summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2022-12-07 13:17:14 +0100
committerJörg Frings-Fürst <debian@jff-webhosting.net>2022-12-07 13:17:14 +0100
commit4875a3dd9b183dcd2256e2abfc4ccf7484c233b4 (patch)
tree0abbea881ded030851014ffdd60fbf71fead8f65
parentdaf17154bf13139d9375f48525d19d6aaba08155 (diff)
New upstream version 4.0.2upstream/4.0.2
-rwxr-xr-xAUTHORSbin0 -> 7413760 bytes
-rwxr-xr-xCOPYING688
-rwxr-xr-xChangeLog8
-rwxr-xr-xINSTALL6
-rwxr-xr-xMakefile.am48
-rwxr-xr-xMakefile.in499
-rwxr-xr-xNEWS (renamed from news)34
-rwxr-xr-xREADME46
-rwxr-xr-xTODO34
-rwxr-xr-xaclocal.m44328
-rwxr-xr-xauthors47
-rwxr-xr-xbin/Makefile.am30
-rwxr-xr-xbin/Makefile.in507
-rwxr-xr-xbin/copydbf.cpp76
-rwxr-xr-xbin/dbfutil1.cpp1347
-rwxr-xr-xbin/deletall.cpp71
-rwxr-xr-xbin/dumpdbt.cpp113
-rwxr-xr-xbin/dumphdr.cpp69
-rwxr-xr-xbin/dumprecs.cpp97
-rwxr-xr-xbin/makebcc.bat22
-rwxr-xr-xbin/packdbf.cpp77
-rwxr-xr-xbin/undelall.cpp76
-rwxr-xr-xbin/zap.cpp76
-rwxr-xr-xbuild/borland5.5/BuildBorland.bat9
-rwxr-xr-xbuild/borland5.5/CMakeLists.txt706
-rwxr-xr-xbuild/borland5.5/CleanBorland.bat18
-rwxr-xr-xbuild/cmake/CMakeLists.txt706
-rwxr-xr-xbuild/cmake/copymake6
-rwxr-xr-xbuild/linux32/CMakeLists.txt706
-rwxr-xr-xbuild/linux64/CMakeLists.txt705
-rwxr-xr-xbuild/mac64/CMakeLists.txt706
-rwxr-xr-xbuild/win32vs/BuildWin.bat8
-rwxr-xr-xbuild/win32vs/CMakeLists.txt706
-rwxr-xr-xbuild/win32vs/CleanWin.bat20
-rwxr-xr-xbuild/win64vs/BuildWin.bat11
-rwxr-xr-xbuild/win64vs/CMakeLists.txt706
-rwxr-xr-xbuild/win64vs/CleanWin.bat18
-rwxr-xr-xconfig.guess1317
-rwxr-xr-xconfig.sub1411
-rwxr-xr-xconfigure10750
-rwxr-xr-xconfigure.in207
-rwxr-xr-xcopying858
-rw-r--r--data/CopyStructureV3NoMemos.DBFbin0 -> 321 bytes
-rw-r--r--data/CopyStructureV4NoMemos.DBFbin0 -> 353 bytes
-rw-r--r--data/ExpTest.DBFbin0 -> 232 bytes
-rw-r--r--data/Functest.DBFbin0 -> 156 bytes
-rw-r--r--data/LockTest.DBFbin0 -> 114 bytes
-rw-r--r--data/LockTest.DBTbin0 -> 1024 bytes
-rw-r--r--data/TMDXDB01.DBFbin0 -> 58962 bytes
-rw-r--r--data/TMDXDB01.MDXbin0 -> 135168 bytes
-rw-r--r--data/TestFilt.DBFbin0 -> 1950 bytes
-rw-r--r--data/TestFilt.NDXbin0 -> 4096 bytes
-rw-r--r--data/TestNdx.DBFbin0 -> 283 bytes
-rw-r--r--data/TestNdx.INF5
-rw-r--r--data/TestNdxC.NDXbin0 -> 1024 bytes
-rw-r--r--data/TestNdxD.NDXbin0 -> 19456 bytes
-rw-r--r--data/TestNdxN.NDXbin0 -> 19456 bytes
-rw-r--r--data/TestSQL.DBFbin0 -> 287 bytes
-rw-r--r--data/TestSQL.DBTbin0 -> 2048 bytes
-rw-r--r--data/TestV3.DBFbin0 -> 321 bytes
-rw-r--r--data/TestV3_memos.DBFbin0 -> 216 bytes
-rw-r--r--data/TestV3_memos.DBTbin0 -> 6144 bytes
-rw-r--r--data/TestV4.DBFbin0 -> 542 bytes
-rw-r--r--data/TestV4_memos.DBFbin0 -> 278 bytes
-rw-r--r--data/TestV4_memos.DBTbin0 -> 7168 bytes
-rw-r--r--data/xbfile.txt1
-rwxr-xr-xdepcomp423
-rwxr-xr-xdocs/Makefile.am14
-rwxr-xr-xdocs/Makefile.in240
-rwxr-xr-xdocs/doxygen.cfg.in732
-rw-r--r--docs/doxygen/config/Doxyfile2694
-rw-r--r--docs/doxygen/config/doxyout.txt438
-rw-r--r--docs/doxygen/html/annotated.html89
-rw-r--r--docs/doxygen/html/bc_s.pngbin0 -> 676 bytes
-rw-r--r--docs/doxygen/html/bdwn.pngbin0 -> 147 bytes
-rw-r--r--docs/doxygen/html/checkndx_8cpp.html117
-rw-r--r--docs/doxygen/html/classes.html81
-rw-r--r--docs/doxygen/html/classxb_1_1xbDate.html1820
-rw-r--r--docs/doxygen/html/classxb_1_1xbDate.pngbin0 -> 414 bytes
-rw-r--r--docs/doxygen/html/classxb_1_1xbDbf.html8836
-rw-r--r--docs/doxygen/html/classxb_1_1xbDbf.pngbin0 -> 519 bytes
-rw-r--r--docs/doxygen/html/classxb_1_1xbFile.html3362
-rw-r--r--docs/doxygen/html/classxb_1_1xbFile.pngbin0 -> 525 bytes
-rw-r--r--docs/doxygen/html/classxb_1_1xbSsv.html652
-rw-r--r--docs/doxygen/html/classxb_1_1xbSsv.pngbin0 -> 1164 bytes
-rw-r--r--docs/doxygen/html/classxb_1_1xbString.html2799
-rw-r--r--docs/doxygen/html/classxb_1_1xbTblMgr.html962
-rw-r--r--docs/doxygen/html/classxb_1_1xbTblMgr.pngbin0 -> 639 bytes
-rw-r--r--docs/doxygen/html/classxb_1_1xbXBase.html1690
-rw-r--r--docs/doxygen/html/classxb_1_1xbXBase.pngbin0 -> 637 bytes
-rw-r--r--docs/doxygen/html/closed.pngbin0 -> 132 bytes
-rw-r--r--docs/doxygen/html/dbfxtrct_8cpp.html136
-rw-r--r--docs/doxygen/html/dir_25b94c3afce00ed38231227d8141f932.html97
-rw-r--r--docs/doxygen/html/dir_313caf1132e152dd9b58bea13a4052ca.html115
-rw-r--r--docs/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html95
-rw-r--r--docs/doxygen/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html131
-rw-r--r--docs/doxygen/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html129
-rw-r--r--docs/doxygen/html/dir_d93a1d4020dea85bb71b237545b5e722.html131
-rw-r--r--docs/doxygen/html/dir_e931c1a3f0014e624d0645a271726ad2.html97
-rw-r--r--docs/doxygen/html/doc.pngbin0 -> 746 bytes
-rw-r--r--docs/doxygen/html/doxygen.css1841
-rw-r--r--docs/doxygen/html/doxygen.svg26
-rw-r--r--docs/doxygen/html/dynsections.js121
-rw-r--r--docs/doxygen/html/files.html187
-rw-r--r--docs/doxygen/html/folderclosed.pngbin0 -> 616 bytes
-rw-r--r--docs/doxygen/html/folderopen.pngbin0 -> 597 bytes
-rw-r--r--docs/doxygen/html/functions.html82
-rw-r--r--docs/doxygen/html/functions_b.html78
-rw-r--r--docs/doxygen/html/functions_c.html103
-rw-r--r--docs/doxygen/html/functions_d.html89
-rw-r--r--docs/doxygen/html/functions_e.html89
-rw-r--r--docs/doxygen/html/functions_f.html80
-rw-r--r--docs/doxygen/html/functions_func.html82
-rw-r--r--docs/doxygen/html/functions_func_b.html78
-rw-r--r--docs/doxygen/html/functions_func_c.html93
-rw-r--r--docs/doxygen/html/functions_func_d.html89
-rw-r--r--docs/doxygen/html/functions_func_e.html88
-rw-r--r--docs/doxygen/html/functions_func_f.html80
-rw-r--r--docs/doxygen/html/functions_func_g.html137
-rw-r--r--docs/doxygen/html/functions_func_h.html77
-rw-r--r--docs/doxygen/html/functions_func_i.html80
-rw-r--r--docs/doxygen/html/functions_func_j.html78
-rw-r--r--docs/doxygen/html/functions_func_l.html81
-rw-r--r--docs/doxygen/html/functions_func_m.html79
-rw-r--r--docs/doxygen/html/functions_func_n.html77
-rw-r--r--docs/doxygen/html/functions_func_o.html93
-rw-r--r--docs/doxygen/html/functions_func_p.html89
-rw-r--r--docs/doxygen/html/functions_func_r.html83
-rw-r--r--docs/doxygen/html/functions_func_s.html98
-rw-r--r--docs/doxygen/html/functions_func_t.html79
-rw-r--r--docs/doxygen/html/functions_func_u.html78
-rw-r--r--docs/doxygen/html/functions_func_v.html79
-rw-r--r--docs/doxygen/html/functions_func_w.html80
-rw-r--r--docs/doxygen/html/functions_func_x.html103
-rw-r--r--docs/doxygen/html/functions_func_y.html77
-rw-r--r--docs/doxygen/html/functions_func_z.html80
-rw-r--r--docs/doxygen/html/functions_func_~.html82
-rw-r--r--docs/doxygen/html/functions_g.html137
-rw-r--r--docs/doxygen/html/functions_h.html77
-rw-r--r--docs/doxygen/html/functions_i.html87
-rw-r--r--docs/doxygen/html/functions_j.html78
-rw-r--r--docs/doxygen/html/functions_l.html81
-rw-r--r--docs/doxygen/html/functions_m.html79
-rw-r--r--docs/doxygen/html/functions_n.html77
-rw-r--r--docs/doxygen/html/functions_o.html94
-rw-r--r--docs/doxygen/html/functions_p.html93
-rw-r--r--docs/doxygen/html/functions_r.html85
-rw-r--r--docs/doxygen/html/functions_rela.html77
-rw-r--r--docs/doxygen/html/functions_s.html101
-rw-r--r--docs/doxygen/html/functions_t.html79
-rw-r--r--docs/doxygen/html/functions_u.html82
-rw-r--r--docs/doxygen/html/functions_v.html79
-rw-r--r--docs/doxygen/html/functions_vars.html136
-rw-r--r--docs/doxygen/html/functions_w.html80
-rw-r--r--docs/doxygen/html/functions_x.html106
-rw-r--r--docs/doxygen/html/functions_y.html77
-rw-r--r--docs/doxygen/html/functions_z.html80
-rw-r--r--docs/doxygen/html/functions_~.html82
-rw-r--r--docs/doxygen/html/globals.html223
-rw-r--r--docs/doxygen/html/globals_defs.html177
-rw-r--r--docs/doxygen/html/globals_func.html117
-rw-r--r--docs/doxygen/html/globals_vars.html75
-rw-r--r--docs/doxygen/html/hierarchy.html88
-rw-r--r--docs/doxygen/html/index.html75
-rw-r--r--docs/doxygen/html/jquery.js35
-rw-r--r--docs/doxygen/html/menu.js127
-rw-r--r--docs/doxygen/html/menudata.js131
-rw-r--r--docs/doxygen/html/namespacemembers.html83
-rw-r--r--docs/doxygen/html/namespacemembers_func.html75
-rw-r--r--docs/doxygen/html/namespacemembers_type.html78
-rw-r--r--docs/doxygen/html/namespacemembers_vars.html78
-rw-r--r--docs/doxygen/html/namespaces.html89
-rw-r--r--docs/doxygen/html/namespacexb.html290
-rw-r--r--docs/doxygen/html/nav_f.pngbin0 -> 153 bytes
-rw-r--r--docs/doxygen/html/nav_g.pngbin0 -> 95 bytes
-rw-r--r--docs/doxygen/html/nav_h.pngbin0 -> 98 bytes
-rw-r--r--docs/doxygen/html/open.pngbin0 -> 123 bytes
-rw-r--r--docs/doxygen/html/reindex_8cpp.html117
-rw-r--r--docs/doxygen/html/search/all_0.html37
-rw-r--r--docs/doxygen/html/search/all_0.js9
-rw-r--r--docs/doxygen/html/search/all_1.html37
-rw-r--r--docs/doxygen/html/search/all_1.js5
-rw-r--r--docs/doxygen/html/search/all_10.html37
-rw-r--r--docs/doxygen/html/search/all_10.js28
-rw-r--r--docs/doxygen/html/search/all_11.html37
-rw-r--r--docs/doxygen/html/search/all_11.js11
-rw-r--r--docs/doxygen/html/search/all_12.html37
-rw-r--r--docs/doxygen/html/search/all_12.js10
-rw-r--r--docs/doxygen/html/search/all_13.html37
-rw-r--r--docs/doxygen/html/search/all_13.js7
-rw-r--r--docs/doxygen/html/search/all_14.html37
-rw-r--r--docs/doxygen/html/search/all_14.js7
-rw-r--r--docs/doxygen/html/search/all_15.html37
-rw-r--r--docs/doxygen/html/search/all_15.js222
-rw-r--r--docs/doxygen/html/search/all_16.html37
-rw-r--r--docs/doxygen/html/search/all_16.js4
-rw-r--r--docs/doxygen/html/search/all_17.html37
-rw-r--r--docs/doxygen/html/search/all_17.js7
-rw-r--r--docs/doxygen/html/search/all_18.html37
-rw-r--r--docs/doxygen/html/search/all_18.js9
-rw-r--r--docs/doxygen/html/search/all_2.html37
-rw-r--r--docs/doxygen/html/search/all_2.js32
-rw-r--r--docs/doxygen/html/search/all_3.html37
-rw-r--r--docs/doxygen/html/search/all_3.js21
-rw-r--r--docs/doxygen/html/search/all_4.html37
-rw-r--r--docs/doxygen/html/search/all_4.js16
-rw-r--r--docs/doxygen/html/search/all_5.html37
-rw-r--r--docs/doxygen/html/search/all_5.js8
-rw-r--r--docs/doxygen/html/search/all_6.html37
-rw-r--r--docs/doxygen/html/search/all_6.js65
-rw-r--r--docs/doxygen/html/search/all_7.html37
-rw-r--r--docs/doxygen/html/search/all_7.js4
-rw-r--r--docs/doxygen/html/search/all_8.html37
-rw-r--r--docs/doxygen/html/search/all_8.js15
-rw-r--r--docs/doxygen/html/search/all_9.html37
-rw-r--r--docs/doxygen/html/search/all_9.js6
-rw-r--r--docs/doxygen/html/search/all_a.html37
-rw-r--r--docs/doxygen/html/search/all_a.js12
-rw-r--r--docs/doxygen/html/search/all_b.html37
-rw-r--r--docs/doxygen/html/search/all_b.js7
-rw-r--r--docs/doxygen/html/search/all_c.html37
-rw-r--r--docs/doxygen/html/search/all_c.js4
-rw-r--r--docs/doxygen/html/search/all_d.html37
-rw-r--r--docs/doxygen/html/search/all_d.js21
-rw-r--r--docs/doxygen/html/search/all_e.html37
-rw-r--r--docs/doxygen/html/search/all_e.js20
-rw-r--r--docs/doxygen/html/search/all_f.html37
-rw-r--r--docs/doxygen/html/search/all_f.js13
-rw-r--r--docs/doxygen/html/search/classes_0.html37
-rw-r--r--docs/doxygen/html/search/classes_0.js12
-rw-r--r--docs/doxygen/html/search/close.svg31
-rw-r--r--docs/doxygen/html/search/defines_0.html37
-rw-r--r--docs/doxygen/html/search/defines_0.js4
-rw-r--r--docs/doxygen/html/search/defines_1.html37
-rw-r--r--docs/doxygen/html/search/defines_1.js7
-rw-r--r--docs/doxygen/html/search/defines_2.html37
-rw-r--r--docs/doxygen/html/search/defines_2.js4
-rw-r--r--docs/doxygen/html/search/defines_3.html37
-rw-r--r--docs/doxygen/html/search/defines_3.js86
-rw-r--r--docs/doxygen/html/search/files_0.html37
-rw-r--r--docs/doxygen/html/search/files_0.js4
-rw-r--r--docs/doxygen/html/search/files_1.html37
-rw-r--r--docs/doxygen/html/search/files_1.js4
-rw-r--r--docs/doxygen/html/search/files_2.html37
-rw-r--r--docs/doxygen/html/search/files_2.js4
-rw-r--r--docs/doxygen/html/search/files_3.html37
-rw-r--r--docs/doxygen/html/search/files_3.js4
-rw-r--r--docs/doxygen/html/search/files_4.html37
-rw-r--r--docs/doxygen/html/search/files_4.js100
-rw-r--r--docs/doxygen/html/search/functions_0.html37
-rw-r--r--docs/doxygen/html/search/functions_0.js9
-rw-r--r--docs/doxygen/html/search/functions_1.html37
-rw-r--r--docs/doxygen/html/search/functions_1.js5
-rw-r--r--docs/doxygen/html/search/functions_10.html37
-rw-r--r--docs/doxygen/html/search/functions_10.js25
-rw-r--r--docs/doxygen/html/search/functions_11.html37
-rw-r--r--docs/doxygen/html/search/functions_11.js9
-rw-r--r--docs/doxygen/html/search/functions_12.html37
-rw-r--r--docs/doxygen/html/search/functions_12.js6
-rw-r--r--docs/doxygen/html/search/functions_13.html37
-rw-r--r--docs/doxygen/html/search/functions_13.js6
-rw-r--r--docs/doxygen/html/search/functions_14.html37
-rw-r--r--docs/doxygen/html/search/functions_14.js7
-rw-r--r--docs/doxygen/html/search/functions_15.html37
-rw-r--r--docs/doxygen/html/search/functions_15.js30
-rw-r--r--docs/doxygen/html/search/functions_16.html37
-rw-r--r--docs/doxygen/html/search/functions_16.js4
-rw-r--r--docs/doxygen/html/search/functions_17.html37
-rw-r--r--docs/doxygen/html/search/functions_17.js7
-rw-r--r--docs/doxygen/html/search/functions_18.html37
-rw-r--r--docs/doxygen/html/search/functions_18.js9
-rw-r--r--docs/doxygen/html/search/functions_2.html37
-rw-r--r--docs/doxygen/html/search/functions_2.js21
-rw-r--r--docs/doxygen/html/search/functions_3.html37
-rw-r--r--docs/doxygen/html/search/functions_3.js20
-rw-r--r--docs/doxygen/html/search/functions_4.html37
-rw-r--r--docs/doxygen/html/search/functions_4.js15
-rw-r--r--docs/doxygen/html/search/functions_5.html37
-rw-r--r--docs/doxygen/html/search/functions_5.js8
-rw-r--r--docs/doxygen/html/search/functions_6.html37
-rw-r--r--docs/doxygen/html/search/functions_6.js65
-rw-r--r--docs/doxygen/html/search/functions_7.html37
-rw-r--r--docs/doxygen/html/search/functions_7.js4
-rw-r--r--docs/doxygen/html/search/functions_8.html37
-rw-r--r--docs/doxygen/html/search/functions_8.js8
-rw-r--r--docs/doxygen/html/search/functions_9.html37
-rw-r--r--docs/doxygen/html/search/functions_9.js5
-rw-r--r--docs/doxygen/html/search/functions_a.html37
-rw-r--r--docs/doxygen/html/search/functions_a.js8
-rw-r--r--docs/doxygen/html/search/functions_b.html37
-rw-r--r--docs/doxygen/html/search/functions_b.js7
-rw-r--r--docs/doxygen/html/search/functions_c.html37
-rw-r--r--docs/doxygen/html/search/functions_c.js4
-rw-r--r--docs/doxygen/html/search/functions_d.html37
-rw-r--r--docs/doxygen/html/search/functions_d.js21
-rw-r--r--docs/doxygen/html/search/functions_e.html37
-rw-r--r--docs/doxygen/html/search/functions_e.js16
-rw-r--r--docs/doxygen/html/search/functions_f.html37
-rw-r--r--docs/doxygen/html/search/functions_f.js10
-rw-r--r--docs/doxygen/html/search/mag_sel.svg74
-rw-r--r--docs/doxygen/html/search/namespaces_0.html37
-rw-r--r--docs/doxygen/html/search/namespaces_0.js4
-rw-r--r--docs/doxygen/html/search/nomatches.html13
-rw-r--r--docs/doxygen/html/search/related_0.html37
-rw-r--r--docs/doxygen/html/search/related_0.js4
-rw-r--r--docs/doxygen/html/search/related_1.html37
-rw-r--r--docs/doxygen/html/search/related_1.js5
-rw-r--r--docs/doxygen/html/search/search.css263
-rw-r--r--docs/doxygen/html/search/search.js794
-rw-r--r--docs/doxygen/html/search/search_l.pngbin0 -> 567 bytes
-rw-r--r--docs/doxygen/html/search/search_m.pngbin0 -> 158 bytes
-rw-r--r--docs/doxygen/html/search/search_r.pngbin0 -> 553 bytes
-rw-r--r--docs/doxygen/html/search/searchdata.js39
-rw-r--r--docs/doxygen/html/search/typedefs_0.html37
-rw-r--r--docs/doxygen/html/search/typedefs_0.js7
-rw-r--r--docs/doxygen/html/search/variables_0.html37
-rw-r--r--docs/doxygen/html/search/variables_0.js13
-rw-r--r--docs/doxygen/html/search/variables_1.html37
-rw-r--r--docs/doxygen/html/search/variables_1.js4
-rw-r--r--docs/doxygen/html/search/variables_2.html37
-rw-r--r--docs/doxygen/html/search/variables_2.js10
-rw-r--r--docs/doxygen/html/search/variables_3.html37
-rw-r--r--docs/doxygen/html/search/variables_3.js7
-rw-r--r--docs/doxygen/html/search/variables_4.html37
-rw-r--r--docs/doxygen/html/search/variables_4.js5
-rw-r--r--docs/doxygen/html/search/variables_5.html37
-rw-r--r--docs/doxygen/html/search/variables_5.js6
-rw-r--r--docs/doxygen/html/search/variables_6.html37
-rw-r--r--docs/doxygen/html/search/variables_6.js4
-rw-r--r--docs/doxygen/html/search/variables_7.html37
-rw-r--r--docs/doxygen/html/search/variables_7.js7
-rw-r--r--docs/doxygen/html/search/variables_8.html37
-rw-r--r--docs/doxygen/html/search/variables_8.js8
-rw-r--r--docs/doxygen/html/splitbar.pngbin0 -> 314 bytes
-rw-r--r--docs/doxygen/html/structxb_1_1xbSchema.html179
-rw-r--r--docs/doxygen/html/structxb_1_1xbTblList.html155
-rw-r--r--docs/doxygen/html/sync_off.pngbin0 -> 853 bytes
-rw-r--r--docs/doxygen/html/sync_on.pngbin0 -> 845 bytes
-rw-r--r--docs/doxygen/html/tab_a.pngbin0 -> 142 bytes
-rw-r--r--docs/doxygen/html/tab_b.pngbin0 -> 169 bytes
-rw-r--r--docs/doxygen/html/tab_h.pngbin0 -> 177 bytes
-rw-r--r--docs/doxygen/html/tab_s.pngbin0 -> 184 bytes
-rw-r--r--docs/doxygen/html/tabs.css1
-rw-r--r--docs/doxygen/html/tstfuncs_8cpp.html595
-rw-r--r--docs/doxygen/html/xb__cfg__check_8cpp.html108
-rw-r--r--docs/doxygen/html/xb__copydbf_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__dbfutil_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__deletall_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__dumpdbt_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__dumphdr_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__dumpix_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__dumprecs_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__ex__date_8cpp.html106
-rw-r--r--docs/doxygen/html/xb__ex__sql_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__ex__string_8cpp.html106
-rw-r--r--docs/doxygen/html/xb__ex__v3__create__dbf_8cpp.html106
-rw-r--r--docs/doxygen/html/xb__ex__v3__upd__dbf_8cpp.html106
-rw-r--r--docs/doxygen/html/xb__ex__v4__create__dbf_8cpp.html106
-rw-r--r--docs/doxygen/html/xb__ex__v4__upd__dbf_8cpp.html106
-rw-r--r--docs/doxygen/html/xb__execsql_8cpp.html147
-rw-r--r--docs/doxygen/html/xb__pack_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__tblinfo_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__test__bcd_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__date_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__dbf__v3__memos_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__dbf__v3__nomemos_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__dbf__v4__memos_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__dbf__v4__nomemos_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__expnode_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__expression_8cpp.html502
-rw-r--r--docs/doxygen/html/xb__test__file_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__filter_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__funcs_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__linklist_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__lock2_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__lock_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__log_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__mdx_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__ndx2_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__ndx_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__sql_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__string_8cpp.html139
-rw-r--r--docs/doxygen/html/xb__test__tblmgr_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__uda_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__test__xbase_8cpp.html118
-rw-r--r--docs/doxygen/html/xb__undelall_8cpp.html117
-rw-r--r--docs/doxygen/html/xb__zap_8cpp.html117
-rw-r--r--docs/doxygen/html/xbase_8h.html109
-rw-r--r--docs/doxygen/html/xbase_8h_source.html194
-rw-r--r--docs/doxygen/html/xbbcd_8cpp.html80
-rw-r--r--docs/doxygen/html/xbbcd_8h.html81
-rw-r--r--docs/doxygen/html/xbbcd_8h_source.html174
-rw-r--r--docs/doxygen/html/xbcrix_8cpp.html80
-rw-r--r--docs/doxygen/html/xbcrtbl_8cpp.html80
-rw-r--r--docs/doxygen/html/xbdate_8cpp.html89
-rw-r--r--docs/doxygen/html/xbdate_8h.html165
-rw-r--r--docs/doxygen/html/xbdate_8h_source.html182
-rw-r--r--docs/doxygen/html/xbdbf3_8cpp.html80
-rw-r--r--docs/doxygen/html/xbdbf4_8cpp.html80
-rw-r--r--docs/doxygen/html/xbdbf_8cpp.html88
-rw-r--r--docs/doxygen/html/xbdbf_8h.html456
-rw-r--r--docs/doxygen/html/xbdbf_8h_source.html588
-rw-r--r--docs/doxygen/html/xbdrpix_8cpp.html80
-rw-r--r--docs/doxygen/html/xbdrptbl_8cpp.html80
-rw-r--r--docs/doxygen/html/xbexp_8cpp.html80
-rw-r--r--docs/doxygen/html/xbexp_8h.html81
-rw-r--r--docs/doxygen/html/xbexp_8h_source.html242
-rw-r--r--docs/doxygen/html/xbexpnode_8cpp.html80
-rw-r--r--docs/doxygen/html/xbexpnode_8h.html81
-rw-r--r--docs/doxygen/html/xbexpnode_8h_source.html190
-rw-r--r--docs/doxygen/html/xbfields_8cpp.html88
-rw-r--r--docs/doxygen/html/xbfile_8cpp.html88
-rw-r--r--docs/doxygen/html/xbfile_8h.html181
-rw-r--r--docs/doxygen/html/xbfile_8h_source.html262
-rw-r--r--docs/doxygen/html/xbfilter_8cpp.html80
-rw-r--r--docs/doxygen/html/xbfilter_8h.html81
-rw-r--r--docs/doxygen/html/xbfilter_8h_source.html160
-rw-r--r--docs/doxygen/html/xbfuncs_8cpp.html80
-rw-r--r--docs/doxygen/html/xbindex_8h.html81
-rw-r--r--docs/doxygen/html/xbindex_8h_source.html592
-rw-r--r--docs/doxygen/html/xbinsert_8cpp.html80
-rw-r--r--docs/doxygen/html/xbixbase_8cpp.html80
-rw-r--r--docs/doxygen/html/xbixmdx_8cpp.html80
-rw-r--r--docs/doxygen/html/xbixndx_8cpp.html80
-rw-r--r--docs/doxygen/html/xblnklst_8h.html81
-rw-r--r--docs/doxygen/html/xblnklst_8h_source.html341
-rw-r--r--docs/doxygen/html/xblnklstord_8h.html81
-rw-r--r--docs/doxygen/html/xblnklstord_8h_source.html455
-rw-r--r--docs/doxygen/html/xblnknod_8h.html81
-rw-r--r--docs/doxygen/html/xblnknod_8h_source.html174
-rw-r--r--docs/doxygen/html/xblog_8cpp.html80
-rw-r--r--docs/doxygen/html/xblog_8h.html89
-rw-r--r--docs/doxygen/html/xblog_8h_source.html135
-rw-r--r--docs/doxygen/html/xbmemo3_8cpp.html80
-rw-r--r--docs/doxygen/html/xbmemo4_8cpp.html80
-rw-r--r--docs/doxygen/html/xbmemo_8cpp.html80
-rw-r--r--docs/doxygen/html/xbmemo_8h.html81
-rw-r--r--docs/doxygen/html/xbmemo_8h_source.html262
-rw-r--r--docs/doxygen/html/xbretcod_8h.html958
-rw-r--r--docs/doxygen/html/xbretcod_8h_source.html174
-rw-r--r--docs/doxygen/html/xbset_8cpp.html80
-rw-r--r--docs/doxygen/html/xbsql_8cpp.html80
-rw-r--r--docs/doxygen/html/xbsql_8h.html81
-rw-r--r--docs/doxygen/html/xbsql_8h_source.html150
-rw-r--r--docs/doxygen/html/xbssv_8cpp.html94
-rw-r--r--docs/doxygen/html/xbssv_8h.html102
-rw-r--r--docs/doxygen/html/xbssv_8h_source.html250
-rw-r--r--docs/doxygen/html/xbstring_8cpp.html95
-rw-r--r--docs/doxygen/html/xbstring_8h.html98
-rw-r--r--docs/doxygen/html/xbstring_8h_source.html247
-rw-r--r--docs/doxygen/html/xbtag_8cpp.html80
-rw-r--r--docs/doxygen/html/xbtag_8h.html89
-rw-r--r--docs/doxygen/html/xbtag_8h_source.html144
-rw-r--r--docs/doxygen/html/xbtblmgr_8cpp.html88
-rw-r--r--docs/doxygen/html/xbtblmgr_8h.html103
-rw-r--r--docs/doxygen/html/xbtblmgr_8h_source.html150
-rw-r--r--docs/doxygen/html/xbtypes_8h.html154
-rw-r--r--docs/doxygen/html/xbtypes_8h_source.html139
-rw-r--r--docs/doxygen/html/xbuda_8cpp.html80
-rw-r--r--docs/doxygen/html/xbuda_8h.html81
-rw-r--r--docs/doxygen/html/xbuda_8h_source.html132
-rw-r--r--docs/doxygen/html/xbxbase_8cpp.html88
-rw-r--r--docs/doxygen/html/xbxbase_8h.html102
-rw-r--r--docs/doxygen/html/xbxbase_8h_source.html309
-rw-r--r--docs/doxygen/latex/Makefile23
-rw-r--r--docs/doxygen/latex/annotated.tex12
-rw-r--r--docs/doxygen/latex/checkndx_8cpp.tex17
-rw-r--r--docs/doxygen/latex/classxb_1_1xbDate.eps197
-rw-r--r--docs/doxygen/latex/classxb_1_1xbDate.pdfbin0 -> 4739 bytes
-rw-r--r--docs/doxygen/latex/classxb_1_1xbDate.tex1029
-rw-r--r--docs/doxygen/latex/classxb_1_1xbDbf.eps203
-rw-r--r--docs/doxygen/latex/classxb_1_1xbDbf.pdfbin0 -> 4914 bytes
-rw-r--r--docs/doxygen/latex/classxb_1_1xbDbf.tex4204
-rw-r--r--docs/doxygen/latex/classxb_1_1xbFile.eps203
-rw-r--r--docs/doxygen/latex/classxb_1_1xbFile.pdfbin0 -> 4915 bytes
-rw-r--r--docs/doxygen/latex/classxb_1_1xbFile.tex1882
-rw-r--r--docs/doxygen/latex/classxb_1_1xbSsv.eps219
-rw-r--r--docs/doxygen/latex/classxb_1_1xbSsv.pdfbin0 -> 6100 bytes
-rw-r--r--docs/doxygen/latex/classxb_1_1xbSsv.tex339
-rw-r--r--docs/doxygen/latex/classxb_1_1xbString.tex1702
-rw-r--r--docs/doxygen/latex/classxb_1_1xbTblMgr.eps203
-rw-r--r--docs/doxygen/latex/classxb_1_1xbTblMgr.pdfbin0 -> 5490 bytes
-rw-r--r--docs/doxygen/latex/classxb_1_1xbTblMgr.tex395
-rw-r--r--docs/doxygen/latex/classxb_1_1xbXBase.eps203
-rw-r--r--docs/doxygen/latex/classxb_1_1xbXBase.pdfbin0 -> 5492 bytes
-rw-r--r--docs/doxygen/latex/classxb_1_1xbXBase.tex663
-rw-r--r--docs/doxygen/latex/dbfxtrct_8cpp.tex25
-rw-r--r--docs/doxygen/latex/dir_25b94c3afce00ed38231227d8141f932.tex19
-rw-r--r--docs/doxygen/latex/dir_313caf1132e152dd9b58bea13a4052ca.tex37
-rw-r--r--docs/doxygen/latex/dir_68267d1309a1af8e8297ef4c3efbcdba.tex17
-rw-r--r--docs/doxygen/latex/dir_aebb8dcc11953d78e620bbef0b9e2183.tex53
-rw-r--r--docs/doxygen/latex/dir_b0856f6b0d80ccb263b2f415c91f9e17.tex51
-rw-r--r--docs/doxygen/latex/dir_d93a1d4020dea85bb71b237545b5e722.tex53
-rw-r--r--docs/doxygen/latex/dir_e931c1a3f0014e624d0645a271726ad2.tex19
-rw-r--r--docs/doxygen/latex/doxygen.sty601
-rw-r--r--docs/doxygen/latex/files.tex104
-rw-r--r--docs/doxygen/latex/hierarchy.tex18
-rw-r--r--docs/doxygen/latex/longtable_doxygen.sty448
-rw-r--r--docs/doxygen/latex/namespaces.tex4
-rw-r--r--docs/doxygen/latex/namespacexb.tex126
-rw-r--r--docs/doxygen/latex/refman.tex332
-rw-r--r--docs/doxygen/latex/reindex_8cpp.tex17
-rw-r--r--docs/doxygen/latex/structxb_1_1xbSchema.tex77
-rw-r--r--docs/doxygen/latex/structxb_1_1xbTblList.tex49
-rw-r--r--docs/doxygen/latex/tabu_doxygen.sty2557
-rw-r--r--docs/doxygen/latex/tstfuncs_8cpp.tex126
-rw-r--r--docs/doxygen/latex/xb__cfg__check_8cpp.tex19
-rw-r--r--docs/doxygen/latex/xb__copydbf_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__dbfutil_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__deletall_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__dumpdbt_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__dumphdr_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__dumpix_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__dumprecs_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__ex__date_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__ex__sql_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__ex__string_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__ex__v3__create__dbf_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__ex__v3__upd__dbf_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__ex__v4__create__dbf_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__ex__v4__upd__dbf_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__execsql_8cpp.tex25
-rw-r--r--docs/doxygen/latex/xb__pack_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__tblinfo_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__test__bcd_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__date_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__dbf__v3__memos_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__dbf__v3__nomemos_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__dbf__v4__memos_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__dbf__v4__nomemos_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__expnode_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__expression_8cpp.tex74
-rw-r--r--docs/doxygen/latex/xb__test__file_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__filter_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__funcs_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__linklist_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__lock2_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__lock_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__log_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__mdx_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__ndx2_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__ndx_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__sql_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__string_8cpp.tex32
-rw-r--r--docs/doxygen/latex/xb__test__tblmgr_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__uda_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__test__xbase_8cpp.tex18
-rw-r--r--docs/doxygen/latex/xb__undelall_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xb__zap_8cpp.tex17
-rw-r--r--docs/doxygen/latex/xbase_8h.tex30
-rw-r--r--docs/doxygen/latex/xbase_8h_source.tex99
-rw-r--r--docs/doxygen/latex/xbbcd_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbbcd_8h.tex2
-rw-r--r--docs/doxygen/latex/xbbcd_8h_source.tex99
-rw-r--r--docs/doxygen/latex/xbcrix_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbcrtbl_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbdate_8cpp.tex9
-rw-r--r--docs/doxygen/latex/xbdate_8h.tex50
-rw-r--r--docs/doxygen/latex/xbdate_8h_source.tex104
-rw-r--r--docs/doxygen/latex/xbdbf3_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbdbf4_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbdbf_8cpp.tex8
-rw-r--r--docs/doxygen/latex/xbdbf_8h.tex196
-rw-r--r--docs/doxygen/latex/xbdbf_8h_source.tex491
-rw-r--r--docs/doxygen/latex/xbdrpix_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbdrptbl_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbexp_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbexp_8h.tex2
-rw-r--r--docs/doxygen/latex/xbexp_8h_source.tex164
-rw-r--r--docs/doxygen/latex/xbexpnode_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbexpnode_8h.tex2
-rw-r--r--docs/doxygen/latex/xbexpnode_8h_source.tex113
-rw-r--r--docs/doxygen/latex/xbfields_8cpp.tex8
-rw-r--r--docs/doxygen/latex/xbfile_8cpp.tex8
-rw-r--r--docs/doxygen/latex/xbfile_8h.tex58
-rw-r--r--docs/doxygen/latex/xbfile_8h_source.tex180
-rw-r--r--docs/doxygen/latex/xbfilter_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbfilter_8h.tex2
-rw-r--r--docs/doxygen/latex/xbfilter_8h_source.tex84
-rw-r--r--docs/doxygen/latex/xbfuncs_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbindex_8h.tex2
-rw-r--r--docs/doxygen/latex/xbindex_8h_source.tex513
-rw-r--r--docs/doxygen/latex/xbinsert_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbixbase_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbixmdx_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbixndx_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xblnklst_8h.tex2
-rw-r--r--docs/doxygen/latex/xblnklst_8h_source.tex263
-rw-r--r--docs/doxygen/latex/xblnklstord_8h.tex2
-rw-r--r--docs/doxygen/latex/xblnklstord_8h_source.tex373
-rw-r--r--docs/doxygen/latex/xblnknod_8h.tex2
-rw-r--r--docs/doxygen/latex/xblnknod_8h_source.tex100
-rw-r--r--docs/doxygen/latex/xblog_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xblog_8h.tex7
-rw-r--r--docs/doxygen/latex/xblog_8h_source.tex59
-rw-r--r--docs/doxygen/latex/xbmemo3_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbmemo4_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbmemo_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbmemo_8h.tex2
-rw-r--r--docs/doxygen/latex/xbmemo_8h_source.tex186
-rw-r--r--docs/doxygen/latex/xbretcod_8h.tex445
-rw-r--r--docs/doxygen/latex/xbretcod_8h_source.tex100
-rw-r--r--docs/doxygen/latex/xbset_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbsql_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbsql_8h.tex2
-rw-r--r--docs/doxygen/latex/xbsql_8h_source.tex75
-rw-r--r--docs/doxygen/latex/xbssv_8cpp.tex13
-rw-r--r--docs/doxygen/latex/xbssv_8h.tex17
-rw-r--r--docs/doxygen/latex/xbssv_8h_source.tex170
-rw-r--r--docs/doxygen/latex/xbstring_8cpp.tex13
-rw-r--r--docs/doxygen/latex/xbstring_8h.tex14
-rw-r--r--docs/doxygen/latex/xbstring_8h_source.tex169
-rw-r--r--docs/doxygen/latex/xbtag_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbtag_8h.tex7
-rw-r--r--docs/doxygen/latex/xbtag_8h_source.tex69
-rw-r--r--docs/doxygen/latex/xbtblmgr_8cpp.tex8
-rw-r--r--docs/doxygen/latex/xbtblmgr_8h.tex19
-rw-r--r--docs/doxygen/latex/xbtblmgr_8h_source.tex67
-rw-r--r--docs/doxygen/latex/xbtypes_8h.tex48
-rw-r--r--docs/doxygen/latex/xbtypes_8h_source.tex61
-rw-r--r--docs/doxygen/latex/xbuda_8cpp.tex3
-rw-r--r--docs/doxygen/latex/xbuda_8h.tex2
-rw-r--r--docs/doxygen/latex/xbuda_8h_source.tex58
-rw-r--r--docs/doxygen/latex/xbxbase_8cpp.tex8
-rw-r--r--docs/doxygen/latex/xbxbase_8h.tex17
-rw-r--r--docs/doxygen/latex/xbxbase_8h_source.tex224
-rwxr-xr-xdocs/howto/AddAnIndex.txt11
-rwxr-xr-xdocs/howto/GettingStarted.txt86
-rwxr-xr-xdocs/howto/Hacking.txt28
-rwxr-xr-xdocs/howto/Locking.txt53
-rwxr-xr-xdocs/howto/mac_cmake_compile.txt1
-rwxr-xr-xdocs/html/index.htm33
-rwxr-xr-xdocs/html/xbase.jpg (renamed from html/xbase.jpg)bin6421 -> 6421 bytes
-rwxr-xr-xdocs/html/xbbib.htm (renamed from html/xbbib.htm)0
-rwxr-xr-xdocs/html/xbc1.htm185
-rwxr-xr-xdocs/html/xbc10.htm12
-rwxr-xr-xdocs/html/xbc11.htm12
-rwxr-xr-xdocs/html/xbc12.htm72
-rwxr-xr-xdocs/html/xbc13.htm46
-rwxr-xr-xdocs/html/xbc14.htm12
-rwxr-xr-xdocs/html/xbc15.htm34
-rwxr-xr-xdocs/html/xbc2.htm (renamed from html/xbc2.htm)55
-rwxr-xr-xdocs/html/xbc3.htm (renamed from html/xbc3.htm)38
-rwxr-xr-xdocs/html/xbc4.htm (renamed from html/xbc4.htm)73
-rwxr-xr-xdocs/html/xbc5.htm205
-rwxr-xr-xdocs/html/xbc6.htm137
-rwxr-xr-xdocs/html/xbc7.htm (renamed from html/xbc6.htm)11
-rwxr-xr-xdocs/html/xbc8.htm79
-rwxr-xr-xdocs/html/xbc9.htm (renamed from html/xbc7.htm)7
-rwxr-xr-xdocs/license/gpl-3.0.txt674
-rwxr-xr-xdocs/license/preamble.txt11
-rwxr-xr-xdocs/misc/AutoUpdate.txt54
-rwxr-xr-xdocs/misc/DirectoryStructure.txt32
-rwxr-xr-xdocs/misc/ExpressionNotes.odsbin0 -> 20662 bytes
-rwxr-xr-xdocs/misc/Expressions.txt13
-rwxr-xr-xdocs/misc/FileTypeByte.txt53
-rwxr-xr-xdocs/misc/IndexNotes.odsbin0 -> 23172 bytes
-rwxr-xr-xdocs/misc/RealDelete.txt88
-rwxr-xr-xdocs/misc/Release.txt34
-rwxr-xr-xdocs/misc/Versions.txt30
-rwxr-xr-xdocs/misc/xbTmpFiles.txt12
-rwxr-xr-xexamples/Makefile.am23
-rwxr-xr-xexamples/Makefile.in417
-rwxr-xr-xexamples/exfilter.cpp77
-rwxr-xr-xexamples/makebcc.bat17
-rwxr-xr-xexamples/sample1.cpp120
-rwxr-xr-xexamples/sample2.cpp226
-rwxr-xr-xexamples/sample3.cpp137
-rwxr-xr-xexamples/sample4.cpp135
-rwxr-xr-xexamples/sample5.cpp135
-rwxr-xr-xexamples/xbstring.cpp84
-rwxr-xr-xhtml/Makefile.am34
-rwxr-xr-xhtml/Makefile.in254
-rwxr-xr-xhtml/Xb2cpp.htm81
-rwxr-xr-xhtml/copying.lib443
-rwxr-xr-xhtml/index.htm39
-rwxr-xr-xhtml/xba1.htm65
-rwxr-xr-xhtml/xba2.htm110
-rwxr-xr-xhtml/xbapps.htm39
-rwxr-xr-xhtml/xbc1.htm232
-rwxr-xr-xhtml/xbc11.htm40
-rwxr-xr-xhtml/xbc12.htm566
-rwxr-xr-xhtml/xbc13.htm470
-rwxr-xr-xhtml/xbc14.htm200
-rwxr-xr-xhtml/xbc15.htm338
-rwxr-xr-xhtml/xbc16.htm202
-rwxr-xr-xhtml/xbc17.htm352
-rwxr-xr-xhtml/xbc18.htm261
-rwxr-xr-xhtml/xbc5.htm156
-rwxr-xr-xhtml/xbc8.htm130
-rwxr-xr-xhtml/xblock.htm281
-rwxr-xr-xinstall186
-rwxr-xr-xinstall-sh251
-rwxr-xr-xlibtest/Makefile.am19
-rwxr-xr-xlibtest/Makefile.in391
-rwxr-xr-xlibtest/exptest.cpp277
-rwxr-xr-xlibtest/indextst.cpp297
-rwxr-xr-xlibtest/lfiletst.cpp138
-rwxr-xr-xlibtest/locktest.cpp77
-rwxr-xr-xlibtest/makebcc.bat16
-rwxr-xr-xlibtest/readme10
-rwxr-xr-xlibtest/testdate.cpp213
-rw-r--r--logs/Linux_x64.xbLog.txt254
-rwxr-xr-xltconfig2105
-rwxr-xr-xltmain.sh5064
-rwxr-xr-xmissing336
-rwxr-xr-xmkinstalldirs99
-rwxr-xr-xreadme108
-rwxr-xr-xsql/del.sql9
-rwxr-xr-xsql/oneNdxTag.sql18
-rwxr-xr-xsql/testc.sql13
-rwxr-xr-xsql/testd.sql12
-rwxr-xr-xsql/testdd.sql14
-rwxr-xr-xsql/testflg.sql12
-rwxr-xr-xsql/testmdx.sql12
-rwxr-xr-xsql/testmdx2.sql12
-rwxr-xr-xsql/twotags.sql10
-rwxr-xr-xsrc/core/xbbcd.cpp333
-rwxr-xr-xsrc/core/xbdate.cpp802
-rwxr-xr-xsrc/core/xbdbf.cpp4220
-rwxr-xr-xsrc/core/xbdbf3.cpp577
-rwxr-xr-xsrc/core/xbdbf4.cpp590
-rwxr-xr-xsrc/core/xbexp.cpp2643
-rwxr-xr-xsrc/core/xbexpnode.cpp562
-rwxr-xr-xsrc/core/xbfields.cpp1122
-rwxr-xr-xsrc/core/xbfile.cpp2052
-rwxr-xr-xsrc/core/xbfilter.cpp569
-rwxr-xr-xsrc/core/xbfuncs.cpp850
-rwxr-xr-xsrc/core/xbixbase.cpp792
-rwxr-xr-xsrc/core/xbixmdx.cpp5067
-rwxr-xr-xsrc/core/xbixndx.cpp2840
-rwxr-xr-xsrc/core/xblog.cpp208
-rwxr-xr-xsrc/core/xbmemo.cpp219
-rwxr-xr-xsrc/core/xbmemo3.cpp590
-rwxr-xr-xsrc/core/xbmemo4.cpp1372
-rwxr-xr-xsrc/core/xbssv.cpp550
-rwxr-xr-xsrc/core/xbstring.cpp1839
-rwxr-xr-xsrc/core/xbtag.cpp121
-rwxr-xr-xsrc/core/xbtblmgr.cpp257
-rwxr-xr-xsrc/core/xbuda.cpp78
-rwxr-xr-xsrc/core/xbxbase.cpp712
-rwxr-xr-xsrc/examples/xb_ex_date.cpp210
-rwxr-xr-xsrc/examples/xb_ex_sql.cpp111
-rwxr-xr-xsrc/examples/xb_ex_string.cpp385
-rwxr-xr-xsrc/examples/xb_ex_v3_create_dbf.cpp102
-rwxr-xr-xsrc/examples/xb_ex_v3_upd_dbf.cpp282
-rwxr-xr-xsrc/examples/xb_ex_v4_create_dbf.cpp81
-rwxr-xr-xsrc/examples/xb_ex_v4_upd_dbf.cpp283
-rwxr-xr-xsrc/include/xbase.h93
-rwxr-xr-xsrc/include/xbbcd.h95
-rwxr-xr-xsrc/include/xbconfig.h.in122
-rwxr-xr-xsrc/include/xbdate.h123
-rwxr-xr-xsrc/include/xbdbf.h538
-rwxr-xr-xsrc/include/xbexp.h215
-rwxr-xr-xsrc/include/xbexpnode.h120
-rwxr-xr-xsrc/include/xbfile.h194
-rwxr-xr-xsrc/include/xbfilter.h78
-rwxr-xr-xsrc/include/xbindex.h605
-rwxr-xr-xsrc/include/xblnklst.h257
-rwxr-xr-xsrc/include/xblnklstord.h367
-rwxr-xr-xsrc/include/xblnknod.h94
-rwxr-xr-xsrc/include/xblog.h66
-rwxr-xr-xsrc/include/xbmemo.h223
-rwxr-xr-xsrc/include/xbretcod.h94
-rwxr-xr-xsrc/include/xbsql.h69
-rwxr-xr-xsrc/include/xbssv.h177
-rwxr-xr-xsrc/include/xbstring.h183
-rwxr-xr-xsrc/include/xbtag.h74
-rwxr-xr-xsrc/include/xbtblmgr.h61
-rwxr-xr-xsrc/include/xbtypes.h55
-rwxr-xr-xsrc/include/xbuda.h52
-rwxr-xr-xsrc/include/xbxbase.h222
-rwxr-xr-xsrc/sql/xbcrix.cpp279
-rwxr-xr-xsrc/sql/xbcrtbl.cpp256
-rwxr-xr-xsrc/sql/xbdrpix.cpp143
-rwxr-xr-xsrc/sql/xbdrptbl.cpp125
-rwxr-xr-xsrc/sql/xbinsert.cpp190
-rwxr-xr-xsrc/sql/xbset.cpp91
-rwxr-xr-xsrc/sql/xbsql.cpp143
-rwxr-xr-xsrc/tests/tstfuncs.cpp581
-rwxr-xr-xsrc/tests/xb_test_bcd.cpp128
-rwxr-xr-xsrc/tests/xb_test_date.cpp189
-rwxr-xr-xsrc/tests/xb_test_dbf_v3_memos.cpp233
-rwxr-xr-xsrc/tests/xb_test_dbf_v3_nomemos.cpp323
-rwxr-xr-xsrc/tests/xb_test_dbf_v4_memos.cpp335
-rwxr-xr-xsrc/tests/xb_test_dbf_v4_nomemos.cpp330
-rwxr-xr-xsrc/tests/xb_test_expnode.cpp123
-rwxr-xr-xsrc/tests/xb_test_expression.cpp791
-rwxr-xr-xsrc/tests/xb_test_file.cpp212
-rwxr-xr-xsrc/tests/xb_test_filter.cpp185
-rwxr-xr-xsrc/tests/xb_test_funcs.cpp288
-rwxr-xr-xsrc/tests/xb_test_linklist.cpp340
-rwxr-xr-xsrc/tests/xb_test_lock.cpp874
-rwxr-xr-xsrc/tests/xb_test_lock2.cpp208
-rwxr-xr-xsrc/tests/xb_test_log.cpp88
-rwxr-xr-xsrc/tests/xb_test_mdx.cpp243
-rwxr-xr-xsrc/tests/xb_test_ndx.cpp330
-rwxr-xr-xsrc/tests/xb_test_ndx2.cpp145
-rwxr-xr-xsrc/tests/xb_test_sql.cpp107
-rwxr-xr-xsrc/tests/xb_test_string.cpp397
-rwxr-xr-xsrc/tests/xb_test_tblmgr.cpp167
-rwxr-xr-xsrc/tests/xb_test_uda.cpp98
-rwxr-xr-xsrc/tests/xb_test_xbase.cpp106
-rwxr-xr-xsrc/utils/checkndx.cpp (renamed from bin/checkndx.cpp)21
-rwxr-xr-xsrc/utils/dbfxtrct.cpp (renamed from bin/dbfxtrct.cpp)22
-rwxr-xr-xsrc/utils/preamble.txt19
-rwxr-xr-xsrc/utils/reindex.cpp (renamed from bin/reindex.cpp)37
-rwxr-xr-xsrc/utils/xb_cfg_check.cpp370
-rwxr-xr-xsrc/utils/xb_copydbf.cpp62
-rwxr-xr-xsrc/utils/xb_dbfutil.cpp3719
-rwxr-xr-xsrc/utils/xb_deletall.cpp55
-rwxr-xr-xsrc/utils/xb_dumpdbt.cpp87
-rwxr-xr-xsrc/utils/xb_dumphdr.cpp45
-rwxr-xr-xsrc/utils/xb_dumpix.cpp56
-rwxr-xr-xsrc/utils/xb_dumprecs.cpp62
-rwxr-xr-xsrc/utils/xb_execsql.cpp95
-rwxr-xr-xsrc/utils/xb_pack.cpp55
-rwxr-xr-xsrc/utils/xb_tblinfo.cpp91
-rwxr-xr-xsrc/utils/xb_undelall.cpp55
-rwxr-xr-xsrc/utils/xb_zap.cpp52
-rwxr-xr-xtodo123
-rwxr-xr-xxbase64-config.in74
-rwxr-xr-xxbase64.spec.in67
-rwxr-xr-xxbase64/Makefile.am55
-rwxr-xr-xxbase64/Makefile.in475
-rwxr-xr-xxbase64/makebcc.bat32
-rwxr-xr-xxbase64/xbase64.cpp766
-rwxr-xr-xxbase64/xbase64.h239
-rwxr-xr-xxbase64/xbcdx.cpp113
-rwxr-xr-xxbase64/xbcdx.h150
-rw-r--r--xbase64/xbconfig.h131
-rwxr-xr-xxbase64/xbconfig.in130
-rwxr-xr-xxbase64/xbdate.cpp851
-rwxr-xr-xxbase64/xbdate.h278
-rwxr-xr-xxbase64/xbdbf.cpp2671
-rwxr-xr-xxbase64/xbdbf.h533
-rwxr-xr-xxbase64/xbexp.cpp1323
-rwxr-xr-xxbase64/xbexp.h290
-rwxr-xr-xxbase64/xbexpfnc.cpp1092
-rwxr-xr-xxbase64/xbexpprc.cpp549
-rwxr-xr-xxbase64/xbfields.cpp672
-rwxr-xr-xxbase64/xbfile.cpp69
-rwxr-xr-xxbase64/xbfile.h70
-rwxr-xr-xxbase64/xbfilter.cpp231
-rwxr-xr-xxbase64/xbfilter.h75
-rwxr-xr-xxbase64/xbindex.cpp220
-rwxr-xr-xxbase64/xbindex.h137
-rwxr-xr-xxbase64/xblock.cpp580
-rwxr-xr-xxbase64/xblock.h159
-rwxr-xr-xxbase64/xbmemo.cpp1173
-rwxr-xr-xxbase64/xbmindex.h14
-rwxr-xr-xxbase64/xbndx.cpp2402
-rwxr-xr-xxbase64/xbndx.h292
-rwxr-xr-xxbase64/xbnode.cpp6
-rwxr-xr-xxbase64/xbnode.h19
-rwxr-xr-xxbase64/xbntx.cpp2604
-rwxr-xr-xxbase64/xbntx.h213
-rwxr-xr-xxbase64/xbretcod.h99
-rwxr-xr-xxbase64/xbstring.cpp1041
-rwxr-xr-xxbase64/xbstring.h145
-rwxr-xr-xxbase64/xbtypes.h99
-rwxr-xr-xxbase64/xbwincfg.h82
862 files changed, 133911 insertions, 59229 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100755
index 0000000..16b8731
--- /dev/null
+++ b/AUTHORS
Binary files differ
diff --git a/COPYING b/COPYING
new file mode 100755
index 0000000..01ac73a
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,688 @@
+
+The XBase library itself is released under the GNU Lesser General Public
+License, see the text of the GNU LGPL below.
+
+The executable programs in the bin, examples, and libtest directories
+are release under the GNU General Public License, see the text of the
+GNU GPL below.
+
+Any licensing questions should be directed to XDB-devel@lists.sourceforge.net
+
+
+-------------------------------------------------------------------------
+
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/ChangeLog b/ChangeLog
deleted file mode 100755
index fbb8ccb..0000000
--- a/ChangeLog
+++ /dev/null
@@ -1,8 +0,0 @@
-2003-09-15 Gary Kunkel <gkunkel@zhsac.com>
-
- * branched xbase off of current tree and renamed to xbase64
- - added 64 bit file support
- - fixes to multi user windows record and file locking
- - changed license to GPL instead of LGPL as recommended by GNU web site
- - added data type XB_BOOL
- - updated documentation
diff --git a/INSTALL b/INSTALL
new file mode 100755
index 0000000..31815e0
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,6 @@
+Basic Installation
+==================
+
+See Chapter 1 in the manual on getting started.
+
+docs/html/xbc1.htm
diff --git a/Makefile.am b/Makefile.am
deleted file mode 100755
index 8bd0414..0000000
--- a/Makefile.am
+++ /dev/null
@@ -1,48 +0,0 @@
-# $Id: Makefile.am,v 1.11 2001/06/27 04:36:44 gkunkel $
-#
-## Process this file with automake to produce Makefile.in
-##
-# This file is part of the xbase64 libraries
-# Copyright (C) 1998 Denis Pershin (dyp@inetlab.com)
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Contact:
-#
-# Email:
-#
-# xbase64-dev@techass.com
-#
-#
-
-SUBDIRS = @XSUBDIRS@
-
-MAINTAINERCLEANFILES = Makefile.in configure aclocal.m4 libtool
-
-# not currently working - left behing in release 2.0 for now
-#EXTRA_DIST = makefile.g95
-
-
-bin_SCRIPTS = xbase64-config
-
-rpm : dist
- cp xbase64-@VERSION@.tar.gz /usr/src/redhat/SOURCES
- cp xbase64.spec /usr/src/redhat/SPECS
- (cd /usr/src/redhat/SPECS ; rpm -ba --clean xbase64.spec)
-
-docs :
- (cd docs ; make docs)
-
-.PHONY : docs \ No newline at end of file
diff --git a/Makefile.in b/Makefile.in
deleted file mode 100755
index 8ffbd3c..0000000
--- a/Makefile.in
+++ /dev/null
@@ -1,499 +0,0 @@
-# Makefile.in generated by automake 1.6.3 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# $Id: Makefile.am,v 1.11 2001/06/27 04:36:44 gkunkel $
-#
-# This file is part of the xbase64 libraries
-# Copyright (C) 1998 Denis Pershin (dyp@inetlab.com)
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Contact:
-#
-# Email:
-#
-# xbase64-dev@techass.com
-#
-#
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = .
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = @program_transform_name@
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-
-EXEEXT = @EXEEXT@
-OBJEXT = @OBJEXT@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-AMTAR = @AMTAR@
-AS = @AS@
-AWK = @AWK@
-CC = @CC@
-CXX = @CXX@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
-GXXVER = @GXXVER@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-RELEASE = @RELEASE@
-RHREL = @RHREL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XSUBDIRS = @XSUBDIRS@
-am__include = @am__include@
-am__quote = @am__quote@
-doxygen = @doxygen@
-install_sh = @install_sh@
-topdir = @topdir@
-
-SUBDIRS = @XSUBDIRS@
-
-MAINTAINERCLEANFILES = Makefile.in configure aclocal.m4 libtool
-
-
-# not currently working - left behing in release 2.0 for now
-#EXTRA_DIST = makefile.g95
-bin_SCRIPTS = xbase64-config
-subdir = .
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/xbase64/xbconfig.h
-CONFIG_CLEAN_FILES = xbase64-config xbase64.spec
-SCRIPTS = $(bin_SCRIPTS)
-
-DIST_SOURCES =
-
-RECURSIVE_TARGETS = info-recursive dvi-recursive install-info-recursive \
- uninstall-info-recursive all-recursive install-data-recursive \
- install-exec-recursive installdirs-recursive install-recursive \
- uninstall-recursive check-recursive installcheck-recursive
-DIST_COMMON = README AUTHORS COPYING ChangeLog INSTALL Makefile.am \
- Makefile.in NEWS TODO aclocal.m4 config.guess config.sub \
- configure configure.in depcomp install-sh ltconfig ltmain.sh \
- missing mkinstalldirs xbase64-config.in xbase64.spec.in
-DIST_SUBDIRS = $(SUBDIRS)
-all: all-recursive
-
-.SUFFIXES:
-
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && \
- $(AUTOMAKE) --gnu Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)
-
-$(top_builddir)/config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
- $(SHELL) ./config.status --recheck
-$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
- cd $(srcdir) && $(AUTOCONF)
-
-$(ACLOCAL_M4): configure.in
- cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-xbase64-config: $(top_builddir)/config.status xbase64-config.in
- cd $(top_builddir) && $(SHELL) ./config.status $@
-xbase64.spec: $(top_builddir)/config.status xbase64.spec.in
- cd $(top_builddir) && $(SHELL) ./config.status $@
-binSCRIPT_INSTALL = $(INSTALL_SCRIPT)
-install-binSCRIPTS: $(bin_SCRIPTS)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(bindir)
- @list='$(bin_SCRIPTS)'; for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- if test -f $$d$$p; then \
- f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
- echo " $(binSCRIPT_INSTALL) $$d$$p $(DESTDIR)$(bindir)/$$f"; \
- $(binSCRIPT_INSTALL) $$d$$p $(DESTDIR)$(bindir)/$$f; \
- else :; fi; \
- done
-
-uninstall-binSCRIPTS:
- @$(NORMAL_UNINSTALL)
- @list='$(bin_SCRIPTS)'; for p in $$list; do \
- f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \
- echo " rm -f $(DESTDIR)$(bindir)/$$f"; \
- rm -f $(DESTDIR)$(bindir)/$$f; \
- done
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
- -rm -f libtool
-uninstall-info-am:
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-# (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
- @set fnord $$MAKEFLAGS; amf=$$2; \
- dot_seen=no; \
- target=`echo $@ | sed s/-recursive//`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- dot_seen=yes; \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
- done; \
- if test "$$dot_seen" = "no"; then \
- $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
- fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
- @set fnord $$MAKEFLAGS; amf=$$2; \
- dot_seen=no; \
- case "$@" in \
- distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
- *) list='$(SUBDIRS)' ;; \
- esac; \
- rev=''; for subdir in $$list; do \
- if test "$$subdir" = "."; then :; else \
- rev="$$subdir $$rev"; \
- fi; \
- done; \
- rev="$$rev ."; \
- target=`echo $@ | sed s/-recursive//`; \
- for subdir in $$rev; do \
- echo "Making $$target in $$subdir"; \
- if test "$$subdir" = "."; then \
- local_target="$$target-am"; \
- else \
- local_target="$$target"; \
- fi; \
- (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
- || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
- done && test -z "$$fail"
-tags-recursive:
- list='$(SUBDIRS)'; for subdir in $$list; do \
- test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
- done
-
-ETAGS = etags
-ETAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- mkid -fID $$unique
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \
- fi; \
- done; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$tags$$unique" \
- || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = .
-distdir = $(PACKAGE)-$(VERSION)
-
-am__remove_distdir = \
- { test ! -d $(distdir) \
- || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
- && rm -fr $(distdir); }; }
-
-GZIP_ENV = --best
-distcleancheck_listfiles = find . -type f -print
-
-distdir: $(DISTFILES)
- $(am__remove_distdir)
- mkdir $(distdir)
- $(mkinstalldirs) $(distdir)/. $(distdir)/docs
- @list='$(DISTFILES)'; for file in $$list; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
- dir="/$$dir"; \
- $(mkinstalldirs) "$(distdir)$$dir"; \
- else \
- dir=''; \
- fi; \
- if test -d $$d/$$file; then \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
- else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
- || exit 1; \
- fi; \
- done
- list='$(SUBDIRS)'; for subdir in $$list; do \
- if test "$$subdir" = .; then :; else \
- test -d $(distdir)/$$subdir \
- || mkdir $(distdir)/$$subdir \
- || exit 1; \
- (cd $$subdir && \
- $(MAKE) $(AM_MAKEFLAGS) \
- top_distdir="$(top_distdir)" \
- distdir=../$(distdir)/$$subdir \
- distdir) \
- || exit 1; \
- fi; \
- done
- -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
- ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
- ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
- ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
- || chmod -R a+r $(distdir)
-dist-gzip: distdir
- $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- $(am__remove_distdir)
-
-dist dist-all: distdir
- $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
- $(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration. Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
- $(am__remove_distdir)
- GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf -
- chmod -R a-w $(distdir); chmod a+w $(distdir)
- mkdir $(distdir)/=build
- mkdir $(distdir)/=inst
- chmod a-w $(distdir)
- dc_install_base=`$(am__cd) $(distdir)/=inst && pwd` \
- && cd $(distdir)/=build \
- && ../configure --srcdir=.. --prefix=$$dc_install_base \
- $(DISTCHECK_CONFIGURE_FLAGS) \
- && $(MAKE) $(AM_MAKEFLAGS) \
- && $(MAKE) $(AM_MAKEFLAGS) dvi \
- && $(MAKE) $(AM_MAKEFLAGS) check \
- && $(MAKE) $(AM_MAKEFLAGS) install \
- && $(MAKE) $(AM_MAKEFLAGS) installcheck \
- && $(MAKE) $(AM_MAKEFLAGS) uninstall \
- && (test `find $$dc_install_base -type f -print | wc -l` -le 1 \
- || { echo "ERROR: files left after uninstall:" ; \
- find $$dc_install_base -type f -print ; \
- exit 1; } >&2 ) \
- && $(MAKE) $(AM_MAKEFLAGS) dist-gzip \
- && rm -f $(distdir).tar.gz \
- && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
- $(am__remove_distdir)
- @echo "$(distdir).tar.gz is ready for distribution" | \
- sed 'h;s/./=/g;p;x;p;x'
-distcleancheck: distclean
- if test '$(srcdir)' = . ; then \
- echo "ERROR: distcleancheck can only run from a VPATH build" ; \
- exit 1 ; \
- fi
- test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
- || { echo "ERROR: files left after distclean:" ; \
- $(distcleancheck_listfiles) ; \
- exit 1; } >&2
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(SCRIPTS)
-installdirs: installdirs-recursive
-installdirs-am:
- $(mkinstalldirs) $(DESTDIR)$(bindir)
-
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
- -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-recursive
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-recursive
- -rm -f $(am__CONFIG_DISTCLEAN_FILES)
-distclean-am: clean-am distclean-generic distclean-libtool \
- distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-info: info-recursive
-
-info-am:
-
-install-data-am:
-
-install-exec-am: install-binSCRIPTS
-
-install-info: install-info-recursive
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
- -rm -f $(am__CONFIG_DISTCLEAN_FILES)
- -rm -rf autom4te.cache
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-uninstall-am: uninstall-binSCRIPTS uninstall-info-am
-
-uninstall-info: uninstall-info-recursive
-
-.PHONY: $(RECURSIVE_TARGETS) GTAGS all all-am check check-am clean \
- clean-generic clean-libtool clean-recursive dist dist-all \
- dist-gzip distcheck distclean distclean-generic \
- distclean-libtool distclean-recursive distclean-tags \
- distcleancheck distdir dvi dvi-am dvi-recursive info info-am \
- info-recursive install install-am install-binSCRIPTS \
- install-data install-data-am install-data-recursive \
- install-exec install-exec-am install-exec-recursive \
- install-info install-info-am install-info-recursive install-man \
- install-recursive install-strip installcheck installcheck-am \
- installdirs installdirs-am installdirs-recursive \
- maintainer-clean maintainer-clean-generic \
- maintainer-clean-recursive mostlyclean mostlyclean-generic \
- mostlyclean-libtool mostlyclean-recursive tags tags-recursive \
- uninstall uninstall-am uninstall-binSCRIPTS uninstall-info-am \
- uninstall-info-recursive uninstall-recursive
-
-
-rpm : dist
- cp xbase64-@VERSION@.tar.gz /usr/src/redhat/SOURCES
- cp xbase64.spec /usr/src/redhat/SPECS
- (cd /usr/src/redhat/SPECS ; rpm -ba --clean xbase64.spec)
-
-docs :
- (cd docs ; make docs)
-
-.PHONY : docs
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/news b/NEWS
index e0e117a..66fd658 100755
--- a/news
+++ b/NEWS
@@ -1,3 +1,29 @@
+Xbase64 (Nov 27, 2022)
+------------------------
+
+The library has been refreshed with release 4.0.1
+
+
+4.0.2 - 12/15/22 Documentation cleanup and updates.
+
+
+4.0.1 - 11/22/22 Rerwrite of core library.
+
+1) 32/64 bit support.
+2) Big Endian or Little Endian support.
+3) Updates for error handling and exception processing.
+4) DBF III and DBF IV support.
+5) NDX, MDX index support.
+6) DBT Memo file support for both version III and version IV files.
+7) Updates and fixes to record and file locking.
+8) Support for logfile generation
+9) The beginnings of SQL support.
+10) CDX and NTX index support which was available in earlier releases
+ is still pending inclusion in the latest library rewrite.
+
+
+
+
Xbase64 (Sept 15, 2003)
------------------------
@@ -20,10 +46,10 @@ There are significant changes in this release.
interface, and the ybase directory. These are either unused, not working,
undocumented, not maintained, or I didn't have authority to change the
license from LGPL to GPL.
-
+
5) Didn't move make files forward that were not documented or working.
These need to be reviewed and brought forward.
-
+
6) Worked on the locking logic.
7) Added support for Borland C++ 5.x compiler.
@@ -34,9 +60,9 @@ There are significant changes in this release.
9) Dropped support for XB_CASTELLANO dates. Changed the logic to use
system locale settings, this supports descriptive dates in different
languages.
-
+
10) Cleaned up memory leaks.
-
+
11) Updates to the documentation.
12) Enhancements to the expression logic
diff --git a/README b/README
new file mode 100755
index 0000000..5ba316c
--- /dev/null
+++ b/README
@@ -0,0 +1,46 @@
+ Xbase64 Version 4.0.1
+ 11/28/22
+
+
+WHAT IS IT?
+-----------
+
+Xbase64 is an xbase (i.e. dBase, FoxPro, etc.) compatible C++ class library
+originally by Gary Kunkel and others (see the AUTHORS file).
+
+Xbase64 is useful for accessing data in legacy dBase 3 and 4 database files as
+well as a general light-weight database engine. It includes support for
+DBF (dBase version 3 and 4) data files, NDX and MDX indices and DBT (dBase version 3 and 4).
+It supports file and record locking under *nix and Windows.
+
+
+DIRECTORY LAYOUT
+----------------
+
+ /build/borland5.5 Build library for Borland 5.5 environment
+ /build/linux32 Build library for Linux 32 bit environment
+ /build/linux64 Build library for Linux 64 bit environment
+ /build/mac64 Build library for Mac 64 bit environment
+ /build/win32vs Build library for Windows 32 bit Visual Studio environment
+ /build/win64vs Build library for Windows 64 bit Visual Studio environment
+
+ /data Folder for database files
+ /docs Library documentation
+ /logs Log files
+ /sql SQL files
+ /src Library source code
+
+
+
+Starting point
+--------------
+
+ docs/html/index.htm
+
+
+
+
+Please email comments, bug reports, and patches to Gary Kunkel
+xdb-dev@lists.sourceforge.net
+
+
diff --git a/TODO b/TODO
new file mode 100755
index 0000000..f700fb0
--- /dev/null
+++ b/TODO
@@ -0,0 +1,34 @@
+
+XBase 64 todo list as of 11/28/22
+
+Xbase64 TODO's (not necessarily in this order!)
+-----------------------------------------------
+
+
+1) Additional index support
+ - NTX - bring legacy code forward
+ - CDX - bring legacy code forward
+ - IDX - develop
+
+
+2) SQL support
+
+
+3) Support for DBase Version 5 files
+
+
+4) Transaction support
+ Create a logging routine -
+ put hooks in the PutRecord function to log data
+
+
+5) Real deletes
+
+ - analysis
+ - test this functionality
+ - incorporate into dbfutil1
+ - update documentation
+ - impact on indices
+
+
+6) Block reads
diff --git a/aclocal.m4 b/aclocal.m4
deleted file mode 100755
index bf9ed34..0000000
--- a/aclocal.m4
+++ /dev/null
@@ -1,4328 +0,0 @@
-# aclocal.m4 generated automatically by aclocal 1.6.3 -*- Autoconf -*-
-
-# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-# Do all the work for Automake. -*- Autoconf -*-
-
-# This macro actually does too much some checks are only needed if
-# your package does certain things. But this isn't really a big deal.
-
-# Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# serial 8
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery. Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-AC_PREREQ([2.52])
-
-# Autoconf 2.50 wants to disallow AM_ names. We explicitly allow
-# the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out. PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition. After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
- AC_REQUIRE([AC_PROG_INSTALL])dnl
-# test to see if srcdir already configured
-if test "`cd $srcdir && pwd`" != "`pwd`" &&
- test -f $srcdir/config.status; then
- AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-fi
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
- AC_SUBST([PACKAGE], [AC_PACKAGE_TARNAME])dnl
- AC_SUBST([VERSION], [AC_PACKAGE_VERSION])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AM_MISSING_PROG(AMTAR, tar)
-AM_PROG_INSTALL_SH
-AM_PROG_INSTALL_STRIP
-# We need awk for the "check" target. The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_][CC],
- [_AM_DEPENDENCIES(CC)],
- [define([AC_PROG_][CC],
- defn([AC_PROG_][CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_][CXX],
- [_AM_DEPENDENCIES(CXX)],
- [define([AC_PROG_][CXX],
- defn([AC_PROG_][CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-])
-])
-
-# Copyright 2002 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-AC_DEFUN([AM_AUTOMAKE_VERSION],[am__api_version="1.6"])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION so it can be traced.
-# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
- [AM_AUTOMAKE_VERSION([1.6.3])])
-
-# Helper functions for option handling. -*- Autoconf -*-
-
-# Copyright 2001, 2002 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# serial 2
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME. Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-#
-# Check to make sure that the build environment is sane.
-#
-
-# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# serial 3
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments. Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
- set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
- if test "$[*]" = "X"; then
- # -L didn't work.
- set X `ls -t $srcdir/configure conftest.file`
- fi
- rm -f conftest.file
- if test "$[*]" != "X $srcdir/configure conftest.file" \
- && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
-alias in your environment])
- fi
-
- test "$[2]" = conftest.file
- )
-then
- # Ok.
- :
-else
- AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# -*- Autoconf -*-
-
-
-# Copyright 1997, 1999, 2000, 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# serial 3
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
- am_missing_run="$MISSING --run "
-else
- am_missing_run=
- AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# AM_AUX_DIR_EXPAND
-
-# Copyright 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory. The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run. This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-# fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-# fails if $ac_aux_dir is absolute,
-# fails when called from a subdirectory in a VPATH build with
-# a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir. In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
-# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-# MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH. The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-# Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])
-
-AC_DEFUN([AM_AUX_DIR_EXPAND], [
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-
-# Copyright 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-install_sh=${install_sh-"$am_aux_dir/install-sh"}
-AC_SUBST(install_sh)])
-
-# AM_PROG_INSTALL_STRIP
-
-# Copyright 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries. This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'. However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
- AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# serial 4 -*- Autoconf -*-
-
-# Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery. Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
- [$1], CXX, [depcc="$CXX" am_compiler_list=],
- [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
- [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
- [depcc="$$1" am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
- [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
-
- am_cv_$1_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
- fi
- for depmode in $am_compiler_list; do
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- echo '#include "conftest.h"' > conftest.c
- echo 'int i;' > conftest.h
- echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf
-
- case $depmode in
- nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- none) break ;;
- esac
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this.
- if depmode=$depmode \
- source=conftest.c object=conftest.o \
- depfile=conftest.Po tmpdepfile=conftest.TPo \
- $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 &&
- grep conftest.h conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- am_cv_$1_dependencies_compiler_type=$depmode
- break
- fi
- done
-
- cd ..
- rm -rf conftest.dir
-else
- am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[rm -f .deps 2>/dev/null
-mkdir .deps 2>/dev/null
-if test -d .deps; then
- DEPDIR=.deps
-else
- # MS-DOS does not allow filenames that begin with a dot.
- DEPDIR=_deps
-fi
-rmdir .deps 2>/dev/null
-AC_SUBST([DEPDIR])
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[ --disable-dependency-tracking Speeds up one-time builds
- --enable-dependency-tracking Do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
- am_depcomp="$ac_aux_dir/depcomp"
- AMDEPBACKSLASH='\'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])
-])
-
-# Generate code to set up dependency tracking. -*- Autoconf -*-
-
-# Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-#serial 2
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[for mf in $CONFIG_FILES; do
- # Strip MF so we end up with the name of the file.
- mf=`echo "$mf" | sed -e 's/:.*$//'`
- # Check whether this is an Automake generated Makefile or not.
- # We used to match only the files named `Makefile.in', but
- # some people rename them; so instead we look at the file content.
- # Grep'ing the first line is not enough: some people post-process
- # each Makefile.in and add a new line on top of each file to say so.
- # So let's grep whole file.
- if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
- dirpart=`AS_DIRNAME("$mf")`
- else
- continue
- fi
- grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue
- # Extract the definition of DEP_FILES from the Makefile without
- # running `make'.
- DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
- test -z "$DEPDIR" && continue
- # When using ansi2knr, U may be empty or an underscore; expand it
- U=`sed -n -e '/^U = / s///p' < "$mf"`
- test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
- # We invoke sed twice because it is the simplest approach to
- # changing $(DEPDIR) to its actual value in the expansion.
- for file in `sed -n -e '
- /^DEP_FILES = .*\\\\$/ {
- s/^DEP_FILES = //
- :loop
- s/\\\\$//
- p
- n
- /\\\\$/ b loop
- p
- }
- /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
- # Make sure the directory exists.
- test -f "$dirpart/$file" && continue
- fdir=`AS_DIRNAME(["$file"])`
- AS_MKDIR_P([$dirpart/$fdir])
- # echo "creating $dirpart/$file"
- echo '# dummy' > "$dirpart/$file"
- done
-done
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled. FIXME. This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
- [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
- [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Copyright 2001 Free Software Foundation, Inc. -*- Autoconf -*-
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# serial 2
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-doit:
- @echo done
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# We grep out `Entering directory' and `Leaving directory'
-# messages which can occur if `w' ends up in MAKEFLAGS.
-# In particular we don't look at `^make:' because GNU make might
-# be invoked under some other name (usually "gmake"), in which
-# case it prints its new name instead of `make'.
-if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then
- am__include=include
- am__quote=
- _am_result=GNU
-fi
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
- echo '.include "confinc"' > confmf
- if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
- am__include=.include
- am__quote="\""
- _am_result=BSD
- fi
-fi
-AC_SUBST(am__include)
-AC_SUBST(am__quote)
-AC_MSG_RESULT($_am_result)
-rm -f confinc confmf
-])
-
-# AM_CONDITIONAL -*- Autoconf -*-
-
-# Copyright 1997, 2000, 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# serial 5
-
-AC_PREREQ(2.52)
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
- [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])
-AC_SUBST([$1_FALSE])
-if $2; then
- $1_TRUE=
- $1_FALSE='#'
-else
- $1_TRUE='#'
- $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
- AC_MSG_ERROR([conditional \"$1\" was never defined.
-Usually this means the macro was only invoked conditionally.])
-fi])])
-
-# Like AC_CONFIG_HEADER, but automatically create stamp file. -*- Autoconf -*-
-
-# Copyright 1996, 1997, 2000, 2001 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-AC_PREREQ([2.52])
-
-# serial 6
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated. We must strip everything past the first ":",
-# and everything past the last "/".
-
-# _AM_DIRNAME(PATH)
-# -----------------
-# Like AS_DIRNAME, only do it during macro expansion
-AC_DEFUN([_AM_DIRNAME],
- [m4_if(regexp([$1], [^.*[^/]//*[^/][^/]*/*$]), -1,
- m4_if(regexp([$1], [^//\([^/]\|$\)]), -1,
- m4_if(regexp([$1], [^/.*]), -1,
- [.],
- patsubst([$1], [^\(/\).*], [\1])),
- patsubst([$1], [^\(//\)\([^/].*\|$\)], [\1])),
- patsubst([$1], [^\(.*[^/]\)//*[^/][^/]*/*$], [\1]))[]dnl
-])# _AM_DIRNAME
-
-
-# The stamp files are numbered to have different names.
-# We could number them on a directory basis, but that's additional
-# complications, let's have a unique counter.
-m4_define([_AM_STAMP_Count], [0])
-
-
-# _AM_STAMP(HEADER)
-# -----------------
-# The name of the stamp file for HEADER.
-AC_DEFUN([_AM_STAMP],
-[m4_define([_AM_STAMP_Count], m4_incr(_AM_STAMP_Count))dnl
-AS_ESCAPE(_AM_DIRNAME(patsubst([$1],
- [:.*])))/stamp-h[]_AM_STAMP_Count])
-
-
-# _AM_CONFIG_HEADER(HEADER[:SOURCES], COMMANDS, INIT-COMMANDS)
-# ------------------------------------------------------------
-# We used to try to get a real timestamp in stamp-h. But the fear is that
-# that will cause unnecessary cvs conflicts.
-AC_DEFUN([_AM_CONFIG_HEADER],
-[# Add the stamp file to the list of files AC keeps track of,
-# along with our hook.
-AC_CONFIG_HEADERS([$1],
- [# update the timestamp
-echo 'timestamp for $1' >"_AM_STAMP([$1])"
-$2],
- [$3])
-])# _AM_CONFIG_HEADER
-
-
-# AM_CONFIG_HEADER(HEADER[:SOURCES]..., COMMANDS, INIT-COMMANDS)
-# --------------------------------------------------------------
-AC_DEFUN([AM_CONFIG_HEADER],
-[AC_FOREACH([_AM_File], [$1], [_AM_CONFIG_HEADER(_AM_File, [$2], [$3])])
-])# AM_CONFIG_HEADER
-
-# libtool.m4 - Configure libtool for the host system. -*-Shell-script-*-
-
-# serial 46 AC_PROG_LIBTOOL
-
-AC_DEFUN([AC_PROG_LIBTOOL],
-[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-AC_SUBST(LIBTOOL)dnl
-
-# Prevent multiple expansion
-define([AC_PROG_LIBTOOL], [])
-])
-
-AC_DEFUN([AC_LIBTOOL_SETUP],
-[AC_PREREQ(2.13)dnl
-AC_REQUIRE([AC_ENABLE_SHARED])dnl
-AC_REQUIRE([AC_ENABLE_STATIC])dnl
-AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_PROG_LD])dnl
-AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
-AC_REQUIRE([AC_PROG_NM])dnl
-AC_REQUIRE([AC_PROG_LN_S])dnl
-AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
-AC_REQUIRE([AC_OBJEXT])dnl
-AC_REQUIRE([AC_EXEEXT])dnl
-dnl
-
-_LT_AC_PROG_ECHO_BACKSLASH
-# Only perform the check for file, if the check method requires it
-case $deplibs_check_method in
-file_magic*)
- if test "$file_magic_cmd" = '$MAGIC_CMD'; then
- AC_PATH_MAGIC
- fi
- ;;
-esac
-
-AC_CHECK_TOOL(RANLIB, ranlib, :)
-AC_CHECK_TOOL(STRIP, strip, :)
-
-ifdef([AC_PROVIDE_AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
-ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
-enable_win32_dll=yes, enable_win32_dll=no)
-
-AC_ARG_ENABLE(libtool-lock,
- [ --disable-libtool-lock avoid locking (might break parallel builds)])
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-*-*-irix6*)
- # Find out which ABI we are using.
- echo '[#]line __oline__ "configure"' > conftest.$ac_ext
- if AC_TRY_EVAL(ac_compile); then
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -32"
- ;;
- *N32*)
- LD="${LD-ld} -n32"
- ;;
- *64-bit*)
- LD="${LD-ld} -64"
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-
-*-*-sco3.2v5*)
- # On SCO OpenServer 5, we need -belf to get full-featured binaries.
- SAVE_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -belf"
- AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
- [AC_LANG_SAVE
- AC_LANG_C
- AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
- AC_LANG_RESTORE])
- if test x"$lt_cv_cc_needs_belf" != x"yes"; then
- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
- CFLAGS="$SAVE_CFLAGS"
- fi
- ;;
-
-ifdef([AC_PROVIDE_AC_LIBTOOL_WIN32_DLL],
-[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
- AC_CHECK_TOOL(DLLTOOL, dlltool, false)
- AC_CHECK_TOOL(AS, as, false)
- AC_CHECK_TOOL(OBJDUMP, objdump, false)
-
- # recent cygwin and mingw systems supply a stub DllMain which the user
- # can override, but on older systems we have to supply one
- AC_CACHE_CHECK([if libtool should supply DllMain function], lt_cv_need_dllmain,
- [AC_TRY_LINK([],
- [extern int __attribute__((__stdcall__)) DllMain(void*, int, void*);
- DllMain (0, 0, 0);],
- [lt_cv_need_dllmain=no],[lt_cv_need_dllmain=yes])])
-
- case $host/$CC in
- *-*-cygwin*/gcc*-mno-cygwin*|*-*-mingw*)
- # old mingw systems require "-dll" to link a DLL, while more recent ones
- # require "-mdll"
- SAVE_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -mdll"
- AC_CACHE_CHECK([how to link DLLs], lt_cv_cc_dll_switch,
- [AC_TRY_LINK([], [], [lt_cv_cc_dll_switch=-mdll],[lt_cv_cc_dll_switch=-dll])])
- CFLAGS="$SAVE_CFLAGS" ;;
- *-*-cygwin* | *-*-pw32*)
- # cygwin systems need to pass --dll to the linker, and not link
- # crt.o which will require a WinMain@16 definition.
- lt_cv_cc_dll_switch="-Wl,--dll -nostartfiles" ;;
- esac
- ;;
- ])
-esac
-
-_LT_AC_LTCONFIG_HACK
-
-])
-
-# AC_LIBTOOL_HEADER_ASSERT
-# ------------------------
-AC_DEFUN([AC_LIBTOOL_HEADER_ASSERT],
-[AC_CACHE_CHECK([whether $CC supports assert without backlinking],
- [lt_cv_func_assert_works],
- [case $host in
- *-*-solaris*)
- if test "$GCC" = yes && test "$with_gnu_ld" != yes; then
- case `$CC --version 2>/dev/null` in
- [[12]].*) lt_cv_func_assert_works=no ;;
- *) lt_cv_func_assert_works=yes ;;
- esac
- fi
- ;;
- esac])
-
-if test "x$lt_cv_func_assert_works" = xyes; then
- AC_CHECK_HEADERS(assert.h)
-fi
-])# AC_LIBTOOL_HEADER_ASSERT
-
-# _LT_AC_CHECK_DLFCN
-# --------------------
-AC_DEFUN([_LT_AC_CHECK_DLFCN],
-[AC_CHECK_HEADERS(dlfcn.h)
-])# _LT_AC_CHECK_DLFCN
-
-# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-# ---------------------------------
-AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
-[AC_REQUIRE([AC_CANONICAL_HOST])
-AC_REQUIRE([AC_PROG_NM])
-AC_REQUIRE([AC_OBJEXT])
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-AC_MSG_CHECKING([command to parse $NM output])
-AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], [dnl
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix. What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[[BCDEGRST]]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
-
-# Transform the above into a raw symbol and a C symbol.
-symxfrm='\1 \2\3 \3'
-
-# Transform an extracted symbol line into a proper C declaration
-lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
-
-# Define system-specific variables.
-case $host_os in
-aix*)
- symcode='[[BCDT]]'
- ;;
-cygwin* | mingw* | pw32*)
- symcode='[[ABCDGISTW]]'
- ;;
-hpux*) # Its linker distinguishes data from code symbols
- lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
- lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
- ;;
-irix*)
- symcode='[[BCDEGRST]]'
- ;;
-solaris* | sysv5*)
- symcode='[[BDT]]'
- ;;
-sysv4)
- symcode='[[DFNSTU]]'
- ;;
-esac
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $host_os in
-mingw*)
- opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
- ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
- symcode='[[ABCDGISTW]]'
-fi
-
-# Try without a prefix undercore, then with it.
-for ac_symprfx in "" "_"; do
-
- # Write the raw and C identifiers.
-lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
-
- # Check to see that the pipe works correctly.
- pipe_works=no
- rm -f conftest*
- cat > conftest.$ac_ext <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
-
- if AC_TRY_EVAL(ac_compile); then
- # Now try to grab the symbols.
- nlist=conftest.nm
- if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
- # Try sorting and uniquifying the output.
- if sort "$nlist" | uniq > "$nlist"T; then
- mv -f "$nlist"T "$nlist"
- else
- rm -f "$nlist"T
- fi
-
- # Make sure that we snagged all the symbols we need.
- if egrep ' nm_test_var$' "$nlist" >/dev/null; then
- if egrep ' nm_test_func$' "$nlist" >/dev/null; then
- cat <<EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EOF
- # Now generate the symbol file.
- eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext'
-
- cat <<EOF >> conftest.$ac_ext
-#if defined (__STDC__) && __STDC__
-# define lt_ptr void *
-#else
-# define lt_ptr char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
- const char *name;
- lt_ptr address;
-}
-lt_preloaded_symbols[[]] =
-{
-EOF
- sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext
- cat <<\EOF >> conftest.$ac_ext
- {0, (lt_ptr) 0}
-};
-
-#ifdef __cplusplus
-}
-#endif
-EOF
- # Now try linking the two files.
- mv conftest.$ac_objext conftstm.$ac_objext
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
- LIBS="conftstm.$ac_objext"
- CFLAGS="$CFLAGS$no_builtin_flag"
- if AC_TRY_EVAL(ac_link) && test -s conftest; then
- pipe_works=yes
- fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
- else
- echo "cannot find nm_test_func in $nlist" >&AC_FD_CC
- fi
- else
- echo "cannot find nm_test_var in $nlist" >&AC_FD_CC
- fi
- else
- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AC_FD_CC
- fi
- else
- echo "$progname: failed program was:" >&AC_FD_CC
- cat conftest.$ac_ext >&5
- fi
- rm -f conftest* conftst*
-
- # Do not use the global_symbol_pipe unless it works.
- if test "$pipe_works" = yes; then
- break
- else
- lt_cv_sys_global_symbol_pipe=
- fi
-done
-])
-global_symbol_pipe="$lt_cv_sys_global_symbol_pipe"
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
- global_symbol_to_cdecl=
- global_symbol_to_c_name_address=
-else
- global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl"
- global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address"
-fi
-if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address";
-then
- AC_MSG_RESULT(failed)
-else
- AC_MSG_RESULT(ok)
-fi
-]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
-
-# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
-# ---------------------------------
-AC_DEFUN([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR],
-[# Find the correct PATH separator. Usually this is `:', but
-# DJGPP uses `;' like DOS.
-if test "X${PATH_SEPARATOR+set}" != Xset; then
- UNAME=${UNAME-`uname 2>/dev/null`}
- case X$UNAME in
- *-DOS) lt_cv_sys_path_separator=';' ;;
- *) lt_cv_sys_path_separator=':' ;;
- esac
- PATH_SEPARATOR=$lt_cv_sys_path_separator
-fi
-])# _LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
-
-# _LT_AC_PROG_ECHO_BACKSLASH
-# --------------------------
-# Add some code to the start of the generated configure script which
-# will find an echo command which doesn't interpret backslashes.
-AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
-[ifdef([AC_DIVERSION_NOTICE], [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
- [AC_DIVERT_PUSH(NOTICE)])
-_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR
-
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$ECHO in
-X*--fallback-echo)
- # Remove one level of quotation (which was required for Make).
- ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
- ;;
-esac
-
-echo=${ECHO-echo}
-if test "X[$]1" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
-elif test "X[$]1" = X--fallback-echo; then
- # Avoid inline document here, it may be left over
- :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
- # Yippee, $echo works!
- :
-else
- # Restart under the correct shell.
- exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
-fi
-
-if test "X[$]1" = X--fallback-echo; then
- # used as fallback echo
- shift
- cat <<EOF
-$*
-EOF
- exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-
-if test -z "$ECHO"; then
-if test "X${echo_test_string+set}" != Xset; then
-# find a string as large as possible, as long as the shell can cope with it
- for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
- if (echo_test_string="`eval $cmd`") 2>/dev/null &&
- echo_test_string="`eval $cmd`" &&
- (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
- then
- break
- fi
- done
-fi
-
-if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- :
-else
- # The Solaris, AIX, and Digital Unix default echo programs unquote
- # backslashes. This makes it impossible to quote backslashes using
- # echo "$something" | sed 's/\\/\\\\/g'
- #
- # So, first we look for a working echo in the user's PATH.
-
- IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for dir in $PATH /usr/ucb; do
- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- echo="$dir/echo"
- break
- fi
- done
- IFS="$save_ifs"
-
- if test "X$echo" = Xecho; then
- # We didn't find a better echo, so look for alternatives.
- if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- # This shell has a builtin print -r that does the trick.
- echo='print -r'
- elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
- test "X$CONFIG_SHELL" != X/bin/ksh; then
- # If we have ksh, try running configure again with it.
- ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
- export ORIGINAL_CONFIG_SHELL
- CONFIG_SHELL=/bin/ksh
- export CONFIG_SHELL
- exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
- else
- # Try using printf.
- echo='printf %s\n'
- if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- # Cool, printf works
- :
- elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
- test "X$echo_testing_string" = 'X\t' &&
- echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
- export CONFIG_SHELL
- SHELL="$CONFIG_SHELL"
- export SHELL
- echo="$CONFIG_SHELL [$]0 --fallback-echo"
- elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
- test "X$echo_testing_string" = 'X\t' &&
- echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- echo="$CONFIG_SHELL [$]0 --fallback-echo"
- else
- # maybe with a smaller string...
- prev=:
-
- for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
- if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
- then
- break
- fi
- prev="$cmd"
- done
-
- if test "$prev" != 'sed 50q "[$]0"'; then
- echo_test_string=`eval $prev`
- export echo_test_string
- exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
- else
- # Oops. We lost completely, so just stick with echo.
- echo=echo
- fi
- fi
- fi
- fi
-fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-ECHO=$echo
-if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
- ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
-fi
-
-AC_SUBST(ECHO)
-AC_DIVERT_POP
-])# _LT_AC_PROG_ECHO_BACKSLASH
-
-# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
-# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
-# ------------------------------------------------------------------
-AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
-[if test "$cross_compiling" = yes; then :
- [$4]
-else
- AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<EOF
-[#line __oline__ "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- /* dlclose (self); */
- }
-
- exit (status);
-}]
-EOF
- if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) $1 ;;
- x$lt_dlneed_uscore) $2 ;;
- x$lt_unknown|x*) $3 ;;
- esac
- else :
- # compilation failed
- $3
- fi
-fi
-rm -fr conftest*
-])# _LT_AC_TRY_DLOPEN_SELF
-
-# AC_LIBTOOL_DLOPEN_SELF
-# -------------------
-AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
-[if test "x$enable_dlopen" != xyes; then
- enable_dlopen=unknown
- enable_dlopen_self=unknown
- enable_dlopen_self_static=unknown
-else
- lt_cv_dlopen=no
- lt_cv_dlopen_libs=
-
- case $host_os in
- beos*)
- lt_cv_dlopen="load_add_on"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
- ;;
-
- cygwin* | mingw* | pw32*)
- lt_cv_dlopen="LoadLibrary"
- lt_cv_dlopen_libs=
- ;;
-
- *)
- AC_CHECK_FUNC([shl_load],
- [lt_cv_dlopen="shl_load"],
- [AC_CHECK_LIB([dld], [shl_load],
- [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
- [AC_CHECK_FUNC([dlopen],
- [lt_cv_dlopen="dlopen"],
- [AC_CHECK_LIB([dl], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
- [AC_CHECK_LIB([svld], [dlopen],
- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
- [AC_CHECK_LIB([dld], [dld_link],
- [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
- ])
- ])
- ])
- ])
- ])
- ;;
- esac
-
- if test "x$lt_cv_dlopen" != xno; then
- enable_dlopen=yes
- else
- enable_dlopen=no
- fi
-
- case $lt_cv_dlopen in
- dlopen)
- save_CPPFLAGS="$CPPFLAGS"
- AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
- save_LDFLAGS="$LDFLAGS"
- eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
- save_LIBS="$LIBS"
- LIBS="$lt_cv_dlopen_libs $LIBS"
-
- AC_CACHE_CHECK([whether a program can dlopen itself],
- lt_cv_dlopen_self, [dnl
- _LT_AC_TRY_DLOPEN_SELF(
- lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
- lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
- ])
-
- if test "x$lt_cv_dlopen_self" = xyes; then
- LDFLAGS="$LDFLAGS $link_static_flag"
- AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
- lt_cv_dlopen_self_static, [dnl
- _LT_AC_TRY_DLOPEN_SELF(
- lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
- lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
- ])
- fi
-
- CPPFLAGS="$save_CPPFLAGS"
- LDFLAGS="$save_LDFLAGS"
- LIBS="$save_LIBS"
- ;;
- esac
-
- case $lt_cv_dlopen_self in
- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
- *) enable_dlopen_self=unknown ;;
- esac
-
- case $lt_cv_dlopen_self_static in
- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
- *) enable_dlopen_self_static=unknown ;;
- esac
-fi
-])# AC_LIBTOOL_DLOPEN_SELF
-
-AC_DEFUN([_LT_AC_LTCONFIG_HACK],
-[AC_REQUIRE([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])dnl
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e s/^X//'
-sed_quote_subst='s/\([[\\"\\`$\\\\]]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([[\\"\\`\\\\]]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Constants:
-rm="rm -f"
-
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except M$VC,
-# which needs '.lib').
-libext=a
-ltmain="$ac_aux_dir/ltmain.sh"
-ofile="$default_ofile"
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-need_locks="$enable_libtool_lock"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-test -z "$AS" && AS=as
-test -z "$CC" && CC=cc
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$LD" && LD=ld
-test -z "$LN_S" && LN_S="ln -s"
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-test -z "$NM" && NM=nm
-test -z "$OBJDUMP" && OBJDUMP=objdump
-test -z "$RANLIB" && RANLIB=:
-test -z "$STRIP" && STRIP=:
-test -z "$ac_objext" && ac_objext=o
-
-if test x"$host" != x"$build"; then
- ac_tool_prefix=${host_alias}-
-else
- ac_tool_prefix=
-fi
-
-# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
-case $host_os in
-linux-gnu*) ;;
-linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
-esac
-
-case $host_os in
-aix3*)
- # AIX sometimes has problems with the GCC collect2 program. For some
- # reason, if we set the COLLECT_NAMES environment variable, the problems
- # vanish in a puff of smoke.
- if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
- fi
- ;;
-esac
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
- case $host_os in
- openbsd*)
- old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
- ;;
- *)
- old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
- ;;
- esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-# Allow CC to be a program name with arguments.
-set dummy $CC
-compiler="[$]2"
-
-AC_MSG_CHECKING([for objdir])
-rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
- objdir=.libs
-else
- # MS-DOS does not allow filenames that begin with a dot.
- objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-AC_MSG_RESULT($objdir)
-
-
-AC_ARG_WITH(pic,
-[ --with-pic try to use only PIC/non-PIC objects [default=use both]],
-pic_mode="$withval", pic_mode=default)
-test -z "$pic_mode" && pic_mode=default
-
-# We assume here that the value for lt_cv_prog_cc_pic will not be cached
-# in isolation, and that seeing it set (from the cache) indicates that
-# the associated values are set (in the cache) correctly too.
-AC_MSG_CHECKING([for $compiler option to produce PIC])
-AC_CACHE_VAL(lt_cv_prog_cc_pic,
-[ lt_cv_prog_cc_pic=
- lt_cv_prog_cc_shlib=
- lt_cv_prog_cc_wl=
- lt_cv_prog_cc_static=
- lt_cv_prog_cc_no_builtin=
- lt_cv_prog_cc_can_build_shared=$can_build_shared
-
- if test "$GCC" = yes; then
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static='-static'
-
- case $host_os in
- aix*)
- # Below there is a dirty hack to force normal static linking with -ldl
- # The problem is because libdl dynamically linked with both libc and
- # libC (AIX C++ library), which obviously doesn't included in libraries
- # list by gcc. This cause undefined symbols with -static flags.
- # This hack allows C programs to be linked with "-static -ldl", but
- # not sure about C++ programs.
- lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC"
- ;;
- amigaos*)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
- ;;
- beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- lt_cv_prog_cc_pic='-fno-common'
- ;;
- cygwin* | mingw* | pw32* | os2*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- lt_cv_prog_cc_pic='-DDLL_EXPORT'
- ;;
- sysv4*MP*)
- if test -d /usr/nec; then
- lt_cv_prog_cc_pic=-Kconform_pic
- fi
- ;;
- *)
- lt_cv_prog_cc_pic='-fPIC'
- ;;
- esac
- else
- # PORTME Check for PIC flags for the system compiler.
- case $host_os in
- aix3* | aix4* | aix5*)
- lt_cv_prog_cc_wl='-Wl,'
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_cv_prog_cc_static='-Bstatic'
- else
- lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
-
- hpux9* | hpux10* | hpux11*)
- # Is there a better lt_cv_prog_cc_static that works with the bundled CC?
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive"
- lt_cv_prog_cc_pic='+Z'
- ;;
-
- irix5* | irix6*)
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static='-non_shared'
- # PIC (with -KPIC) is the default.
- ;;
-
- cygwin* | mingw* | pw32* | os2*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- lt_cv_prog_cc_pic='-DDLL_EXPORT'
- ;;
-
- newsos6)
- lt_cv_prog_cc_pic='-KPIC'
- lt_cv_prog_cc_static='-Bstatic'
- ;;
-
- osf3* | osf4* | osf5*)
- # All OSF/1 code is PIC.
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static='-non_shared'
- ;;
-
- sco3.2v5*)
- lt_cv_prog_cc_pic='-Kpic'
- lt_cv_prog_cc_static='-dn'
- lt_cv_prog_cc_shlib='-belf'
- ;;
-
- solaris*)
- lt_cv_prog_cc_pic='-KPIC'
- lt_cv_prog_cc_static='-Bstatic'
- lt_cv_prog_cc_wl='-Wl,'
- ;;
-
- sunos4*)
- lt_cv_prog_cc_pic='-PIC'
- lt_cv_prog_cc_static='-Bstatic'
- lt_cv_prog_cc_wl='-Qoption ld '
- ;;
-
- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- lt_cv_prog_cc_pic='-KPIC'
- lt_cv_prog_cc_static='-Bstatic'
- if test "x$host_vendor" = xsni; then
- lt_cv_prog_cc_wl='-LD'
- else
- lt_cv_prog_cc_wl='-Wl,'
- fi
- ;;
-
- uts4*)
- lt_cv_prog_cc_pic='-pic'
- lt_cv_prog_cc_static='-Bstatic'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec ;then
- lt_cv_prog_cc_pic='-Kconform_pic'
- lt_cv_prog_cc_static='-Bstatic'
- fi
- ;;
-
- *)
- lt_cv_prog_cc_can_build_shared=no
- ;;
- esac
- fi
-])
-if test -z "$lt_cv_prog_cc_pic"; then
- AC_MSG_RESULT([none])
-else
- AC_MSG_RESULT([$lt_cv_prog_cc_pic])
-
- # Check to make sure the pic_flag actually works.
- AC_MSG_CHECKING([if $compiler PIC flag $lt_cv_prog_cc_pic works])
- AC_CACHE_VAL(lt_cv_prog_cc_pic_works, [dnl
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC"
- AC_TRY_COMPILE([], [], [dnl
- case $host_os in
- hpux9* | hpux10* | hpux11*)
- # On HP-UX, both CC and GCC only warn that PIC is supported... then
- # they create non-PIC objects. So, if there were any warnings, we
- # assume that PIC is not supported.
- if test -s conftest.err; then
- lt_cv_prog_cc_pic_works=no
- else
- lt_cv_prog_cc_pic_works=yes
- fi
- ;;
- *)
- lt_cv_prog_cc_pic_works=yes
- ;;
- esac
- ], [dnl
- lt_cv_prog_cc_pic_works=no
- ])
- CFLAGS="$save_CFLAGS"
- ])
-
- if test "X$lt_cv_prog_cc_pic_works" = Xno; then
- lt_cv_prog_cc_pic=
- lt_cv_prog_cc_can_build_shared=no
- else
- lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic"
- fi
-
- AC_MSG_RESULT([$lt_cv_prog_cc_pic_works])
-fi
-
-# Check for any special shared library compilation flags.
-if test -n "$lt_cv_prog_cc_shlib"; then
- AC_MSG_WARN([\`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries])
- if echo "$old_CC $old_CFLAGS " | egrep -e "[[ ]]$lt_cv_prog_cc_shlib[[ ]]" >/dev/null; then :
- else
- AC_MSG_WARN([add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure])
- lt_cv_prog_cc_can_build_shared=no
- fi
-fi
-
-AC_MSG_CHECKING([if $compiler static flag $lt_cv_prog_cc_static works])
-AC_CACHE_VAL([lt_cv_prog_cc_static_works], [dnl
- lt_cv_prog_cc_static_works=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static"
- AC_TRY_LINK([], [], [lt_cv_prog_cc_static_works=yes])
- LDFLAGS="$save_LDFLAGS"
-])
-
-# Belt *and* braces to stop my trousers falling down:
-test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static=
-AC_MSG_RESULT([$lt_cv_prog_cc_static_works])
-
-pic_flag="$lt_cv_prog_cc_pic"
-special_shlib_compile_flags="$lt_cv_prog_cc_shlib"
-wl="$lt_cv_prog_cc_wl"
-link_static_flag="$lt_cv_prog_cc_static"
-no_builtin_flag="$lt_cv_prog_cc_no_builtin"
-can_build_shared="$lt_cv_prog_cc_can_build_shared"
-
-
-# Check to see if options -o and -c are simultaneously supported by compiler
-AC_MSG_CHECKING([if $compiler supports -c -o file.$ac_objext])
-AC_CACHE_VAL([lt_cv_compiler_c_o], [
-$rm -r conftest 2>/dev/null
-mkdir conftest
-cd conftest
-echo "int some_variable = 0;" > conftest.$ac_ext
-mkdir out
-# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
-# that will create temporary files in the current directory regardless of
-# the output directory. Thus, making CWD read-only will cause this test
-# to fail, enabling locking or at least warning the user not to do parallel
-# builds.
-chmod -w .
-save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
-compiler_c_o=no
-if { (eval echo configure:__oline__: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s out/conftest.err; then
- lt_cv_compiler_c_o=no
- else
- lt_cv_compiler_c_o=yes
- fi
-else
- # Append any errors to the config.log.
- cat out/conftest.err 1>&AC_FD_CC
- lt_cv_compiler_c_o=no
-fi
-CFLAGS="$save_CFLAGS"
-chmod u+w .
-$rm conftest* out/*
-rmdir out
-cd ..
-rmdir conftest
-$rm -r conftest 2>/dev/null
-])
-compiler_c_o=$lt_cv_compiler_c_o
-AC_MSG_RESULT([$compiler_c_o])
-
-if test x"$compiler_c_o" = x"yes"; then
- # Check to see if we can write to a .lo
- AC_MSG_CHECKING([if $compiler supports -c -o file.lo])
- AC_CACHE_VAL([lt_cv_compiler_o_lo], [
- lt_cv_compiler_o_lo=no
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -c -o conftest.lo"
- save_objext="$ac_objext"
- ac_objext=lo
- AC_TRY_COMPILE([], [int some_variable = 0;], [dnl
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- lt_cv_compiler_o_lo=no
- else
- lt_cv_compiler_o_lo=yes
- fi
- ])
- ac_objext="$save_objext"
- CFLAGS="$save_CFLAGS"
- ])
- compiler_o_lo=$lt_cv_compiler_o_lo
- AC_MSG_RESULT([$compiler_o_lo])
-else
- compiler_o_lo=no
-fi
-
-# Check to see if we can do hard links to lock some files if needed
-hard_links="nottested"
-if test "$compiler_c_o" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- AC_MSG_CHECKING([if we can lock with hard links])
- hard_links=yes
- $rm conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- AC_MSG_RESULT([$hard_links])
- if test "$hard_links" = no; then
- AC_MSG_WARN([\`$CC' does not support \`-c -o', so \`make -j' may be unsafe])
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-
-if test "$GCC" = yes; then
- # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
- AC_MSG_CHECKING([if $compiler supports -fno-rtti -fno-exceptions])
- echo "int some_variable = 0;" > conftest.$ac_ext
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext"
- compiler_rtti_exceptions=no
- AC_TRY_COMPILE([], [int some_variable = 0;], [dnl
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- compiler_rtti_exceptions=no
- else
- compiler_rtti_exceptions=yes
- fi
- ])
- CFLAGS="$save_CFLAGS"
- AC_MSG_RESULT([$compiler_rtti_exceptions])
-
- if test "$compiler_rtti_exceptions" = "yes"; then
- no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
- else
- no_builtin_flag=' -fno-builtin'
- fi
-fi
-
-# See if the linker supports building shared libraries.
-AC_MSG_CHECKING([whether the linker ($LD) supports shared libraries])
-
-allow_undefined_flag=
-no_undefined_flag=
-need_lib_prefix=unknown
-need_version=unknown
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-archive_cmds=
-archive_expsym_cmds=
-old_archive_from_new_cmds=
-old_archive_from_expsyms_cmds=
-export_dynamic_flag_spec=
-whole_archive_flag_spec=
-thread_safe_flag_spec=
-hardcode_into_libs=no
-hardcode_libdir_flag_spec=
-hardcode_libdir_separator=
-hardcode_direct=no
-hardcode_minus_L=no
-hardcode_shlibpath_var=unsupported
-runpath_var=
-link_all_deplibs=unknown
-always_export_symbols=no
-export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
-# include_expsyms should be a list of space-separated symbols to be *always*
-# included in the symbol list
-include_expsyms=
-# exclude_expsyms can be an egrep regular expression of symbols to exclude
-# it will be wrapped by ` (' and `)$', so one must not match beginning or
-# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-# as well as any symbol that contains `d'.
-exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
-# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-# platforms (ab)use it in PIC code, but their linkers get confused if
-# the symbol is explicitly referenced. Since portable code cannot
-# rely on this symbol name, it's probably fine to never include it in
-# preloaded symbol tables.
-extract_expsyms_cmds=
-
-case $host_os in
-cygwin* | mingw* | pw32*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- if test "$GCC" != yes; then
- with_gnu_ld=no
- fi
- ;;
-openbsd*)
- with_gnu_ld=no
- ;;
-esac
-
-ld_shlibs=yes
-if test "$with_gnu_ld" = yes; then
- # If archive_cmds runs LD, not CC, wlarc should be empty
- wlarc='${wl}'
-
- # See if GNU ld supports shared libraries.
- case $host_os in
- aix3* | aix4* | aix5*)
- # On AIX, the GNU linker is very broken
- # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.
- ld_shlibs=no
- cat <<EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support. If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-EOF
- ;;
-
- amigaos*)
- archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
-
- # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
- # that the semantics of dynamic libraries on AmigaOS, at least up
- # to version 4, is to share data among multiple programs linked
- # with the same dynamic library. Since this doesn't match the
- # behavior of shared libraries on other platforms, we can use
- # them.
- ld_shlibs=no
- ;;
-
- beos*)
- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- allow_undefined_flag=unsupported
- # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- cygwin* | mingw* | pw32*)
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec='-L$libdir'
- allow_undefined_flag=unsupported
- always_export_symbols=yes
-
- extract_expsyms_cmds='test -f $output_objdir/impgen.c || \
- sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~
- test -f $output_objdir/impgen.exe || (cd $output_objdir && \
- if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \
- else $CC -o impgen impgen.c ; fi)~
- $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'
-
- old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'
-
- # cygwin and mingw dlls have different entry points and sets of symbols
- # to exclude.
- # FIXME: what about values for MSVC?
- dll_entry=__cygwin_dll_entry@12
- dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~
- case $host_os in
- mingw*)
- # mingw values
- dll_entry=_DllMainCRTStartup@12
- dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~
- ;;
- esac
-
- # mingw and cygwin differ, and it's simplest to just exclude the union
- # of the two symbol sets.
- dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12
-
- # recent cygwin and mingw systems supply a stub DllMain which the user
- # can override, but on older systems we have to supply one (in ltdll.c)
- if test "x$lt_cv_need_dllmain" = "xyes"; then
- ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext "
- ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~
- test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'
- else
- ltdll_obj=
- ltdll_cmds=
- fi
-
- # Extract the symbol export list from an `--export-all' def file,
- # then regenerate the def file from the symbol export list, so that
- # the compiled dll only exports the symbol export list.
- # Be careful not to strip the DATA tag left be newer dlltools.
- export_symbols_cmds="$ltdll_cmds"'
- $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~
- sed -e "1,/EXPORTS/d" -e "s/ @ [[0-9]]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols'
-
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is.
- # If DATA tags from a recent dlltool are present, honour them!
- archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname-def;
- else
- echo EXPORTS > $output_objdir/$soname-def;
- _lt_hint=1;
- cat $export_symbols | while read symbol; do
- set dummy \$symbol;
- case \[$]# in
- 2) echo " \[$]2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
- *) echo " \[$]2 @ \$_lt_hint \[$]3 ; " >> $output_objdir/$soname-def;;
- esac;
- _lt_hint=`expr 1 + \$_lt_hint`;
- done;
- fi~
- '"$ltdll_cmds"'
- $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~
- $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~
- $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
- wlarc=
- else
- archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- fi
- ;;
-
- solaris* | sysv5*)
- if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
- ld_shlibs=no
- cat <<EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-EOF
- elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- sunos4*)
- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- wlarc=
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- *)
- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
- esac
-
- if test "$ld_shlibs" = yes; then
- runpath_var=LD_RUN_PATH
- hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
- export_dynamic_flag_spec='${wl}--export-dynamic'
- case $host_os in
- cygwin* | mingw* | pw32*)
- # dlltool doesn't understand --whole-archive et. al.
- whole_archive_flag_spec=
- ;;
- *)
- # ancient GNU ld didn't support --whole-archive et. al.
- if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- whole_archive_flag_spec=
- fi
- ;;
- esac
- fi
-else
- # PORTME fill in a description of your system's linker (not GNU ld)
- case $host_os in
- aix3*)
- allow_undefined_flag=unsupported
- always_export_symbols=yes
- archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
- # Note: this linker hardcodes the directories in LIBPATH if there
- # are no directories specified by -L.
- hardcode_minus_L=yes
- if test "$GCC" = yes && test -z "$link_static_flag"; then
- # Neither direct hardcoding nor static linking is supported with a
- # broken collect2.
- hardcode_direct=unsupported
- fi
- ;;
-
- aix4* | aix5*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
- for ld_flag in $LDFLAGS; do
- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
- aix_use_runtimelinking=yes
- break
- fi
- done
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- hardcode_direct=yes
- archive_cmds=''
- hardcode_libdir_separator=':'
- if test "$GCC" = yes; then
- case $host_os in aix4.[[012]]|aix4.[[012]].*)
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" && \
- strings "$collect2name" | grep resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- hardcode_direct=yes
- else
- # We have old collect2
- hardcode_direct=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- hardcode_minus_L=yes
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_libdir_separator=
- fi
- esac
-
- shared_flag='-shared'
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- shared_flag='${wl}-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- # It seems that -bexpall can do strange things, so it is better to
- # generate a list of symbols to export.
- always_export_symbols=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- allow_undefined_flag='-berok'
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'
- archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
- allow_undefined_flag="-z nodefs"
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
- else
- hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- allow_undefined_flag='${wl}-berok'
- # This is a bit strange, but is similar to how AIX traditionally builds
- # it's shared libraries.
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'
- fi
- fi
- ;;
-
- amigaos*)
- archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- # see comment about different semantics on the GNU ld section
- ld_shlibs=no
- ;;
-
- cygwin* | mingw* | pw32*)
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- old_archive_from_new_cmds='true'
- # FIXME: Should let the user specify the lib program.
- old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
- fix_srcfile_path='`cygpath -w "$srcfile"`'
- ;;
-
- darwin* | rhapsody*)
- case "$host_os" in
- rhapsody* | darwin1.[[012]])
- allow_undefined_flag='-undefined suppress'
- ;;
- *) # Darwin 1.3 on
- allow_undefined_flag='-flat_namespace -undefined suppress'
- ;;
- esac
- # FIXME: Relying on posixy $() will cause problems for
- # cross-compilation, but unfortunately the echo tests do not
- # yet detect zsh echo's removal of \ escapes.
- archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring'
- # We need to add '_' to the symbols in $export_symbols first
- #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- whole_archive_flag_spec='-all_load $convenience'
- ;;
-
- freebsd1*)
- ld_shlibs=no
- ;;
-
- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
- # support. Future versions do this automatically, but an explicit c++rt0.o
- # does not break anything, and helps significantly (at the cost of a little
- # extra space).
- freebsd2.2*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- # Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd*)
- archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- hpux9* | hpux10* | hpux11*)
- case $host_os in
- hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;
- *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;
- esac
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_direct=yes
- hardcode_minus_L=yes # Not in the search PATH, but as the default
- # location of the library.
- export_dynamic_flag_spec='${wl}-E'
- ;;
-
- irix5* | irix6*)
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
- fi
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- link_all_deplibs=yes
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
- else
- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
- fi
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- newsos6)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_shlibpath_var=no
- ;;
-
- openbsd*)
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- export_dynamic_flag_spec='${wl}-E'
- else
- case "$host_os" in
- openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- ;;
- *)
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- ;;
- esac
- fi
- ;;
-
- os2*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- allow_undefined_flag=unsupported
- archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
- old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
- ;;
-
- osf3*)
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
- fi
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
-
- osf4* | osf5*) # as osf3* with the addition of -msym flag
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
- $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
-
- #Both c and cxx compiler support -rpath directly
- hardcode_libdir_flag_spec='-rpath $libdir'
- fi
- hardcode_libdir_separator=:
- ;;
-
- sco3.2v5*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- export_dynamic_flag_spec='${wl}-Bexport'
- ;;
-
- solaris*)
- # gcc --version < 3.0 without binutils cannot create self contained
- # shared libraries reliably, requiring libgcc.a to resolve some of
- # the object symbols generated in some cases. Libraries that use
- # assert need libgcc.a to resolve __eprintf, for example. Linking
- # a copy of libgcc.a into every shared library to guarantee resolving
- # such symbols causes other problems: According to Tim Van Holder
- # <tim.van.holder@pandora.be>, C++ libraries end up with a separate
- # (to the application) exception stack for one thing.
- no_undefined_flag=' -z defs'
- if test "$GCC" = yes; then
- case `$CC --version 2>/dev/null` in
- [[12]].*)
- cat <<EOF 1>&2
-
-*** Warning: Releases of GCC earlier than version 3.0 cannot reliably
-*** create self contained shared libraries on Solaris systems, without
-*** introducing a dependency on libgcc.a. Therefore, libtool is disabling
-*** -no-undefined support, which will at least allow you to build shared
-*** libraries. However, you may find that when you link such libraries
-*** into an application without using GCC, you have to manually add
-*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to
-*** upgrade to a newer version of GCC. Another option is to rebuild your
-*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer.
-
-EOF
- no_undefined_flag=
- ;;
- esac
- fi
- # $CC -shared without GNU ld will not create a library from C++
- # object files and a static libstdc++, better avoid it by now
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_shlibpath_var=no
- case $host_os in
- solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
- *) # Supported since Solaris 2.6 (maybe 2.5.1?)
- whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
- esac
- link_all_deplibs=yes
- ;;
-
- sunos4*)
- if test "x$host_vendor" = xsequent; then
- # Use $CC to link under sequent, because it throws in some extra .o
- # files that make .init and .fini sections work.
- archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
- fi
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- sysv4)
- if test "x$host_vendor" = xsno; then
- archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes # is this really true???
- else
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=no #Motorola manual says yes, but my tests say they lie
- fi
- runpath_var='LD_RUN_PATH'
- hardcode_shlibpath_var=no
- ;;
-
- sysv4.3*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- export_dynamic_flag_spec='-Bexport'
- ;;
-
- sysv5*)
- no_undefined_flag=' -z text'
- # $CC -shared without GNU ld will not create a library from C++
- # object files and a static libstdc++, better avoid it by now
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
- hardcode_libdir_flag_spec=
- hardcode_shlibpath_var=no
- runpath_var='LD_RUN_PATH'
- ;;
-
- uts4*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- dgux*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- ld_shlibs=yes
- fi
- ;;
-
- sysv4.2uw2*)
- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_minus_L=no
- hardcode_shlibpath_var=no
- hardcode_runpath_var=yes
- runpath_var=LD_RUN_PATH
- ;;
-
- sysv5uw7* | unixware7*)
- no_undefined_flag='${wl}-z ${wl}text'
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- runpath_var='LD_RUN_PATH'
- hardcode_shlibpath_var=no
- ;;
-
- *)
- ld_shlibs=no
- ;;
- esac
-fi
-AC_MSG_RESULT([$ld_shlibs])
-test "$ld_shlibs" = no && can_build_shared=no
-
-# Check hardcoding attributes.
-AC_MSG_CHECKING([how to hardcode library paths into programs])
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" || \
- test -n "$runpath_var"; then
-
- # We can hardcode non-existant directories.
- if test "$hardcode_direct" != no &&
- # If the only mechanism to avoid hardcoding is shlibpath_var, we
- # have to relink, otherwise we might link with an installed library
- # when we should be linking with a yet-to-be-installed one
- ## test "$hardcode_shlibpath_var" != no &&
- test "$hardcode_minus_L" != no; then
- # Linking always hardcodes the temporary library directory.
- hardcode_action=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- hardcode_action=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- hardcode_action=unsupported
-fi
-AC_MSG_RESULT([$hardcode_action])
-
-striplib=
-old_striplib=
-AC_MSG_CHECKING([whether stripping libraries is possible])
-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
- test -z "$striplib" && striplib="$STRIP --strip-unneeded"
- AC_MSG_RESULT([yes])
-else
- AC_MSG_RESULT([no])
-fi
-
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-# PORTME Fill in your ld.so characteristics
-AC_MSG_CHECKING([dynamic linker characteristics])
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-
-case $host_os in
-aix3*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}.so$major'
- ;;
-
-aix4* | aix5*)
- version_type=linux
- if test "$host_cpu" = ia64; then
- # AIX 5 supports IA64
- library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- else
- # With GCC up to 2.95.x, collect2 would create an import file
- # for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
- # development snapshots of GCC prior to 3.0.
- case $host_os in
- aix4 | aix4.[[01]] | aix4.[[01]].*)
- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
- echo ' yes '
- echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
- :
- else
- can_build_shared=no
- fi
- ;;
- esac
- # AIX (on Power*) has no versioning support, so currently we can
- # not hardcode correct soname into executable. Probably we can
- # add versioning support to collect2, so additional links can
- # be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
- # If using run time linking (on AIX 4.2 or later) use lib<name>.so
- # instead of lib<name>.a to let people know that these are not
- # typical AIX shared libraries.
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- else
- # We preserve .a as extension for shared libraries through AIX4.2
- # and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}.so$major'
- fi
- shlibpath_var=LIBPATH
- fi
- ;;
-
-amigaos*)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
- ;;
-
-beos*)
- library_names_spec='${libname}.so'
- dynamic_linker="$host_os ld.so"
- shlibpath_var=LIBRARY_PATH
- ;;
-
-bsdi4*)
- version_type=linux
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
- export_dynamic_flag_spec=-rdynamic
- # the default ld.so.conf also contains /usr/contrib/lib and
- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
- # libtool to hard-code these into programs
- ;;
-
-cygwin* | mingw* | pw32*)
- version_type=windows
- need_version=no
- need_lib_prefix=no
- case $GCC,$host_os in
- yes,cygwin*)
- library_names_spec='$libname.dll.a'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll'
- postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog .libs/$dlname \$dldir/$dlname'
- postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $rm \$dlpath'
- ;;
- yes,mingw*)
- library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll'
- sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"`
- ;;
- yes,pw32*)
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
- ;;
- *)
- library_names_spec='${libname}`echo ${release} | sed -e 's/[[.]]/-/g'`${versuffix}.dll $libname.lib'
- ;;
- esac
- dynamic_linker='Win32 ld.exe'
- # FIXME: first we should search . and the directory the executable is in
- shlibpath_var=PATH
- ;;
-
-darwin* | rhapsody*)
- dynamic_linker="$host_os dyld"
- version_type=darwin
- need_lib_prefix=no
- need_version=no
- # FIXME: Relying on posixy $() will cause problems for
- # cross-compilation, but unfortunately the echo tests do not
- # yet detect zsh echo's removal of \ escapes.
- library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'
- soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'
- shlibpath_overrides_runpath=yes
- shlibpath_var=DYLD_LIBRARY_PATH
- ;;
-
-freebsd1*)
- dynamic_linker=no
- ;;
-
-freebsd*)
- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
- version_type=freebsd-$objformat
- case $version_type in
- freebsd-elf*)
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
- need_version=no
- need_lib_prefix=no
- ;;
- freebsd-*)
- library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
- need_version=yes
- ;;
- esac
- shlibpath_var=LD_LIBRARY_PATH
- case $host_os in
- freebsd2*)
- shlibpath_overrides_runpath=yes
- ;;
- *)
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
- esac
- ;;
-
-gnu*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- hardcode_into_libs=yes
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- dynamic_linker="$host_os dld.sl"
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- shlibpath_var=SHLIB_PATH
- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
- soname_spec='${libname}${release}.sl$major'
- # HP-UX runs *really* slowly unless shared libraries are mode 555.
- postinstall_cmds='chmod 555 $lib'
- ;;
-
-irix5* | irix6*)
- version_type=irix
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}.so$major'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
- case $host_os in
- irix5*)
- libsuff= shlibsuff=
- ;;
- *)
- case $LD in # libtool.m4 will add one of these switches to LD
- *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
- *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
- *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
- *) libsuff= shlibsuff= libmagic=never-match;;
- esac
- ;;
- esac
- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
- dynamic_linker=no
- ;;
-
-# This must be Linux ELF.
-linux-gnu*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- # This implies no fast_install, which is unacceptable.
- # Some rework will be needed to allow for fast_install
- # before this can be enabled.
- hardcode_into_libs=yes
-
- # We used to test for /lib/ld.so.1 and disable shared libraries on
- # powerpc, because MkLinux only supported shared libraries with the
- # GNU dynamic linker. Since this was broken with cross compilers,
- # most powerpc-linux boxes support dynamic linking these days and
- # people can always --disable-shared, the test was removed, and we
- # assume the GNU/Linux dynamic linker is in use.
- dynamic_linker='GNU/Linux ld.so'
- ;;
-
-netbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- dynamic_linker='NetBSD (a.out) ld.so'
- else
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
- soname_spec='${libname}${release}.so$major'
- dynamic_linker='NetBSD ld.elf_so'
- fi
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
-
-newsos6)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- ;;
-
-openbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case "$host_os" in
- openbsd2.[[89]] | openbsd2.[[89]].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
- else
- shlibpath_overrides_runpath=yes
- fi
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-os2*)
- libname_spec='$name'
- need_lib_prefix=no
- library_names_spec='$libname.dll $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4* | osf5*)
- version_type=osf
- need_version=no
- soname_spec='${libname}${release}.so'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
- ;;
-
-sco3.2v5*)
- version_type=osf
- soname_spec='${libname}${release}.so$major'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-solaris*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- fi
- need_version=yes
- ;;
-
-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- case $host_vendor in
- sni)
- shlibpath_overrides_runpath=no
- ;;
- motorola)
- need_lib_prefix=no
- need_version=no
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
- ;;
- esac
- ;;
-
-uts4*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-dgux*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux
- library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
- soname_spec='$libname.so.$major'
- shlibpath_var=LD_LIBRARY_PATH
- fi
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-AC_MSG_RESULT([$dynamic_linker])
-test "$dynamic_linker" = no && can_build_shared=no
-
-# Report the final consequences.
-AC_MSG_CHECKING([if libtool supports shared libraries])
-AC_MSG_RESULT([$can_build_shared])
-
-AC_MSG_CHECKING([whether to build shared libraries])
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case "$host_os" in
-aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
-
-aix4*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
-esac
-AC_MSG_RESULT([$enable_shared])
-
-AC_MSG_CHECKING([whether to build static libraries])
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-AC_MSG_RESULT([$enable_static])
-
-if test "$hardcode_action" = relink; then
- # Fast installation is not supported
- enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
- # Fast installation is not necessary
- enable_fast_install=needless
-fi
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-AC_LIBTOOL_DLOPEN_SELF
-
-if test "$enable_shared" = yes && test "$GCC" = yes; then
- case $archive_cmds in
- *'~'*)
- # FIXME: we may have to deal with multi-command sequences.
- ;;
- '$CC '*)
- # Test whether the compiler implicitly links with -lc since on some
- # systems, -lgcc has to come before -lc. If gcc already passes -lc
- # to ld, don't add -lc before -lgcc.
- AC_MSG_CHECKING([whether -lc should be explicitly linked in])
- AC_CACHE_VAL([lt_cv_archive_cmds_need_lc],
- [$rm conftest*
- echo 'static int dummy;' > conftest.$ac_ext
-
- if AC_TRY_EVAL(ac_compile); then
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$lt_cv_prog_cc_wl
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- save_allow_undefined_flag=$allow_undefined_flag
- allow_undefined_flag=
- if AC_TRY_EVAL(archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
- then
- lt_cv_archive_cmds_need_lc=no
- else
- lt_cv_archive_cmds_need_lc=yes
- fi
- allow_undefined_flag=$save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi])
- AC_MSG_RESULT([$lt_cv_archive_cmds_need_lc])
- ;;
- esac
-fi
-need_lc=${lt_cv_archive_cmds_need_lc-yes}
-
-# The second clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
- :
-else
- # If there is no Makefile yet, we rely on a make rule to execute
- # `config.status --recheck' to rerun these tests and create the
- # libtool script then.
- test -f Makefile && make "$ltmain"
-fi
-
-if test -f "$ltmain"; then
- trap "$rm \"${ofile}T\"; exit 1" 1 2 15
- $rm -f "${ofile}T"
-
- echo creating $ofile
-
- # Now quote all the things that may contain metacharacters while being
- # careful not to overquote the AC_SUBSTed values. We take copies of the
- # variables and quote the copies for generation of the libtool script.
- for var in echo old_CC old_CFLAGS \
- AR AR_FLAGS CC LD LN_S NM SHELL \
- reload_flag reload_cmds wl \
- pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
- thread_safe_flag_spec whole_archive_flag_spec libname_spec \
- library_names_spec soname_spec \
- RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
- old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \
- postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \
- old_striplib striplib file_magic_cmd export_symbols_cmds \
- deplibs_check_method allow_undefined_flag no_undefined_flag \
- finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
- global_symbol_to_c_name_address \
- hardcode_libdir_flag_spec hardcode_libdir_separator \
- sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
- compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
-
- case $var in
- reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
- old_postinstall_cmds | old_postuninstall_cmds | \
- export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
- extract_expsyms_cmds | old_archive_from_expsyms_cmds | \
- postinstall_cmds | postuninstall_cmds | \
- finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
- # Double-quote double-evaled strings.
- eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
- ;;
- *)
- eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
- ;;
- esac
- done
-
- cat <<__EOF__ > "${ofile}T"
-#! $SHELL
-
-# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-# Copyright (C) 1996-2000 Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="sed -e s/^X//"
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$need_lc
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# The default C compiler.
-CC=$lt_CC
-
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
-
-# A BSD-compatible nm program.
-NM=$lt_NM
-
-# A symbol stripping program
-STRIP=$STRIP
-
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
-
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
-
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
-
-# Used on cygwin: assembler.
-AS="$AS"
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# How to pass a linker flag through the compiler.
-wl=$lt_wl
-
-# Object file suffix (normally "o").
-objext="$ac_objext"
-
-# Old archive suffix (normally "a").
-libext="$libext"
-
-# Executable file suffix (normally "").
-exeext="$exeext"
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_pic_flag
-pic_mode=$pic_mode
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_compiler_c_o
-
-# Can we write directly to a .lo ?
-compiler_o_lo=$lt_compiler_o_lo
-
-# Must we lock files when doing compilation ?
-need_locks=$lt_need_locks
-
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_link_static_flag
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_no_builtin_flag
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec
-
-# Library versioning type.
-version_type=$version_type
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names. First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address
-
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path"
-
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# ### END LIBTOOL CONFIG
-
-__EOF__
-
- case $host_os in
- aix3*)
- cat <<\EOF >> "${ofile}T"
-
-# AIX sometimes has problems with the GCC collect2 program. For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
-fi
-EOF
- ;;
- esac
-
- case $host_os in
- cygwin* | mingw* | pw32* | os2*)
- cat <<'EOF' >> "${ofile}T"
- # This is a source program that is used to create dlls on Windows
- # Don't remove nor modify the starting and closing comments
-# /* ltdll.c starts here */
-# #define WIN32_LEAN_AND_MEAN
-# #include <windows.h>
-# #undef WIN32_LEAN_AND_MEAN
-# #include <stdio.h>
-#
-# #ifndef __CYGWIN__
-# # ifdef __CYGWIN32__
-# # define __CYGWIN__ __CYGWIN32__
-# # endif
-# #endif
-#
-# #ifdef __cplusplus
-# extern "C" {
-# #endif
-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-# #ifdef __cplusplus
-# }
-# #endif
-#
-# #ifdef __CYGWIN__
-# #include <cygwin/cygwin_dll.h>
-# DECLARE_CYGWIN_DLL( DllMain );
-# #endif
-# HINSTANCE __hDllInstance_base;
-#
-# BOOL APIENTRY
-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-# {
-# __hDllInstance_base = hInst;
-# return TRUE;
-# }
-# /* ltdll.c ends here */
- # This is a source program that is used to create import libraries
- # on Windows for dlls which lack them. Don't remove nor modify the
- # starting and closing comments
-# /* impgen.c starts here */
-# /* Copyright (C) 1999-2000 Free Software Foundation, Inc.
-#
-# This file is part of GNU libtool.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-# */
-#
-# #include <stdio.h> /* for printf() */
-# #include <unistd.h> /* for open(), lseek(), read() */
-# #include <fcntl.h> /* for O_RDONLY, O_BINARY */
-# #include <string.h> /* for strdup() */
-#
-# /* O_BINARY isn't required (or even defined sometimes) under Unix */
-# #ifndef O_BINARY
-# #define O_BINARY 0
-# #endif
-#
-# static unsigned int
-# pe_get16 (fd, offset)
-# int fd;
-# int offset;
-# {
-# unsigned char b[2];
-# lseek (fd, offset, SEEK_SET);
-# read (fd, b, 2);
-# return b[0] + (b[1]<<8);
-# }
-#
-# static unsigned int
-# pe_get32 (fd, offset)
-# int fd;
-# int offset;
-# {
-# unsigned char b[4];
-# lseek (fd, offset, SEEK_SET);
-# read (fd, b, 4);
-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-# }
-#
-# static unsigned int
-# pe_as32 (ptr)
-# void *ptr;
-# {
-# unsigned char *b = ptr;
-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-# }
-#
-# int
-# main (argc, argv)
-# int argc;
-# char *argv[];
-# {
-# int dll;
-# unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
-# unsigned long export_rva, export_size, nsections, secptr, expptr;
-# unsigned long name_rvas, nexp;
-# unsigned char *expdata, *erva;
-# char *filename, *dll_name;
-#
-# filename = argv[1];
-#
-# dll = open(filename, O_RDONLY|O_BINARY);
-# if (dll < 1)
-# return 1;
-#
-# dll_name = filename;
-#
-# for (i=0; filename[i]; i++)
-# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
-# dll_name = filename + i +1;
-#
-# pe_header_offset = pe_get32 (dll, 0x3c);
-# opthdr_ofs = pe_header_offset + 4 + 20;
-# num_entries = pe_get32 (dll, opthdr_ofs + 92);
-#
-# if (num_entries < 1) /* no exports */
-# return 1;
-#
-# export_rva = pe_get32 (dll, opthdr_ofs + 96);
-# export_size = pe_get32 (dll, opthdr_ofs + 100);
-# nsections = pe_get16 (dll, pe_header_offset + 4 +2);
-# secptr = (pe_header_offset + 4 + 20 +
-# pe_get16 (dll, pe_header_offset + 4 + 16));
-#
-# expptr = 0;
-# for (i = 0; i < nsections; i++)
-# {
-# char sname[8];
-# unsigned long secptr1 = secptr + 40 * i;
-# unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
-# unsigned long vsize = pe_get32 (dll, secptr1 + 16);
-# unsigned long fptr = pe_get32 (dll, secptr1 + 20);
-# lseek(dll, secptr1, SEEK_SET);
-# read(dll, sname, 8);
-# if (vaddr <= export_rva && vaddr+vsize > export_rva)
-# {
-# expptr = fptr + (export_rva - vaddr);
-# if (export_rva + export_size > vaddr + vsize)
-# export_size = vsize - (export_rva - vaddr);
-# break;
-# }
-# }
-#
-# expdata = (unsigned char*)malloc(export_size);
-# lseek (dll, expptr, SEEK_SET);
-# read (dll, expdata, export_size);
-# erva = expdata - export_rva;
-#
-# nexp = pe_as32 (expdata+24);
-# name_rvas = pe_as32 (expdata+32);
-#
-# printf ("EXPORTS\n");
-# for (i = 0; i<nexp; i++)
-# {
-# unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
-# printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
-# }
-#
-# return 0;
-# }
-# /* impgen.c ends here */
-
-EOF
- ;;
- esac
-
- # We use sed instead of cat because bash on DJGPP gets confused if
- # if finds mixed CR/LF and LF-only lines. Since sed operates in
- # text mode, it properly converts lines to CR/LF. This bash problem
- # is reportedly fixed, but why not run on old versions too?
- sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1)
-
- mv -f "${ofile}T" "$ofile" || \
- (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T")
- chmod +x "$ofile"
-fi
-
-])# _LT_AC_LTCONFIG_HACK
-
-# AC_LIBTOOL_DLOPEN - enable checks for dlopen support
-AC_DEFUN([AC_LIBTOOL_DLOPEN], [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])])
-
-# AC_LIBTOOL_WIN32_DLL - declare package support for building win32 dll's
-AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [AC_BEFORE([$0], [AC_LIBTOOL_SETUP])])
-
-# AC_ENABLE_SHARED - implement the --enable-shared flag
-# Usage: AC_ENABLE_SHARED[(DEFAULT)]
-# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
-# `yes'.
-AC_DEFUN([AC_ENABLE_SHARED],
-[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE(shared,
-changequote(<<, >>)dnl
-<< --enable-shared[=PKGS] build shared libraries [default=>>AC_ENABLE_SHARED_DEFAULT],
-changequote([, ])dnl
-[p=${PACKAGE-default}
-case $enableval in
-yes) enable_shared=yes ;;
-no) enable_shared=no ;;
-*)
- enable_shared=no
- # Look at the argument we got. We use all the common list separators.
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
- for pkg in $enableval; do
- if test "X$pkg" = "X$p"; then
- enable_shared=yes
- fi
- done
- IFS="$ac_save_ifs"
- ;;
-esac],
-enable_shared=AC_ENABLE_SHARED_DEFAULT)dnl
-])
-
-# AC_DISABLE_SHARED - set the default shared flag to --disable-shared
-AC_DEFUN([AC_DISABLE_SHARED],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_SHARED(no)])
-
-# AC_ENABLE_STATIC - implement the --enable-static flag
-# Usage: AC_ENABLE_STATIC[(DEFAULT)]
-# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
-# `yes'.
-AC_DEFUN([AC_ENABLE_STATIC],
-[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE(static,
-changequote(<<, >>)dnl
-<< --enable-static[=PKGS] build static libraries [default=>>AC_ENABLE_STATIC_DEFAULT],
-changequote([, ])dnl
-[p=${PACKAGE-default}
-case $enableval in
-yes) enable_static=yes ;;
-no) enable_static=no ;;
-*)
- enable_static=no
- # Look at the argument we got. We use all the common list separators.
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
- for pkg in $enableval; do
- if test "X$pkg" = "X$p"; then
- enable_static=yes
- fi
- done
- IFS="$ac_save_ifs"
- ;;
-esac],
-enable_static=AC_ENABLE_STATIC_DEFAULT)dnl
-])
-
-# AC_DISABLE_STATIC - set the default static flag to --disable-static
-AC_DEFUN([AC_DISABLE_STATIC],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_STATIC(no)])
-
-
-# AC_ENABLE_FAST_INSTALL - implement the --enable-fast-install flag
-# Usage: AC_ENABLE_FAST_INSTALL[(DEFAULT)]
-# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
-# `yes'.
-AC_DEFUN([AC_ENABLE_FAST_INSTALL],
-[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
-AC_ARG_ENABLE(fast-install,
-changequote(<<, >>)dnl
-<< --enable-fast-install[=PKGS] optimize for fast installation [default=>>AC_ENABLE_FAST_INSTALL_DEFAULT],
-changequote([, ])dnl
-[p=${PACKAGE-default}
-case $enableval in
-yes) enable_fast_install=yes ;;
-no) enable_fast_install=no ;;
-*)
- enable_fast_install=no
- # Look at the argument we got. We use all the common list separators.
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
- for pkg in $enableval; do
- if test "X$pkg" = "X$p"; then
- enable_fast_install=yes
- fi
- done
- IFS="$ac_save_ifs"
- ;;
-esac],
-enable_fast_install=AC_ENABLE_FAST_INSTALL_DEFAULT)dnl
-])
-
-# AC_DISABLE_FAST_INSTALL - set the default to --disable-fast-install
-AC_DEFUN([AC_DISABLE_FAST_INSTALL],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-AC_ENABLE_FAST_INSTALL(no)])
-
-# AC_LIBTOOL_PICMODE - implement the --with-pic flag
-# Usage: AC_LIBTOOL_PICMODE[(MODE)]
-# Where MODE is either `yes' or `no'. If omitted, it defaults to
-# `both'.
-AC_DEFUN([AC_LIBTOOL_PICMODE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
-pic_mode=ifelse($#,1,$1,default)])
-
-
-# AC_PATH_TOOL_PREFIX - find a file program which can recognise shared library
-AC_DEFUN([AC_PATH_TOOL_PREFIX],
-[AC_MSG_CHECKING([for $1])
-AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
-[case $MAGIC_CMD in
- /*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
- ?:/*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
- ;;
- *)
- ac_save_MAGIC_CMD="$MAGIC_CMD"
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
-dnl $ac_dummy forces splitting on constant user-supplied paths.
-dnl POSIX.2 word splitting is done only on the output of word expansions,
-dnl not every word. This closes a longstanding sh security hole.
- ac_dummy="ifelse([$2], , $PATH, [$2])"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/$1; then
- lt_cv_path_MAGIC_CMD="$ac_dir/$1"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- egrep "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$ac_save_ifs"
- MAGIC_CMD="$ac_save_MAGIC_CMD"
- ;;
-esac])
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- AC_MSG_RESULT($MAGIC_CMD)
-else
- AC_MSG_RESULT(no)
-fi
-])
-
-
-# AC_PATH_MAGIC - find a file program which can recognise a shared library
-AC_DEFUN([AC_PATH_MAGIC],
-[AC_REQUIRE([AC_CHECK_TOOL_PREFIX])dnl
-AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin:$PATH)
-if test -z "$lt_cv_path_MAGIC_CMD"; then
- if test -n "$ac_tool_prefix"; then
- AC_PATH_TOOL_PREFIX(file, /usr/bin:$PATH)
- else
- MAGIC_CMD=:
- fi
-fi
-])
-
-
-# AC_PROG_LD - find the path to the GNU or non-GNU linker
-AC_DEFUN([AC_PROG_LD],
-[AC_ARG_WITH(gnu-ld,
-[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
-test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
-AC_REQUIRE([AC_PROG_CC])dnl
-AC_REQUIRE([AC_CANONICAL_HOST])dnl
-AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl
-ac_prog=ld
-if test "$GCC" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- AC_MSG_CHECKING([for ld used by GCC])
- case $host in
- *-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
- *)
- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
- esac
- case $ac_prog in
- # Accept absolute paths.
- [[\\/]]* | [[A-Za-z]]:[[\\/]]*)
- re_direlt='/[[^/]][[^/]]*/\.\./'
- # Canonicalize the path of ld
- ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
- while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
- done
- test -z "$LD" && LD="$ac_prog"
- ;;
- "")
- # If it fails, then pretend we aren't using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
-elif test "$with_gnu_ld" = yes; then
- AC_MSG_CHECKING([for GNU ld])
-else
- AC_MSG_CHECKING([for non-GNU ld])
-fi
-AC_CACHE_VAL(lt_cv_path_LD,
-[if test -z "$LD"; then
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH; do
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some GNU ld's only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
- test "$with_gnu_ld" != no && break
- else
- test "$with_gnu_ld" != yes && break
- fi
- fi
- done
- IFS="$ac_save_ifs"
-else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi])
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
- AC_MSG_RESULT($LD)
-else
- AC_MSG_RESULT(no)
-fi
-test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
-AC_PROG_LD_GNU
-])
-
-# AC_PROG_LD_GNU -
-AC_DEFUN([AC_PROG_LD_GNU],
-[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
-[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
-if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
- lt_cv_prog_gnu_ld=yes
-else
- lt_cv_prog_gnu_ld=no
-fi])
-with_gnu_ld=$lt_cv_prog_gnu_ld
-])
-
-# AC_PROG_LD_RELOAD_FLAG - find reload flag for linker
-# -- PORTME Some linkers may need a different reload flag.
-AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
-[AC_CACHE_CHECK([for $LD option to reload object files], lt_cv_ld_reload_flag,
-[lt_cv_ld_reload_flag='-r'])
-reload_flag=$lt_cv_ld_reload_flag
-test -n "$reload_flag" && reload_flag=" $reload_flag"
-])
-
-# AC_DEPLIBS_CHECK_METHOD - how to check for library dependencies
-# -- PORTME fill in with the dynamic library characteristics
-AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
-[AC_CACHE_CHECK([how to recognise dependant libraries],
-lt_cv_deplibs_check_method,
-[lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given egrep regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix4* | aix5*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-beos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-bsdi4*)
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
- lt_cv_file_magic_test_file=/shlib/libc.so
- ;;
-
-cygwin* | mingw* | pw32*)
- lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- ;;
-
-darwin* | rhapsody*)
- lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
- case "$host_os" in
- rhapsody* | darwin1.[[012]])
- lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`
- ;;
- *) # Darwin 1.3 on
- lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'
- ;;
- esac
- ;;
-
-freebsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
- case $host_cpu in
- i*86 )
- # Not sure whether the presence of OpenBSD here was a mistake.
- # Let's accept both of them until this is cleared up.
- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[[3-9]]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
- ;;
- esac
- else
- lt_cv_deplibs_check_method=pass_all
- fi
- ;;
-
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-hpux10.20*|hpux11*)
- lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=/usr/lib/libc.sl
- ;;
-
-irix5* | irix6*)
- case $host_os in
- irix5*)
- # this will be overridden with pass_all, but let us keep it just in case
- lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
- ;;
- *)
- case $LD in
- *-32|*"-32 ") libmagic=32-bit;;
- *-n32|*"-n32 ") libmagic=N32;;
- *-64|*"-64 ") libmagic=64-bit;;
- *) libmagic=never-match;;
- esac
- # this will be overridden with pass_all, but let us keep it just in case
- lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[[1234]] dynamic lib MIPS - version 1"
- ;;
- esac
- lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-# This must be Linux ELF.
-linux-gnu*)
- case $host_cpu in
- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* )
- lt_cv_deplibs_check_method=pass_all ;;
- *)
- # glibc up to 2.1.1 does not perform some relocations on ARM
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' ;;
- esac
- lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
- ;;
-
-netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
- lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so\.[[0-9]]+\.[[0-9]]+$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[[^/\.]]+\.so$'
- fi
- ;;
-
-newos6*)
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=/usr/lib/libnls.so
- ;;
-
-openbsd*)
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB shared object'
- else
- lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'
- fi
- ;;
-
-osf3* | osf4* | osf5*)
- # this will be overridden with pass_all, but let us keep it just in case
- lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'
- lt_cv_file_magic_test_file=/shlib/libc.so
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sco3.2v5*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-solaris*)
- lt_cv_deplibs_check_method=pass_all
- lt_cv_file_magic_test_file=/lib/libc.so
- ;;
-
-sysv5uw[[78]]* | sysv4*uw2*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- case $host_vendor in
- motorola)
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
- ;;
- ncr)
- lt_cv_deplibs_check_method=pass_all
- ;;
- sequent)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
- ;;
- sni)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
- lt_cv_file_magic_test_file=/lib/libc.so
- ;;
- esac
- ;;
-esac
-])
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-])
-
-
-# AC_PROG_NM - find the path to a BSD-compatible name lister
-AC_DEFUN([AC_PROG_NM],
-[AC_REQUIRE([_LT_AC_LIBTOOL_SYS_PATH_SEPARATOR])dnl
-AC_MSG_CHECKING([for BSD-compatible nm])
-AC_CACHE_VAL(lt_cv_path_NM,
-[if test -n "$NM"; then
- # Let the user override the test.
- lt_cv_path_NM="$NM"
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
- test -z "$ac_dir" && ac_dir=.
- tmp_nm=$ac_dir/${ac_tool_prefix}nm
- if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then
- # Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
- # nm: unknown option "B" ignored
- # Tru64's nm complains that /dev/null is an invalid object file
- if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then
- lt_cv_path_NM="$tmp_nm -B"
- break
- elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
- lt_cv_path_NM="$tmp_nm -p"
- break
- else
- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
- continue # so that we can try to find one that supports BSD flags
- fi
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
-fi])
-NM="$lt_cv_path_NM"
-AC_MSG_RESULT([$NM])
-])
-
-# AC_CHECK_LIBM - check for math library
-AC_DEFUN([AC_CHECK_LIBM],
-[AC_REQUIRE([AC_CANONICAL_HOST])dnl
-LIBM=
-case $host in
-*-*-beos* | *-*-cygwin* | *-*-pw32*)
- # These system don't have libm
- ;;
-*-ncr-sysv4.3*)
- AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
- AC_CHECK_LIB(m, main, LIBM="$LIBM -lm")
- ;;
-*)
- AC_CHECK_LIB(m, main, LIBM="-lm")
- ;;
-esac
-])
-
-# AC_LIBLTDL_CONVENIENCE[(dir)] - sets LIBLTDL to the link flags for
-# the libltdl convenience library and INCLTDL to the include flags for
-# the libltdl header and adds --enable-ltdl-convenience to the
-# configure arguments. Note that LIBLTDL and INCLTDL are not
-# AC_SUBSTed, nor is AC_CONFIG_SUBDIRS called. If DIR is not
-# provided, it is assumed to be `libltdl'. LIBLTDL will be prefixed
-# with '${top_builddir}/' and INCLTDL will be prefixed with
-# '${top_srcdir}/' (note the single quotes!). If your package is not
-# flat and you're not using automake, define top_builddir and
-# top_srcdir appropriately in the Makefiles.
-AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
- case $enable_ltdl_convenience in
- no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
- "") enable_ltdl_convenience=yes
- ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
- esac
- LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
- INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
-])
-
-# AC_LIBLTDL_INSTALLABLE[(dir)] - sets LIBLTDL to the link flags for
-# the libltdl installable library and INCLTDL to the include flags for
-# the libltdl header and adds --enable-ltdl-install to the configure
-# arguments. Note that LIBLTDL and INCLTDL are not AC_SUBSTed, nor is
-# AC_CONFIG_SUBDIRS called. If DIR is not provided and an installed
-# libltdl is not found, it is assumed to be `libltdl'. LIBLTDL will
-# be prefixed with '${top_builddir}/' and INCLTDL will be prefixed
-# with '${top_srcdir}/' (note the single quotes!). If your package is
-# not flat and you're not using automake, define top_builddir and
-# top_srcdir appropriately in the Makefiles.
-# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
-AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
-[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
- AC_CHECK_LIB(ltdl, main,
- [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
- [if test x"$enable_ltdl_install" = xno; then
- AC_MSG_WARN([libltdl not installed, but installation disabled])
- else
- enable_ltdl_install=yes
- fi
- ])
- if test x"$enable_ltdl_install" = x"yes"; then
- ac_configure_args="$ac_configure_args --enable-ltdl-install"
- LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
- INCLTDL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
- else
- ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
- LIBLTDL="-lltdl"
- INCLTDL=
- fi
-])
-
-# old names
-AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL])
-AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
-AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
-AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
-AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
-AC_DEFUN([AM_PROG_LD], [AC_PROG_LD])
-AC_DEFUN([AM_PROG_NM], [AC_PROG_NM])
-
-# This is just to silence aclocal about the macro not being used
-ifelse([AC_DISABLE_FAST_INSTALL])
-
diff --git a/authors b/authors
deleted file mode 100755
index add1945..0000000
--- a/authors
+++ /dev/null
@@ -1,47 +0,0 @@
-
-This is a list of the people who are or have worked on the xbase64 Library.
-
-Gary Kunkel <gkunkel@zhsac.com> - original author,
- current maintainer of xbase64
-Larry McCourry <lmccourry@charter.net - memory leak testing
-Sergiy Yakovin <s.yakovin@if.ukrsotsbank.com> - cdx index support
-
-Previous to this library being branced to xbase64, the following AUTHORS have
-supported xbase to the 2.x release level.
-
-
-
-------------------------------------------------------------------------------
-The following list is the AUTHORS file for the xbase library release 2.
-------------------------------------------------------------------------------
-This is a partial list of the people that have helped with the xbase
-project and something specific they worked on. Most have worked on more
-than what is listed.
-
-Derry Bryson <derry@techass.com> - release 2.x maintainer
-Mario Motta - testing and bugfixes
-Serge Smirnov <sw1181@mail.ru> - MSVC stuff and OCAML support
-Frolov Sergey - bugfixes (memory leaks)
-
-------------------------------------------------------------------------------
-The following is the original AUTHORS file for the xbase library
-------------------------------------------------------------------------------
-This is a partial list of the people that have helped with the xbase
-project and something specific they worked on. Most have worked on more
-than what is listed.
-
-
-Bob Cotton <bcotton@synix.com> - Clipper NTX index support
-Denis Braussen <postoffice@mail.dotcom.fr> - general support
-Denis Pershin <dyp@inetlab.com> - provided library enhancements
-Eirk Bachman <ebp@geocities.com> - keeper of definitive Xbase spec
-Gabriel Emerson <egabriel@io.com> - provided logo
-Kehl Hubertus <kehlh@hotmail.com> - Xbase to Xbase C++ Perl Converter
-Michael Bedward <mbedward@ozemail.com.au> - Expression logic support
-Paul Foster <paulf@quillandmouse.com> - general support
-Vitaly Fedrushkov <willy@snowyowl.csu.ac.ru> - TV support and more
-
-------------------------------------------------------------------------------
-
-If you are missing and you should be included in this file, please let me
-know at xbase64-dev@lists.sourceforge.net. Thanks, Gary Kunkel.
diff --git a/bin/Makefile.am b/bin/Makefile.am
deleted file mode 100755
index 43c8333..0000000
--- a/bin/Makefile.am
+++ /dev/null
@@ -1,30 +0,0 @@
-
-INCLUDES= -I$(topdir)
-LDADD = -L$(topdir)/xbase64 -lxbase64
-
-INSTALL_PROGRAM = @INSTALL@
-
-bin_PROGRAMS = checkndx copydbf dbfxtrct deletall dumphdr dumprecs packdbf \
- reindex undelall zap dbfutil1
-
-noinst_PROGRAMS = dumpdbt
-
-checkndx_SOURCES = checkndx.cpp
-copydbf_SOURCES = copydbf.cpp
-dbfxtrct_SOURCES = dbfxtrct.cpp
-dbfutil1_SOURCES = dbfutil1.cpp
-deletall_SOURCES = deletall.cpp
-dumpdbt_SOURCES = dumpdbt.cpp
-dumphdr_SOURCES = dumphdr.cpp
-dumprecs_SOURCES = dumprecs.cpp
-packdbf_SOURCES = packdbf.cpp
-reindex_SOURCES = reindex.cpp
-undelall_SOURCES = undelall.cpp
-zap_SOURCES = zap.cpp
-
-noinst_HEADERS =
-
-EXTRA_DIST = makebcc.bat
-
-CLEANFILES = Makefile.in *.exe *.BAK *.tds *.obj *.tr2 *.ndx *.dbf *.dbt \
- *.ntx compout
diff --git a/bin/Makefile.in b/bin/Makefile.in
deleted file mode 100755
index e757afd..0000000
--- a/bin/Makefile.in
+++ /dev/null
@@ -1,507 +0,0 @@
-# Makefile.in generated by automake 1.6.3 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = @program_transform_name@
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-
-EXEEXT = @EXEEXT@
-OBJEXT = @OBJEXT@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-
-INSTALL_PROGRAM = @INSTALL@
-AMTAR = @AMTAR@
-AS = @AS@
-AWK = @AWK@
-CC = @CC@
-CXX = @CXX@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
-GXXVER = @GXXVER@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-RELEASE = @RELEASE@
-RHREL = @RHREL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XSUBDIRS = @XSUBDIRS@
-am__include = @am__include@
-am__quote = @am__quote@
-doxygen = @doxygen@
-install_sh = @install_sh@
-topdir = @topdir@
-
-INCLUDES = -I$(topdir)
-LDADD = -L$(topdir)/xbase64 -lxbase64
-
-bin_PROGRAMS = checkndx copydbf dbfxtrct deletall dumphdr dumprecs packdbf \
- reindex undelall zap dbfutil1
-
-
-noinst_PROGRAMS = dumpdbt
-
-checkndx_SOURCES = checkndx.cpp
-copydbf_SOURCES = copydbf.cpp
-dbfxtrct_SOURCES = dbfxtrct.cpp
-dbfutil1_SOURCES = dbfutil1.cpp
-deletall_SOURCES = deletall.cpp
-dumpdbt_SOURCES = dumpdbt.cpp
-dumphdr_SOURCES = dumphdr.cpp
-dumprecs_SOURCES = dumprecs.cpp
-packdbf_SOURCES = packdbf.cpp
-reindex_SOURCES = reindex.cpp
-undelall_SOURCES = undelall.cpp
-zap_SOURCES = zap.cpp
-
-noinst_HEADERS =
-
-EXTRA_DIST = makebcc.bat
-
-CLEANFILES = Makefile.in *.exe *.BAK *.tds *.obj *.tr2 *.ndx *.dbf *.dbt \
- *.ntx compout
-
-subdir = bin
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/xbase64/xbconfig.h
-CONFIG_CLEAN_FILES =
-bin_PROGRAMS = checkndx$(EXEEXT) copydbf$(EXEEXT) dbfxtrct$(EXEEXT) \
- deletall$(EXEEXT) dumphdr$(EXEEXT) dumprecs$(EXEEXT) \
- packdbf$(EXEEXT) reindex$(EXEEXT) undelall$(EXEEXT) \
- zap$(EXEEXT) dbfutil1$(EXEEXT)
-noinst_PROGRAMS = dumpdbt$(EXEEXT)
-PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS)
-
-am_checkndx_OBJECTS = checkndx.$(OBJEXT)
-checkndx_OBJECTS = $(am_checkndx_OBJECTS)
-checkndx_LDADD = $(LDADD)
-checkndx_DEPENDENCIES =
-checkndx_LDFLAGS =
-am_copydbf_OBJECTS = copydbf.$(OBJEXT)
-copydbf_OBJECTS = $(am_copydbf_OBJECTS)
-copydbf_LDADD = $(LDADD)
-copydbf_DEPENDENCIES =
-copydbf_LDFLAGS =
-am_dbfutil1_OBJECTS = dbfutil1.$(OBJEXT)
-dbfutil1_OBJECTS = $(am_dbfutil1_OBJECTS)
-dbfutil1_LDADD = $(LDADD)
-dbfutil1_DEPENDENCIES =
-dbfutil1_LDFLAGS =
-am_dbfxtrct_OBJECTS = dbfxtrct.$(OBJEXT)
-dbfxtrct_OBJECTS = $(am_dbfxtrct_OBJECTS)
-dbfxtrct_LDADD = $(LDADD)
-dbfxtrct_DEPENDENCIES =
-dbfxtrct_LDFLAGS =
-am_deletall_OBJECTS = deletall.$(OBJEXT)
-deletall_OBJECTS = $(am_deletall_OBJECTS)
-deletall_LDADD = $(LDADD)
-deletall_DEPENDENCIES =
-deletall_LDFLAGS =
-am_dumpdbt_OBJECTS = dumpdbt.$(OBJEXT)
-dumpdbt_OBJECTS = $(am_dumpdbt_OBJECTS)
-dumpdbt_LDADD = $(LDADD)
-dumpdbt_DEPENDENCIES =
-dumpdbt_LDFLAGS =
-am_dumphdr_OBJECTS = dumphdr.$(OBJEXT)
-dumphdr_OBJECTS = $(am_dumphdr_OBJECTS)
-dumphdr_LDADD = $(LDADD)
-dumphdr_DEPENDENCIES =
-dumphdr_LDFLAGS =
-am_dumprecs_OBJECTS = dumprecs.$(OBJEXT)
-dumprecs_OBJECTS = $(am_dumprecs_OBJECTS)
-dumprecs_LDADD = $(LDADD)
-dumprecs_DEPENDENCIES =
-dumprecs_LDFLAGS =
-am_packdbf_OBJECTS = packdbf.$(OBJEXT)
-packdbf_OBJECTS = $(am_packdbf_OBJECTS)
-packdbf_LDADD = $(LDADD)
-packdbf_DEPENDENCIES =
-packdbf_LDFLAGS =
-am_reindex_OBJECTS = reindex.$(OBJEXT)
-reindex_OBJECTS = $(am_reindex_OBJECTS)
-reindex_LDADD = $(LDADD)
-reindex_DEPENDENCIES =
-reindex_LDFLAGS =
-am_undelall_OBJECTS = undelall.$(OBJEXT)
-undelall_OBJECTS = $(am_undelall_OBJECTS)
-undelall_LDADD = $(LDADD)
-undelall_DEPENDENCIES =
-undelall_LDFLAGS =
-am_zap_OBJECTS = zap.$(OBJEXT)
-zap_OBJECTS = $(am_zap_OBJECTS)
-zap_LDADD = $(LDADD)
-zap_DEPENDENCIES =
-zap_LDFLAGS =
-
-DEFS = @DEFS@
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/xbase64
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/checkndx.Po ./$(DEPDIR)/copydbf.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/dbfutil1.Po ./$(DEPDIR)/dbfxtrct.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/deletall.Po ./$(DEPDIR)/dumpdbt.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/dumphdr.Po ./$(DEPDIR)/dumprecs.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/packdbf.Po ./$(DEPDIR)/reindex.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/undelall.Po ./$(DEPDIR)/zap.Po
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
-CXXFLAGS = @CXXFLAGS@
-DIST_SOURCES = $(checkndx_SOURCES) $(copydbf_SOURCES) \
- $(dbfutil1_SOURCES) $(dbfxtrct_SOURCES) $(deletall_SOURCES) \
- $(dumpdbt_SOURCES) $(dumphdr_SOURCES) $(dumprecs_SOURCES) \
- $(packdbf_SOURCES) $(reindex_SOURCES) $(undelall_SOURCES) \
- $(zap_SOURCES)
-HEADERS = $(noinst_HEADERS)
-
-DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in
-SOURCES = $(checkndx_SOURCES) $(copydbf_SOURCES) $(dbfutil1_SOURCES) $(dbfxtrct_SOURCES) $(deletall_SOURCES) $(dumpdbt_SOURCES) $(dumphdr_SOURCES) $(dumprecs_SOURCES) $(packdbf_SOURCES) $(reindex_SOURCES) $(undelall_SOURCES) $(zap_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .cpp .lo .o .obj
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && \
- $(AUTOMAKE) --gnu bin/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-install-binPROGRAMS: $(bin_PROGRAMS)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(bindir)
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- if test -f $$p \
- || test -f $$p1 \
- ; then \
- f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \
- $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f; \
- else :; fi; \
- done
-
-uninstall-binPROGRAMS:
- @$(NORMAL_UNINSTALL)
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
- echo " rm -f $(DESTDIR)$(bindir)/$$f"; \
- rm -f $(DESTDIR)$(bindir)/$$f; \
- done
-
-clean-binPROGRAMS:
- @list='$(bin_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
-
-clean-noinstPROGRAMS:
- @list='$(noinst_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
-checkndx$(EXEEXT): $(checkndx_OBJECTS) $(checkndx_DEPENDENCIES)
- @rm -f checkndx$(EXEEXT)
- $(CXXLINK) $(checkndx_LDFLAGS) $(checkndx_OBJECTS) $(checkndx_LDADD) $(LIBS)
-copydbf$(EXEEXT): $(copydbf_OBJECTS) $(copydbf_DEPENDENCIES)
- @rm -f copydbf$(EXEEXT)
- $(CXXLINK) $(copydbf_LDFLAGS) $(copydbf_OBJECTS) $(copydbf_LDADD) $(LIBS)
-dbfutil1$(EXEEXT): $(dbfutil1_OBJECTS) $(dbfutil1_DEPENDENCIES)
- @rm -f dbfutil1$(EXEEXT)
- $(CXXLINK) $(dbfutil1_LDFLAGS) $(dbfutil1_OBJECTS) $(dbfutil1_LDADD) $(LIBS)
-dbfxtrct$(EXEEXT): $(dbfxtrct_OBJECTS) $(dbfxtrct_DEPENDENCIES)
- @rm -f dbfxtrct$(EXEEXT)
- $(CXXLINK) $(dbfxtrct_LDFLAGS) $(dbfxtrct_OBJECTS) $(dbfxtrct_LDADD) $(LIBS)
-deletall$(EXEEXT): $(deletall_OBJECTS) $(deletall_DEPENDENCIES)
- @rm -f deletall$(EXEEXT)
- $(CXXLINK) $(deletall_LDFLAGS) $(deletall_OBJECTS) $(deletall_LDADD) $(LIBS)
-dumpdbt$(EXEEXT): $(dumpdbt_OBJECTS) $(dumpdbt_DEPENDENCIES)
- @rm -f dumpdbt$(EXEEXT)
- $(CXXLINK) $(dumpdbt_LDFLAGS) $(dumpdbt_OBJECTS) $(dumpdbt_LDADD) $(LIBS)
-dumphdr$(EXEEXT): $(dumphdr_OBJECTS) $(dumphdr_DEPENDENCIES)
- @rm -f dumphdr$(EXEEXT)
- $(CXXLINK) $(dumphdr_LDFLAGS) $(dumphdr_OBJECTS) $(dumphdr_LDADD) $(LIBS)
-dumprecs$(EXEEXT): $(dumprecs_OBJECTS) $(dumprecs_DEPENDENCIES)
- @rm -f dumprecs$(EXEEXT)
- $(CXXLINK) $(dumprecs_LDFLAGS) $(dumprecs_OBJECTS) $(dumprecs_LDADD) $(LIBS)
-packdbf$(EXEEXT): $(packdbf_OBJECTS) $(packdbf_DEPENDENCIES)
- @rm -f packdbf$(EXEEXT)
- $(CXXLINK) $(packdbf_LDFLAGS) $(packdbf_OBJECTS) $(packdbf_LDADD) $(LIBS)
-reindex$(EXEEXT): $(reindex_OBJECTS) $(reindex_DEPENDENCIES)
- @rm -f reindex$(EXEEXT)
- $(CXXLINK) $(reindex_LDFLAGS) $(reindex_OBJECTS) $(reindex_LDADD) $(LIBS)
-undelall$(EXEEXT): $(undelall_OBJECTS) $(undelall_DEPENDENCIES)
- @rm -f undelall$(EXEEXT)
- $(CXXLINK) $(undelall_LDFLAGS) $(undelall_OBJECTS) $(undelall_LDADD) $(LIBS)
-zap$(EXEEXT): $(zap_OBJECTS) $(zap_DEPENDENCIES)
- @rm -f zap$(EXEEXT)
- $(CXXLINK) $(zap_LDFLAGS) $(zap_OBJECTS) $(zap_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
- -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/checkndx.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/copydbf.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfutil1.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dbfxtrct.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/deletall.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumpdbt.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumphdr.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dumprecs.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/packdbf.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reindex.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/undelall.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/zap.Po@am__quote@
-
-distclean-depend:
- -rm -rf ./$(DEPDIR)
-
-.cpp.o:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-
-.cpp.obj:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(CXXCOMPILE) -c -o $@ `cygpath -w $<`
-
-.cpp.lo:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-CXXDEPMODE = @CXXDEPMODE@
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
- -rm -f libtool
-uninstall-info-am:
-
-ETAGS = etags
-ETAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- mkid -fID $$unique
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$tags$$unique" \
- || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
- @list='$(DISTFILES)'; for file in $$list; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
- dir="/$$dir"; \
- $(mkinstalldirs) "$(distdir)$$dir"; \
- else \
- dir=''; \
- fi; \
- if test -d $$d/$$file; then \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
- else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS) $(HEADERS)
-
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(bindir)
-
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-generic clean-libtool \
- clean-noinstPROGRAMS mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
- distclean-generic distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am: install-binPROGRAMS
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-uninstall-am: uninstall-binPROGRAMS uninstall-info-am
-
-.PHONY: GTAGS all all-am check check-am clean clean-binPROGRAMS \
- clean-generic clean-libtool clean-noinstPROGRAMS distclean \
- distclean-compile distclean-depend distclean-generic \
- distclean-libtool distclean-tags distdir dvi dvi-am info \
- info-am install install-am install-binPROGRAMS install-data \
- install-data-am install-exec install-exec-am install-info \
- install-info-am install-man install-strip installcheck \
- installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-compile \
- mostlyclean-generic mostlyclean-libtool tags uninstall \
- uninstall-am uninstall-binPROGRAMS uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/bin/copydbf.cpp b/bin/copydbf.cpp
deleted file mode 100755
index 3175a87..0000000
--- a/bin/copydbf.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- Xbase64 project source code
-
- This sample program copies the structure of one dbf to another
- dbf file
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main(int ac,char** av)
-{
- if (3 != ac) {
- std::cout <<
- "\nUsage: copydbf filename1 filename2\n"
- "This program copies the structure of one dbf file to another\n";
- return 1;
- }
-
- char* sfilename = av[1];
- char* tfilename = av[2];
-
- xbXBase x;
- xbDbf MyFile( &x );
-
- xbShort rc = MyFile.OpenDatabase( sfilename );
- if( rc != XB_NO_ERROR ) {
- std::cout << "Could not open file " << sfilename << " Error = " << rc
- << "\n";
- return 2;
- }
-
- // OverlaySwitch = 0; /* dont overlay existing file if it exists */
- xbShort OverlaySwitch = 1; /* overlay existing file if it exists */
-
- if(( rc = MyFile.CopyDbfStructure( tfilename, OverlaySwitch )) != XB_NO_ERROR )
- {
- std::cout << "Could not copy file " << tfilename << " Error = " << rc
- << "\n";
- return 3;
- }
-
- MyFile.CloseDatabase(); /* close database */
- return 0;
-}
diff --git a/bin/dbfutil1.cpp b/bin/dbfutil1.cpp
deleted file mode 100755
index 0b74d41..0000000
--- a/bin/dbfutil1.cpp
+++ /dev/null
@@ -1,1347 +0,0 @@
-/*
- dbf utility program
-
- This is a generic XBase menu program for executing XBase64 functions
- on a single dbf database table.
-
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-// next lines are helpful for debugging purposes
-/*
-#include <xbase64/xbdbf.cpp>
-#include <xbase64/xbexp.cpp>
-#include <xbase64/xbexpprc.cpp>
-#include <xbase64/xbexpfnc.cpp>
-#include <xbase64/xbfields.cpp>
-#include <xbase64/xbindex.cpp>
-#include <xbase64/xbmemo.cpp>
-#include <xbase64/xbndx.cpp>
-#include <xbase64/xbntx.cpp>
-#include <xbase64/xbase64.cpp>
-#include <xbase64/xbdate.cpp>
-#include <xbase64/xbfilter.cpp>
-#include <xbase64/xblock.cpp>
-#include <xbase64/xbstring.cpp>
-#include <xbase64/xbfile.cpp>
-#include <xbase64/xbcdx.cpp>
-*/
-
-xbXBase x;
-xbDbf d( &x );
-xbIndex *ix;
-
-#ifdef XB_FILTERS
-xbFilter *xbf;
-#endif
-
-
-class MyClass {
- public:
- MyClass() {};
- void OpenFile();
- void CloseFile();
- void ConvertDatabase();
- void ReindexDatabase();
- void PackDatabase();
- void ZapDatabase();
- void DeleteMemoField();
- void UpdateMemoField();
- void ShowFieldInfo( int );
- void ShowFieldData();
- void UpdateFieldData();
- void PutRecord();
- void GetRecord();
- void DumpDbtHeader();
- void BlankRecord();
- void FindMemoBlocks();
- void GetMemoBlocks();
- void FileStats();
- void MainMenu();
- void FileMenu();
- void RecordMenu();
- void FieldMenu();
- void IndexMenu();
- void LockingMenu();
- void DebugMenu();
- void OpenIndex();
- void CloseIndex();
- void FindKey();
- void GetFirstKey();
- void GetLastKey();
- void GetNextKey();
- void GetPrevKey();
- void DumpIndexNodes();
- void ShowLockInfo();
- void SetRetryCount();
- void SetDefaultLockMode();
- void SetTableLockMode();
- void LockDbf();
- void UnlockDbf();
- void LockRecord();
- void UnlockRecord();
- void LockMemoFile( xbShort );
- void LockIndexFile( xbShort );
- void CreateNewIndex();
- void ProcessExpression();
- void FilterMenu();
- void SetFilter();
- void FirstFilterRec();
- void NextFilterRec();
- void PrevFilterRec();
- void LastFilterRec();
-};
-/************************************************************************/
-#ifdef XB_FILTERS
-void MyClass::FilterMenu()
-{
- int option = 0;
-
- while( option != 99 ) {
- std::cout << std::endl << std::endl
- << "Filter Menu" << std::endl;
- std::cout << "1 - Set Filter Expression" << std::endl;
- std::cout << "2 - Get First Filter Record" << std::endl;
- std::cout << "3 - Get Next Filter Record" << std::endl;
- std::cout << "4 - Get Previous Filter Record" << std::endl;
- std::cout << "5 - Get Last Filter Record" << std::endl;
- std::cout << "99 - Exit Menu" << std::endl;
- std::cin >> option;
- switch( option ){
- case 1: SetFilter(); break;
- case 2: FirstFilterRec(); break;
- case 3: NextFilterRec(); break;
- case 4: PrevFilterRec(); break;
- case 5: LastFilterRec(); break;
- case 99: break;
- default: std::cout << "Invalid option" << std::endl; break;
- }
- }
-}
-/************************************************************************/
-void MyClass::SetFilter()
-{
- char Expression[512];
- memset( Expression, 0x00, 512 );
- while( !strlen( Expression )){
- std::cout << "Enter filter expression (like AMOUNT<5)" << std::endl;
- gets( Expression );
- }
- if( xbf )
- delete xbf;
-
- xbf = new xbFilter( &d, 0, Expression );
-
- if( xbf->GetStatus() )
- x.DisplayError( xbf->GetStatus());
- else
- std::cout << "Filter initialized" << std::endl;
-}
-/************************************************************************/
-void MyClass::FirstFilterRec()
-{
- xbShort rc;
- if( !xbf )
- SetFilter();
- rc = xbf->GetFirstFilterRec();
- if( rc ){
- x.DisplayError( rc );
- return;
- }
- std::cout << "Record: " << d.GetCurRecNo() << std::endl;
- for( int i = 0; i < d.FieldCount() && i < 3; i++ )
- printf( "%-10s = %s\n", d.GetFieldName(i), d.GetStringField(i));
-
-}
-/************************************************************************/
-void MyClass::NextFilterRec()
-{
- xbShort rc;
- if( !xbf )
- SetFilter();
- rc = xbf->GetNextFilterRec();
- if( rc ){
- x.DisplayError( rc );
- return;
- }
- std::cout << "Record: " << d.GetCurRecNo() << std::endl;
- for( int i = 0; i < d.FieldCount() && i < 3; i++ )
- printf( "%-10s = %s\n", d.GetFieldName(i), d.GetStringField(i));
-}
-/************************************************************************/
-void MyClass::PrevFilterRec()
-{
- xbShort rc;
- if( !xbf )
- SetFilter();
- rc = xbf->GetPrevFilterRec();
- if( rc ){
- x.DisplayError( rc );
- return;
- }
- std::cout << "Record: " << d.GetCurRecNo() << std::endl;
- for( int i = 0; i < d.FieldCount() && i < 3; i++ )
- printf( "%-10s = %s\n", d.GetFieldName(i), d.GetStringField(i));
-}
-/************************************************************************/
-void MyClass::LastFilterRec()
-{
- xbShort rc;
- if( !xbf )
- SetFilter();
- rc = xbf->GetLastFilterRec();
- if( rc ){
- x.DisplayError( rc );
- return;
- }
- std::cout << "Record: " << d.GetCurRecNo() << std::endl;
- for( int i = 0; i < d.FieldCount() && i < 3; i++ )
- printf( "%-10s = %s\n", d.GetFieldName(i), d.GetStringField(i));
-}
-#endif // XB_FILTERS
-/************************************************************************/
-#ifdef XB_EXPRESSIONS
-void MyClass::ProcessExpression()
-{
- char exprsn[256];
- char type;
- xbExpn *exp; // expression
- xbShort rc;
- int debug = 0;
- memset( exprsn, 0x00, 256 );
-
- std::cout << "Enter expression string or HELP" << std::endl;
-
- while( !strstr( exprsn, "QUIT" ) && !strstr( exprsn, "quit" )){
-
- std::cout << ">";
- gets( exprsn );
-
- if( strstr( exprsn, "HELP" ) || strstr( exprsn, "help" )){
- std::cout << "** Command Help ***" << std::endl << std::endl;
- std::cout << "HELP - This help screen" << std::endl;
- std::cout << "QUIT - Exit the function" << std::endl;
- #ifdef XBASE_DEBUG
- std::cout << "DEBUG - Toggle debug mode on/off" << std::endl;
- #endif
- std::cout << "\nExamples expressions:" << std::endl;
- std::cout << " 5+5 or 5-2/7 or FUNC(op1,op2)" << std::endl;
- std::cout << "\nRecognized functions:" << std::endl;
- xbString s;
- xbShort i = 0;
- exp = new xbExpn( &x );
- s = exp->GetValidFuncName( i++ );
- while( s.len() ){
- std::cout << s << "\t";
- s = exp->GetValidFuncName( i++ );
- }
-
- delete exp;
- std::cout << "\n\nSee documentation for more expression info"
- << std::endl << std::endl;
- }
-
- else if( strstr( exprsn, "DEBUG" ) || strstr( exprsn, "debug" )){
- if( debug ){
- std::cout << "Debug mode toggled off" << std::endl;
- debug = 0;
- } else {
- std::cout << "Debug mode toggled on" << std::endl;
- debug = 1;
- }
- }
-
- else if( !strstr( exprsn, "QUIT" ) && !strstr( exprsn, "quit" ))
- {
- exp = new xbExpn( &x );
- if(( rc = exp->ParseExpression( exprsn, &d )) != 0 ){
- std::cout << "Error while parsing" << std::endl;
- x.DisplayError( rc );
- }
-
- else {
- if( debug ){
- exp->DumpExpressionTree( 1 );
- std::cout << "Expression tree dumped to file xbase64.log" << std::endl;
- }
-
- if(( rc = exp->ProcessExpression()) != 0 ){
- std::cout << "Error in processing " << std::endl;
- x.DisplayError( rc );
- } else {
-
- type = exp->GetExpressionResultType();
-
- std::cout << "Result Type = [" << type << "]" << std::endl;
- std::cout << "Result Data = [";
- switch( type ){
- case 'C':
- case 'D':
- std::cout << exp->GetStringResult() << "]" << std::endl;
- break;
- case 'N':
- std::cout << exp->GetDoubleResult() << "]" << std::endl;
- break;
- case 'L':
- std::cout << exp->GetIntResult() << "]" << std::endl;
- break;
- default:
- std::cout << "Unknown result type]" << std::endl;
- break;
- }
- }
- delete exp;
- }
- }
- }
-}
-#endif // XB_EXPRESSIONS
-/************************************************************************/
-#ifdef XBASE_DEBUG
-void MyClass::DumpIndexNodes()
-{
- xbLong NodeCnt = ix->GetTotalNodes();
- std::cout << "For NDX indices, output placed in xbase.log" << std::endl;
- std::cout << "total nodes = " << NodeCnt << std::endl;
- ix->DumpHdrNode( 1 );
- if( NodeCnt > 1 )
- for( xbLong l = 1L; l <= NodeCnt-1; l++ )
- ix->DumpNodeRec( l );
-}
-#endif
-/************************************************************************/
-void MyClass::OpenIndex()
-{
- int rc;
- char Filename[51];
-
- if( d.GetDbfStatus() == XB_CLOSED ){
- std::cout << "No open database" << std::endl;
- return;
- }
- if( ix ){
- std::cout << "Index already opened" << std::endl;
- return;
- }
-
- std::cout << "Enter index name: ";
- std::cin >> Filename;
- if( strstr( Filename, "NDX" ) || strstr( Filename, "ndx" )){
- ix = new xbNdx( &d );
- rc = ix->OpenIndex( Filename );
- }
- else if( strstr( Filename, "NTX" ) || strstr( Filename, "ntx" )){
- ix = new xbNtx( &d );
- rc = ix->OpenIndex( Filename );
- }
- else
- {
- std::cout
- << "Invalid index name. Needs file extension. index.ndx or index.ntx"
- << std::endl;
- return;
- }
- x.DisplayError( rc );
-// std::cout << "Return code " << rc << std::endl;
-}
-/************************************************************************/
-void MyClass::FindKey()
-{
- if( !ix ){
- std::cout << "No open index" << std::endl;
- return;
- }
-
- char KeyBuf[101];
- memset( KeyBuf, 0x00, 101 );
- std::cout << "This function only works for character keys (so far).."
- << std::endl;
- std::cout << "Enter search key:" << std::endl;
- std::cin >> KeyBuf;
- x.DisplayError( ix->FindKey( KeyBuf ) );
-}
-/************************************************************************/
-void MyClass::GetNextKey()
-{
- if( !ix )
- std::cout << "No open index" << std::endl;
- else
- x.DisplayError( ix->GetNextKey() );
-}
-/************************************************************************/
-void MyClass::GetPrevKey()
-{
- if( !ix )
- std::cout << "No open index" << std::endl;
- else
- x.DisplayError( ix->GetPrevKey() );
-}
-/************************************************************************/
-void MyClass::GetFirstKey()
-{
- if( !ix )
- std::cout << "No open index" << std::endl;
- else
- x.DisplayError( ix->GetFirstKey() );
-}
-/************************************************************************/
-void MyClass::GetLastKey()
-{
- if( !ix )
- std::cout << "No open index" << std::endl;
- else
- x.DisplayError( ix->GetLastKey() );
-}
-/************************************************************************/
-void MyClass::CloseIndex()
-{
- if( !ix ){
- std::cout << "No open index" << std::endl;
- return;
- }
- x.DisplayError( ix->CloseIndex());
- delete ix;
- ix = 0;
-}
-/************************************************************************/
-/* stats */
-void MyClass::FileStats()
-{
- if( d.GetDbfStatus() == XB_CLOSED ){
- std::cout << "No open database" << std::endl;
- return;
- }
- std::cout << "Database name = " << d.GetDbfName() << std::endl;
- std::cout << "Number of records = " << d.NoOfRecords() << std::endl;
- std::cout << "Physical no of recs = " << d.PhysicalNoOfRecords() << std::endl;
- std::cout << "Number of fields = " << d.FieldCount() << std::endl;
- std::cout << "Database Status = ";
- switch( d.GetDbfStatus() ){
- case 0:
- std::cout << "XB_CLOSED" << std::endl;
- break;
- case 1:
- std::cout << "XB_OPEN" << std::endl;
- break;
- case 2:
- std::cout << "XB_UPDATED" << std::endl;
- break;
- default:
- std::cout << std::endl;
- break;
- }
- std::cout << "Record Length = " << d.GetRecordLen() << std::endl;
-#ifdef XB_MEMO_FIELDS
- std::cout << "Memo Fields Present = ";
- switch( d.MemoFieldsPresent() ){
- case 0:
- std::cout << "No " << std::endl;
- break;
- case 1:
- std::cout << "Yes" << std::endl;
- std::cout << "Memofile name = " << d.GetDbtName() << std::endl;
- break;
- default:
- std::cout << std::endl;
- break;
- }
-#endif
- std::cout << "Current Record No = " << d.GetCurRecNo() << std::endl;
- std::cout << "Autolock status = " << d.GetAutoLock() << std::endl;
- std::cout << "Real Delete status = " << d.GetRealDelete()<< std::endl;
- std::cout << "Index Count = " << d.IndexCount() << std::endl;
-}
-/************************************************************************/
-/* open database */
-void MyClass::OpenFile()
-{
- int rc;
- char filename[50];
- std::cout << "Enter database file (.dbf) name: ";
- std::cin >> filename;
-
- rc = d.OpenDatabase( filename );
- x.DisplayError( rc );
-}
-/************************************************************************/
-/* open database */
-void MyClass::PackDatabase()
-{
- x.DisplayError( d.PackDatabase( 0,0,0 ));
-}
-/************************************************************************/
-/* open database */
-void MyClass::ZapDatabase()
-{
- x.DisplayError( d.Zap(0) );
-}
-/************************************************************************/
-/* close database */
-void MyClass::CloseFile()
-{
- int rc;
- rc = d.CloseDatabase();
- x.DisplayError( rc );
-}
-/************************************************************************/
-/* convert database */
-void MyClass::ConvertDatabase()
-{
- int rc;
- xbShort FieldNo;
- xbLong len, FieldCnt;
- xbDbf d2( &x );
- char *MemoFieldBuf = NULL;
- xbLong MemoFieldLen = 0L;
-
- std::cout << "Warning - check your results!!" << std::endl << std::endl;
-
- char filename[50];
- std::cout << "Enter database file name to convert to: ";
- std::cin >> filename;
-
- if(( rc = d2.OpenDatabase( filename )) != XB_NO_ERROR ){
- std::cout << "Error " << rc << " opening database" << std::endl;
- return;
- }
-
- rc = d.GetFirstRecord();
- FieldCnt = d.FieldCount();
- std::cout << "Database has " << FieldCnt << " fields to convert"
- << std::endl;
- while( rc == XB_NO_ERROR )
- {
- d2.BlankRecord();
- for( xbShort i = 0; i < FieldCnt; i++ )
- {
- if(( FieldNo = d2.GetFieldNo( d.GetFieldName( i ))) == -1 )
- std::cout << "Error converting field " << d.GetFieldName( i )
- << std::endl;
- else
- {
- if( d.GetFieldType( i ) != d2.GetFieldType( FieldNo ))
- std::cout << "Error - different field types " << d.GetFieldName(i);
- else
- {
- if( d.GetFieldType( i ) == 'M' )
- {
-#ifdef XB_MEMO_FIELDS
- len = d.GetMemoFieldLen( i );
- if( len > MemoFieldLen )
- {
- if( MemoFieldLen > 0 )
- delete MemoFieldBuf;
- MemoFieldBuf = new char[len];
- MemoFieldLen = len;
- }
- d.GetMemoField( i, len, MemoFieldBuf, XB_LOCK );
- d2.UpdateMemoData( FieldNo, len, MemoFieldBuf, XB_LOCK );
-#else
- std::cout
- << "Memo fields not converted XB_MEMO_FIELDS not compiled in\n";
-#endif
- }
- else{
- if( d.GetFieldType(i) == 'N' ){
- std::cout << "const code compile prob..." << std::endl;
-
-// d2.PutField( FieldNo, x.LTRIM( d.GetField( i )));
- }
- else
- d2.PutField( FieldNo, d.GetField(i));
- }
- }
- }
- }
- rc = d.GetNextRecord();
- d2.AppendRecord();
- }
- if( MemoFieldLen > 0 )
- delete MemoFieldBuf;
- d2.CloseDatabase();
-}
-/************************************************************************/
-void MyClass::ShowFieldInfo( int option )
-{
- FILE * out;
- xbString dbfName = d.GetDbfName();
- if( option ){
- if(( out = fopen( "xbase64.dmp" , "w" )) == NULL ){
- std::cout << "File could not be opened" << std::endl;
- getchar();
- } else {
- fprintf( out, "Table Name = %s\n\n", dbfName.getData());
- fprintf( out, "Number Name Type Len Decs\n" );
- for( int i = 0; i < d.FieldCount(); i++ )
- fprintf(out, "%3d %-10s %c %5d %d\n", i+1,
- d.GetFieldName(i), d.GetFieldType(i),
- d.GetFieldLen(i), d.GetFieldDecimal(i) );
- }
- fclose( out );
- }
- else
- {
- printf( "Table Name = %s\n", dbfName.getData());
- std::cout << "Number Name Type Len Decs" << std::endl;
- for( int i = 0; i < d.FieldCount(); i++ ){
- printf( "%3d %-10s %c %5d %d\n", i+1,
- d.GetFieldName(i), d.GetFieldType(i),
- d.GetFieldLen(i), d.GetFieldDecimal(i) );
- if(((i+1)%15) == 0 ){
- std::cout << "Press a key to continue" << std::endl;
- getchar();
- std::cout << "Number Name Type Len Decs" << std::endl;
- }
- }
- }
- std::cout << "Press a key to continue" << std::endl;
- getchar();
-}
-/************************************************************************/
-void MyClass::ShowFieldData()
-{
- int done = 0;
-
- if( d.GetCurRecNo() == 0L ){
- d.GetRecord( 1L );
- }
-
- while( !done ){
- std::cout << "Record: " << d.GetCurRecNo() << std::endl;
- std::cout << "FieldName Data" << std::endl;
- std::cout << "========= ====" << std::endl;
- if( d.RecordDeleted())
- std::cout << "Record is deleted" << std::endl;
- for( int i = 0; i < d.FieldCount(); i++ ){
- printf( "%-10s = %s\n", d.GetFieldName(i), d.GetStringField(i));
- if(((i+1)%15) == 0 ){
- std::cout << "Press a key to continue" << std::endl;
- getchar();
- std::cout << " Name Data" << std::endl;
- }
- }
- std::cout << "Press 'N' for next record or any other key to exit" << std::endl;
- if( toupper( getchar()) == 'N' ){
- d.GetRecord( d.GetCurRecNo() + 1L );
- getchar();
- }
- else
- done ++;
- }
-}
-/************************************************************************/
-void MyClass::UpdateFieldData()
-{
- char dbuf[100];
- int rc, fn;
- std::cout << "Enter Field Number to update (first field is 0): "
- << std::endl;
- std::cin >> fn;
- std::cout << "Enter Field Data" << std::endl;
- std::cin >> dbuf;
- rc = d.PutField( fn, dbuf );
- x.DisplayError( rc );
-}
-/************************************************************************/
-/* open database */
-void MyClass::ReindexDatabase()
-{
- xbNdx n(&d);
- int rc;
- char filename[50];
- std::cout << "Enter index file name: ";
- std::cin >> filename;
-
- if(( rc = n.OpenIndex( filename )) != XB_NO_ERROR ){
- x.DisplayError( rc );
- return;
- }
- x.DisplayError( n.ReIndex() );
-}
-/************************************************************************/
-void MyClass::GetRecord()
-{
- xbLong RecNo;
- std::cout << "Enter record number: ";
- std::cin >> RecNo;
-
- x.DisplayError( d.GetRecord( RecNo ));
-}
-/************************************************************************/
-void MyClass::UpdateMemoField()
-{
-#ifdef XB_MEMO_FIELDS
- xbShort fn,rc;
- xbLong len;
- char bufchar[2];
- char *buf;
-
- std::cout << "Enter Field Number: " << std::endl;
- std::cin >> fn;
- if( fn < 0 || fn > d.FieldCount()){
- std::cout << "Invalid Field Number" << std::endl;
- return;
- }
- if( d.GetFieldType( fn ) != 'M' ){
- std::cout << "Field " << fn << " is not a memo field" << std::endl;
- std::cout << "Field Name = " << d.GetFieldName( fn ) << " type= ";
- std::cout << d.GetFieldType( fn ) << std::endl;
- return;
- }
- std::cout << "Enter length of memo data:" << std::endl;
- std::cin >> len;
-
- std::cout << "Enter character to populate memo data:" << std::endl;
- std::cin >> bufchar;
-
- buf = new char[len];
- memset( buf, bufchar[0], len );
-
- rc = d.UpdateMemoData( fn, len, buf, XB_LOCK );
- std::cout << "Return Code = " << rc << std::endl;
-#else
- std::cout << "\nXB_MEMO_FIELDS is not compiled in\n";
-#endif
-}
-/************************************************************************/
-void MyClass::DeleteMemoField()
-{
-#ifdef XB_MEMO_FIELDS
- xbShort fn,rc;
- std::cout << "Enter Field Number: " << std::endl;
- std::cin >> fn;
- if( fn < 0 || fn > d.FieldCount()){
- std::cout << "Invalid Field Number" << std::endl;
- return;
- }
- if( d.GetFieldType( fn ) != 'M' ){
- std::cout << "Field " << fn << " is not a memo field" << std::endl;
- std::cout << "Field Name = " << d.GetFieldName( fn ) << " type= ";
- std::cout << d.GetFieldType( fn ) << std::endl;
- return;
- }
- rc = d.UpdateMemoData( fn, 0, 0, XB_LOCK );
- x.DisplayError( rc );
-#else
- std::cout << "\nXB_MEMO_FIELDS is not compiled in\n";
-#endif
-}
-/************************************************************************/
-#ifdef XBASE_DEBUG
-void MyClass::DumpDbtHeader()
-{
- int rc;
-
-#ifdef XB_MEMO_FIELDS
-#ifdef XBASE_DEBUG
-
-/* - This is used to peek in the file for debugging purposes
- probably not to useful for anything else - Gary
-*/
-
- rc = d.DumpMemoFreeChain();
- x.DisplayError( rc );
-
-#else
- std::cout << "\nXBASE_DEBUG is not compiled in\n";
-#endif
-#else
- std::cout << "\nXB_MEMO_FIELDS is not compiled in\n";
-#endif
-}
-/************************************************************************/
-void MyClass::GetMemoBlocks()
-{
-#ifdef XB_MEMO_FIELDS
- xbLong BlocksNeeded, Location, PrevNode;
- int rc;
-
- std::cout << "Enter number of blocks: " << std::endl;
- std::cin >> BlocksNeeded;
- std::cout << "Enter starting location: " << std::endl;
- std::cin >> Location;
- std::cout << "Enter previous node: " << std::endl;
- std::cin >> PrevNode;
- rc = d.GetBlockSetFromChain( BlocksNeeded, Location, PrevNode );
- x.DisplayError( rc );
-
-#else
- std::cout << "\nXB_MEMO_FIELDS is not compiled in\n";
-#endif
-}
-/************************************************************************/
-void MyClass::CreateNewIndex()
-{
- char IndexName[128];
- char KeyExpression[500];
- char Unique[25];
- xbShort uniqueSw = 0;
- xbShort rc;
-
- if( ix ){
- std::cout << "Program only supports one open index at a time" << std::endl;
- std::cout << "Looking for volunteer to change that fact" << std::endl;
- return;
- }
- memset( IndexName, 0x00, 128 );
- memset( KeyExpression, 0x00, 500 );
- memset( Unique, 0x00, 25 );
- std::cout << "This function creates a new index for an open table" << std::endl;
- std::cout << "If the index already exists, it will be overlaid" << std::endl;
- while( !strlen( IndexName ) ||
- ( !strstr( IndexName, ".ndx" ) && !strstr( IndexName, ".ntx" ))){
- std::cout << "Enter index name (include .ntx or .ndx extension)" << std::endl;
- std::cin >> IndexName;
- for( int i = 0; i < (int) strlen( IndexName ); i++ )
- IndexName[i] = tolower( IndexName[i] );
- }
- while( Unique[0] != 'U' && Unique[0] != 'N' ){
- std::cout << "Enter U)nique or N)on unique" << std::endl;
- std::cin >> Unique;
- if( Unique[0] == 'U' )
- uniqueSw++;
- }
- while( !strlen( KeyExpression )){
- std::cout << "Enter key expression" << std::endl;
- std::cin >> KeyExpression;
- }
- if( strstr( IndexName, "ndx" )){
- ix = new xbNdx( &d );
- rc = ix->CreateIndex( IndexName, KeyExpression, uniqueSw, 1 );
- }
- else if( strstr( IndexName, "ntx" )){
- ix = new xbNtx( &d );
- rc = ix->CreateIndex( IndexName, KeyExpression, uniqueSw, 1 );
- }
- if( rc ){
- x.DisplayError( rc );
- ix->CloseIndex();
- ix = NULL;
- return;
- }
- std::cout << IndexName << " created. Loading data.." << std::endl;
- rc = ix->ReIndex();
- if( rc ){
- x.DisplayError( rc );
- return;
- }
- std::cout << "Index loaded successfully" << std::endl;
- return;
-}
-/************************************************************************/
-void MyClass::FindMemoBlocks()
-{
-#ifdef XB_MEMO_FIELDS
- xbLong BlocksNeeded, Location, PrevNode;
- int rc;
-
- std::cout << "Enter number of blocks: " << std::endl;
- std::cin >> BlocksNeeded;
- rc = d.FindBlockSetInChain( BlocksNeeded, 0, Location, PrevNode );
- std::cout << "Return code = " << rc << std::endl;
- std::cout << "Location = " << Location << std::endl;
- std::cout << "Previous Node = " << PrevNode << std::endl;
-#else
- std::cout << "\nXB_MEMO_FIELDS is not compiled in\n";
-#endif
-}
-#endif // XBASE_DEBUG
-/************************************************************************/
-void MyClass::IndexMenu()
-{
- int option = 0;
-
- while( option != 99 ) {
- std::cout << std::endl << std::endl
- << "NDX and NTX Index Menu" << std::endl;
- std::cout << "This program only supports one open index at a time" << std::endl;
- std::cout << "1 - Open Index" << std::endl;
- std::cout << "2 - Create New Index" << std::endl;
- if( ix ){
- std::cout << "3 - Find Key" << std::endl;
- std::cout << "4 - Get First Key" << std::endl;
- std::cout << "5 - Get Last Key" << std::endl;
- std::cout << "6 - Get Previous Key" << std::endl;
- std::cout << "7 - Get Next Key" << std::endl;
- std::cout << "8 - Close Index" << std::endl;
- std::cout << "9 - Check Index Integrity" << std::endl;
- }
- std::cout << "99 - Exit Menu" << std::endl;
- std::cin >> option;
- switch( option ){
- case 1: OpenIndex(); break;
- case 2: CreateNewIndex(); break;
- case 3: FindKey(); break;
- case 4: GetFirstKey(); break;
- case 5: GetLastKey(); break;
- case 6: GetPrevKey(); break;
- case 7: GetNextKey(); break;
- case 8: CloseIndex(); break;
- case 9: x.DisplayError( ix->CheckIndexIntegrity( 1 )); break;
- case 99: break;
- default: std::cout << "Invalid option" << std::endl; break;
- }
- }
-}
-/************************************************************************/
-#ifdef XBASE_DEBUG
-void MyClass::DebugMenu()
-{
- int option = 0;
-
- while( option != 99 ) {
- std::cout << std::endl << std::endl << "Debug Menu" << std::endl;
- std::cout << "1 - Dislay DBT Header" << std::endl;
- std::cout << "2 - Find Memo Blocks" << std::endl;
- std::cout << "3 - Get Memo Blocks" << std::endl;
- std::cout << "4 - Dump index node chains to file xbase.dmp" << std::endl;
- std::cout << "5 - Dump index node chain" << std::endl;
- std::cout << "99 - Exit Menu" << std::endl;
- std::cin >> option;
- switch( option ){
- case 1: DumpDbtHeader(); break;
- case 2: FindMemoBlocks(); break;
- case 3: GetMemoBlocks(); break;
- case 4: DumpIndexNodes(); break;
- case 5: ix->DumpNodeChain(); break;
- case 99: break;
- default: std::cout << "Invalid option" << std::endl; break;
- }
- }
-}
-#endif // XBASE_DEBUG
-
-/************************************************************************/
-
-#ifdef XB_LOCKING_ON
-
-void MyClass::LockDbf()
-{
- xbShort rc;
- std::cout << "Locking table" << std::endl;
-// rc = d.LockTable( XB_LOCK );
-// x.DisplayError( rc );
- std::cout << "temporarily out of service" << std::endl;
-}
-/************************************************************************/
-
-void MyClass::UnlockDbf()
-{
- xbShort rc;
- std::cout << "Unlocking table" << std::endl;
-// rc = d.LockTable( XB_UNLOCK );
-// x.DisplayError( rc );
-
- std::cout << "temporarily out of service" << std::endl;
-}
-
-/************************************************************************/
-
-void MyClass::LockRecord()
-{
- xbShort rc;
- xbULong RecNo;
- xbULong RecCnt;
-
- std::cout << "Enter start record number to lock" << std::endl;
- std::cin >> RecNo;
- std::cout << "Enter number of records to lock" << std::endl;
- std::cin >> RecCnt;
-
-// rc = d.LockRecord( XB_LOCK, RecNo, RecCnt );
-// x.DisplayError( rc );
-
- std::cout << "temporarily out of service" << std::endl;
-}
-/************************************************************************/
-void MyClass::UnlockRecord()
-{
- xbShort rc;
- xbULong RecNo;
- xbULong RecCnt;
- std::cout << "Enter start record number to unlock" << std::endl;
- std::cin >> RecNo;
- std::cout << "Enter number of records to unlock" << std::endl;
- std::cin >> RecCnt;
-// rc = d.LockRecord( XB_UNLOCK, RecNo, RecCnt );
-// x.DisplayError( rc );
-
- std::cout << "temporarily out of service" << std::endl;
-}
-/************************************************************************/
-void MyClass::ShowLockInfo()
-{
- std::cout << "Retry Count (in seconds) => " << x.GetLockRetryCount() << std::endl;
-// std::cout << "No of table locks => " << d.GetTableLockCnt() << std::endl;
-
- #ifdef XB_MEMO_FIELDS
-// std::cout << "Memo locks => " << d.GetMemoLockCnt() << std::endl;
- #endif
-
- std::cout << "Current default lock mode => ";
- switch( x.GetLockMode() ){
- case XB_SINGLE_USER_MODE:
- std::cout << "XB_SINGLE_USER_MODE" << std::endl;
- break;
- case XB_XBASE_LOCK_MODE:
- std::cout << "XB_XBASE_LOCK_MODE" << std::endl;
- break;
- case XB_DBASE5_LOCK_MODE:
- std::cout << "XB_DBASE5_LOCK_MODE" << std::endl;
- break; case XB_CLIPPER5_LOCK_MODE:
- std::cout << "XB_CLIPPER5_LOCK_MODE" << std::endl;
- break;
- case XB_FOXPRO3_LOCK_MODE:
- std::cout << "XB_FOXPRO3_LOCK_MODE" << std::endl;
- break;
- default:
- std::cout << "Unknown lock mode" << std::endl;
- break;
- }
-
- std::cout << "Current table lock mode => ";
- switch( d.GetLockMode() ){
- case XB_SINGLE_USER_MODE:
- std::cout << "XB_SINGLE_USER_MODE" << std::endl;
- break;
- case XB_XBASE_LOCK_MODE:
- std::cout << "XB_XBASE_LOCK_MODE" << std::endl;
- break;
- case XB_DBASE5_LOCK_MODE:
- std::cout << "XB_DBASE5_LOCK_MODE" << std::endl;
- break;
- case XB_CLIPPER5_LOCK_MODE:
- std::cout << "XB_CLIPPER5_LOCK_MODE" << std::endl;
- break;
- case XB_FOXPRO3_LOCK_MODE:
- std::cout << "XB_FOXPRO3_LOCK_MODE" << std::endl;
- break;
- default:
- std::cout << "Unknown lock mode" << std::endl;
- break;
- }
-}
-
-/************************************************************************/
-
-void MyClass::SetDefaultLockMode()
-{
- xbShort option;
-
- std::cout << std::endl << std::endl;
- std::cout << "Default Lock Mode Selection" << std::endl;
- std::cout << "1 - XB_SINGLE_USER_MODE" << std::endl;
- std::cout << "2 - XB_XBASE_LOCK_MODE" << std::endl;
- std::cout << "3 - XB_DBASE5_LOCK_MODE" << std::endl;
- std::cout << "4 - XB_CLIPPER5_LOCK_MODE" << std::endl;
- std::cout << "5 - XB_FOXPRO3_LOCK_MODE" << std::endl;
- std::cout << "99 - Exit Menu" << std::endl;
- std::cin >> option;
-
- switch( option ){
- case 1: x.SetLockMode( XB_SINGLE_USER_MODE ); break;
- case 2: x.SetLockMode( XB_XBASE_LOCK_MODE ); break;
- case 3: x.SetLockMode( XB_DBASE5_LOCK_MODE ); break;
- case 4: x.SetLockMode( XB_CLIPPER5_LOCK_MODE ); break;
- case 5: x.SetLockMode( XB_FOXPRO3_LOCK_MODE ); break;
- case 99: break;
- }
-}
-
-/************************************************************************/
-
-void MyClass::SetTableLockMode()
-{
-
- xbShort option;
-
- std::cout << std::endl << std::endl;
- std::cout << "Table Lock Mode Selection" << std::endl;
- std::cout << "1 - XB_SINGLE_USER_MODE" << std::endl;
- std::cout << "2 - XB_XBASE_LOCK_MODE" << std::endl;
- std::cout << "3 - XB_DBASE5_LOCK_MODE" << std::endl;
- std::cout << "4 - XB_CLIPPER5_LOCK_MODE" << std::endl;
- std::cout << "5 - XB_FOXPRO3_LOCK_MODE" << std::endl;
- std::cout << "99 - Exit Menu" << std::endl;
- std::cin >> option;
-
- switch( option ){
- case 1: d.SetLockMode( XB_SINGLE_USER_MODE ); break;
- case 2: d.SetLockMode( XB_XBASE_LOCK_MODE ); break;
- case 3: d.SetLockMode( XB_DBASE5_LOCK_MODE ); break;
- case 4: d.SetLockMode( XB_CLIPPER5_LOCK_MODE ); break;
- case 5: d.SetLockMode( XB_FOXPRO3_LOCK_MODE ); break;
- case 99: break;
- }
-}
-
-/************************************************************************/
-
-void MyClass::SetRetryCount()
-{
- xbShort retryCnt;
- std::cout << "Enter new Retry Count " << std::endl;
- std::cin >> retryCnt;
- x.SetLockRetryCount( retryCnt );
-}
-
-/************************************************************************/
-#ifdef XB_MEMO_FIELDS
-
-void MyClass::LockMemoFile( xbShort LockType )
-{
- xbShort rc;
-// rc = d.LockMemoFile( LockType );
-// x.DisplayError( rc );
- std::cout << "no memo locking here" << std::endl;
-}
-
-#endif
-
-/************************************************************************/
-
-void MyClass::LockIndexFile( xbShort LockType )
-{
- xbShort rc;
-
- if( ix ){
-// rc = ix->LockIndex( LockType );
-// x.DisplayError( rc );
-
- std::cout << "temporarily out of service" << std::endl;
- }
- else
- std::cout << "No open index" << std::endl;
-}
-
-#endif
-/************************************************************************/
-void MyClass::PutRecord()
-{
- xbLong l;
- std::cout << "Enter Record number for PutRecord()" << std::endl;
- std::cin >> l;
- int rc = d.PutRecord( l );
- x.DisplayError( rc );
-}
-/************************************************************************/
-void MyClass::FieldMenu()
-{
- int option = 0;
-
- while( option != 99 ) {
- std::cout << std::endl << std::endl << "Field Menu" << std::endl;
- std::cout << "1 - Delete Memo Field" << std::endl;
- std::cout << "2 - Update Memo Field" << std::endl;
- std::cout << "3 - Show Field Info" << std::endl;
- std::cout << "4 - Dump Field Info to file xbase64.dmp" << std::endl;
- std::cout << "5 - Show Field Data" << std::endl;
- std::cout << "6 - Update Field Data" << std::endl;
- std::cout << "99 - Exit Menu" << std::endl;
- std::cin >> option;
- switch( option ){
- case 1: DeleteMemoField(); break;
- case 2: UpdateMemoField(); break;
- case 3: ShowFieldInfo(0); break;
- case 4: ShowFieldInfo(1); break;
- case 5: ShowFieldData(); break;
- case 6: UpdateFieldData(); break;
- case 99: break;
- default: std::cout << "Function not available" << std::endl; break;
- }
- }
-}
-/************************************************************************/
-void MyClass::RecordMenu()
-{
- int option = 0;
- std::cout << "Record Menu" << std::endl;
- while( option != 99 ) {
- std::cout << std::endl << std::endl << "Record Menu" << std::endl;
- std::cout << "1 - Get Record" << std::endl;
- std::cout << "2 - Blank Record" << std::endl;
- std::cout << "3 - Append Record" << std::endl;
- std::cout << "4 - Put Record" << std::endl;
- std::cout << "5 - Delete Record" << std::endl;
- std::cout << "6 - Undelete Record" << std::endl;
- std::cout << "99 - Exit Menu" << std::endl;
- std::cin >> option;
- switch( option ){
- case 1: GetRecord(); break;
- case 2: x.DisplayError( d.BlankRecord()); break;
- case 3: x.DisplayError( d.AppendRecord()); break;
- case 4: x.DisplayError( d.PutRecord()); break;
- case 5: x.DisplayError( d.DeleteRecord()); break;
- case 6: x.DisplayError( d.UndeleteRecord()); break;
- case 99: break;
- default: std::cout << "Invalid option" << std::endl; break;
- }
- }
-}
-/************************************************************************/
-void MyClass::FileMenu()
-{
- int option = 0;
-
- while( option != 99 ) {
- std::cout << std::endl << std::endl << "File Menu" << std::endl;
- std::cout << "1 - Open File" << std::endl;
- std::cout << "2 - Close File" << std::endl;
- std::cout << "3 - File Stats" << std::endl;
- std::cout << "4 - Convert Database" << std::endl;
- std::cout << "5 - Reindex Database" << std::endl;
- std::cout << "6 - Pack Database" << std::endl;
- std::cout << "7 - Zap Database" << std::endl;
- std::cout << "99 - Exit Menu" << std::endl;
- std::cin >> option;
-
- switch( option ){
- case 1: OpenFile(); break;
- case 2: CloseFile(); break;
- case 3: FileStats(); break;
- case 4: ConvertDatabase(); break;
- case 5: ReindexDatabase(); break;
- case 6: PackDatabase(); break;
- case 7: ZapDatabase(); break;
- case 99: break;
- default: std::cout << "Invalid Option" << std::endl;
- }
- }
-}
-/************************************************************************/
-
-#ifdef XB_LOCKING_ON
-void MyClass::LockingMenu()
-{
- int option = 0;
-
- while( option != 99 ) {
- std::cout << std::endl << std::endl << "Locking Menu" << std::endl;
- std::cout << "1 - Display lock info" << std::endl;
- std::cout << "2 - Set retry count" << std::endl;
- std::cout << "3 - Set default lock mode" << std::endl;
- std::cout << "4 - Set table lock mode" << std::endl;
- std::cout << "5 - Lock table (dbf file)" << std::endl;
- std::cout << "6 - Unlock table (dbf file)" << std::endl;
- std::cout << "7 - Lock Record" << std::endl;
- std::cout << "8 - Unlock Record" << std::endl;
- std::cout << "9 - Lock Memo File" << std::endl;
- std::cout << "10 - Unlock Memo File" << std::endl;
- std::cout << "11 - Lock Index File" << std::endl;
- std::cout << "12 - Unlock Index File" << std::endl;
-
- std::cout << "99 - Exit Menu" << std::endl;
- std::cin >> option;
-
- switch( option ) {
- case 1: ShowLockInfo(); break;
- case 2: SetRetryCount(); break;
- case 3: SetDefaultLockMode(); break;
- case 4: SetTableLockMode(); break;
- case 5: LockDbf(); break;
- case 6: UnlockDbf(); break;
- case 7: LockRecord(); break;
- case 8: UnlockRecord(); break;
- case 9: LockMemoFile( XB_LOCK ); break;
- case 10: LockMemoFile( XB_UNLOCK ); break;
- case 11: LockIndexFile( XB_LOCK ); break;
- case 12: LockIndexFile( XB_UNLOCK ); break;
-
- case 99: break;
- default: std::cout << "Invalid Option" << std::endl;
- }
- }
-}
-#endif
-
-/************************************************************************/
-
-void MyClass::MainMenu()
-{
- int option = 0;
- std::cout << std::endl<< std::endl << "XBase Utility Program";
- while( option != 99 ) {
- std::cout << std::endl << std::endl << "Main Menu" << std::endl;
- std::cout << "1 - File Menu" << std::endl;
- std::cout << "2 - Record Menu" << std::endl;
- std::cout << "3 - Field Menu" << std::endl;
- std::cout << "4 - Index Menu" << std::endl;
- #ifdef XB_LOCKING_ON
- std::cout << "5 - Locking Menu" << std::endl;
- #endif
- #ifdef XBASE_DEBUG
- std::cout << "6 - Debug Menu" << std::endl;
- #endif
- #ifdef XB_EXPRESSIONS
- std::cout << "7 - Expression Testor" << std::endl;
- #endif
- #ifdef XB_FILTERS
- std::cout << "8 - Filter Menu" << std::endl;
- #endif
- std::cout << "99 - Exit" << std::endl;
- std::cin >> option;
- switch( option ){
- case 1: FileMenu(); break;
- case 2: RecordMenu(); break;
- case 3: FieldMenu(); break;
- case 4: IndexMenu(); break;
- #ifdef XB_LOCKING_ON
- case 5: LockingMenu(); break;
- #endif
- #ifdef XBASE_DEBUG
- case 6: DebugMenu(); break;
- #endif
- #ifdef XB_EXPRESSIONS
- case 7: ProcessExpression(); break;
- #endif
- #ifdef XB_FILTERS
- case 8: FilterMenu(); break;
- #endif
-
- case 99: std::cout << "Bye!! - Thanks for using XBase64"
- << std::endl; break;
- default: std::cout << "Invalid function" << std::endl; break;
- }
- }
-}
-
-/************************************************************************/
-
-int main(int, char**)
-{
- MyClass m;
- m.MainMenu();
- return 0;
-}
diff --git a/bin/deletall.cpp b/bin/deletall.cpp
deleted file mode 100755
index 03d2e23..0000000
--- a/bin/deletall.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- Xbase64 project source code
-
- This sample program deletes all records in an Xbase64 DBF file
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main(int ac,char** av)
-{
- if (ac <= 1) {
- std::cout << "\nUsage: deletall filename...\n";
- return 1;
- }
-
- for (int i=1; i<ac; ++i) {
- char* filename = av[i];
-
- xbXBase x;
- xbDbf MyFile( &x );
-
- if( MyFile.OpenDatabase( filename )) {
- std::cout << "Could not open file " << filename << "\n";
- return 2;
- }
-
- xbShort rc = MyFile.DeleteAllRecords();
- if( rc != XB_NO_ERROR ) {
- std::cout << "\nError Deleting all records - database ==> "
- << filename;
- std::cout << " Return Code = " << rc;
- }
- MyFile.CloseDatabase(); /* close database */
-
- std::cout << "\nDone...\n\n";
- }
-
- return 0;
-}
diff --git a/bin/dumpdbt.cpp b/bin/dumpdbt.cpp
deleted file mode 100755
index 1ecae84..0000000
--- a/bin/dumpdbt.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- Xbase64 project source code
-
- This program is used for debugging the memo file logic
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main( int ac, char **av )
-{
-#ifdef XB_MEMO_FIELDS
- xbXBase x;
-
- if( ac <= 1 ){
- std::cout << "\nUsage: dumpdbt filename...\n";
- return 1;
- }
-
- for( int i = 1; i < ac; ++i ){
- char* filename = av[i];
- xbDbf dbf( &x );
-
- if( dbf.OpenDatabase( filename )){
- std::cout << "\nCant open input file " << filename;
- return 2;
- }
-
- std::cout << "\n\nFree Block Chain....";
-#ifdef XBASE_DEBUG
- dbf.DumpMemoFreeChain();
- std::cout <<"\nEnd of free block chain\n***********************************";
-#else
- std::cout << "\nXBASE_DEBUG is not compiled in\n";
-#endif
-
- /* lock the memo file */
-# ifdef XB_LOCKING_ON
-// dbf.LockMemoFile( XB_LOCK );
-# endif /* XB_LOCKING_ON */
-
- if( !dbf.MemoFieldsPresent() ) {
- std::cout << "No memo fields exist in " << filename << std::endl;
- } else {
- xbLong BufSize = 0L;
- char* Buf = NULL;
- for( xbLong l = 1; l <= dbf.NoOfRecords(); l++ ){
- dbf.GetRecord( l );
- std::cout << "\nRecord # " << dbf.GetCurRecNo();
- for( int j = 0; j < dbf.FieldCount(); j++ ) {
- if( dbf.GetFieldType( j ) == 'M' ) {
- int len = dbf.GetMemoFieldLen( j );
- std::cout << "\nMemo field " << dbf.GetFieldName(j)
- << " length = " << len;
- std::cout << " Head Block = " << dbf.GetLongField( j ) << "\n";
- if( len > BufSize ){
- if( BufSize ) free( Buf );
- if(( Buf = (( char *) malloc( len ))) == NULL )
- return XB_NO_MEMORY;
- BufSize = len;
- }
- dbf.GetMemoField( j, len, Buf, XB_LOCK );
- for( int i = 0; i < len; i++ )
- std::cout << Buf[i];
- }
- }
- }
-
- /* unlock the memo file */
-# ifdef XB_LOCKING_ON
-// dbf.LockMemoFile( XB_UNLOCK );
-# endif /* XB_LOCKING_ON */
-
- std::cout << "\n";
- dbf.CloseDatabase();
- }
- }
-#else
- std::cout << "\nXB_MEMO_FIELDS is not compiled in\n";
-#endif
- return 0;
-}
diff --git a/bin/dumphdr.cpp b/bin/dumphdr.cpp
deleted file mode 100755
index 50115b6..0000000
--- a/bin/dumphdr.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- This sample program dumps an Xbase header record
-
- Xbase64 project source code
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main( int ac, char ** av )
-{
-#ifdef XBASE_DEBUG
- xbShort rc;
- xbXBase x;
-
- if( ac <= 1 ) {
- std::cout << "\nUsage: dumphdr filename...\n";
- return 1;
- }
- for( int i = 1; i < ac; ++i ){
- char * filename = av[i];
- xbDbf MyFile( &x );
-
- if(( rc = MyFile.OpenDatabase( filename )) != 0 )
- {
- std::cout << "Could not open file rc = " << rc << " file = "
- << filename << "\n";
- return 0;
- }
- MyFile.DumpHeader( 3 );
- MyFile.CloseDatabase();
- }
-#else
- std::cout << "\nXBASE_DEBUG is not compiled in\n";
-#endif
- return 0;
-}
diff --git a/bin/dumprecs.cpp b/bin/dumprecs.cpp
deleted file mode 100755
index 5d79ab2..0000000
--- a/bin/dumprecs.cpp
+++ /dev/null
@@ -1,97 +0,0 @@
-/* dumprecs.cpp
-
- Thos program dumps a dbf file contents
-
- Xbase64 project source code
-
- This sample program dumps Xbase records
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-#include <xbase64/xbase64.h>
-
-// next lines are helpful for debugging purposes
-#include <xbase64/xbdbf.cpp>
-#include <xbase64/xbexp.cpp>
-#include <xbase64/xbexpprc.cpp>
-#include <xbase64/xbexpfnc.cpp>
-#include <xbase64/xbfields.cpp>
-#include <xbase64/xbindex.cpp>
-#include <xbase64/xbmemo.cpp>
-#include <xbase64/xbndx.cpp>
-#include <xbase64/xbntx.cpp>
-#include <xbase64/xbase64.cpp>
-#include <xbase64/xbdate.cpp>
-#include <xbase64/xbfilter.cpp>
-#include <xbase64/xblock.cpp>
-#include <xbase64/xbstring.cpp>
-#include <xbase64/xbfile.cpp>
-#include <xbase64/xbcdx.cpp>
-
-
-
-int main(int ac,char** av)
-{
- xbXBase x;
- xbShort rc;
-
- if (ac <= 1) {
- std::cout << "Usage: dumprecs filename..." << std::endl;
- return 1;
- }
-
- for(int i=1; i<ac; ++i){
- char* filename = av[i];
-
- xbDbf MyFile( &x );
-
- MyFile.SetVersion( 4 );
- rc = MyFile.OpenDatabase(filename);
- if( rc != XB_NO_ERROR) {
- std::cout << "Could not open file " << filename << std::endl;
- x.DisplayError( rc );
- return 1;
- }
-
- std::cout << "Processing file sequentially from beginning..." << std::endl;
- int i = 0;
- while(i<MyFile.NoOfRecords()){
- rc = MyFile.DumpRecord(++i);
- if( rc != XB_NO_ERROR )
- x.DisplayError( rc );
- }
- MyFile.CloseDatabase(); /* close database */
- }
- return 0;
-}
-
diff --git a/bin/makebcc.bat b/bin/makebcc.bat
deleted file mode 100755
index d4baca0..0000000
--- a/bin/makebcc.bat
+++ /dev/null
@@ -1,22 +0,0 @@
-
-rem This batch file builds the xbase utility programs
-rem using the borland 5.5 compiler
-
-del *.bak
-del *.tds
-del *.exe
-del *.obj
-
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 checkndx.cpp xbase64.lib > compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 copydbf.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 dbfutil1.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 dbfxtrct.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 deletall.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 dumpdbt.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 dumphdr.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 dumprecs.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 packdbf.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 reindex.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 undelall.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L/borland/bcc55/lib -L../xbase64 zap.cpp xbase64.lib >> compout
-
diff --git a/bin/packdbf.cpp b/bin/packdbf.cpp
deleted file mode 100755
index 2c5db8b..0000000
--- a/bin/packdbf.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- Xbase64 project source code
-
- This sample program packs an Xbase DBF file
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main(int ac,char** av)
-{
- if (ac <= 1) {
- std::cout <<
- "\nUsage: packdbf filename...\n"
- "\nThis program does not automatically reindex any NDX indexes."
- "\nUse the reindex program to reindex any indexes associated"
- "\nwith the database, or build your own program which executes "
- "\nthe PackDatabase() method after opening all the index files "
- "\nassociated with the database.\n\n"
- ;
- return 1;
- }
-
- for (int i=1; i<ac; ++i) {
- char* filename = av[i];
-
- xbXBase x;
- xbDbf MyFile( &x );
-
- if( MyFile.OpenDatabase( filename )) {
- std::cout << "Could not open file " << filename << "\n";
- return 1;
- }
-
- xbShort rc = MyFile.PackDatabase( XB_LOCK );
- if( rc != XB_NO_ERROR ) {
- std::cout << "\nError packing database ==> " << filename;
- std::cout << " Return Code = " << rc;
- }
- MyFile.CloseDatabase(); /* close database */
-
- std::cout << "\nPack Database complete...\n\n";
- }
-
- return 0;
-}
diff --git a/bin/undelall.cpp b/bin/undelall.cpp
deleted file mode 100755
index e63a8c1..0000000
--- a/bin/undelall.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- Xbase64 project source code
-
- This sample program zaps an Xbase DBF file
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main(int ac,char** av)
-{
- if (ac <= 1) {
- std::cout <<
- "\nUsage: undelall filename...\n"
- "\nThis program does not automatically reindex any NDX indexes."
- "\nUse the reindex program to reindex any indexes associated"
- "\nwith the database, or build your own program which executes "
- "\nthe PackDatabase() method after opening all the index files "
- "\nassociated with the database.\n\n"
- ;
- return 1;
- }
-
- for (int i=1; i<ac; ++i) {
- char* filename = av[i];
-
- xbXBase x;
- xbDbf MyFile( &x );
-
- if( MyFile.OpenDatabase( filename )) {
- std::cout << "Could not open file " << filename << "\n";
- return 0;
- }
-
- xbShort rc = MyFile.UndeleteAllRecords();
- if( rc != XB_NO_ERROR ) {
- std::cout << "\nError undeleting records - database ==> " << filename;
- std::cout << " Return Code = " << rc;
- }
- MyFile.CloseDatabase(); /* close database */
-
- std::cout << "\nUndelete all records complete...\n\n";
- }
- return 0;
-}
diff --git a/bin/zap.cpp b/bin/zap.cpp
deleted file mode 100755
index 7261a1a..0000000
--- a/bin/zap.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- Xbase64 project source code
-
- This sample program zaps an Xbase DBF file
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main(int ac,char** av)
-{
- if (ac <= 1) {
- std::cout <<
- "\nUsage: zap filename...\n"
- "\nThis program does not automatically reindex any indices."
- "\nUse the reindex program to reindex any indexes associated"
- "\nwith the database, or build your own program which executes "
- "\nthe PackDatabase() method after opening all the index files "
- "\nassociated with the database.\n\n"
- ;
- return 1;
- }
-
- for (int i=1; i<ac; ++i) {
- char* filename = av[i];
-
- xbXBase x;
- xbDbf MyFile( &x );
- if( MyFile.OpenDatabase( filename )) {
- std::cout << "Could not open file " << filename << std::endl;
- return 0;
- }
-
- xbShort rc = MyFile.Zap( XB_LOCK );
- if( rc != XB_NO_ERROR ) {
- std::cout << "\nError zapping database ==> " << filename;
- std::cout << " Return Code = " << rc << std::endl;
- }
- MyFile.CloseDatabase(); /* close database */
-
- std::cout << "\nZap Database complete..." << std::endl;
- }
-
- return 0;
-}
diff --git a/build/borland5.5/BuildBorland.bat b/build/borland5.5/BuildBorland.bat
new file mode 100755
index 0000000..a61eb62
--- /dev/null
+++ b/build/borland5.5/BuildBorland.bat
@@ -0,0 +1,9 @@
+rem Build Make files for Borland free compiler 5.5
+
+rem - This does not work if both BC45 and bcc55 are on the same drive
+
+rem set CXX=C:\bcc55\bin\
+
+cmake -G "Borland Makefiles" >> build.txt
+
+make \ No newline at end of file
diff --git a/build/borland5.5/CMakeLists.txt b/build/borland5.5/CMakeLists.txt
new file mode 100755
index 0000000..0a192b8
--- /dev/null
+++ b/build/borland5.5/CMakeLists.txt
@@ -0,0 +1,706 @@
+cmake_minimum_required(VERSION 3.0)
+
+project (xbase64)
+set( xbase_VERSION_MAJOR 4 )
+set( xbase_VERSION_MINOR 0 )
+set( xbase_VERSION_PATCH 0 )
+
+MESSAGE( "--- Xbase build for: " ${CMAKE_SYSTEM_NAME} )
+MESSAGE( "--- Compiler: " ${CMAKE_CXX_COMPILER_ID} )
+MESSAGE( "--- Project Name: " ${CMAKE_PROJECT_NAME} )
+
+#Set compiler options
+
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ MESSAGE( "Setting GNU compiler options" )
+ add_compile_options( -Wall -Wsign-conversion )
+# add_compile_options( -Wall -Wconversion -Wsign-conversion )
+ SET( VERBOSE 1 )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+
+IF( BORLAND )
+ MESSAGE ("BORLAND COMPILER" )
+ #set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w-8022" )
+ add_compile_options( -w-8022 )
+ENDIF( BORLAND )
+
+
+MESSAGE( "--- Checking integer sizes" )
+INCLUDE(CheckTypeSize)
+CHECK_TYPE_SIZE( "short int" SHORT_INT )
+CHECK_TYPE_SIZE( int INT )
+CHECK_TYPE_SIZE( __int32 __INT32 )
+CHECK_TYPE_SIZE( int32_t INT32_T )
+CHECK_TYPE_SIZE( long LONG_INT )
+CHECK_TYPE_SIZE( __int64 __INT64 )
+CHECK_TYPE_SIZE( int64_t INT64_T )
+CHECK_TYPE_SIZE( "long long" LONG_LONG )
+CHECK_TYPE_SIZE( u_int64_t U_INT64_T )
+CHECK_TYPE_SIZE( uint64_t UINT64_T )
+CHECK_TYPE_SIZE( "unsigned __int64" UNSIGNED__INT64 )
+CHECK_TYPE_SIZE( "unsigned long long" UNSIGNED_LONG_LONG )
+
+CHECK_TYPE_SIZE( "double" DOUBLE )
+MESSAGE( "--- Double size = " ${DOUBLE} )
+
+
+#determine how 16 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+ SET( xbInt16 "short int" )
+ SET( xbUInt16 "unsigned short int" )
+ SET( iSize ${SHORT_INT} )
+ MESSAGE( "--- xbInt16 = [short int]" )
+ MESSAGE( "--- xbUInt16 = [unsigned short int]" )
+
+ENDIF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+IF( NOT ${iSize} EQUAL 2 )
+ MESSAGE( "FATAL_ERROR Could not detect 16 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 2 )
+
+#determine how 32 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_INT AND ${INT} EQUAL 4 )
+ SET( xbInt32 int )
+ SET( xbUInt32 "unsigned int" )
+ SET( iSize ${INT} )
+ MESSAGE( "--- xbInt32 = [int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned int]" )
+ENDIF( HAVE_INT AND ${INT} EQUAL 4 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+ MESSAGE( __int untested if block - see CMakeLists.txt)
+ SET( xbInt32 __int32 )
+ SET( xbUInt32 "unsigned __int32" )
+ SET( iSize ${__INT} )
+ MESSAGE( "--- xbInt32 = [__int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned __int]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+ SET( xbInt32 int32_t )
+ SET( xbUInt32 "u_int32_t" )
+ SET( iSize ${INT32_T} )
+ MESSAGE( "--- xbInt32 = [int32_t]" )
+ MESSAGE( "--- xbUInt32 = [u_int32_t]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+
+IF( NOT ${iSize} EQUAL 4 )
+ MESSAGE( "FATAL_ERROR Could not detect 32 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 4 )
+
+#determine how 64 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE___INT64 )
+ SET( xbInt64 __int64 )
+ SET( iSize ${__INT64} )
+ MESSAGE( "--- xbInt64 = [__int64]" )
+ENDIF( HAVE___INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+ SET( xbInt64 int64_t )
+ SET( iSize ${INT64_T} )
+ MESSAGE( "--- xbInt64 = [int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+ SET( xbInt64 "long long" )
+ SET( iSize ${LONG_LONG} )
+ MESSAGE( "--- xbInt64 = [long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#determine how 64 bit unsigned integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_UNSIGNED__INT64 )
+ SET( xbUInt64 "unsigned __int64" )
+ SET( iSize ${UNSIGNED__INT64} )
+ MESSAGE( "--- xbUInt64 = [unsigned __int64]" )
+ENDIF( HAVE_UNSIGNED__INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+ SET( xbUInt64 "uint64_t" )
+ SET( iSize ${UINT64_T} )
+ MESSAGE( "--- xbUInt64 = [uint64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+ SET( xbUInt64 u_int64_t )
+ SET( iSize ${U_INT64_T} )
+ MESSAGE( "--- xbUInt64 = [u_int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+ SET( xbUInt64 "unsigned long long" )
+ SET( iSize ${UNSIGNED_LONG_LONG} )
+ MESSAGE( "--- xbUInt64 = [unsigned long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit unsigned integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#Library options
+option( BUILD_SHARED_LIBS "Build shared libraries?" ON)
+option( XB_DEBUG_SUPPORT "Compile debug logic into library?" ON)
+option( XB_UTILS_SUPPORT "Compile utility programs?" ON)
+option( XB_EXAMPLES_SUPPORT "Compile example programs?" ON)
+option( XB_MEMO_SUPPORT "Compile memo field support into library?" ON)
+option( XB_LOGGING_SUPPORT "Compile message logging support into library" ON)
+option( XB_DBF3_SUPPORT "Compile DBase File Format Version 3 support" ON)
+option( XB_DBF4_SUPPORT "Compile DBase File Format Version 4 support" ON)
+option( XB_LINKLIST_SUPPORT "Compile Link List routines into library" ON)
+option( XB_LOCKING_SUPPORT "Compile Multi User Locking support into library" ON)
+option( XB_FUNCTION_SUPPORT "Compile XBase Function support into library" ON)
+option( XB_EXPRESSION_SUPPORT "Compile Expression support into library" ON)
+option( XB_NDX_SUPPORT "Compile NDX Index support into library" ON)
+option( XB_MDX_SUPPORT "Compile MDX Index support into library" ON)
+option( XB_SQL_SUPPORT "Compile SQL support into library" ON)
+option( XB_NDXINF_SUPPORT "Compile NDX INF file support into library" ON)
+option( XB_FILTER_SUPPORT "Compile Filter support into library" ON)
+
+
+Message( "--- BUILD_SHARED_LIBS " ${BUILD_SHARED_LIBS})
+Message( "--- XB_MEMO_SUPPORT " ${XB_MEMO_SUPPORT})
+Message( "--- XB_DEBUG_SUPPORT " ${XB_DEBUG_SUPPORT})
+Message( "--- XB_UTILS_SUPPORT " ${XB_UTILS_SUPPORT})
+Message( "--- XB_EXAMPLES_SUPPORT " ${XB_EXAMPLES_SUPPORT})
+Message( "--- XB_LOGGING_SUPPORT " ${XB_LOGGING_SUPPORT})
+Message( "--- XB_DBF3_SUPPORT " ${XB_DBF3_SUPPORT})
+Message( "--- XB_DBF4_SUPPORT " ${XB_DBF4_SUPPORT})
+Message( "--- XB_LINKLIST_SUPPORT " ${XB_LINKLIST_SUPPORT})
+Message( "--- XB_LOCKING_SUPPORT " ${XB_LOCKING_SUPPORT})
+Message( "--- XB_FUNCTION_SUPPORT " ${XB_FUNCTION_SUPPORT})
+Message( "--- XB_EXPRESSION_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_MDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_SQL_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDXINF_SUPPORT " ${XB_NDXINF_SUPPORT})
+Message( "--- XB_FILTER_SUPPORT " ${XB_FILTER_SUPPORT})
+
+IF( XB_DEBUG_SUPPORT )
+ Message( "--- Adding debug support" )
+ set( CMAKE_BUILD_TYPE Debug )
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ add_compile_options( -Og )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+ENDIF( XB_DEBUG_SUPPORT )
+
+IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 64 bit compiler detected" )
+ set( XB_PLATFORM "x64" )
+ set( XB_PLATFORM_64 1 )
+ set( XB_LIBNAME "xbase64" )
+
+ELSE( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 32 bit compiler detected" )
+ set( XB_PLATFORM "x86" )
+ set( XB_PLATFORM_32 1 )
+ set( XB_LIBNAME "xbase32" )
+
+ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+
+
+#Check for the existence of various header files
+INCLUDE (CheckIncludeFiles)
+CHECK_INCLUDE_FILES (ctype.h HAVE_CTYPE_H)
+CHECK_INCLUDE_FILES (dirent.h HAVE_DIRENT_H)
+CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H)
+CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILES (stdarg.h HAVE_STDARG_H)
+CHECK_INCLUDE_FILES (stdargs.h HAVE_STDARGS_H)
+CHECK_INCLUDE_FILES (string.h HAVE_STRING_H)
+CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H)
+CHECK_INCLUDE_FILES (sys/stat.h HAVE_STAT_H)
+CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
+CHECK_INCLUDE_FILES (varargs.h HAVE_VARARGS_H)
+CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H)
+
+#Check for the existence of various function calls
+INCLUDE( CheckFunctionExists )
+CHECK_FUNCTION_EXISTS(_close HAVE__CLOSE_F)
+CHECK_FUNCTION_EXISTS(fcntl HAVE_FCNTL_F)
+CHECK_FUNCTION_EXISTS(_fdopen HAVE__FDOPEN_F)
+CHECK_FUNCTION_EXISTS(fopen_s HAVE_FOPEN_S_F)
+CHECK_FUNCTION_EXISTS(_fsopen HAVE__FSOPEN_F)
+CHECK_FUNCTION_EXISTS(_fileno HAVE__FILENO_F)
+CHECK_FUNCTION_EXISTS(fork HAVE_FORK_F)
+CHECK_FUNCTION_EXISTS(_fseeki64 HAVE__FSEEKI64_F)
+CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO_F)
+CHECK_FUNCTION_EXISTS(ftruncate HAVE_FTRUNCATE_F)
+CHECK_FUNCTION_EXISTS(_localtime64_s HAVE__LOCALTIME64_S_F)
+CHECK_FUNCTION_EXISTS(LockFile HAVE_LOCKFILE_F)
+CHECK_FUNCTION_EXISTS(locking HAVE_LOCKING_F)
+CHECK_FUNCTION_EXISTS(_locking HAVE__LOCKING_F)
+CHECK_FUNCTION_EXISTS(_open HAVE__OPEN_F)
+CHECK_FUNCTION_EXISTS(SetEndOfFile HAVE_SETENDOFFILE_F)
+
+CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF_F)
+CHECK_FUNCTION_EXISTS(_vsnprintf_s HAVE__VSNPRINTF_S_F)
+
+
+IF( WIN32 )
+
+# Use CHECK_SYMBOL_EXISTS for the Win32API instead of CHECK_FUNCTION_EXISTS
+# Can't detect inline functions in headers
+# Can't detect due to mismatch of calling conventions
+# Can't detect mangled names
+
+INCLUDE( CheckSymbolExists )
+CHECK_SYMBOL_EXISTS(CreateProcessW Windows.h HAVE_CREATEPROCESSW_F )
+CHECK_SYMBOL_EXISTS(vsprintf_s stdio.h HAVE_VSPRINTF_S_F )
+
+
+
+ENDIF ( WIN32 )
+
+# IF( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+# # ----fix me----
+# # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5 SetEndOfFile
+# Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_H" )
+# ENDIF ( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+
+IF( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+ # ----fix me----
+ # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5, or Windows VS 32 bit SetEndOfFile
+ Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_F" )
+ENDIF ( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+
+IF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+ Set( XB_INDEX_SUPPORT "1" )
+ENDIF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+
+
+# Set directories
+# PROJECT_PARENT_DIR is two nodes higher
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_BINARY_DIR} DIRECTORY )
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_PARENT_DIR} DIRECTORY )
+
+# MESSAGE( "PROJECT_PARENT_DIR = " ${PROJECT_PARENT_DIR} )
+# MESSAGE( "PROJECT_BINARY_DIR = " ${PROJECT_BINARY_DIR} )
+
+
+set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/${XB_PLATFORM})
+set( LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib/${XB_PLATFORM})
+set( PROJECT_SOURCE_DIR ${PROJECT_PARENT_DIR}/src)
+set( PROJECT_DATA_DIR ${PROJECT_PARENT_DIR}/data/)
+set( PROJECT_LOG_DIR ${PROJECT_PARENT_DIR}/logs/)
+set( EXTRA_LIBS ${EXTRA_LIBS} ${XB_LIBNAME})
+
+
+
+
+# Undo bad decisions
+IF( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+ MESSAGE( "--- Can't build 64 bit environment with a 32 bit compiler" )
+ MESSAGE( "--- XB_LARGEFILE_SUPPORT set to OFF" )
+ set( XB_LARGEFILE_SUPPORT OFF CACHE BOOL "Use 64 bit large file support?" FORCE )
+ENDIF ( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+
+IF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+ MESSAGE( "--- At lease one file format is required. Defaulting to Version 4" )
+ set( XB_DBF4_SUPPORT ON CACHE BOOL "Compile DBase File Format Version 4 support" FORCE )
+ENDIF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+
+IF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for DBF V4 Memo files. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for locking functions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+ MESSAGE( "--- Expression required for indices. Setting to ON" )
+ set( XB_EXPRESSION_SUPPORT ON CACHE BOOL "Compile Expression support into library" FORCE )
+ENDIF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_FUNCTION_SUPPORT ON CACHE BOOL "Compile XBase Function support into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+
+# Build configuration header file
+configure_file (
+ "${PROJECT_SOURCE_DIR}/include/xbconfig.h.in"
+ "${PROJECT_BINARY_DIR}/include/xbconfig.h"
+)
+
+# Microsoft Windows settings
+IF( WIN32 )
+# add_definitions( /D_CRT_SECURE_NO_WARNINGS)
+ add_definitions( /EHsc )
+ENDIF( WIN32 )
+
+
+# set up include directories
+include_directories( "${PROJECT_BINARY_DIR}/include" )
+include_directories( "${PROJECT_SOURCE_DIR}/include" )
+
+#build the library
+IF ( BUILD_SHARED_LIBS )
+ set( LIB_TYPE SHARED )
+ELSE( BUILD_SHARED_LIBS )
+ set( LIB_TYPE STATIC )
+ENDIF( BUILD_SHARED_LIBS )
+MESSAGE( "--- Lib type " ${LIB_TYPE} )
+
+
+
+set (SOURCES ${PROJECT_SOURCE_DIR}/core/xbstring.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbssv.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdate.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbtblmgr.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbxbase.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfile.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdbf.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfields.cpp
+ ${PROJECT_SOURCE_DIR}/core/xblog.cpp)
+
+IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo.cpp )
+ENDIF( XB_MEMO_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf3.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo3.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf4.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo4.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfuncs.cpp )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexpnode.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexp.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbuda.cpp )
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbbcd.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixbase.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbtag.cpp )
+ENDIF( XB_INDEX_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixndx.cpp )
+ENDIF( XB_NDX_SUPPORT )
+
+
+IF( XB_MDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixmdx.cpp )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbsql.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbinsert.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrtbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrpix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrptbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbset.cpp )
+ENDIF( XB_SQL_SUPPORT )
+
+
+IF( XB_FILTER_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfilter.cpp )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+
+include( GenerateExportHeader )
+#add_library( xbase ${LIB_TYPE} ${SOURCES} )
+add_library( ${XB_LIBNAME} ${LIB_TYPE} ${SOURCES} )
+#add_library( ${CMAKE_PROJECT_NAME} ${LIB_TYPE} ${SOURCES} )
+
+
+IF( WIN32 )
+MESSAGE( "--- Generating Windows Library Headers" )
+
+#GENERATE_EXPORT_HEADER( xbase
+# BASE_NAME xbase
+
+GENERATE_EXPORT_HEADER( ${XB_LIBNAME}
+ BASE_NAME ${XB_LIBNAME}
+ EXPORT_MACRO_NAME xbase_EXPORT
+ EXPORT_FILE_NAME xbase_Export.h
+ STATIC_DEFINE xbase_BUILT_AS_STATIC
+)
+ENDIF( WIN32 )
+
+
+#build test programs
+enable_testing()
+
+add_executable( xb_test_string ${PROJECT_SOURCE_DIR}/tests/xb_test_string.cpp )
+target_link_libraries( xb_test_string ${EXTRA_LIBS})
+add_test( NAME xbString COMMAND xb_test_string QUIET )
+
+add_executable( xb_test_date ${PROJECT_SOURCE_DIR}/tests/xb_test_date.cpp )
+target_link_libraries( xb_test_date ${EXTRA_LIBS})
+add_test( NAME xbDate COMMAND xb_test_date QUIET )
+
+add_executable( xb_test_tblmgr ${PROJECT_SOURCE_DIR}/tests/xb_test_tblmgr.cpp )
+target_link_libraries( xb_test_tblmgr ${EXTRA_LIBS})
+add_test( NAME xbTblMgr COMMAND xb_test_tblmgr QUIET )
+
+add_executable( xb_test_xbase ${PROJECT_SOURCE_DIR}/tests/xb_test_xbase.cpp )
+target_link_libraries( xb_test_xbase ${EXTRA_LIBS})
+add_test( NAME xbXBase COMMAND xb_test_xbase QUIET )
+
+add_executable( xb_test_file ${PROJECT_SOURCE_DIR}/tests/xb_test_file.cpp )
+target_link_libraries( xb_test_file ${EXTRA_LIBS})
+add_test( NAME xbFile COMMAND xb_test_file QUIET )
+
+add_executable( xb_test_log ${PROJECT_SOURCE_DIR}/tests/xb_test_log.cpp )
+target_link_libraries( xb_test_log ${EXTRA_LIBS})
+add_test( NAME xbLog COMMAND xb_test_log QUIET )
+
+IF( XB_LINKLIST_SUPPORT )
+add_executable( xb_test_linklist ${PROJECT_SOURCE_DIR}/tests/xb_test_linklist.cpp )
+target_link_libraries( xb_test_linklist ${EXTRA_LIBS})
+add_test( NAME xbLinkList COMMAND xb_test_linklist QUIET )
+ENDIF( XB_LINKLIST_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+add_executable( xb_test_dbf_v3_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v3_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3NoMemos COMMAND xb_test_dbf_v3_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v3_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_memos.cpp )
+target_link_libraries( xb_test_dbf_v3_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3Memos COMMAND xb_test_dbf_v3_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+add_executable( xb_test_dbf_v4_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v4_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4NoMemos COMMAND xb_test_dbf_v4_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v4_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_memos.cpp )
+target_link_libraries( xb_test_dbf_v4_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4Memos COMMAND xb_test_dbf_v4_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+add_executable( xb_test_funcs ${PROJECT_SOURCE_DIR}/tests/xb_test_funcs.cpp )
+target_link_libraries( xb_test_funcs ${EXTRA_LIBS})
+add_test( NAME xbFunctions COMMAND xb_test_funcs QUIET )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+add_executable( xb_test_ndx ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx.cpp )
+target_link_libraries( xb_test_ndx ${EXTRA_LIBS})
+add_test( NAME xbIxNdx COMMAND xb_test_ndx QUIET )
+add_executable( xb_test_ndx2 ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx2.cpp )
+target_link_libraries( xb_test_ndx2 ${EXTRA_LIBS})
+add_test( NAME xbIxNdx2 COMMAND xb_test_ndx2 QUIET )
+ENDIF( XB_NDX_SUPPORT )
+
+IF( XB_MDX_SUPPORT )
+add_executable( xb_test_mdx ${PROJECT_SOURCE_DIR}/tests/xb_test_mdx.cpp )
+target_link_libraries( xb_test_mdx ${EXTRA_LIBS})
+add_test( NAME xbIxMdx COMMAND xb_test_mdx QUIET )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+add_executable( xb_test_bcd ${PROJECT_SOURCE_DIR}/tests/xb_test_bcd.cpp )
+target_link_libraries( xb_test_bcd ${EXTRA_LIBS})
+add_test( NAME xbBcd COMMAND xb_test_bcd QUIET )
+ENDIF( XB_INDEX_SUPPORT )
+
+
+IF( XB_EXPRESSION_SUPPORT )
+
+add_executable( xb_test_expnode ${PROJECT_SOURCE_DIR}/tests/xb_test_expnode.cpp )
+target_link_libraries( xb_test_expnode ${EXTRA_LIBS})
+add_test( NAME xbExpNode COMMAND xb_test_expnode QUIET )
+
+
+add_executable( xb_test_expression ${PROJECT_SOURCE_DIR}/tests/xb_test_expression.cpp )
+target_link_libraries( xb_test_expression ${EXTRA_LIBS})
+add_test( NAME xbExpressions COMMAND xb_test_expression QUIET )
+
+add_executable( xb_test_uda ${PROJECT_SOURCE_DIR}/tests/xb_test_uda.cpp )
+target_link_libraries( xb_test_uda ${EXTRA_LIBS})
+add_test( NAME xbUda COMMAND xb_test_uda QUIET )
+
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+add_executable( xb_test_sql ${PROJECT_SOURCE_DIR}/tests/xb_test_sql.cpp )
+target_link_libraries( xb_test_sql ${EXTRA_LIBS})
+add_test( NAME xbSql COMMAND xb_test_sql QUIET )
+ENDIF( XB_SQL_SUPPORT )
+
+IF( XB_FILTER_SUPPORT )
+add_executable( xb_test_filter ${PROJECT_SOURCE_DIR}/tests/xb_test_filter.cpp )
+target_link_libraries( xb_test_filter ${EXTRA_LIBS})
+add_test( NAME xbFilter COMMAND xb_test_filter QUIET )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+IF( XB_LOCKING_SUPPORT )
+add_executable( xb_test_lock ${PROJECT_SOURCE_DIR}/tests/xb_test_lock.cpp )
+target_link_libraries( xb_test_lock ${EXTRA_LIBS})
+add_test( NAME xbLock COMMAND xb_test_lock QUIET )
+IF( HAVE_CREATEPROCESSW_F )
+add_executable( xb_test_lock2 ${PROJECT_SOURCE_DIR}/tests/xb_test_lock2.cpp )
+target_link_libraries( xb_test_lock2 ${EXTRA_LIBS})
+ENDIF( HAVE_CREATEPROCESSW_F )
+ENDIF( XB_LOCKING_SUPPORT )
+
+#build example programs
+IF( XB_EXAMPLES_SUPPORT )
+ add_executable( xb_ex_string ${PROJECT_SOURCE_DIR}/examples/xb_ex_string.cpp )
+ target_link_libraries( xb_ex_string ${EXTRA_LIBS})
+
+ add_executable( xb_ex_date ${PROJECT_SOURCE_DIR}/examples/xb_ex_date.cpp )
+ target_link_libraries( xb_ex_date ${EXTRA_LIBS})
+
+ IF( XB_DBF3_SUPPORT )
+ add_executable( xb_ex_v3_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_create_dbf.cpp )
+ target_link_libraries( xb_ex_v3_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v3_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v3_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF3_SUPPORT )
+
+ IF( XB_DBF4_SUPPORT )
+ add_executable( xb_ex_v4_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_create_dbf.cpp )
+ target_link_libraries( xb_ex_v4_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v4_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v4_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF4_SUPPORT )
+
+ENDIF( XB_EXAMPLES_SUPPORT )
+
+#build utility programs
+IF( XB_UTILS_SUPPORT )
+
+ add_executable( xb_cfg_check ${PROJECT_SOURCE_DIR}/utils/xb_cfg_check.cpp )
+ target_link_libraries( xb_cfg_check ${EXTRA_LIBS})
+
+ add_executable( xb_copydbf ${PROJECT_SOURCE_DIR}/utils/xb_copydbf.cpp )
+ target_link_libraries( xb_copydbf ${EXTRA_LIBS})
+
+ add_executable( xb_dbfutil ${PROJECT_SOURCE_DIR}/utils/xb_dbfutil.cpp )
+ target_link_libraries( xb_dbfutil ${EXTRA_LIBS})
+
+ add_executable( xb_deletall ${PROJECT_SOURCE_DIR}/utils/xb_deletall.cpp )
+ target_link_libraries( xb_deletall ${EXTRA_LIBS})
+
+ add_executable( xb_dumpdbt ${PROJECT_SOURCE_DIR}/utils/xb_dumpdbt.cpp )
+ target_link_libraries( xb_dumpdbt ${EXTRA_LIBS})
+
+ add_executable( xb_dumphdr ${PROJECT_SOURCE_DIR}/utils/xb_dumphdr.cpp )
+ target_link_libraries( xb_dumphdr ${EXTRA_LIBS})
+
+ add_executable( xb_dumprecs ${PROJECT_SOURCE_DIR}/utils/xb_dumprecs.cpp )
+ target_link_libraries( xb_dumprecs ${EXTRA_LIBS})
+
+
+ add_executable( xb_tblinfo ${PROJECT_SOURCE_DIR}/utils/xb_tblinfo.cpp )
+ target_link_libraries( xb_tblinfo ${EXTRA_LIBS})
+
+ IF( XB_SQL_SUPPORT )
+ add_executable( xb_execsql ${PROJECT_SOURCE_DIR}/utils/xb_execsql.cpp )
+ target_link_libraries( xb_execsql ${EXTRA_LIBS})
+ ENDIF( XB_SQL_SUPPORT )
+
+ add_executable( xb_pack ${PROJECT_SOURCE_DIR}/utils/xb_pack.cpp )
+ target_link_libraries( xb_pack ${EXTRA_LIBS})
+
+ add_executable( xb_undelall ${PROJECT_SOURCE_DIR}/utils/xb_undelall.cpp )
+ target_link_libraries( xb_undelall ${EXTRA_LIBS})
+
+ add_executable( xb_zap ${PROJECT_SOURCE_DIR}/utils/xb_zap.cpp )
+ target_link_libraries( xb_zap ${EXTRA_LIBS})
+
+
+ install (TARGETS xb_cfg_check DESTINATION bin)
+ install (TARGETS xb_copydbf DESTINATION bin)
+ install (TARGETS xb_dbfutil DESTINATION bin)
+ install (TARGETS xb_deletall DESTINATION bin)
+ install (TARGETS xb_dumpdbt DESTINATION bin)
+ install (TARGETS xb_dumphdr DESTINATION bin)
+ install (TARGETS xb_dumprecs DESTINATION bin)
+ install (TARGETS xb_pack DESTINATION bin)
+ install (TARGETS xb_undelall DESTINATION bin)
+ install (TARGETS xb_zap DESTINATION bin)
+ install (TARGETS xb_execsql DESTINATION bin)
+
+ENDIF( XB_UTILS_SUPPORT )
+
+install (FILES include/xbconfig.h
+ ${PROJECT_SOURCE_DIR}/include/xbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbbcd.h
+ ${PROJECT_SOURCE_DIR}/include/xbdate.h
+ ${PROJECT_SOURCE_DIR}/include/xbdbf.h
+ ${PROJECT_SOURCE_DIR}/include/xbexp.h
+ ${PROJECT_SOURCE_DIR}/include/xbexpnode.h
+ ${PROJECT_SOURCE_DIR}/include/xbfile.h
+ ${PROJECT_SOURCE_DIR}/include/xbindex.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklst.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklstord.h
+ ${PROJECT_SOURCE_DIR}/include/xblnknod.h
+ ${PROJECT_SOURCE_DIR}/include/xblog.h
+ ${PROJECT_SOURCE_DIR}/include/xbmemo.h
+ ${PROJECT_SOURCE_DIR}/include/xbretcod.h
+ ${PROJECT_SOURCE_DIR}/include/xbsql.h
+ ${PROJECT_SOURCE_DIR}/include/xbssv.h
+ ${PROJECT_SOURCE_DIR}/include/xbstring.h
+ ${PROJECT_SOURCE_DIR}/include/xbtblmgr.h
+ ${PROJECT_SOURCE_DIR}/include/xbtypes.h
+ ${PROJECT_SOURCE_DIR}/include/xbxbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbuda.h
+ ${PROJECT_SOURCE_DIR}/include/xbtag.h
+ ${PROJECT_SOURCE_DIR}/include/xbfilter.h
+ DESTINATION include/${CMAKE_PROJECT_NAME})
+
+
+SET_TARGET_PROPERTIES( ${XB_LIBNAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+#SET_TARGET_PROPERTIES( ${CMAKE_PROJECT_NAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+
+IF( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib64/${CMAKE_PROJECT_NAME})
+ELSE( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib/${CMAKE_PROJECT_NAME})
+ENDIF( EXISTS /usr/local/lib64 )
+
+
diff --git a/build/borland5.5/CleanBorland.bat b/build/borland5.5/CleanBorland.bat
new file mode 100755
index 0000000..eed30b7
--- /dev/null
+++ b/build/borland5.5/CleanBorland.bat
@@ -0,0 +1,18 @@
+
+rem Use this batch file to completely clean the Borland directory tree for a clean build from scratch
+
+rd /S /Q bin
+rd /S /Q CMakeFiles
+rd /S /Q include
+rd /S /Q lib
+rd /S /Q testing
+del *.cmake
+del CmakeCache.txt
+del Makefile
+del *.h
+del *.exp
+del *.lib
+del *.filters
+del *.vcxproj
+del *.sln
+del build.txt \ No newline at end of file
diff --git a/build/cmake/CMakeLists.txt b/build/cmake/CMakeLists.txt
new file mode 100755
index 0000000..0a192b8
--- /dev/null
+++ b/build/cmake/CMakeLists.txt
@@ -0,0 +1,706 @@
+cmake_minimum_required(VERSION 3.0)
+
+project (xbase64)
+set( xbase_VERSION_MAJOR 4 )
+set( xbase_VERSION_MINOR 0 )
+set( xbase_VERSION_PATCH 0 )
+
+MESSAGE( "--- Xbase build for: " ${CMAKE_SYSTEM_NAME} )
+MESSAGE( "--- Compiler: " ${CMAKE_CXX_COMPILER_ID} )
+MESSAGE( "--- Project Name: " ${CMAKE_PROJECT_NAME} )
+
+#Set compiler options
+
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ MESSAGE( "Setting GNU compiler options" )
+ add_compile_options( -Wall -Wsign-conversion )
+# add_compile_options( -Wall -Wconversion -Wsign-conversion )
+ SET( VERBOSE 1 )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+
+IF( BORLAND )
+ MESSAGE ("BORLAND COMPILER" )
+ #set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w-8022" )
+ add_compile_options( -w-8022 )
+ENDIF( BORLAND )
+
+
+MESSAGE( "--- Checking integer sizes" )
+INCLUDE(CheckTypeSize)
+CHECK_TYPE_SIZE( "short int" SHORT_INT )
+CHECK_TYPE_SIZE( int INT )
+CHECK_TYPE_SIZE( __int32 __INT32 )
+CHECK_TYPE_SIZE( int32_t INT32_T )
+CHECK_TYPE_SIZE( long LONG_INT )
+CHECK_TYPE_SIZE( __int64 __INT64 )
+CHECK_TYPE_SIZE( int64_t INT64_T )
+CHECK_TYPE_SIZE( "long long" LONG_LONG )
+CHECK_TYPE_SIZE( u_int64_t U_INT64_T )
+CHECK_TYPE_SIZE( uint64_t UINT64_T )
+CHECK_TYPE_SIZE( "unsigned __int64" UNSIGNED__INT64 )
+CHECK_TYPE_SIZE( "unsigned long long" UNSIGNED_LONG_LONG )
+
+CHECK_TYPE_SIZE( "double" DOUBLE )
+MESSAGE( "--- Double size = " ${DOUBLE} )
+
+
+#determine how 16 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+ SET( xbInt16 "short int" )
+ SET( xbUInt16 "unsigned short int" )
+ SET( iSize ${SHORT_INT} )
+ MESSAGE( "--- xbInt16 = [short int]" )
+ MESSAGE( "--- xbUInt16 = [unsigned short int]" )
+
+ENDIF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+IF( NOT ${iSize} EQUAL 2 )
+ MESSAGE( "FATAL_ERROR Could not detect 16 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 2 )
+
+#determine how 32 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_INT AND ${INT} EQUAL 4 )
+ SET( xbInt32 int )
+ SET( xbUInt32 "unsigned int" )
+ SET( iSize ${INT} )
+ MESSAGE( "--- xbInt32 = [int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned int]" )
+ENDIF( HAVE_INT AND ${INT} EQUAL 4 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+ MESSAGE( __int untested if block - see CMakeLists.txt)
+ SET( xbInt32 __int32 )
+ SET( xbUInt32 "unsigned __int32" )
+ SET( iSize ${__INT} )
+ MESSAGE( "--- xbInt32 = [__int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned __int]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+ SET( xbInt32 int32_t )
+ SET( xbUInt32 "u_int32_t" )
+ SET( iSize ${INT32_T} )
+ MESSAGE( "--- xbInt32 = [int32_t]" )
+ MESSAGE( "--- xbUInt32 = [u_int32_t]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+
+IF( NOT ${iSize} EQUAL 4 )
+ MESSAGE( "FATAL_ERROR Could not detect 32 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 4 )
+
+#determine how 64 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE___INT64 )
+ SET( xbInt64 __int64 )
+ SET( iSize ${__INT64} )
+ MESSAGE( "--- xbInt64 = [__int64]" )
+ENDIF( HAVE___INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+ SET( xbInt64 int64_t )
+ SET( iSize ${INT64_T} )
+ MESSAGE( "--- xbInt64 = [int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+ SET( xbInt64 "long long" )
+ SET( iSize ${LONG_LONG} )
+ MESSAGE( "--- xbInt64 = [long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#determine how 64 bit unsigned integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_UNSIGNED__INT64 )
+ SET( xbUInt64 "unsigned __int64" )
+ SET( iSize ${UNSIGNED__INT64} )
+ MESSAGE( "--- xbUInt64 = [unsigned __int64]" )
+ENDIF( HAVE_UNSIGNED__INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+ SET( xbUInt64 "uint64_t" )
+ SET( iSize ${UINT64_T} )
+ MESSAGE( "--- xbUInt64 = [uint64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+ SET( xbUInt64 u_int64_t )
+ SET( iSize ${U_INT64_T} )
+ MESSAGE( "--- xbUInt64 = [u_int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+ SET( xbUInt64 "unsigned long long" )
+ SET( iSize ${UNSIGNED_LONG_LONG} )
+ MESSAGE( "--- xbUInt64 = [unsigned long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit unsigned integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#Library options
+option( BUILD_SHARED_LIBS "Build shared libraries?" ON)
+option( XB_DEBUG_SUPPORT "Compile debug logic into library?" ON)
+option( XB_UTILS_SUPPORT "Compile utility programs?" ON)
+option( XB_EXAMPLES_SUPPORT "Compile example programs?" ON)
+option( XB_MEMO_SUPPORT "Compile memo field support into library?" ON)
+option( XB_LOGGING_SUPPORT "Compile message logging support into library" ON)
+option( XB_DBF3_SUPPORT "Compile DBase File Format Version 3 support" ON)
+option( XB_DBF4_SUPPORT "Compile DBase File Format Version 4 support" ON)
+option( XB_LINKLIST_SUPPORT "Compile Link List routines into library" ON)
+option( XB_LOCKING_SUPPORT "Compile Multi User Locking support into library" ON)
+option( XB_FUNCTION_SUPPORT "Compile XBase Function support into library" ON)
+option( XB_EXPRESSION_SUPPORT "Compile Expression support into library" ON)
+option( XB_NDX_SUPPORT "Compile NDX Index support into library" ON)
+option( XB_MDX_SUPPORT "Compile MDX Index support into library" ON)
+option( XB_SQL_SUPPORT "Compile SQL support into library" ON)
+option( XB_NDXINF_SUPPORT "Compile NDX INF file support into library" ON)
+option( XB_FILTER_SUPPORT "Compile Filter support into library" ON)
+
+
+Message( "--- BUILD_SHARED_LIBS " ${BUILD_SHARED_LIBS})
+Message( "--- XB_MEMO_SUPPORT " ${XB_MEMO_SUPPORT})
+Message( "--- XB_DEBUG_SUPPORT " ${XB_DEBUG_SUPPORT})
+Message( "--- XB_UTILS_SUPPORT " ${XB_UTILS_SUPPORT})
+Message( "--- XB_EXAMPLES_SUPPORT " ${XB_EXAMPLES_SUPPORT})
+Message( "--- XB_LOGGING_SUPPORT " ${XB_LOGGING_SUPPORT})
+Message( "--- XB_DBF3_SUPPORT " ${XB_DBF3_SUPPORT})
+Message( "--- XB_DBF4_SUPPORT " ${XB_DBF4_SUPPORT})
+Message( "--- XB_LINKLIST_SUPPORT " ${XB_LINKLIST_SUPPORT})
+Message( "--- XB_LOCKING_SUPPORT " ${XB_LOCKING_SUPPORT})
+Message( "--- XB_FUNCTION_SUPPORT " ${XB_FUNCTION_SUPPORT})
+Message( "--- XB_EXPRESSION_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_MDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_SQL_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDXINF_SUPPORT " ${XB_NDXINF_SUPPORT})
+Message( "--- XB_FILTER_SUPPORT " ${XB_FILTER_SUPPORT})
+
+IF( XB_DEBUG_SUPPORT )
+ Message( "--- Adding debug support" )
+ set( CMAKE_BUILD_TYPE Debug )
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ add_compile_options( -Og )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+ENDIF( XB_DEBUG_SUPPORT )
+
+IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 64 bit compiler detected" )
+ set( XB_PLATFORM "x64" )
+ set( XB_PLATFORM_64 1 )
+ set( XB_LIBNAME "xbase64" )
+
+ELSE( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 32 bit compiler detected" )
+ set( XB_PLATFORM "x86" )
+ set( XB_PLATFORM_32 1 )
+ set( XB_LIBNAME "xbase32" )
+
+ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+
+
+#Check for the existence of various header files
+INCLUDE (CheckIncludeFiles)
+CHECK_INCLUDE_FILES (ctype.h HAVE_CTYPE_H)
+CHECK_INCLUDE_FILES (dirent.h HAVE_DIRENT_H)
+CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H)
+CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILES (stdarg.h HAVE_STDARG_H)
+CHECK_INCLUDE_FILES (stdargs.h HAVE_STDARGS_H)
+CHECK_INCLUDE_FILES (string.h HAVE_STRING_H)
+CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H)
+CHECK_INCLUDE_FILES (sys/stat.h HAVE_STAT_H)
+CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
+CHECK_INCLUDE_FILES (varargs.h HAVE_VARARGS_H)
+CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H)
+
+#Check for the existence of various function calls
+INCLUDE( CheckFunctionExists )
+CHECK_FUNCTION_EXISTS(_close HAVE__CLOSE_F)
+CHECK_FUNCTION_EXISTS(fcntl HAVE_FCNTL_F)
+CHECK_FUNCTION_EXISTS(_fdopen HAVE__FDOPEN_F)
+CHECK_FUNCTION_EXISTS(fopen_s HAVE_FOPEN_S_F)
+CHECK_FUNCTION_EXISTS(_fsopen HAVE__FSOPEN_F)
+CHECK_FUNCTION_EXISTS(_fileno HAVE__FILENO_F)
+CHECK_FUNCTION_EXISTS(fork HAVE_FORK_F)
+CHECK_FUNCTION_EXISTS(_fseeki64 HAVE__FSEEKI64_F)
+CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO_F)
+CHECK_FUNCTION_EXISTS(ftruncate HAVE_FTRUNCATE_F)
+CHECK_FUNCTION_EXISTS(_localtime64_s HAVE__LOCALTIME64_S_F)
+CHECK_FUNCTION_EXISTS(LockFile HAVE_LOCKFILE_F)
+CHECK_FUNCTION_EXISTS(locking HAVE_LOCKING_F)
+CHECK_FUNCTION_EXISTS(_locking HAVE__LOCKING_F)
+CHECK_FUNCTION_EXISTS(_open HAVE__OPEN_F)
+CHECK_FUNCTION_EXISTS(SetEndOfFile HAVE_SETENDOFFILE_F)
+
+CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF_F)
+CHECK_FUNCTION_EXISTS(_vsnprintf_s HAVE__VSNPRINTF_S_F)
+
+
+IF( WIN32 )
+
+# Use CHECK_SYMBOL_EXISTS for the Win32API instead of CHECK_FUNCTION_EXISTS
+# Can't detect inline functions in headers
+# Can't detect due to mismatch of calling conventions
+# Can't detect mangled names
+
+INCLUDE( CheckSymbolExists )
+CHECK_SYMBOL_EXISTS(CreateProcessW Windows.h HAVE_CREATEPROCESSW_F )
+CHECK_SYMBOL_EXISTS(vsprintf_s stdio.h HAVE_VSPRINTF_S_F )
+
+
+
+ENDIF ( WIN32 )
+
+# IF( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+# # ----fix me----
+# # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5 SetEndOfFile
+# Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_H" )
+# ENDIF ( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+
+IF( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+ # ----fix me----
+ # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5, or Windows VS 32 bit SetEndOfFile
+ Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_F" )
+ENDIF ( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+
+IF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+ Set( XB_INDEX_SUPPORT "1" )
+ENDIF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+
+
+# Set directories
+# PROJECT_PARENT_DIR is two nodes higher
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_BINARY_DIR} DIRECTORY )
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_PARENT_DIR} DIRECTORY )
+
+# MESSAGE( "PROJECT_PARENT_DIR = " ${PROJECT_PARENT_DIR} )
+# MESSAGE( "PROJECT_BINARY_DIR = " ${PROJECT_BINARY_DIR} )
+
+
+set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/${XB_PLATFORM})
+set( LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib/${XB_PLATFORM})
+set( PROJECT_SOURCE_DIR ${PROJECT_PARENT_DIR}/src)
+set( PROJECT_DATA_DIR ${PROJECT_PARENT_DIR}/data/)
+set( PROJECT_LOG_DIR ${PROJECT_PARENT_DIR}/logs/)
+set( EXTRA_LIBS ${EXTRA_LIBS} ${XB_LIBNAME})
+
+
+
+
+# Undo bad decisions
+IF( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+ MESSAGE( "--- Can't build 64 bit environment with a 32 bit compiler" )
+ MESSAGE( "--- XB_LARGEFILE_SUPPORT set to OFF" )
+ set( XB_LARGEFILE_SUPPORT OFF CACHE BOOL "Use 64 bit large file support?" FORCE )
+ENDIF ( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+
+IF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+ MESSAGE( "--- At lease one file format is required. Defaulting to Version 4" )
+ set( XB_DBF4_SUPPORT ON CACHE BOOL "Compile DBase File Format Version 4 support" FORCE )
+ENDIF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+
+IF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for DBF V4 Memo files. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for locking functions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+ MESSAGE( "--- Expression required for indices. Setting to ON" )
+ set( XB_EXPRESSION_SUPPORT ON CACHE BOOL "Compile Expression support into library" FORCE )
+ENDIF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_FUNCTION_SUPPORT ON CACHE BOOL "Compile XBase Function support into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+
+# Build configuration header file
+configure_file (
+ "${PROJECT_SOURCE_DIR}/include/xbconfig.h.in"
+ "${PROJECT_BINARY_DIR}/include/xbconfig.h"
+)
+
+# Microsoft Windows settings
+IF( WIN32 )
+# add_definitions( /D_CRT_SECURE_NO_WARNINGS)
+ add_definitions( /EHsc )
+ENDIF( WIN32 )
+
+
+# set up include directories
+include_directories( "${PROJECT_BINARY_DIR}/include" )
+include_directories( "${PROJECT_SOURCE_DIR}/include" )
+
+#build the library
+IF ( BUILD_SHARED_LIBS )
+ set( LIB_TYPE SHARED )
+ELSE( BUILD_SHARED_LIBS )
+ set( LIB_TYPE STATIC )
+ENDIF( BUILD_SHARED_LIBS )
+MESSAGE( "--- Lib type " ${LIB_TYPE} )
+
+
+
+set (SOURCES ${PROJECT_SOURCE_DIR}/core/xbstring.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbssv.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdate.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbtblmgr.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbxbase.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfile.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdbf.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfields.cpp
+ ${PROJECT_SOURCE_DIR}/core/xblog.cpp)
+
+IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo.cpp )
+ENDIF( XB_MEMO_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf3.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo3.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf4.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo4.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfuncs.cpp )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexpnode.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexp.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbuda.cpp )
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbbcd.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixbase.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbtag.cpp )
+ENDIF( XB_INDEX_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixndx.cpp )
+ENDIF( XB_NDX_SUPPORT )
+
+
+IF( XB_MDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixmdx.cpp )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbsql.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbinsert.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrtbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrpix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrptbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbset.cpp )
+ENDIF( XB_SQL_SUPPORT )
+
+
+IF( XB_FILTER_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfilter.cpp )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+
+include( GenerateExportHeader )
+#add_library( xbase ${LIB_TYPE} ${SOURCES} )
+add_library( ${XB_LIBNAME} ${LIB_TYPE} ${SOURCES} )
+#add_library( ${CMAKE_PROJECT_NAME} ${LIB_TYPE} ${SOURCES} )
+
+
+IF( WIN32 )
+MESSAGE( "--- Generating Windows Library Headers" )
+
+#GENERATE_EXPORT_HEADER( xbase
+# BASE_NAME xbase
+
+GENERATE_EXPORT_HEADER( ${XB_LIBNAME}
+ BASE_NAME ${XB_LIBNAME}
+ EXPORT_MACRO_NAME xbase_EXPORT
+ EXPORT_FILE_NAME xbase_Export.h
+ STATIC_DEFINE xbase_BUILT_AS_STATIC
+)
+ENDIF( WIN32 )
+
+
+#build test programs
+enable_testing()
+
+add_executable( xb_test_string ${PROJECT_SOURCE_DIR}/tests/xb_test_string.cpp )
+target_link_libraries( xb_test_string ${EXTRA_LIBS})
+add_test( NAME xbString COMMAND xb_test_string QUIET )
+
+add_executable( xb_test_date ${PROJECT_SOURCE_DIR}/tests/xb_test_date.cpp )
+target_link_libraries( xb_test_date ${EXTRA_LIBS})
+add_test( NAME xbDate COMMAND xb_test_date QUIET )
+
+add_executable( xb_test_tblmgr ${PROJECT_SOURCE_DIR}/tests/xb_test_tblmgr.cpp )
+target_link_libraries( xb_test_tblmgr ${EXTRA_LIBS})
+add_test( NAME xbTblMgr COMMAND xb_test_tblmgr QUIET )
+
+add_executable( xb_test_xbase ${PROJECT_SOURCE_DIR}/tests/xb_test_xbase.cpp )
+target_link_libraries( xb_test_xbase ${EXTRA_LIBS})
+add_test( NAME xbXBase COMMAND xb_test_xbase QUIET )
+
+add_executable( xb_test_file ${PROJECT_SOURCE_DIR}/tests/xb_test_file.cpp )
+target_link_libraries( xb_test_file ${EXTRA_LIBS})
+add_test( NAME xbFile COMMAND xb_test_file QUIET )
+
+add_executable( xb_test_log ${PROJECT_SOURCE_DIR}/tests/xb_test_log.cpp )
+target_link_libraries( xb_test_log ${EXTRA_LIBS})
+add_test( NAME xbLog COMMAND xb_test_log QUIET )
+
+IF( XB_LINKLIST_SUPPORT )
+add_executable( xb_test_linklist ${PROJECT_SOURCE_DIR}/tests/xb_test_linklist.cpp )
+target_link_libraries( xb_test_linklist ${EXTRA_LIBS})
+add_test( NAME xbLinkList COMMAND xb_test_linklist QUIET )
+ENDIF( XB_LINKLIST_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+add_executable( xb_test_dbf_v3_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v3_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3NoMemos COMMAND xb_test_dbf_v3_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v3_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_memos.cpp )
+target_link_libraries( xb_test_dbf_v3_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3Memos COMMAND xb_test_dbf_v3_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+add_executable( xb_test_dbf_v4_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v4_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4NoMemos COMMAND xb_test_dbf_v4_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v4_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_memos.cpp )
+target_link_libraries( xb_test_dbf_v4_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4Memos COMMAND xb_test_dbf_v4_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+add_executable( xb_test_funcs ${PROJECT_SOURCE_DIR}/tests/xb_test_funcs.cpp )
+target_link_libraries( xb_test_funcs ${EXTRA_LIBS})
+add_test( NAME xbFunctions COMMAND xb_test_funcs QUIET )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+add_executable( xb_test_ndx ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx.cpp )
+target_link_libraries( xb_test_ndx ${EXTRA_LIBS})
+add_test( NAME xbIxNdx COMMAND xb_test_ndx QUIET )
+add_executable( xb_test_ndx2 ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx2.cpp )
+target_link_libraries( xb_test_ndx2 ${EXTRA_LIBS})
+add_test( NAME xbIxNdx2 COMMAND xb_test_ndx2 QUIET )
+ENDIF( XB_NDX_SUPPORT )
+
+IF( XB_MDX_SUPPORT )
+add_executable( xb_test_mdx ${PROJECT_SOURCE_DIR}/tests/xb_test_mdx.cpp )
+target_link_libraries( xb_test_mdx ${EXTRA_LIBS})
+add_test( NAME xbIxMdx COMMAND xb_test_mdx QUIET )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+add_executable( xb_test_bcd ${PROJECT_SOURCE_DIR}/tests/xb_test_bcd.cpp )
+target_link_libraries( xb_test_bcd ${EXTRA_LIBS})
+add_test( NAME xbBcd COMMAND xb_test_bcd QUIET )
+ENDIF( XB_INDEX_SUPPORT )
+
+
+IF( XB_EXPRESSION_SUPPORT )
+
+add_executable( xb_test_expnode ${PROJECT_SOURCE_DIR}/tests/xb_test_expnode.cpp )
+target_link_libraries( xb_test_expnode ${EXTRA_LIBS})
+add_test( NAME xbExpNode COMMAND xb_test_expnode QUIET )
+
+
+add_executable( xb_test_expression ${PROJECT_SOURCE_DIR}/tests/xb_test_expression.cpp )
+target_link_libraries( xb_test_expression ${EXTRA_LIBS})
+add_test( NAME xbExpressions COMMAND xb_test_expression QUIET )
+
+add_executable( xb_test_uda ${PROJECT_SOURCE_DIR}/tests/xb_test_uda.cpp )
+target_link_libraries( xb_test_uda ${EXTRA_LIBS})
+add_test( NAME xbUda COMMAND xb_test_uda QUIET )
+
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+add_executable( xb_test_sql ${PROJECT_SOURCE_DIR}/tests/xb_test_sql.cpp )
+target_link_libraries( xb_test_sql ${EXTRA_LIBS})
+add_test( NAME xbSql COMMAND xb_test_sql QUIET )
+ENDIF( XB_SQL_SUPPORT )
+
+IF( XB_FILTER_SUPPORT )
+add_executable( xb_test_filter ${PROJECT_SOURCE_DIR}/tests/xb_test_filter.cpp )
+target_link_libraries( xb_test_filter ${EXTRA_LIBS})
+add_test( NAME xbFilter COMMAND xb_test_filter QUIET )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+IF( XB_LOCKING_SUPPORT )
+add_executable( xb_test_lock ${PROJECT_SOURCE_DIR}/tests/xb_test_lock.cpp )
+target_link_libraries( xb_test_lock ${EXTRA_LIBS})
+add_test( NAME xbLock COMMAND xb_test_lock QUIET )
+IF( HAVE_CREATEPROCESSW_F )
+add_executable( xb_test_lock2 ${PROJECT_SOURCE_DIR}/tests/xb_test_lock2.cpp )
+target_link_libraries( xb_test_lock2 ${EXTRA_LIBS})
+ENDIF( HAVE_CREATEPROCESSW_F )
+ENDIF( XB_LOCKING_SUPPORT )
+
+#build example programs
+IF( XB_EXAMPLES_SUPPORT )
+ add_executable( xb_ex_string ${PROJECT_SOURCE_DIR}/examples/xb_ex_string.cpp )
+ target_link_libraries( xb_ex_string ${EXTRA_LIBS})
+
+ add_executable( xb_ex_date ${PROJECT_SOURCE_DIR}/examples/xb_ex_date.cpp )
+ target_link_libraries( xb_ex_date ${EXTRA_LIBS})
+
+ IF( XB_DBF3_SUPPORT )
+ add_executable( xb_ex_v3_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_create_dbf.cpp )
+ target_link_libraries( xb_ex_v3_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v3_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v3_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF3_SUPPORT )
+
+ IF( XB_DBF4_SUPPORT )
+ add_executable( xb_ex_v4_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_create_dbf.cpp )
+ target_link_libraries( xb_ex_v4_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v4_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v4_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF4_SUPPORT )
+
+ENDIF( XB_EXAMPLES_SUPPORT )
+
+#build utility programs
+IF( XB_UTILS_SUPPORT )
+
+ add_executable( xb_cfg_check ${PROJECT_SOURCE_DIR}/utils/xb_cfg_check.cpp )
+ target_link_libraries( xb_cfg_check ${EXTRA_LIBS})
+
+ add_executable( xb_copydbf ${PROJECT_SOURCE_DIR}/utils/xb_copydbf.cpp )
+ target_link_libraries( xb_copydbf ${EXTRA_LIBS})
+
+ add_executable( xb_dbfutil ${PROJECT_SOURCE_DIR}/utils/xb_dbfutil.cpp )
+ target_link_libraries( xb_dbfutil ${EXTRA_LIBS})
+
+ add_executable( xb_deletall ${PROJECT_SOURCE_DIR}/utils/xb_deletall.cpp )
+ target_link_libraries( xb_deletall ${EXTRA_LIBS})
+
+ add_executable( xb_dumpdbt ${PROJECT_SOURCE_DIR}/utils/xb_dumpdbt.cpp )
+ target_link_libraries( xb_dumpdbt ${EXTRA_LIBS})
+
+ add_executable( xb_dumphdr ${PROJECT_SOURCE_DIR}/utils/xb_dumphdr.cpp )
+ target_link_libraries( xb_dumphdr ${EXTRA_LIBS})
+
+ add_executable( xb_dumprecs ${PROJECT_SOURCE_DIR}/utils/xb_dumprecs.cpp )
+ target_link_libraries( xb_dumprecs ${EXTRA_LIBS})
+
+
+ add_executable( xb_tblinfo ${PROJECT_SOURCE_DIR}/utils/xb_tblinfo.cpp )
+ target_link_libraries( xb_tblinfo ${EXTRA_LIBS})
+
+ IF( XB_SQL_SUPPORT )
+ add_executable( xb_execsql ${PROJECT_SOURCE_DIR}/utils/xb_execsql.cpp )
+ target_link_libraries( xb_execsql ${EXTRA_LIBS})
+ ENDIF( XB_SQL_SUPPORT )
+
+ add_executable( xb_pack ${PROJECT_SOURCE_DIR}/utils/xb_pack.cpp )
+ target_link_libraries( xb_pack ${EXTRA_LIBS})
+
+ add_executable( xb_undelall ${PROJECT_SOURCE_DIR}/utils/xb_undelall.cpp )
+ target_link_libraries( xb_undelall ${EXTRA_LIBS})
+
+ add_executable( xb_zap ${PROJECT_SOURCE_DIR}/utils/xb_zap.cpp )
+ target_link_libraries( xb_zap ${EXTRA_LIBS})
+
+
+ install (TARGETS xb_cfg_check DESTINATION bin)
+ install (TARGETS xb_copydbf DESTINATION bin)
+ install (TARGETS xb_dbfutil DESTINATION bin)
+ install (TARGETS xb_deletall DESTINATION bin)
+ install (TARGETS xb_dumpdbt DESTINATION bin)
+ install (TARGETS xb_dumphdr DESTINATION bin)
+ install (TARGETS xb_dumprecs DESTINATION bin)
+ install (TARGETS xb_pack DESTINATION bin)
+ install (TARGETS xb_undelall DESTINATION bin)
+ install (TARGETS xb_zap DESTINATION bin)
+ install (TARGETS xb_execsql DESTINATION bin)
+
+ENDIF( XB_UTILS_SUPPORT )
+
+install (FILES include/xbconfig.h
+ ${PROJECT_SOURCE_DIR}/include/xbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbbcd.h
+ ${PROJECT_SOURCE_DIR}/include/xbdate.h
+ ${PROJECT_SOURCE_DIR}/include/xbdbf.h
+ ${PROJECT_SOURCE_DIR}/include/xbexp.h
+ ${PROJECT_SOURCE_DIR}/include/xbexpnode.h
+ ${PROJECT_SOURCE_DIR}/include/xbfile.h
+ ${PROJECT_SOURCE_DIR}/include/xbindex.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklst.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklstord.h
+ ${PROJECT_SOURCE_DIR}/include/xblnknod.h
+ ${PROJECT_SOURCE_DIR}/include/xblog.h
+ ${PROJECT_SOURCE_DIR}/include/xbmemo.h
+ ${PROJECT_SOURCE_DIR}/include/xbretcod.h
+ ${PROJECT_SOURCE_DIR}/include/xbsql.h
+ ${PROJECT_SOURCE_DIR}/include/xbssv.h
+ ${PROJECT_SOURCE_DIR}/include/xbstring.h
+ ${PROJECT_SOURCE_DIR}/include/xbtblmgr.h
+ ${PROJECT_SOURCE_DIR}/include/xbtypes.h
+ ${PROJECT_SOURCE_DIR}/include/xbxbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbuda.h
+ ${PROJECT_SOURCE_DIR}/include/xbtag.h
+ ${PROJECT_SOURCE_DIR}/include/xbfilter.h
+ DESTINATION include/${CMAKE_PROJECT_NAME})
+
+
+SET_TARGET_PROPERTIES( ${XB_LIBNAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+#SET_TARGET_PROPERTIES( ${CMAKE_PROJECT_NAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+
+IF( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib64/${CMAKE_PROJECT_NAME})
+ELSE( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib/${CMAKE_PROJECT_NAME})
+ENDIF( EXISTS /usr/local/lib64 )
+
+
diff --git a/build/cmake/copymake b/build/cmake/copymake
new file mode 100755
index 0000000..e692f68
--- /dev/null
+++ b/build/cmake/copymake
@@ -0,0 +1,6 @@
+cp CMakeLists.txt ../linux32
+cp CMakeLists.txt ../linux64
+cp CMakeLists.txt ../mac64
+cp CMakeLists.txt ../borland5.5
+cp CMakeLists.txt ../win32vs
+cp CMakeLists.txt ../win64vs
diff --git a/build/linux32/CMakeLists.txt b/build/linux32/CMakeLists.txt
new file mode 100755
index 0000000..0a192b8
--- /dev/null
+++ b/build/linux32/CMakeLists.txt
@@ -0,0 +1,706 @@
+cmake_minimum_required(VERSION 3.0)
+
+project (xbase64)
+set( xbase_VERSION_MAJOR 4 )
+set( xbase_VERSION_MINOR 0 )
+set( xbase_VERSION_PATCH 0 )
+
+MESSAGE( "--- Xbase build for: " ${CMAKE_SYSTEM_NAME} )
+MESSAGE( "--- Compiler: " ${CMAKE_CXX_COMPILER_ID} )
+MESSAGE( "--- Project Name: " ${CMAKE_PROJECT_NAME} )
+
+#Set compiler options
+
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ MESSAGE( "Setting GNU compiler options" )
+ add_compile_options( -Wall -Wsign-conversion )
+# add_compile_options( -Wall -Wconversion -Wsign-conversion )
+ SET( VERBOSE 1 )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+
+IF( BORLAND )
+ MESSAGE ("BORLAND COMPILER" )
+ #set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w-8022" )
+ add_compile_options( -w-8022 )
+ENDIF( BORLAND )
+
+
+MESSAGE( "--- Checking integer sizes" )
+INCLUDE(CheckTypeSize)
+CHECK_TYPE_SIZE( "short int" SHORT_INT )
+CHECK_TYPE_SIZE( int INT )
+CHECK_TYPE_SIZE( __int32 __INT32 )
+CHECK_TYPE_SIZE( int32_t INT32_T )
+CHECK_TYPE_SIZE( long LONG_INT )
+CHECK_TYPE_SIZE( __int64 __INT64 )
+CHECK_TYPE_SIZE( int64_t INT64_T )
+CHECK_TYPE_SIZE( "long long" LONG_LONG )
+CHECK_TYPE_SIZE( u_int64_t U_INT64_T )
+CHECK_TYPE_SIZE( uint64_t UINT64_T )
+CHECK_TYPE_SIZE( "unsigned __int64" UNSIGNED__INT64 )
+CHECK_TYPE_SIZE( "unsigned long long" UNSIGNED_LONG_LONG )
+
+CHECK_TYPE_SIZE( "double" DOUBLE )
+MESSAGE( "--- Double size = " ${DOUBLE} )
+
+
+#determine how 16 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+ SET( xbInt16 "short int" )
+ SET( xbUInt16 "unsigned short int" )
+ SET( iSize ${SHORT_INT} )
+ MESSAGE( "--- xbInt16 = [short int]" )
+ MESSAGE( "--- xbUInt16 = [unsigned short int]" )
+
+ENDIF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+IF( NOT ${iSize} EQUAL 2 )
+ MESSAGE( "FATAL_ERROR Could not detect 16 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 2 )
+
+#determine how 32 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_INT AND ${INT} EQUAL 4 )
+ SET( xbInt32 int )
+ SET( xbUInt32 "unsigned int" )
+ SET( iSize ${INT} )
+ MESSAGE( "--- xbInt32 = [int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned int]" )
+ENDIF( HAVE_INT AND ${INT} EQUAL 4 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+ MESSAGE( __int untested if block - see CMakeLists.txt)
+ SET( xbInt32 __int32 )
+ SET( xbUInt32 "unsigned __int32" )
+ SET( iSize ${__INT} )
+ MESSAGE( "--- xbInt32 = [__int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned __int]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+ SET( xbInt32 int32_t )
+ SET( xbUInt32 "u_int32_t" )
+ SET( iSize ${INT32_T} )
+ MESSAGE( "--- xbInt32 = [int32_t]" )
+ MESSAGE( "--- xbUInt32 = [u_int32_t]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+
+IF( NOT ${iSize} EQUAL 4 )
+ MESSAGE( "FATAL_ERROR Could not detect 32 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 4 )
+
+#determine how 64 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE___INT64 )
+ SET( xbInt64 __int64 )
+ SET( iSize ${__INT64} )
+ MESSAGE( "--- xbInt64 = [__int64]" )
+ENDIF( HAVE___INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+ SET( xbInt64 int64_t )
+ SET( iSize ${INT64_T} )
+ MESSAGE( "--- xbInt64 = [int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+ SET( xbInt64 "long long" )
+ SET( iSize ${LONG_LONG} )
+ MESSAGE( "--- xbInt64 = [long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#determine how 64 bit unsigned integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_UNSIGNED__INT64 )
+ SET( xbUInt64 "unsigned __int64" )
+ SET( iSize ${UNSIGNED__INT64} )
+ MESSAGE( "--- xbUInt64 = [unsigned __int64]" )
+ENDIF( HAVE_UNSIGNED__INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+ SET( xbUInt64 "uint64_t" )
+ SET( iSize ${UINT64_T} )
+ MESSAGE( "--- xbUInt64 = [uint64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+ SET( xbUInt64 u_int64_t )
+ SET( iSize ${U_INT64_T} )
+ MESSAGE( "--- xbUInt64 = [u_int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+ SET( xbUInt64 "unsigned long long" )
+ SET( iSize ${UNSIGNED_LONG_LONG} )
+ MESSAGE( "--- xbUInt64 = [unsigned long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit unsigned integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#Library options
+option( BUILD_SHARED_LIBS "Build shared libraries?" ON)
+option( XB_DEBUG_SUPPORT "Compile debug logic into library?" ON)
+option( XB_UTILS_SUPPORT "Compile utility programs?" ON)
+option( XB_EXAMPLES_SUPPORT "Compile example programs?" ON)
+option( XB_MEMO_SUPPORT "Compile memo field support into library?" ON)
+option( XB_LOGGING_SUPPORT "Compile message logging support into library" ON)
+option( XB_DBF3_SUPPORT "Compile DBase File Format Version 3 support" ON)
+option( XB_DBF4_SUPPORT "Compile DBase File Format Version 4 support" ON)
+option( XB_LINKLIST_SUPPORT "Compile Link List routines into library" ON)
+option( XB_LOCKING_SUPPORT "Compile Multi User Locking support into library" ON)
+option( XB_FUNCTION_SUPPORT "Compile XBase Function support into library" ON)
+option( XB_EXPRESSION_SUPPORT "Compile Expression support into library" ON)
+option( XB_NDX_SUPPORT "Compile NDX Index support into library" ON)
+option( XB_MDX_SUPPORT "Compile MDX Index support into library" ON)
+option( XB_SQL_SUPPORT "Compile SQL support into library" ON)
+option( XB_NDXINF_SUPPORT "Compile NDX INF file support into library" ON)
+option( XB_FILTER_SUPPORT "Compile Filter support into library" ON)
+
+
+Message( "--- BUILD_SHARED_LIBS " ${BUILD_SHARED_LIBS})
+Message( "--- XB_MEMO_SUPPORT " ${XB_MEMO_SUPPORT})
+Message( "--- XB_DEBUG_SUPPORT " ${XB_DEBUG_SUPPORT})
+Message( "--- XB_UTILS_SUPPORT " ${XB_UTILS_SUPPORT})
+Message( "--- XB_EXAMPLES_SUPPORT " ${XB_EXAMPLES_SUPPORT})
+Message( "--- XB_LOGGING_SUPPORT " ${XB_LOGGING_SUPPORT})
+Message( "--- XB_DBF3_SUPPORT " ${XB_DBF3_SUPPORT})
+Message( "--- XB_DBF4_SUPPORT " ${XB_DBF4_SUPPORT})
+Message( "--- XB_LINKLIST_SUPPORT " ${XB_LINKLIST_SUPPORT})
+Message( "--- XB_LOCKING_SUPPORT " ${XB_LOCKING_SUPPORT})
+Message( "--- XB_FUNCTION_SUPPORT " ${XB_FUNCTION_SUPPORT})
+Message( "--- XB_EXPRESSION_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_MDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_SQL_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDXINF_SUPPORT " ${XB_NDXINF_SUPPORT})
+Message( "--- XB_FILTER_SUPPORT " ${XB_FILTER_SUPPORT})
+
+IF( XB_DEBUG_SUPPORT )
+ Message( "--- Adding debug support" )
+ set( CMAKE_BUILD_TYPE Debug )
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ add_compile_options( -Og )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+ENDIF( XB_DEBUG_SUPPORT )
+
+IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 64 bit compiler detected" )
+ set( XB_PLATFORM "x64" )
+ set( XB_PLATFORM_64 1 )
+ set( XB_LIBNAME "xbase64" )
+
+ELSE( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 32 bit compiler detected" )
+ set( XB_PLATFORM "x86" )
+ set( XB_PLATFORM_32 1 )
+ set( XB_LIBNAME "xbase32" )
+
+ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+
+
+#Check for the existence of various header files
+INCLUDE (CheckIncludeFiles)
+CHECK_INCLUDE_FILES (ctype.h HAVE_CTYPE_H)
+CHECK_INCLUDE_FILES (dirent.h HAVE_DIRENT_H)
+CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H)
+CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILES (stdarg.h HAVE_STDARG_H)
+CHECK_INCLUDE_FILES (stdargs.h HAVE_STDARGS_H)
+CHECK_INCLUDE_FILES (string.h HAVE_STRING_H)
+CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H)
+CHECK_INCLUDE_FILES (sys/stat.h HAVE_STAT_H)
+CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
+CHECK_INCLUDE_FILES (varargs.h HAVE_VARARGS_H)
+CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H)
+
+#Check for the existence of various function calls
+INCLUDE( CheckFunctionExists )
+CHECK_FUNCTION_EXISTS(_close HAVE__CLOSE_F)
+CHECK_FUNCTION_EXISTS(fcntl HAVE_FCNTL_F)
+CHECK_FUNCTION_EXISTS(_fdopen HAVE__FDOPEN_F)
+CHECK_FUNCTION_EXISTS(fopen_s HAVE_FOPEN_S_F)
+CHECK_FUNCTION_EXISTS(_fsopen HAVE__FSOPEN_F)
+CHECK_FUNCTION_EXISTS(_fileno HAVE__FILENO_F)
+CHECK_FUNCTION_EXISTS(fork HAVE_FORK_F)
+CHECK_FUNCTION_EXISTS(_fseeki64 HAVE__FSEEKI64_F)
+CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO_F)
+CHECK_FUNCTION_EXISTS(ftruncate HAVE_FTRUNCATE_F)
+CHECK_FUNCTION_EXISTS(_localtime64_s HAVE__LOCALTIME64_S_F)
+CHECK_FUNCTION_EXISTS(LockFile HAVE_LOCKFILE_F)
+CHECK_FUNCTION_EXISTS(locking HAVE_LOCKING_F)
+CHECK_FUNCTION_EXISTS(_locking HAVE__LOCKING_F)
+CHECK_FUNCTION_EXISTS(_open HAVE__OPEN_F)
+CHECK_FUNCTION_EXISTS(SetEndOfFile HAVE_SETENDOFFILE_F)
+
+CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF_F)
+CHECK_FUNCTION_EXISTS(_vsnprintf_s HAVE__VSNPRINTF_S_F)
+
+
+IF( WIN32 )
+
+# Use CHECK_SYMBOL_EXISTS for the Win32API instead of CHECK_FUNCTION_EXISTS
+# Can't detect inline functions in headers
+# Can't detect due to mismatch of calling conventions
+# Can't detect mangled names
+
+INCLUDE( CheckSymbolExists )
+CHECK_SYMBOL_EXISTS(CreateProcessW Windows.h HAVE_CREATEPROCESSW_F )
+CHECK_SYMBOL_EXISTS(vsprintf_s stdio.h HAVE_VSPRINTF_S_F )
+
+
+
+ENDIF ( WIN32 )
+
+# IF( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+# # ----fix me----
+# # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5 SetEndOfFile
+# Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_H" )
+# ENDIF ( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+
+IF( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+ # ----fix me----
+ # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5, or Windows VS 32 bit SetEndOfFile
+ Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_F" )
+ENDIF ( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+
+IF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+ Set( XB_INDEX_SUPPORT "1" )
+ENDIF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+
+
+# Set directories
+# PROJECT_PARENT_DIR is two nodes higher
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_BINARY_DIR} DIRECTORY )
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_PARENT_DIR} DIRECTORY )
+
+# MESSAGE( "PROJECT_PARENT_DIR = " ${PROJECT_PARENT_DIR} )
+# MESSAGE( "PROJECT_BINARY_DIR = " ${PROJECT_BINARY_DIR} )
+
+
+set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/${XB_PLATFORM})
+set( LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib/${XB_PLATFORM})
+set( PROJECT_SOURCE_DIR ${PROJECT_PARENT_DIR}/src)
+set( PROJECT_DATA_DIR ${PROJECT_PARENT_DIR}/data/)
+set( PROJECT_LOG_DIR ${PROJECT_PARENT_DIR}/logs/)
+set( EXTRA_LIBS ${EXTRA_LIBS} ${XB_LIBNAME})
+
+
+
+
+# Undo bad decisions
+IF( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+ MESSAGE( "--- Can't build 64 bit environment with a 32 bit compiler" )
+ MESSAGE( "--- XB_LARGEFILE_SUPPORT set to OFF" )
+ set( XB_LARGEFILE_SUPPORT OFF CACHE BOOL "Use 64 bit large file support?" FORCE )
+ENDIF ( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+
+IF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+ MESSAGE( "--- At lease one file format is required. Defaulting to Version 4" )
+ set( XB_DBF4_SUPPORT ON CACHE BOOL "Compile DBase File Format Version 4 support" FORCE )
+ENDIF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+
+IF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for DBF V4 Memo files. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for locking functions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+ MESSAGE( "--- Expression required for indices. Setting to ON" )
+ set( XB_EXPRESSION_SUPPORT ON CACHE BOOL "Compile Expression support into library" FORCE )
+ENDIF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_FUNCTION_SUPPORT ON CACHE BOOL "Compile XBase Function support into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+
+# Build configuration header file
+configure_file (
+ "${PROJECT_SOURCE_DIR}/include/xbconfig.h.in"
+ "${PROJECT_BINARY_DIR}/include/xbconfig.h"
+)
+
+# Microsoft Windows settings
+IF( WIN32 )
+# add_definitions( /D_CRT_SECURE_NO_WARNINGS)
+ add_definitions( /EHsc )
+ENDIF( WIN32 )
+
+
+# set up include directories
+include_directories( "${PROJECT_BINARY_DIR}/include" )
+include_directories( "${PROJECT_SOURCE_DIR}/include" )
+
+#build the library
+IF ( BUILD_SHARED_LIBS )
+ set( LIB_TYPE SHARED )
+ELSE( BUILD_SHARED_LIBS )
+ set( LIB_TYPE STATIC )
+ENDIF( BUILD_SHARED_LIBS )
+MESSAGE( "--- Lib type " ${LIB_TYPE} )
+
+
+
+set (SOURCES ${PROJECT_SOURCE_DIR}/core/xbstring.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbssv.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdate.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbtblmgr.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbxbase.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfile.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdbf.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfields.cpp
+ ${PROJECT_SOURCE_DIR}/core/xblog.cpp)
+
+IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo.cpp )
+ENDIF( XB_MEMO_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf3.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo3.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf4.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo4.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfuncs.cpp )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexpnode.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexp.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbuda.cpp )
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbbcd.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixbase.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbtag.cpp )
+ENDIF( XB_INDEX_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixndx.cpp )
+ENDIF( XB_NDX_SUPPORT )
+
+
+IF( XB_MDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixmdx.cpp )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbsql.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbinsert.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrtbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrpix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrptbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbset.cpp )
+ENDIF( XB_SQL_SUPPORT )
+
+
+IF( XB_FILTER_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfilter.cpp )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+
+include( GenerateExportHeader )
+#add_library( xbase ${LIB_TYPE} ${SOURCES} )
+add_library( ${XB_LIBNAME} ${LIB_TYPE} ${SOURCES} )
+#add_library( ${CMAKE_PROJECT_NAME} ${LIB_TYPE} ${SOURCES} )
+
+
+IF( WIN32 )
+MESSAGE( "--- Generating Windows Library Headers" )
+
+#GENERATE_EXPORT_HEADER( xbase
+# BASE_NAME xbase
+
+GENERATE_EXPORT_HEADER( ${XB_LIBNAME}
+ BASE_NAME ${XB_LIBNAME}
+ EXPORT_MACRO_NAME xbase_EXPORT
+ EXPORT_FILE_NAME xbase_Export.h
+ STATIC_DEFINE xbase_BUILT_AS_STATIC
+)
+ENDIF( WIN32 )
+
+
+#build test programs
+enable_testing()
+
+add_executable( xb_test_string ${PROJECT_SOURCE_DIR}/tests/xb_test_string.cpp )
+target_link_libraries( xb_test_string ${EXTRA_LIBS})
+add_test( NAME xbString COMMAND xb_test_string QUIET )
+
+add_executable( xb_test_date ${PROJECT_SOURCE_DIR}/tests/xb_test_date.cpp )
+target_link_libraries( xb_test_date ${EXTRA_LIBS})
+add_test( NAME xbDate COMMAND xb_test_date QUIET )
+
+add_executable( xb_test_tblmgr ${PROJECT_SOURCE_DIR}/tests/xb_test_tblmgr.cpp )
+target_link_libraries( xb_test_tblmgr ${EXTRA_LIBS})
+add_test( NAME xbTblMgr COMMAND xb_test_tblmgr QUIET )
+
+add_executable( xb_test_xbase ${PROJECT_SOURCE_DIR}/tests/xb_test_xbase.cpp )
+target_link_libraries( xb_test_xbase ${EXTRA_LIBS})
+add_test( NAME xbXBase COMMAND xb_test_xbase QUIET )
+
+add_executable( xb_test_file ${PROJECT_SOURCE_DIR}/tests/xb_test_file.cpp )
+target_link_libraries( xb_test_file ${EXTRA_LIBS})
+add_test( NAME xbFile COMMAND xb_test_file QUIET )
+
+add_executable( xb_test_log ${PROJECT_SOURCE_DIR}/tests/xb_test_log.cpp )
+target_link_libraries( xb_test_log ${EXTRA_LIBS})
+add_test( NAME xbLog COMMAND xb_test_log QUIET )
+
+IF( XB_LINKLIST_SUPPORT )
+add_executable( xb_test_linklist ${PROJECT_SOURCE_DIR}/tests/xb_test_linklist.cpp )
+target_link_libraries( xb_test_linklist ${EXTRA_LIBS})
+add_test( NAME xbLinkList COMMAND xb_test_linklist QUIET )
+ENDIF( XB_LINKLIST_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+add_executable( xb_test_dbf_v3_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v3_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3NoMemos COMMAND xb_test_dbf_v3_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v3_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_memos.cpp )
+target_link_libraries( xb_test_dbf_v3_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3Memos COMMAND xb_test_dbf_v3_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+add_executable( xb_test_dbf_v4_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v4_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4NoMemos COMMAND xb_test_dbf_v4_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v4_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_memos.cpp )
+target_link_libraries( xb_test_dbf_v4_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4Memos COMMAND xb_test_dbf_v4_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+add_executable( xb_test_funcs ${PROJECT_SOURCE_DIR}/tests/xb_test_funcs.cpp )
+target_link_libraries( xb_test_funcs ${EXTRA_LIBS})
+add_test( NAME xbFunctions COMMAND xb_test_funcs QUIET )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+add_executable( xb_test_ndx ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx.cpp )
+target_link_libraries( xb_test_ndx ${EXTRA_LIBS})
+add_test( NAME xbIxNdx COMMAND xb_test_ndx QUIET )
+add_executable( xb_test_ndx2 ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx2.cpp )
+target_link_libraries( xb_test_ndx2 ${EXTRA_LIBS})
+add_test( NAME xbIxNdx2 COMMAND xb_test_ndx2 QUIET )
+ENDIF( XB_NDX_SUPPORT )
+
+IF( XB_MDX_SUPPORT )
+add_executable( xb_test_mdx ${PROJECT_SOURCE_DIR}/tests/xb_test_mdx.cpp )
+target_link_libraries( xb_test_mdx ${EXTRA_LIBS})
+add_test( NAME xbIxMdx COMMAND xb_test_mdx QUIET )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+add_executable( xb_test_bcd ${PROJECT_SOURCE_DIR}/tests/xb_test_bcd.cpp )
+target_link_libraries( xb_test_bcd ${EXTRA_LIBS})
+add_test( NAME xbBcd COMMAND xb_test_bcd QUIET )
+ENDIF( XB_INDEX_SUPPORT )
+
+
+IF( XB_EXPRESSION_SUPPORT )
+
+add_executable( xb_test_expnode ${PROJECT_SOURCE_DIR}/tests/xb_test_expnode.cpp )
+target_link_libraries( xb_test_expnode ${EXTRA_LIBS})
+add_test( NAME xbExpNode COMMAND xb_test_expnode QUIET )
+
+
+add_executable( xb_test_expression ${PROJECT_SOURCE_DIR}/tests/xb_test_expression.cpp )
+target_link_libraries( xb_test_expression ${EXTRA_LIBS})
+add_test( NAME xbExpressions COMMAND xb_test_expression QUIET )
+
+add_executable( xb_test_uda ${PROJECT_SOURCE_DIR}/tests/xb_test_uda.cpp )
+target_link_libraries( xb_test_uda ${EXTRA_LIBS})
+add_test( NAME xbUda COMMAND xb_test_uda QUIET )
+
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+add_executable( xb_test_sql ${PROJECT_SOURCE_DIR}/tests/xb_test_sql.cpp )
+target_link_libraries( xb_test_sql ${EXTRA_LIBS})
+add_test( NAME xbSql COMMAND xb_test_sql QUIET )
+ENDIF( XB_SQL_SUPPORT )
+
+IF( XB_FILTER_SUPPORT )
+add_executable( xb_test_filter ${PROJECT_SOURCE_DIR}/tests/xb_test_filter.cpp )
+target_link_libraries( xb_test_filter ${EXTRA_LIBS})
+add_test( NAME xbFilter COMMAND xb_test_filter QUIET )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+IF( XB_LOCKING_SUPPORT )
+add_executable( xb_test_lock ${PROJECT_SOURCE_DIR}/tests/xb_test_lock.cpp )
+target_link_libraries( xb_test_lock ${EXTRA_LIBS})
+add_test( NAME xbLock COMMAND xb_test_lock QUIET )
+IF( HAVE_CREATEPROCESSW_F )
+add_executable( xb_test_lock2 ${PROJECT_SOURCE_DIR}/tests/xb_test_lock2.cpp )
+target_link_libraries( xb_test_lock2 ${EXTRA_LIBS})
+ENDIF( HAVE_CREATEPROCESSW_F )
+ENDIF( XB_LOCKING_SUPPORT )
+
+#build example programs
+IF( XB_EXAMPLES_SUPPORT )
+ add_executable( xb_ex_string ${PROJECT_SOURCE_DIR}/examples/xb_ex_string.cpp )
+ target_link_libraries( xb_ex_string ${EXTRA_LIBS})
+
+ add_executable( xb_ex_date ${PROJECT_SOURCE_DIR}/examples/xb_ex_date.cpp )
+ target_link_libraries( xb_ex_date ${EXTRA_LIBS})
+
+ IF( XB_DBF3_SUPPORT )
+ add_executable( xb_ex_v3_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_create_dbf.cpp )
+ target_link_libraries( xb_ex_v3_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v3_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v3_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF3_SUPPORT )
+
+ IF( XB_DBF4_SUPPORT )
+ add_executable( xb_ex_v4_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_create_dbf.cpp )
+ target_link_libraries( xb_ex_v4_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v4_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v4_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF4_SUPPORT )
+
+ENDIF( XB_EXAMPLES_SUPPORT )
+
+#build utility programs
+IF( XB_UTILS_SUPPORT )
+
+ add_executable( xb_cfg_check ${PROJECT_SOURCE_DIR}/utils/xb_cfg_check.cpp )
+ target_link_libraries( xb_cfg_check ${EXTRA_LIBS})
+
+ add_executable( xb_copydbf ${PROJECT_SOURCE_DIR}/utils/xb_copydbf.cpp )
+ target_link_libraries( xb_copydbf ${EXTRA_LIBS})
+
+ add_executable( xb_dbfutil ${PROJECT_SOURCE_DIR}/utils/xb_dbfutil.cpp )
+ target_link_libraries( xb_dbfutil ${EXTRA_LIBS})
+
+ add_executable( xb_deletall ${PROJECT_SOURCE_DIR}/utils/xb_deletall.cpp )
+ target_link_libraries( xb_deletall ${EXTRA_LIBS})
+
+ add_executable( xb_dumpdbt ${PROJECT_SOURCE_DIR}/utils/xb_dumpdbt.cpp )
+ target_link_libraries( xb_dumpdbt ${EXTRA_LIBS})
+
+ add_executable( xb_dumphdr ${PROJECT_SOURCE_DIR}/utils/xb_dumphdr.cpp )
+ target_link_libraries( xb_dumphdr ${EXTRA_LIBS})
+
+ add_executable( xb_dumprecs ${PROJECT_SOURCE_DIR}/utils/xb_dumprecs.cpp )
+ target_link_libraries( xb_dumprecs ${EXTRA_LIBS})
+
+
+ add_executable( xb_tblinfo ${PROJECT_SOURCE_DIR}/utils/xb_tblinfo.cpp )
+ target_link_libraries( xb_tblinfo ${EXTRA_LIBS})
+
+ IF( XB_SQL_SUPPORT )
+ add_executable( xb_execsql ${PROJECT_SOURCE_DIR}/utils/xb_execsql.cpp )
+ target_link_libraries( xb_execsql ${EXTRA_LIBS})
+ ENDIF( XB_SQL_SUPPORT )
+
+ add_executable( xb_pack ${PROJECT_SOURCE_DIR}/utils/xb_pack.cpp )
+ target_link_libraries( xb_pack ${EXTRA_LIBS})
+
+ add_executable( xb_undelall ${PROJECT_SOURCE_DIR}/utils/xb_undelall.cpp )
+ target_link_libraries( xb_undelall ${EXTRA_LIBS})
+
+ add_executable( xb_zap ${PROJECT_SOURCE_DIR}/utils/xb_zap.cpp )
+ target_link_libraries( xb_zap ${EXTRA_LIBS})
+
+
+ install (TARGETS xb_cfg_check DESTINATION bin)
+ install (TARGETS xb_copydbf DESTINATION bin)
+ install (TARGETS xb_dbfutil DESTINATION bin)
+ install (TARGETS xb_deletall DESTINATION bin)
+ install (TARGETS xb_dumpdbt DESTINATION bin)
+ install (TARGETS xb_dumphdr DESTINATION bin)
+ install (TARGETS xb_dumprecs DESTINATION bin)
+ install (TARGETS xb_pack DESTINATION bin)
+ install (TARGETS xb_undelall DESTINATION bin)
+ install (TARGETS xb_zap DESTINATION bin)
+ install (TARGETS xb_execsql DESTINATION bin)
+
+ENDIF( XB_UTILS_SUPPORT )
+
+install (FILES include/xbconfig.h
+ ${PROJECT_SOURCE_DIR}/include/xbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbbcd.h
+ ${PROJECT_SOURCE_DIR}/include/xbdate.h
+ ${PROJECT_SOURCE_DIR}/include/xbdbf.h
+ ${PROJECT_SOURCE_DIR}/include/xbexp.h
+ ${PROJECT_SOURCE_DIR}/include/xbexpnode.h
+ ${PROJECT_SOURCE_DIR}/include/xbfile.h
+ ${PROJECT_SOURCE_DIR}/include/xbindex.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklst.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklstord.h
+ ${PROJECT_SOURCE_DIR}/include/xblnknod.h
+ ${PROJECT_SOURCE_DIR}/include/xblog.h
+ ${PROJECT_SOURCE_DIR}/include/xbmemo.h
+ ${PROJECT_SOURCE_DIR}/include/xbretcod.h
+ ${PROJECT_SOURCE_DIR}/include/xbsql.h
+ ${PROJECT_SOURCE_DIR}/include/xbssv.h
+ ${PROJECT_SOURCE_DIR}/include/xbstring.h
+ ${PROJECT_SOURCE_DIR}/include/xbtblmgr.h
+ ${PROJECT_SOURCE_DIR}/include/xbtypes.h
+ ${PROJECT_SOURCE_DIR}/include/xbxbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbuda.h
+ ${PROJECT_SOURCE_DIR}/include/xbtag.h
+ ${PROJECT_SOURCE_DIR}/include/xbfilter.h
+ DESTINATION include/${CMAKE_PROJECT_NAME})
+
+
+SET_TARGET_PROPERTIES( ${XB_LIBNAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+#SET_TARGET_PROPERTIES( ${CMAKE_PROJECT_NAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+
+IF( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib64/${CMAKE_PROJECT_NAME})
+ELSE( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib/${CMAKE_PROJECT_NAME})
+ENDIF( EXISTS /usr/local/lib64 )
+
+
diff --git a/build/linux64/CMakeLists.txt b/build/linux64/CMakeLists.txt
new file mode 100755
index 0000000..beac984
--- /dev/null
+++ b/build/linux64/CMakeLists.txt
@@ -0,0 +1,705 @@
+cmake_minimum_required(VERSION 3.0)
+
+project (xbase64)
+set( xbase_VERSION_MAJOR 4 )
+set( xbase_VERSION_MINOR 0 )
+set( xbase_VERSION_PATCH 0 )
+
+MESSAGE( "--- Xbase build for: " ${CMAKE_SYSTEM_NAME} )
+MESSAGE( "--- Compiler: " ${CMAKE_CXX_COMPILER_ID} )
+MESSAGE( "--- Project Name: " ${CMAKE_PROJECT_NAME} )
+
+#Set compiler options
+
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ MESSAGE( "Setting GNU compiler options" )
+ add_compile_options( -Wall -Wsign-conversion )
+# add_compile_options( -Wall -Wconversion -Wsign-conversion )
+ SET( VERBOSE 1 )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+
+IF( BORLAND )
+ MESSAGE ("BORLAND COMPILER" )
+ #set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w-8022" )
+ add_compile_options( -w-8022 )
+ENDIF( BORLAND )
+
+
+MESSAGE( "--- Checking integer sizes" )
+INCLUDE(CheckTypeSize)
+CHECK_TYPE_SIZE( "short int" SHORT_INT )
+CHECK_TYPE_SIZE( int INT )
+CHECK_TYPE_SIZE( __int32 __INT32 )
+CHECK_TYPE_SIZE( int32_t INT32_T )
+CHECK_TYPE_SIZE( long LONG_INT )
+CHECK_TYPE_SIZE( __int64 __INT64 )
+CHECK_TYPE_SIZE( int64_t INT64_T )
+CHECK_TYPE_SIZE( "long long" LONG_LONG )
+CHECK_TYPE_SIZE( u_int64_t U_INT64_T )
+CHECK_TYPE_SIZE( uint64_t UINT64_T )
+CHECK_TYPE_SIZE( "unsigned __int64" UNSIGNED__INT64 )
+CHECK_TYPE_SIZE( "unsigned long long" UNSIGNED_LONG_LONG )
+
+CHECK_TYPE_SIZE( "double" DOUBLE )
+MESSAGE( "--- Double size = " ${DOUBLE} )
+
+
+#determine how 16 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+ SET( xbInt16 "short int" )
+ SET( xbUInt16 "unsigned short int" )
+ SET( iSize ${SHORT_INT} )
+ MESSAGE( "--- xbInt16 = [short int]" )
+ MESSAGE( "--- xbUInt16 = [unsigned short int]" )
+
+ENDIF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+IF( NOT ${iSize} EQUAL 2 )
+ MESSAGE( "FATAL_ERROR Could not detect 16 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 2 )
+
+#determine how 32 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_INT AND ${INT} EQUAL 4 )
+ SET( xbInt32 int )
+ SET( xbUInt32 "unsigned int" )
+ SET( iSize ${INT} )
+ MESSAGE( "--- xbInt32 = [int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned int]" )
+ENDIF( HAVE_INT AND ${INT} EQUAL 4 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+ MESSAGE( __int untested if block - see CMakeLists.txt)
+ SET( xbInt32 __int32 )
+ SET( xbUInt32 "unsigned __int32" )
+ SET( iSize ${__INT} )
+ MESSAGE( "--- xbInt32 = [__int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned __int]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+ SET( xbInt32 int32_t )
+ SET( xbUInt32 "u_int32_t" )
+ SET( iSize ${INT32_T} )
+ MESSAGE( "--- xbInt32 = [int32_t]" )
+ MESSAGE( "--- xbUInt32 = [u_int32_t]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+
+IF( NOT ${iSize} EQUAL 4 )
+ MESSAGE( "FATAL_ERROR Could not detect 32 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 4 )
+
+#determine how 64 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE___INT64 )
+ SET( xbInt64 __int64 )
+ SET( iSize ${__INT64} )
+ MESSAGE( "--- xbInt64 = [__int64]" )
+ENDIF( HAVE___INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+ SET( xbInt64 int64_t )
+ SET( iSize ${INT64_T} )
+ MESSAGE( "--- xbInt64 = [int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+ SET( xbInt64 "long long" )
+ SET( iSize ${LONG_LONG} )
+ MESSAGE( "--- xbInt64 = [long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#determine how 64 bit unsigned integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_UNSIGNED__INT64 )
+ SET( xbUInt64 "unsigned __int64" )
+ SET( iSize ${UNSIGNED__INT64} )
+ MESSAGE( "--- xbUInt64 = [unsigned __int64]" )
+ENDIF( HAVE_UNSIGNED__INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+ SET( xbUInt64 "uint64_t" )
+ SET( iSize ${UINT64_T} )
+ MESSAGE( "--- xbUInt64 = [uint64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+ SET( xbUInt64 u_int64_t )
+ SET( iSize ${U_INT64_T} )
+ MESSAGE( "--- xbUInt64 = [u_int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+ SET( xbUInt64 "unsigned long long" )
+ SET( iSize ${UNSIGNED_LONG_LONG} )
+ MESSAGE( "--- xbUInt64 = [unsigned long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit unsigned integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#Library options
+option( BUILD_SHARED_LIBS "Build shared libraries?" ON)
+option( XB_DEBUG_SUPPORT "Compile debug logic into library?" ON)
+option( XB_UTILS_SUPPORT "Compile utility programs?" ON)
+option( XB_EXAMPLES_SUPPORT "Compile example programs?" ON)
+option( XB_MEMO_SUPPORT "Compile memo field support into library?" ON)
+option( XB_LOGGING_SUPPORT "Compile message logging support into library" ON)
+option( XB_DBF3_SUPPORT "Compile DBase File Format Version 3 support" ON)
+option( XB_DBF4_SUPPORT "Compile DBase File Format Version 4 support" ON)
+option( XB_LINKLIST_SUPPORT "Compile Link List routines into library" ON)
+option( XB_LOCKING_SUPPORT "Compile Multi User Locking support into library" ON)
+option( XB_FUNCTION_SUPPORT "Compile XBase Function support into library" ON)
+option( XB_EXPRESSION_SUPPORT "Compile Expression support into library" ON)
+option( XB_NDX_SUPPORT "Compile NDX Index support into library" ON)
+option( XB_MDX_SUPPORT "Compile MDX Index support into library" ON)
+option( XB_SQL_SUPPORT "Compile SQL support into library" ON)
+option( XB_NDXINF_SUPPORT "Compile NDX INF file support into library" ON)
+option( XB_FILTER_SUPPORT "Compile Filter support into library" ON)
+
+
+Message( "--- BUILD_SHARED_LIBS " ${BUILD_SHARED_LIBS})
+Message( "--- XB_MEMO_SUPPORT " ${XB_MEMO_SUPPORT})
+Message( "--- XB_DEBUG_SUPPORT " ${XB_DEBUG_SUPPORT})
+Message( "--- XB_UTILS_SUPPORT " ${XB_UTILS_SUPPORT})
+Message( "--- XB_EXAMPLES_SUPPORT " ${XB_EXAMPLES_SUPPORT})
+Message( "--- XB_LOGGING_SUPPORT " ${XB_LOGGING_SUPPORT})
+Message( "--- XB_DBF3_SUPPORT " ${XB_DBF3_SUPPORT})
+Message( "--- XB_DBF4_SUPPORT " ${XB_DBF4_SUPPORT})
+Message( "--- XB_LINKLIST_SUPPORT " ${XB_LINKLIST_SUPPORT})
+Message( "--- XB_LOCKING_SUPPORT " ${XB_LOCKING_SUPPORT})
+Message( "--- XB_FUNCTION_SUPPORT " ${XB_FUNCTION_SUPPORT})
+Message( "--- XB_EXPRESSION_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_MDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_SQL_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDXINF_SUPPORT " ${XB_NDXINF_SUPPORT})
+Message( "--- XB_FILTER_SUPPORT " ${XB_FILTER_SUPPORT})
+
+IF( XB_DEBUG_SUPPORT )
+ Message( "--- Adding debug support" )
+ set( CMAKE_BUILD_TYPE Debug )
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ add_compile_options( -Og )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+ENDIF( XB_DEBUG_SUPPORT )
+
+IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 64 bit compiler detected" )
+ set( XB_PLATFORM "x64" )
+ set( XB_PLATFORM_64 1 )
+ set( XB_LIBNAME "xbase64" )
+
+ELSE( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 32 bit compiler detected" )
+ set( XB_PLATFORM "x86" )
+ set( XB_PLATFORM_32 1 )
+ set( XB_LIBNAME "xbase32" )
+
+ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+
+
+#Check for the existence of various header files
+INCLUDE (CheckIncludeFiles)
+CHECK_INCLUDE_FILES (ctype.h HAVE_CTYPE_H)
+CHECK_INCLUDE_FILES (dirent.h HAVE_DIRENT_H)
+CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H)
+CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILES (stdarg.h HAVE_STDARG_H)
+CHECK_INCLUDE_FILES (stdargs.h HAVE_STDARGS_H)
+CHECK_INCLUDE_FILES (string.h HAVE_STRING_H)
+CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H)
+CHECK_INCLUDE_FILES (sys/stat.h HAVE_STAT_H)
+CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
+CHECK_INCLUDE_FILES (varargs.h HAVE_VARARGS_H)
+CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H)
+
+#Check for the existence of various function calls
+INCLUDE( CheckFunctionExists )
+CHECK_FUNCTION_EXISTS(_close HAVE__CLOSE_F)
+CHECK_FUNCTION_EXISTS(fcntl HAVE_FCNTL_F)
+CHECK_FUNCTION_EXISTS(_fdopen HAVE__FDOPEN_F)
+CHECK_FUNCTION_EXISTS(fopen_s HAVE_FOPEN_S_F)
+CHECK_FUNCTION_EXISTS(_fsopen HAVE__FSOPEN_F)
+CHECK_FUNCTION_EXISTS(_fileno HAVE__FILENO_F)
+CHECK_FUNCTION_EXISTS(fork HAVE_FORK_F)
+CHECK_FUNCTION_EXISTS(_fseeki64 HAVE__FSEEKI64_F)
+CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO_F)
+CHECK_FUNCTION_EXISTS(ftruncate HAVE_FTRUNCATE_F)
+CHECK_FUNCTION_EXISTS(_localtime64_s HAVE__LOCALTIME64_S_F)
+CHECK_FUNCTION_EXISTS(LockFile HAVE_LOCKFILE_F)
+CHECK_FUNCTION_EXISTS(locking HAVE_LOCKING_F)
+CHECK_FUNCTION_EXISTS(_locking HAVE__LOCKING_F)
+CHECK_FUNCTION_EXISTS(_open HAVE__OPEN_F)
+CHECK_FUNCTION_EXISTS(SetEndOfFile HAVE_SETENDOFFILE_F)
+
+CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF_F)
+CHECK_FUNCTION_EXISTS(_vsnprintf_s HAVE__VSNPRINTF_S_F)
+
+
+IF( WIN32 )
+
+# Use CHECK_SYMBOL_EXISTS for the Win32API instead of CHECK_FUNCTION_EXISTS
+# Can't detect inline functions in headers
+# Can't detect due to mismatch of calling conventions
+# Can't detect mangled names
+
+INCLUDE( CheckSymbolExists )
+CHECK_SYMBOL_EXISTS(CreateProcessW Windows.h HAVE_CREATEPROCESSW_F )
+CHECK_SYMBOL_EXISTS(vsprintf_s stdio.h HAVE_VSPRINTF_S_F )
+
+
+
+ENDIF ( WIN32 )
+
+# IF( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+# # ----fix me----
+# # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5 SetEndOfFile
+# Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_H" )
+# ENDIF ( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+
+IF( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+ # ----fix me----
+ # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5, or Windows VS 32 bit SetEndOfFile
+ Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_F" )
+ENDIF ( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+
+IF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+ Set( XB_INDEX_SUPPORT "1" )
+ENDIF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+
+
+# Set directories
+# PROJECT_PARENT_DIR is two nodes higher
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_BINARY_DIR} DIRECTORY )
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_PARENT_DIR} DIRECTORY )
+
+# MESSAGE( "PROJECT_PARENT_DIR = " ${PROJECT_PARENT_DIR} )
+# MESSAGE( "PROJECT_BINARY_DIR = " ${PROJECT_BINARY_DIR} )
+
+
+set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/${XB_PLATFORM})
+set( LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib/${XB_PLATFORM})
+set( PROJECT_SOURCE_DIR ${PROJECT_PARENT_DIR}/src)
+set( PROJECT_DATA_DIR ${PROJECT_PARENT_DIR}/data/)
+set( PROJECT_LOG_DIR ${PROJECT_PARENT_DIR}/logs/)
+set( EXTRA_LIBS ${EXTRA_LIBS} ${XB_LIBNAME})
+
+
+
+
+# Undo bad decisions
+IF( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+ MESSAGE( "--- Can't build 64 bit environment with a 32 bit compiler" )
+ MESSAGE( "--- XB_LARGEFILE_SUPPORT set to OFF" )
+ set( XB_LARGEFILE_SUPPORT OFF CACHE BOOL "Use 64 bit large file support?" FORCE )
+ENDIF ( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+
+IF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+ MESSAGE( "--- At lease one file format is required. Defaulting to Version 4" )
+ set( XB_DBF4_SUPPORT ON CACHE BOOL "Compile DBase File Format Version 4 support" FORCE )
+ENDIF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+
+IF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for DBF V4 Memo files. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for locking functions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+ MESSAGE( "--- Expression required for indices. Setting to ON" )
+ set( XB_EXPRESSION_SUPPORT ON CACHE BOOL "Compile Expression support into library" FORCE )
+ENDIF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_FUNCTION_SUPPORT ON CACHE BOOL "Compile XBase Function support into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+
+# Build configuration header file
+configure_file (
+ "${PROJECT_SOURCE_DIR}/include/xbconfig.h.in"
+ "${PROJECT_BINARY_DIR}/include/xbconfig.h"
+)
+
+# Microsoft Windows settings
+IF( WIN32 )
+# add_definitions( /D_CRT_SECURE_NO_WARNINGS)
+ add_definitions( /EHsc )
+ENDIF( WIN32 )
+
+
+# set up include directories
+include_directories( "${PROJECT_BINARY_DIR}/include" )
+include_directories( "${PROJECT_SOURCE_DIR}/include" )
+
+#build the library
+IF ( BUILD_SHARED_LIBS )
+ set( LIB_TYPE SHARED )
+ELSE( BUILD_SHARED_LIBS )
+ set( LIB_TYPE STATIC )
+ENDIF( BUILD_SHARED_LIBS )
+MESSAGE( "--- Lib type " ${LIB_TYPE} )
+
+
+
+set (SOURCES ${PROJECT_SOURCE_DIR}/core/xbstring.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbssv.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdate.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbtblmgr.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbxbase.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfile.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdbf.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfields.cpp
+ ${PROJECT_SOURCE_DIR}/core/xblog.cpp)
+
+IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo.cpp )
+ENDIF( XB_MEMO_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf3.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo3.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf4.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo4.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfuncs.cpp )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexpnode.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexp.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbuda.cpp )
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbbcd.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixbase.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbtag.cpp )
+ENDIF( XB_INDEX_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixndx.cpp )
+ENDIF( XB_NDX_SUPPORT )
+
+
+IF( XB_MDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixmdx.cpp )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbsql.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbinsert.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrtbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrpix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrptbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbset.cpp )
+ENDIF( XB_SQL_SUPPORT )
+
+
+IF( XB_FILTER_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfilter.cpp )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+
+include( GenerateExportHeader )
+#add_library( xbase ${LIB_TYPE} ${SOURCES} )
+add_library( ${XB_LIBNAME} ${LIB_TYPE} ${SOURCES} )
+#add_library( ${CMAKE_PROJECT_NAME} ${LIB_TYPE} ${SOURCES} )
+
+
+IF( WIN32 )
+MESSAGE( "--- Generating Windows Library Headers" )
+
+#GENERATE_EXPORT_HEADER( xbase
+# BASE_NAME xbase
+
+GENERATE_EXPORT_HEADER( ${XB_LIBNAME}
+ BASE_NAME ${XB_LIBNAME}
+ EXPORT_MACRO_NAME xbase_EXPORT
+ EXPORT_FILE_NAME xbase_Export.h
+ STATIC_DEFINE xbase_BUILT_AS_STATIC
+)
+ENDIF( WIN32 )
+
+
+#build test programs
+enable_testing()
+
+add_executable( xb_test_string ${PROJECT_SOURCE_DIR}/tests/xb_test_string.cpp )
+target_link_libraries( xb_test_string ${EXTRA_LIBS})
+add_test( NAME xbString COMMAND xb_test_string QUIET )
+
+add_executable( xb_test_date ${PROJECT_SOURCE_DIR}/tests/xb_test_date.cpp )
+target_link_libraries( xb_test_date ${EXTRA_LIBS})
+add_test( NAME xbDate COMMAND xb_test_date QUIET )
+
+add_executable( xb_test_tblmgr ${PROJECT_SOURCE_DIR}/tests/xb_test_tblmgr.cpp )
+target_link_libraries( xb_test_tblmgr ${EXTRA_LIBS})
+add_test( NAME xbTblMgr COMMAND xb_test_tblmgr QUIET )
+
+add_executable( xb_test_xbase ${PROJECT_SOURCE_DIR}/tests/xb_test_xbase.cpp )
+target_link_libraries( xb_test_xbase ${EXTRA_LIBS})
+add_test( NAME xbXBase COMMAND xb_test_xbase QUIET )
+
+add_executable( xb_test_file ${PROJECT_SOURCE_DIR}/tests/xb_test_file.cpp )
+target_link_libraries( xb_test_file ${EXTRA_LIBS})
+add_test( NAME xbFile COMMAND xb_test_file QUIET )
+
+add_executable( xb_test_log ${PROJECT_SOURCE_DIR}/tests/xb_test_log.cpp )
+target_link_libraries( xb_test_log ${EXTRA_LIBS})
+add_test( NAME xbLog COMMAND xb_test_log QUIET )
+
+IF( XB_LINKLIST_SUPPORT )
+add_executable( xb_test_linklist ${PROJECT_SOURCE_DIR}/tests/xb_test_linklist.cpp )
+target_link_libraries( xb_test_linklist ${EXTRA_LIBS})
+add_test( NAME xbLinkList COMMAND xb_test_linklist QUIET )
+ENDIF( XB_LINKLIST_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+add_executable( xb_test_dbf_v3_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v3_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3NoMemos COMMAND xb_test_dbf_v3_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v3_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_memos.cpp )
+target_link_libraries( xb_test_dbf_v3_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3Memos COMMAND xb_test_dbf_v3_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+add_executable( xb_test_dbf_v4_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v4_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4NoMemos COMMAND xb_test_dbf_v4_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v4_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_memos.cpp )
+target_link_libraries( xb_test_dbf_v4_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4Memos COMMAND xb_test_dbf_v4_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+add_executable( xb_test_funcs ${PROJECT_SOURCE_DIR}/tests/xb_test_funcs.cpp )
+target_link_libraries( xb_test_funcs ${EXTRA_LIBS})
+add_test( NAME xbFunctions COMMAND xb_test_funcs QUIET )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+add_executable( xb_test_ndx ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx.cpp )
+target_link_libraries( xb_test_ndx ${EXTRA_LIBS})
+add_test( NAME xbIxNdx COMMAND xb_test_ndx QUIET )
+add_executable( xb_test_ndx2 ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx2.cpp )
+target_link_libraries( xb_test_ndx2 ${EXTRA_LIBS})
+add_test( NAME xbIxNdx2 COMMAND xb_test_ndx2 QUIET )
+ENDIF( XB_NDX_SUPPORT )
+
+IF( XB_MDX_SUPPORT )
+add_executable( xb_test_mdx ${PROJECT_SOURCE_DIR}/tests/xb_test_mdx.cpp )
+target_link_libraries( xb_test_mdx ${EXTRA_LIBS})
+add_test( NAME xbIxMdx COMMAND xb_test_mdx QUIET )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+add_executable( xb_test_bcd ${PROJECT_SOURCE_DIR}/tests/xb_test_bcd.cpp )
+target_link_libraries( xb_test_bcd ${EXTRA_LIBS})
+add_test( NAME xbBcd COMMAND xb_test_bcd QUIET )
+ENDIF( XB_INDEX_SUPPORT )
+
+
+IF( XB_EXPRESSION_SUPPORT )
+
+add_executable( xb_test_expnode ${PROJECT_SOURCE_DIR}/tests/xb_test_expnode.cpp )
+target_link_libraries( xb_test_expnode ${EXTRA_LIBS})
+add_test( NAME xbExpNode COMMAND xb_test_expnode QUIET )
+
+
+add_executable( xb_test_expression ${PROJECT_SOURCE_DIR}/tests/xb_test_expression.cpp )
+target_link_libraries( xb_test_expression ${EXTRA_LIBS})
+add_test( NAME xbExpressions COMMAND xb_test_expression QUIET )
+
+add_executable( xb_test_uda ${PROJECT_SOURCE_DIR}/tests/xb_test_uda.cpp )
+target_link_libraries( xb_test_uda ${EXTRA_LIBS})
+add_test( NAME xbUda COMMAND xb_test_uda QUIET )
+
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+add_executable( xb_test_sql ${PROJECT_SOURCE_DIR}/tests/xb_test_sql.cpp )
+target_link_libraries( xb_test_sql ${EXTRA_LIBS})
+add_test( NAME xbSql COMMAND xb_test_sql QUIET )
+ENDIF( XB_SQL_SUPPORT )
+
+IF( XB_FILTER_SUPPORT )
+add_executable( xb_test_filter ${PROJECT_SOURCE_DIR}/tests/xb_test_filter.cpp )
+target_link_libraries( xb_test_filter ${EXTRA_LIBS})
+add_test( NAME xbFilter COMMAND xb_test_filter QUIET )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+IF( XB_LOCKING_SUPPORT )
+add_executable( xb_test_lock ${PROJECT_SOURCE_DIR}/tests/xb_test_lock.cpp )
+target_link_libraries( xb_test_lock ${EXTRA_LIBS})
+add_test( NAME xbLock COMMAND xb_test_lock QUIET )
+IF( HAVE_CREATEPROCESSW_F )
+add_executable( xb_test_lock2 ${PROJECT_SOURCE_DIR}/tests/xb_test_lock2.cpp )
+target_link_libraries( xb_test_lock2 ${EXTRA_LIBS})
+ENDIF( HAVE_CREATEPROCESSW_F )
+ENDIF( XB_LOCKING_SUPPORT )
+
+#build example programs
+IF( XB_EXAMPLES_SUPPORT )
+ add_executable( xb_ex_string ${PROJECT_SOURCE_DIR}/examples/xb_ex_string.cpp )
+ target_link_libraries( xb_ex_string ${EXTRA_LIBS})
+
+ add_executable( xb_ex_date ${PROJECT_SOURCE_DIR}/examples/xb_ex_date.cpp )
+ target_link_libraries( xb_ex_date ${EXTRA_LIBS})
+
+ IF( XB_DBF3_SUPPORT )
+ add_executable( xb_ex_v3_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_create_dbf.cpp )
+ target_link_libraries( xb_ex_v3_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v3_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v3_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF3_SUPPORT )
+
+ IF( XB_DBF4_SUPPORT )
+ add_executable( xb_ex_v4_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_create_dbf.cpp )
+ target_link_libraries( xb_ex_v4_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v4_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v4_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF4_SUPPORT )
+
+ENDIF( XB_EXAMPLES_SUPPORT )
+
+#build utility programs
+IF( XB_UTILS_SUPPORT )
+
+ add_executable( xb_cfg_check ${PROJECT_SOURCE_DIR}/utils/xb_cfg_check.cpp )
+ target_link_libraries( xb_cfg_check ${EXTRA_LIBS})
+
+ add_executable( xb_copydbf ${PROJECT_SOURCE_DIR}/utils/xb_copydbf.cpp )
+ target_link_libraries( xb_copydbf ${EXTRA_LIBS})
+
+ add_executable( xb_dbfutil ${PROJECT_SOURCE_DIR}/utils/xb_dbfutil.cpp )
+ target_link_libraries( xb_dbfutil ${EXTRA_LIBS})
+
+ add_executable( xb_deletall ${PROJECT_SOURCE_DIR}/utils/xb_deletall.cpp )
+ target_link_libraries( xb_deletall ${EXTRA_LIBS})
+
+ add_executable( xb_dumpdbt ${PROJECT_SOURCE_DIR}/utils/xb_dumpdbt.cpp )
+ target_link_libraries( xb_dumpdbt ${EXTRA_LIBS})
+
+ add_executable( xb_dumphdr ${PROJECT_SOURCE_DIR}/utils/xb_dumphdr.cpp )
+ target_link_libraries( xb_dumphdr ${EXTRA_LIBS})
+
+ add_executable( xb_dumprecs ${PROJECT_SOURCE_DIR}/utils/xb_dumprecs.cpp )
+ target_link_libraries( xb_dumprecs ${EXTRA_LIBS})
+
+
+ add_executable( xb_tblinfo ${PROJECT_SOURCE_DIR}/utils/xb_tblinfo.cpp )
+ target_link_libraries( xb_tblinfo ${EXTRA_LIBS})
+
+ IF( XB_SQL_SUPPORT )
+ add_executable( xb_execsql ${PROJECT_SOURCE_DIR}/utils/xb_execsql.cpp )
+ target_link_libraries( xb_execsql ${EXTRA_LIBS})
+ ENDIF( XB_SQL_SUPPORT )
+
+ add_executable( xb_pack ${PROJECT_SOURCE_DIR}/utils/xb_pack.cpp )
+ target_link_libraries( xb_pack ${EXTRA_LIBS})
+
+ add_executable( xb_undelall ${PROJECT_SOURCE_DIR}/utils/xb_undelall.cpp )
+ target_link_libraries( xb_undelall ${EXTRA_LIBS})
+
+ add_executable( xb_zap ${PROJECT_SOURCE_DIR}/utils/xb_zap.cpp )
+ target_link_libraries( xb_zap ${EXTRA_LIBS})
+
+
+ install (TARGETS xb_cfg_check DESTINATION bin)
+ install (TARGETS xb_copydbf DESTINATION bin)
+ install (TARGETS xb_dbfutil DESTINATION bin)
+ install (TARGETS xb_deletall DESTINATION bin)
+ install (TARGETS xb_dumpdbt DESTINATION bin)
+ install (TARGETS xb_dumphdr DESTINATION bin)
+ install (TARGETS xb_dumprecs DESTINATION bin)
+ install (TARGETS xb_pack DESTINATION bin)
+ install (TARGETS xb_undelall DESTINATION bin)
+ install (TARGETS xb_zap DESTINATION bin)
+ install (TARGETS xb_execsql DESTINATION bin)
+
+ENDIF( XB_UTILS_SUPPORT )
+
+install (FILES include/xbconfig.h
+ ${PROJECT_SOURCE_DIR}/include/xbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbbcd.h
+ ${PROJECT_SOURCE_DIR}/include/xbdate.h
+ ${PROJECT_SOURCE_DIR}/include/xbdbf.h
+ ${PROJECT_SOURCE_DIR}/include/xbexp.h
+ ${PROJECT_SOURCE_DIR}/include/xbexpnode.h
+ ${PROJECT_SOURCE_DIR}/include/xbfile.h
+ ${PROJECT_SOURCE_DIR}/include/xbindex.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklst.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklstord.h
+ ${PROJECT_SOURCE_DIR}/include/xblnknod.h
+ ${PROJECT_SOURCE_DIR}/include/xblog.h
+ ${PROJECT_SOURCE_DIR}/include/xbmemo.h
+ ${PROJECT_SOURCE_DIR}/include/xbretcod.h
+ ${PROJECT_SOURCE_DIR}/include/xbsql.h
+ ${PROJECT_SOURCE_DIR}/include/xbssv.h
+ ${PROJECT_SOURCE_DIR}/include/xbstring.h
+ ${PROJECT_SOURCE_DIR}/include/xbtblmgr.h
+ ${PROJECT_SOURCE_DIR}/include/xbtypes.h
+ ${PROJECT_SOURCE_DIR}/include/xbxbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbuda.h
+ ${PROJECT_SOURCE_DIR}/include/xbtag.h
+ ${PROJECT_SOURCE_DIR}/include/xbfilter.h
+ DESTINATION include/${CMAKE_PROJECT_NAME})
+
+
+SET_TARGET_PROPERTIES( ${XB_LIBNAME} PROPERTIES VERSION 4.0.0 SOVERSION 0 )
+
+IF( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib64/${CMAKE_PROJECT_NAME})
+ELSE( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib/${CMAKE_PROJECT_NAME})
+ENDIF( EXISTS /usr/local/lib64 )
+
+
diff --git a/build/mac64/CMakeLists.txt b/build/mac64/CMakeLists.txt
new file mode 100755
index 0000000..0a192b8
--- /dev/null
+++ b/build/mac64/CMakeLists.txt
@@ -0,0 +1,706 @@
+cmake_minimum_required(VERSION 3.0)
+
+project (xbase64)
+set( xbase_VERSION_MAJOR 4 )
+set( xbase_VERSION_MINOR 0 )
+set( xbase_VERSION_PATCH 0 )
+
+MESSAGE( "--- Xbase build for: " ${CMAKE_SYSTEM_NAME} )
+MESSAGE( "--- Compiler: " ${CMAKE_CXX_COMPILER_ID} )
+MESSAGE( "--- Project Name: " ${CMAKE_PROJECT_NAME} )
+
+#Set compiler options
+
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ MESSAGE( "Setting GNU compiler options" )
+ add_compile_options( -Wall -Wsign-conversion )
+# add_compile_options( -Wall -Wconversion -Wsign-conversion )
+ SET( VERBOSE 1 )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+
+IF( BORLAND )
+ MESSAGE ("BORLAND COMPILER" )
+ #set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w-8022" )
+ add_compile_options( -w-8022 )
+ENDIF( BORLAND )
+
+
+MESSAGE( "--- Checking integer sizes" )
+INCLUDE(CheckTypeSize)
+CHECK_TYPE_SIZE( "short int" SHORT_INT )
+CHECK_TYPE_SIZE( int INT )
+CHECK_TYPE_SIZE( __int32 __INT32 )
+CHECK_TYPE_SIZE( int32_t INT32_T )
+CHECK_TYPE_SIZE( long LONG_INT )
+CHECK_TYPE_SIZE( __int64 __INT64 )
+CHECK_TYPE_SIZE( int64_t INT64_T )
+CHECK_TYPE_SIZE( "long long" LONG_LONG )
+CHECK_TYPE_SIZE( u_int64_t U_INT64_T )
+CHECK_TYPE_SIZE( uint64_t UINT64_T )
+CHECK_TYPE_SIZE( "unsigned __int64" UNSIGNED__INT64 )
+CHECK_TYPE_SIZE( "unsigned long long" UNSIGNED_LONG_LONG )
+
+CHECK_TYPE_SIZE( "double" DOUBLE )
+MESSAGE( "--- Double size = " ${DOUBLE} )
+
+
+#determine how 16 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+ SET( xbInt16 "short int" )
+ SET( xbUInt16 "unsigned short int" )
+ SET( iSize ${SHORT_INT} )
+ MESSAGE( "--- xbInt16 = [short int]" )
+ MESSAGE( "--- xbUInt16 = [unsigned short int]" )
+
+ENDIF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+IF( NOT ${iSize} EQUAL 2 )
+ MESSAGE( "FATAL_ERROR Could not detect 16 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 2 )
+
+#determine how 32 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_INT AND ${INT} EQUAL 4 )
+ SET( xbInt32 int )
+ SET( xbUInt32 "unsigned int" )
+ SET( iSize ${INT} )
+ MESSAGE( "--- xbInt32 = [int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned int]" )
+ENDIF( HAVE_INT AND ${INT} EQUAL 4 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+ MESSAGE( __int untested if block - see CMakeLists.txt)
+ SET( xbInt32 __int32 )
+ SET( xbUInt32 "unsigned __int32" )
+ SET( iSize ${__INT} )
+ MESSAGE( "--- xbInt32 = [__int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned __int]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+ SET( xbInt32 int32_t )
+ SET( xbUInt32 "u_int32_t" )
+ SET( iSize ${INT32_T} )
+ MESSAGE( "--- xbInt32 = [int32_t]" )
+ MESSAGE( "--- xbUInt32 = [u_int32_t]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+
+IF( NOT ${iSize} EQUAL 4 )
+ MESSAGE( "FATAL_ERROR Could not detect 32 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 4 )
+
+#determine how 64 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE___INT64 )
+ SET( xbInt64 __int64 )
+ SET( iSize ${__INT64} )
+ MESSAGE( "--- xbInt64 = [__int64]" )
+ENDIF( HAVE___INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+ SET( xbInt64 int64_t )
+ SET( iSize ${INT64_T} )
+ MESSAGE( "--- xbInt64 = [int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+ SET( xbInt64 "long long" )
+ SET( iSize ${LONG_LONG} )
+ MESSAGE( "--- xbInt64 = [long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#determine how 64 bit unsigned integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_UNSIGNED__INT64 )
+ SET( xbUInt64 "unsigned __int64" )
+ SET( iSize ${UNSIGNED__INT64} )
+ MESSAGE( "--- xbUInt64 = [unsigned __int64]" )
+ENDIF( HAVE_UNSIGNED__INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+ SET( xbUInt64 "uint64_t" )
+ SET( iSize ${UINT64_T} )
+ MESSAGE( "--- xbUInt64 = [uint64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+ SET( xbUInt64 u_int64_t )
+ SET( iSize ${U_INT64_T} )
+ MESSAGE( "--- xbUInt64 = [u_int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+ SET( xbUInt64 "unsigned long long" )
+ SET( iSize ${UNSIGNED_LONG_LONG} )
+ MESSAGE( "--- xbUInt64 = [unsigned long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit unsigned integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#Library options
+option( BUILD_SHARED_LIBS "Build shared libraries?" ON)
+option( XB_DEBUG_SUPPORT "Compile debug logic into library?" ON)
+option( XB_UTILS_SUPPORT "Compile utility programs?" ON)
+option( XB_EXAMPLES_SUPPORT "Compile example programs?" ON)
+option( XB_MEMO_SUPPORT "Compile memo field support into library?" ON)
+option( XB_LOGGING_SUPPORT "Compile message logging support into library" ON)
+option( XB_DBF3_SUPPORT "Compile DBase File Format Version 3 support" ON)
+option( XB_DBF4_SUPPORT "Compile DBase File Format Version 4 support" ON)
+option( XB_LINKLIST_SUPPORT "Compile Link List routines into library" ON)
+option( XB_LOCKING_SUPPORT "Compile Multi User Locking support into library" ON)
+option( XB_FUNCTION_SUPPORT "Compile XBase Function support into library" ON)
+option( XB_EXPRESSION_SUPPORT "Compile Expression support into library" ON)
+option( XB_NDX_SUPPORT "Compile NDX Index support into library" ON)
+option( XB_MDX_SUPPORT "Compile MDX Index support into library" ON)
+option( XB_SQL_SUPPORT "Compile SQL support into library" ON)
+option( XB_NDXINF_SUPPORT "Compile NDX INF file support into library" ON)
+option( XB_FILTER_SUPPORT "Compile Filter support into library" ON)
+
+
+Message( "--- BUILD_SHARED_LIBS " ${BUILD_SHARED_LIBS})
+Message( "--- XB_MEMO_SUPPORT " ${XB_MEMO_SUPPORT})
+Message( "--- XB_DEBUG_SUPPORT " ${XB_DEBUG_SUPPORT})
+Message( "--- XB_UTILS_SUPPORT " ${XB_UTILS_SUPPORT})
+Message( "--- XB_EXAMPLES_SUPPORT " ${XB_EXAMPLES_SUPPORT})
+Message( "--- XB_LOGGING_SUPPORT " ${XB_LOGGING_SUPPORT})
+Message( "--- XB_DBF3_SUPPORT " ${XB_DBF3_SUPPORT})
+Message( "--- XB_DBF4_SUPPORT " ${XB_DBF4_SUPPORT})
+Message( "--- XB_LINKLIST_SUPPORT " ${XB_LINKLIST_SUPPORT})
+Message( "--- XB_LOCKING_SUPPORT " ${XB_LOCKING_SUPPORT})
+Message( "--- XB_FUNCTION_SUPPORT " ${XB_FUNCTION_SUPPORT})
+Message( "--- XB_EXPRESSION_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_MDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_SQL_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDXINF_SUPPORT " ${XB_NDXINF_SUPPORT})
+Message( "--- XB_FILTER_SUPPORT " ${XB_FILTER_SUPPORT})
+
+IF( XB_DEBUG_SUPPORT )
+ Message( "--- Adding debug support" )
+ set( CMAKE_BUILD_TYPE Debug )
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ add_compile_options( -Og )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+ENDIF( XB_DEBUG_SUPPORT )
+
+IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 64 bit compiler detected" )
+ set( XB_PLATFORM "x64" )
+ set( XB_PLATFORM_64 1 )
+ set( XB_LIBNAME "xbase64" )
+
+ELSE( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 32 bit compiler detected" )
+ set( XB_PLATFORM "x86" )
+ set( XB_PLATFORM_32 1 )
+ set( XB_LIBNAME "xbase32" )
+
+ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+
+
+#Check for the existence of various header files
+INCLUDE (CheckIncludeFiles)
+CHECK_INCLUDE_FILES (ctype.h HAVE_CTYPE_H)
+CHECK_INCLUDE_FILES (dirent.h HAVE_DIRENT_H)
+CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H)
+CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILES (stdarg.h HAVE_STDARG_H)
+CHECK_INCLUDE_FILES (stdargs.h HAVE_STDARGS_H)
+CHECK_INCLUDE_FILES (string.h HAVE_STRING_H)
+CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H)
+CHECK_INCLUDE_FILES (sys/stat.h HAVE_STAT_H)
+CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
+CHECK_INCLUDE_FILES (varargs.h HAVE_VARARGS_H)
+CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H)
+
+#Check for the existence of various function calls
+INCLUDE( CheckFunctionExists )
+CHECK_FUNCTION_EXISTS(_close HAVE__CLOSE_F)
+CHECK_FUNCTION_EXISTS(fcntl HAVE_FCNTL_F)
+CHECK_FUNCTION_EXISTS(_fdopen HAVE__FDOPEN_F)
+CHECK_FUNCTION_EXISTS(fopen_s HAVE_FOPEN_S_F)
+CHECK_FUNCTION_EXISTS(_fsopen HAVE__FSOPEN_F)
+CHECK_FUNCTION_EXISTS(_fileno HAVE__FILENO_F)
+CHECK_FUNCTION_EXISTS(fork HAVE_FORK_F)
+CHECK_FUNCTION_EXISTS(_fseeki64 HAVE__FSEEKI64_F)
+CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO_F)
+CHECK_FUNCTION_EXISTS(ftruncate HAVE_FTRUNCATE_F)
+CHECK_FUNCTION_EXISTS(_localtime64_s HAVE__LOCALTIME64_S_F)
+CHECK_FUNCTION_EXISTS(LockFile HAVE_LOCKFILE_F)
+CHECK_FUNCTION_EXISTS(locking HAVE_LOCKING_F)
+CHECK_FUNCTION_EXISTS(_locking HAVE__LOCKING_F)
+CHECK_FUNCTION_EXISTS(_open HAVE__OPEN_F)
+CHECK_FUNCTION_EXISTS(SetEndOfFile HAVE_SETENDOFFILE_F)
+
+CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF_F)
+CHECK_FUNCTION_EXISTS(_vsnprintf_s HAVE__VSNPRINTF_S_F)
+
+
+IF( WIN32 )
+
+# Use CHECK_SYMBOL_EXISTS for the Win32API instead of CHECK_FUNCTION_EXISTS
+# Can't detect inline functions in headers
+# Can't detect due to mismatch of calling conventions
+# Can't detect mangled names
+
+INCLUDE( CheckSymbolExists )
+CHECK_SYMBOL_EXISTS(CreateProcessW Windows.h HAVE_CREATEPROCESSW_F )
+CHECK_SYMBOL_EXISTS(vsprintf_s stdio.h HAVE_VSPRINTF_S_F )
+
+
+
+ENDIF ( WIN32 )
+
+# IF( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+# # ----fix me----
+# # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5 SetEndOfFile
+# Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_H" )
+# ENDIF ( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+
+IF( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+ # ----fix me----
+ # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5, or Windows VS 32 bit SetEndOfFile
+ Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_F" )
+ENDIF ( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+
+IF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+ Set( XB_INDEX_SUPPORT "1" )
+ENDIF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+
+
+# Set directories
+# PROJECT_PARENT_DIR is two nodes higher
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_BINARY_DIR} DIRECTORY )
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_PARENT_DIR} DIRECTORY )
+
+# MESSAGE( "PROJECT_PARENT_DIR = " ${PROJECT_PARENT_DIR} )
+# MESSAGE( "PROJECT_BINARY_DIR = " ${PROJECT_BINARY_DIR} )
+
+
+set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/${XB_PLATFORM})
+set( LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib/${XB_PLATFORM})
+set( PROJECT_SOURCE_DIR ${PROJECT_PARENT_DIR}/src)
+set( PROJECT_DATA_DIR ${PROJECT_PARENT_DIR}/data/)
+set( PROJECT_LOG_DIR ${PROJECT_PARENT_DIR}/logs/)
+set( EXTRA_LIBS ${EXTRA_LIBS} ${XB_LIBNAME})
+
+
+
+
+# Undo bad decisions
+IF( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+ MESSAGE( "--- Can't build 64 bit environment with a 32 bit compiler" )
+ MESSAGE( "--- XB_LARGEFILE_SUPPORT set to OFF" )
+ set( XB_LARGEFILE_SUPPORT OFF CACHE BOOL "Use 64 bit large file support?" FORCE )
+ENDIF ( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+
+IF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+ MESSAGE( "--- At lease one file format is required. Defaulting to Version 4" )
+ set( XB_DBF4_SUPPORT ON CACHE BOOL "Compile DBase File Format Version 4 support" FORCE )
+ENDIF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+
+IF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for DBF V4 Memo files. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for locking functions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+ MESSAGE( "--- Expression required for indices. Setting to ON" )
+ set( XB_EXPRESSION_SUPPORT ON CACHE BOOL "Compile Expression support into library" FORCE )
+ENDIF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_FUNCTION_SUPPORT ON CACHE BOOL "Compile XBase Function support into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+
+# Build configuration header file
+configure_file (
+ "${PROJECT_SOURCE_DIR}/include/xbconfig.h.in"
+ "${PROJECT_BINARY_DIR}/include/xbconfig.h"
+)
+
+# Microsoft Windows settings
+IF( WIN32 )
+# add_definitions( /D_CRT_SECURE_NO_WARNINGS)
+ add_definitions( /EHsc )
+ENDIF( WIN32 )
+
+
+# set up include directories
+include_directories( "${PROJECT_BINARY_DIR}/include" )
+include_directories( "${PROJECT_SOURCE_DIR}/include" )
+
+#build the library
+IF ( BUILD_SHARED_LIBS )
+ set( LIB_TYPE SHARED )
+ELSE( BUILD_SHARED_LIBS )
+ set( LIB_TYPE STATIC )
+ENDIF( BUILD_SHARED_LIBS )
+MESSAGE( "--- Lib type " ${LIB_TYPE} )
+
+
+
+set (SOURCES ${PROJECT_SOURCE_DIR}/core/xbstring.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbssv.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdate.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbtblmgr.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbxbase.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfile.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdbf.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfields.cpp
+ ${PROJECT_SOURCE_DIR}/core/xblog.cpp)
+
+IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo.cpp )
+ENDIF( XB_MEMO_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf3.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo3.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf4.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo4.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfuncs.cpp )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexpnode.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexp.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbuda.cpp )
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbbcd.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixbase.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbtag.cpp )
+ENDIF( XB_INDEX_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixndx.cpp )
+ENDIF( XB_NDX_SUPPORT )
+
+
+IF( XB_MDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixmdx.cpp )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbsql.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbinsert.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrtbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrpix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrptbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbset.cpp )
+ENDIF( XB_SQL_SUPPORT )
+
+
+IF( XB_FILTER_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfilter.cpp )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+
+include( GenerateExportHeader )
+#add_library( xbase ${LIB_TYPE} ${SOURCES} )
+add_library( ${XB_LIBNAME} ${LIB_TYPE} ${SOURCES} )
+#add_library( ${CMAKE_PROJECT_NAME} ${LIB_TYPE} ${SOURCES} )
+
+
+IF( WIN32 )
+MESSAGE( "--- Generating Windows Library Headers" )
+
+#GENERATE_EXPORT_HEADER( xbase
+# BASE_NAME xbase
+
+GENERATE_EXPORT_HEADER( ${XB_LIBNAME}
+ BASE_NAME ${XB_LIBNAME}
+ EXPORT_MACRO_NAME xbase_EXPORT
+ EXPORT_FILE_NAME xbase_Export.h
+ STATIC_DEFINE xbase_BUILT_AS_STATIC
+)
+ENDIF( WIN32 )
+
+
+#build test programs
+enable_testing()
+
+add_executable( xb_test_string ${PROJECT_SOURCE_DIR}/tests/xb_test_string.cpp )
+target_link_libraries( xb_test_string ${EXTRA_LIBS})
+add_test( NAME xbString COMMAND xb_test_string QUIET )
+
+add_executable( xb_test_date ${PROJECT_SOURCE_DIR}/tests/xb_test_date.cpp )
+target_link_libraries( xb_test_date ${EXTRA_LIBS})
+add_test( NAME xbDate COMMAND xb_test_date QUIET )
+
+add_executable( xb_test_tblmgr ${PROJECT_SOURCE_DIR}/tests/xb_test_tblmgr.cpp )
+target_link_libraries( xb_test_tblmgr ${EXTRA_LIBS})
+add_test( NAME xbTblMgr COMMAND xb_test_tblmgr QUIET )
+
+add_executable( xb_test_xbase ${PROJECT_SOURCE_DIR}/tests/xb_test_xbase.cpp )
+target_link_libraries( xb_test_xbase ${EXTRA_LIBS})
+add_test( NAME xbXBase COMMAND xb_test_xbase QUIET )
+
+add_executable( xb_test_file ${PROJECT_SOURCE_DIR}/tests/xb_test_file.cpp )
+target_link_libraries( xb_test_file ${EXTRA_LIBS})
+add_test( NAME xbFile COMMAND xb_test_file QUIET )
+
+add_executable( xb_test_log ${PROJECT_SOURCE_DIR}/tests/xb_test_log.cpp )
+target_link_libraries( xb_test_log ${EXTRA_LIBS})
+add_test( NAME xbLog COMMAND xb_test_log QUIET )
+
+IF( XB_LINKLIST_SUPPORT )
+add_executable( xb_test_linklist ${PROJECT_SOURCE_DIR}/tests/xb_test_linklist.cpp )
+target_link_libraries( xb_test_linklist ${EXTRA_LIBS})
+add_test( NAME xbLinkList COMMAND xb_test_linklist QUIET )
+ENDIF( XB_LINKLIST_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+add_executable( xb_test_dbf_v3_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v3_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3NoMemos COMMAND xb_test_dbf_v3_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v3_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_memos.cpp )
+target_link_libraries( xb_test_dbf_v3_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3Memos COMMAND xb_test_dbf_v3_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+add_executable( xb_test_dbf_v4_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v4_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4NoMemos COMMAND xb_test_dbf_v4_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v4_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_memos.cpp )
+target_link_libraries( xb_test_dbf_v4_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4Memos COMMAND xb_test_dbf_v4_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+add_executable( xb_test_funcs ${PROJECT_SOURCE_DIR}/tests/xb_test_funcs.cpp )
+target_link_libraries( xb_test_funcs ${EXTRA_LIBS})
+add_test( NAME xbFunctions COMMAND xb_test_funcs QUIET )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+add_executable( xb_test_ndx ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx.cpp )
+target_link_libraries( xb_test_ndx ${EXTRA_LIBS})
+add_test( NAME xbIxNdx COMMAND xb_test_ndx QUIET )
+add_executable( xb_test_ndx2 ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx2.cpp )
+target_link_libraries( xb_test_ndx2 ${EXTRA_LIBS})
+add_test( NAME xbIxNdx2 COMMAND xb_test_ndx2 QUIET )
+ENDIF( XB_NDX_SUPPORT )
+
+IF( XB_MDX_SUPPORT )
+add_executable( xb_test_mdx ${PROJECT_SOURCE_DIR}/tests/xb_test_mdx.cpp )
+target_link_libraries( xb_test_mdx ${EXTRA_LIBS})
+add_test( NAME xbIxMdx COMMAND xb_test_mdx QUIET )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+add_executable( xb_test_bcd ${PROJECT_SOURCE_DIR}/tests/xb_test_bcd.cpp )
+target_link_libraries( xb_test_bcd ${EXTRA_LIBS})
+add_test( NAME xbBcd COMMAND xb_test_bcd QUIET )
+ENDIF( XB_INDEX_SUPPORT )
+
+
+IF( XB_EXPRESSION_SUPPORT )
+
+add_executable( xb_test_expnode ${PROJECT_SOURCE_DIR}/tests/xb_test_expnode.cpp )
+target_link_libraries( xb_test_expnode ${EXTRA_LIBS})
+add_test( NAME xbExpNode COMMAND xb_test_expnode QUIET )
+
+
+add_executable( xb_test_expression ${PROJECT_SOURCE_DIR}/tests/xb_test_expression.cpp )
+target_link_libraries( xb_test_expression ${EXTRA_LIBS})
+add_test( NAME xbExpressions COMMAND xb_test_expression QUIET )
+
+add_executable( xb_test_uda ${PROJECT_SOURCE_DIR}/tests/xb_test_uda.cpp )
+target_link_libraries( xb_test_uda ${EXTRA_LIBS})
+add_test( NAME xbUda COMMAND xb_test_uda QUIET )
+
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+add_executable( xb_test_sql ${PROJECT_SOURCE_DIR}/tests/xb_test_sql.cpp )
+target_link_libraries( xb_test_sql ${EXTRA_LIBS})
+add_test( NAME xbSql COMMAND xb_test_sql QUIET )
+ENDIF( XB_SQL_SUPPORT )
+
+IF( XB_FILTER_SUPPORT )
+add_executable( xb_test_filter ${PROJECT_SOURCE_DIR}/tests/xb_test_filter.cpp )
+target_link_libraries( xb_test_filter ${EXTRA_LIBS})
+add_test( NAME xbFilter COMMAND xb_test_filter QUIET )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+IF( XB_LOCKING_SUPPORT )
+add_executable( xb_test_lock ${PROJECT_SOURCE_DIR}/tests/xb_test_lock.cpp )
+target_link_libraries( xb_test_lock ${EXTRA_LIBS})
+add_test( NAME xbLock COMMAND xb_test_lock QUIET )
+IF( HAVE_CREATEPROCESSW_F )
+add_executable( xb_test_lock2 ${PROJECT_SOURCE_DIR}/tests/xb_test_lock2.cpp )
+target_link_libraries( xb_test_lock2 ${EXTRA_LIBS})
+ENDIF( HAVE_CREATEPROCESSW_F )
+ENDIF( XB_LOCKING_SUPPORT )
+
+#build example programs
+IF( XB_EXAMPLES_SUPPORT )
+ add_executable( xb_ex_string ${PROJECT_SOURCE_DIR}/examples/xb_ex_string.cpp )
+ target_link_libraries( xb_ex_string ${EXTRA_LIBS})
+
+ add_executable( xb_ex_date ${PROJECT_SOURCE_DIR}/examples/xb_ex_date.cpp )
+ target_link_libraries( xb_ex_date ${EXTRA_LIBS})
+
+ IF( XB_DBF3_SUPPORT )
+ add_executable( xb_ex_v3_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_create_dbf.cpp )
+ target_link_libraries( xb_ex_v3_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v3_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v3_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF3_SUPPORT )
+
+ IF( XB_DBF4_SUPPORT )
+ add_executable( xb_ex_v4_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_create_dbf.cpp )
+ target_link_libraries( xb_ex_v4_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v4_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v4_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF4_SUPPORT )
+
+ENDIF( XB_EXAMPLES_SUPPORT )
+
+#build utility programs
+IF( XB_UTILS_SUPPORT )
+
+ add_executable( xb_cfg_check ${PROJECT_SOURCE_DIR}/utils/xb_cfg_check.cpp )
+ target_link_libraries( xb_cfg_check ${EXTRA_LIBS})
+
+ add_executable( xb_copydbf ${PROJECT_SOURCE_DIR}/utils/xb_copydbf.cpp )
+ target_link_libraries( xb_copydbf ${EXTRA_LIBS})
+
+ add_executable( xb_dbfutil ${PROJECT_SOURCE_DIR}/utils/xb_dbfutil.cpp )
+ target_link_libraries( xb_dbfutil ${EXTRA_LIBS})
+
+ add_executable( xb_deletall ${PROJECT_SOURCE_DIR}/utils/xb_deletall.cpp )
+ target_link_libraries( xb_deletall ${EXTRA_LIBS})
+
+ add_executable( xb_dumpdbt ${PROJECT_SOURCE_DIR}/utils/xb_dumpdbt.cpp )
+ target_link_libraries( xb_dumpdbt ${EXTRA_LIBS})
+
+ add_executable( xb_dumphdr ${PROJECT_SOURCE_DIR}/utils/xb_dumphdr.cpp )
+ target_link_libraries( xb_dumphdr ${EXTRA_LIBS})
+
+ add_executable( xb_dumprecs ${PROJECT_SOURCE_DIR}/utils/xb_dumprecs.cpp )
+ target_link_libraries( xb_dumprecs ${EXTRA_LIBS})
+
+
+ add_executable( xb_tblinfo ${PROJECT_SOURCE_DIR}/utils/xb_tblinfo.cpp )
+ target_link_libraries( xb_tblinfo ${EXTRA_LIBS})
+
+ IF( XB_SQL_SUPPORT )
+ add_executable( xb_execsql ${PROJECT_SOURCE_DIR}/utils/xb_execsql.cpp )
+ target_link_libraries( xb_execsql ${EXTRA_LIBS})
+ ENDIF( XB_SQL_SUPPORT )
+
+ add_executable( xb_pack ${PROJECT_SOURCE_DIR}/utils/xb_pack.cpp )
+ target_link_libraries( xb_pack ${EXTRA_LIBS})
+
+ add_executable( xb_undelall ${PROJECT_SOURCE_DIR}/utils/xb_undelall.cpp )
+ target_link_libraries( xb_undelall ${EXTRA_LIBS})
+
+ add_executable( xb_zap ${PROJECT_SOURCE_DIR}/utils/xb_zap.cpp )
+ target_link_libraries( xb_zap ${EXTRA_LIBS})
+
+
+ install (TARGETS xb_cfg_check DESTINATION bin)
+ install (TARGETS xb_copydbf DESTINATION bin)
+ install (TARGETS xb_dbfutil DESTINATION bin)
+ install (TARGETS xb_deletall DESTINATION bin)
+ install (TARGETS xb_dumpdbt DESTINATION bin)
+ install (TARGETS xb_dumphdr DESTINATION bin)
+ install (TARGETS xb_dumprecs DESTINATION bin)
+ install (TARGETS xb_pack DESTINATION bin)
+ install (TARGETS xb_undelall DESTINATION bin)
+ install (TARGETS xb_zap DESTINATION bin)
+ install (TARGETS xb_execsql DESTINATION bin)
+
+ENDIF( XB_UTILS_SUPPORT )
+
+install (FILES include/xbconfig.h
+ ${PROJECT_SOURCE_DIR}/include/xbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbbcd.h
+ ${PROJECT_SOURCE_DIR}/include/xbdate.h
+ ${PROJECT_SOURCE_DIR}/include/xbdbf.h
+ ${PROJECT_SOURCE_DIR}/include/xbexp.h
+ ${PROJECT_SOURCE_DIR}/include/xbexpnode.h
+ ${PROJECT_SOURCE_DIR}/include/xbfile.h
+ ${PROJECT_SOURCE_DIR}/include/xbindex.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklst.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklstord.h
+ ${PROJECT_SOURCE_DIR}/include/xblnknod.h
+ ${PROJECT_SOURCE_DIR}/include/xblog.h
+ ${PROJECT_SOURCE_DIR}/include/xbmemo.h
+ ${PROJECT_SOURCE_DIR}/include/xbretcod.h
+ ${PROJECT_SOURCE_DIR}/include/xbsql.h
+ ${PROJECT_SOURCE_DIR}/include/xbssv.h
+ ${PROJECT_SOURCE_DIR}/include/xbstring.h
+ ${PROJECT_SOURCE_DIR}/include/xbtblmgr.h
+ ${PROJECT_SOURCE_DIR}/include/xbtypes.h
+ ${PROJECT_SOURCE_DIR}/include/xbxbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbuda.h
+ ${PROJECT_SOURCE_DIR}/include/xbtag.h
+ ${PROJECT_SOURCE_DIR}/include/xbfilter.h
+ DESTINATION include/${CMAKE_PROJECT_NAME})
+
+
+SET_TARGET_PROPERTIES( ${XB_LIBNAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+#SET_TARGET_PROPERTIES( ${CMAKE_PROJECT_NAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+
+IF( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib64/${CMAKE_PROJECT_NAME})
+ELSE( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib/${CMAKE_PROJECT_NAME})
+ENDIF( EXISTS /usr/local/lib64 )
+
+
diff --git a/build/win32vs/BuildWin.bat b/build/win32vs/BuildWin.bat
new file mode 100755
index 0000000..421e5c8
--- /dev/null
+++ b/build/win32vs/BuildWin.bat
@@ -0,0 +1,8 @@
+rem Build using MS Visual Studio
+
+rem cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug .
+
+pause To build the Windows Visual Studio 32 bit version, execute this script from a Visual Studio 32 bit command window
+
+cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release .
+nmake \ No newline at end of file
diff --git a/build/win32vs/CMakeLists.txt b/build/win32vs/CMakeLists.txt
new file mode 100755
index 0000000..0a192b8
--- /dev/null
+++ b/build/win32vs/CMakeLists.txt
@@ -0,0 +1,706 @@
+cmake_minimum_required(VERSION 3.0)
+
+project (xbase64)
+set( xbase_VERSION_MAJOR 4 )
+set( xbase_VERSION_MINOR 0 )
+set( xbase_VERSION_PATCH 0 )
+
+MESSAGE( "--- Xbase build for: " ${CMAKE_SYSTEM_NAME} )
+MESSAGE( "--- Compiler: " ${CMAKE_CXX_COMPILER_ID} )
+MESSAGE( "--- Project Name: " ${CMAKE_PROJECT_NAME} )
+
+#Set compiler options
+
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ MESSAGE( "Setting GNU compiler options" )
+ add_compile_options( -Wall -Wsign-conversion )
+# add_compile_options( -Wall -Wconversion -Wsign-conversion )
+ SET( VERBOSE 1 )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+
+IF( BORLAND )
+ MESSAGE ("BORLAND COMPILER" )
+ #set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w-8022" )
+ add_compile_options( -w-8022 )
+ENDIF( BORLAND )
+
+
+MESSAGE( "--- Checking integer sizes" )
+INCLUDE(CheckTypeSize)
+CHECK_TYPE_SIZE( "short int" SHORT_INT )
+CHECK_TYPE_SIZE( int INT )
+CHECK_TYPE_SIZE( __int32 __INT32 )
+CHECK_TYPE_SIZE( int32_t INT32_T )
+CHECK_TYPE_SIZE( long LONG_INT )
+CHECK_TYPE_SIZE( __int64 __INT64 )
+CHECK_TYPE_SIZE( int64_t INT64_T )
+CHECK_TYPE_SIZE( "long long" LONG_LONG )
+CHECK_TYPE_SIZE( u_int64_t U_INT64_T )
+CHECK_TYPE_SIZE( uint64_t UINT64_T )
+CHECK_TYPE_SIZE( "unsigned __int64" UNSIGNED__INT64 )
+CHECK_TYPE_SIZE( "unsigned long long" UNSIGNED_LONG_LONG )
+
+CHECK_TYPE_SIZE( "double" DOUBLE )
+MESSAGE( "--- Double size = " ${DOUBLE} )
+
+
+#determine how 16 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+ SET( xbInt16 "short int" )
+ SET( xbUInt16 "unsigned short int" )
+ SET( iSize ${SHORT_INT} )
+ MESSAGE( "--- xbInt16 = [short int]" )
+ MESSAGE( "--- xbUInt16 = [unsigned short int]" )
+
+ENDIF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+IF( NOT ${iSize} EQUAL 2 )
+ MESSAGE( "FATAL_ERROR Could not detect 16 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 2 )
+
+#determine how 32 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_INT AND ${INT} EQUAL 4 )
+ SET( xbInt32 int )
+ SET( xbUInt32 "unsigned int" )
+ SET( iSize ${INT} )
+ MESSAGE( "--- xbInt32 = [int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned int]" )
+ENDIF( HAVE_INT AND ${INT} EQUAL 4 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+ MESSAGE( __int untested if block - see CMakeLists.txt)
+ SET( xbInt32 __int32 )
+ SET( xbUInt32 "unsigned __int32" )
+ SET( iSize ${__INT} )
+ MESSAGE( "--- xbInt32 = [__int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned __int]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+ SET( xbInt32 int32_t )
+ SET( xbUInt32 "u_int32_t" )
+ SET( iSize ${INT32_T} )
+ MESSAGE( "--- xbInt32 = [int32_t]" )
+ MESSAGE( "--- xbUInt32 = [u_int32_t]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+
+IF( NOT ${iSize} EQUAL 4 )
+ MESSAGE( "FATAL_ERROR Could not detect 32 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 4 )
+
+#determine how 64 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE___INT64 )
+ SET( xbInt64 __int64 )
+ SET( iSize ${__INT64} )
+ MESSAGE( "--- xbInt64 = [__int64]" )
+ENDIF( HAVE___INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+ SET( xbInt64 int64_t )
+ SET( iSize ${INT64_T} )
+ MESSAGE( "--- xbInt64 = [int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+ SET( xbInt64 "long long" )
+ SET( iSize ${LONG_LONG} )
+ MESSAGE( "--- xbInt64 = [long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#determine how 64 bit unsigned integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_UNSIGNED__INT64 )
+ SET( xbUInt64 "unsigned __int64" )
+ SET( iSize ${UNSIGNED__INT64} )
+ MESSAGE( "--- xbUInt64 = [unsigned __int64]" )
+ENDIF( HAVE_UNSIGNED__INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+ SET( xbUInt64 "uint64_t" )
+ SET( iSize ${UINT64_T} )
+ MESSAGE( "--- xbUInt64 = [uint64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+ SET( xbUInt64 u_int64_t )
+ SET( iSize ${U_INT64_T} )
+ MESSAGE( "--- xbUInt64 = [u_int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+ SET( xbUInt64 "unsigned long long" )
+ SET( iSize ${UNSIGNED_LONG_LONG} )
+ MESSAGE( "--- xbUInt64 = [unsigned long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit unsigned integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#Library options
+option( BUILD_SHARED_LIBS "Build shared libraries?" ON)
+option( XB_DEBUG_SUPPORT "Compile debug logic into library?" ON)
+option( XB_UTILS_SUPPORT "Compile utility programs?" ON)
+option( XB_EXAMPLES_SUPPORT "Compile example programs?" ON)
+option( XB_MEMO_SUPPORT "Compile memo field support into library?" ON)
+option( XB_LOGGING_SUPPORT "Compile message logging support into library" ON)
+option( XB_DBF3_SUPPORT "Compile DBase File Format Version 3 support" ON)
+option( XB_DBF4_SUPPORT "Compile DBase File Format Version 4 support" ON)
+option( XB_LINKLIST_SUPPORT "Compile Link List routines into library" ON)
+option( XB_LOCKING_SUPPORT "Compile Multi User Locking support into library" ON)
+option( XB_FUNCTION_SUPPORT "Compile XBase Function support into library" ON)
+option( XB_EXPRESSION_SUPPORT "Compile Expression support into library" ON)
+option( XB_NDX_SUPPORT "Compile NDX Index support into library" ON)
+option( XB_MDX_SUPPORT "Compile MDX Index support into library" ON)
+option( XB_SQL_SUPPORT "Compile SQL support into library" ON)
+option( XB_NDXINF_SUPPORT "Compile NDX INF file support into library" ON)
+option( XB_FILTER_SUPPORT "Compile Filter support into library" ON)
+
+
+Message( "--- BUILD_SHARED_LIBS " ${BUILD_SHARED_LIBS})
+Message( "--- XB_MEMO_SUPPORT " ${XB_MEMO_SUPPORT})
+Message( "--- XB_DEBUG_SUPPORT " ${XB_DEBUG_SUPPORT})
+Message( "--- XB_UTILS_SUPPORT " ${XB_UTILS_SUPPORT})
+Message( "--- XB_EXAMPLES_SUPPORT " ${XB_EXAMPLES_SUPPORT})
+Message( "--- XB_LOGGING_SUPPORT " ${XB_LOGGING_SUPPORT})
+Message( "--- XB_DBF3_SUPPORT " ${XB_DBF3_SUPPORT})
+Message( "--- XB_DBF4_SUPPORT " ${XB_DBF4_SUPPORT})
+Message( "--- XB_LINKLIST_SUPPORT " ${XB_LINKLIST_SUPPORT})
+Message( "--- XB_LOCKING_SUPPORT " ${XB_LOCKING_SUPPORT})
+Message( "--- XB_FUNCTION_SUPPORT " ${XB_FUNCTION_SUPPORT})
+Message( "--- XB_EXPRESSION_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_MDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_SQL_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDXINF_SUPPORT " ${XB_NDXINF_SUPPORT})
+Message( "--- XB_FILTER_SUPPORT " ${XB_FILTER_SUPPORT})
+
+IF( XB_DEBUG_SUPPORT )
+ Message( "--- Adding debug support" )
+ set( CMAKE_BUILD_TYPE Debug )
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ add_compile_options( -Og )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+ENDIF( XB_DEBUG_SUPPORT )
+
+IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 64 bit compiler detected" )
+ set( XB_PLATFORM "x64" )
+ set( XB_PLATFORM_64 1 )
+ set( XB_LIBNAME "xbase64" )
+
+ELSE( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 32 bit compiler detected" )
+ set( XB_PLATFORM "x86" )
+ set( XB_PLATFORM_32 1 )
+ set( XB_LIBNAME "xbase32" )
+
+ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+
+
+#Check for the existence of various header files
+INCLUDE (CheckIncludeFiles)
+CHECK_INCLUDE_FILES (ctype.h HAVE_CTYPE_H)
+CHECK_INCLUDE_FILES (dirent.h HAVE_DIRENT_H)
+CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H)
+CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILES (stdarg.h HAVE_STDARG_H)
+CHECK_INCLUDE_FILES (stdargs.h HAVE_STDARGS_H)
+CHECK_INCLUDE_FILES (string.h HAVE_STRING_H)
+CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H)
+CHECK_INCLUDE_FILES (sys/stat.h HAVE_STAT_H)
+CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
+CHECK_INCLUDE_FILES (varargs.h HAVE_VARARGS_H)
+CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H)
+
+#Check for the existence of various function calls
+INCLUDE( CheckFunctionExists )
+CHECK_FUNCTION_EXISTS(_close HAVE__CLOSE_F)
+CHECK_FUNCTION_EXISTS(fcntl HAVE_FCNTL_F)
+CHECK_FUNCTION_EXISTS(_fdopen HAVE__FDOPEN_F)
+CHECK_FUNCTION_EXISTS(fopen_s HAVE_FOPEN_S_F)
+CHECK_FUNCTION_EXISTS(_fsopen HAVE__FSOPEN_F)
+CHECK_FUNCTION_EXISTS(_fileno HAVE__FILENO_F)
+CHECK_FUNCTION_EXISTS(fork HAVE_FORK_F)
+CHECK_FUNCTION_EXISTS(_fseeki64 HAVE__FSEEKI64_F)
+CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO_F)
+CHECK_FUNCTION_EXISTS(ftruncate HAVE_FTRUNCATE_F)
+CHECK_FUNCTION_EXISTS(_localtime64_s HAVE__LOCALTIME64_S_F)
+CHECK_FUNCTION_EXISTS(LockFile HAVE_LOCKFILE_F)
+CHECK_FUNCTION_EXISTS(locking HAVE_LOCKING_F)
+CHECK_FUNCTION_EXISTS(_locking HAVE__LOCKING_F)
+CHECK_FUNCTION_EXISTS(_open HAVE__OPEN_F)
+CHECK_FUNCTION_EXISTS(SetEndOfFile HAVE_SETENDOFFILE_F)
+
+CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF_F)
+CHECK_FUNCTION_EXISTS(_vsnprintf_s HAVE__VSNPRINTF_S_F)
+
+
+IF( WIN32 )
+
+# Use CHECK_SYMBOL_EXISTS for the Win32API instead of CHECK_FUNCTION_EXISTS
+# Can't detect inline functions in headers
+# Can't detect due to mismatch of calling conventions
+# Can't detect mangled names
+
+INCLUDE( CheckSymbolExists )
+CHECK_SYMBOL_EXISTS(CreateProcessW Windows.h HAVE_CREATEPROCESSW_F )
+CHECK_SYMBOL_EXISTS(vsprintf_s stdio.h HAVE_VSPRINTF_S_F )
+
+
+
+ENDIF ( WIN32 )
+
+# IF( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+# # ----fix me----
+# # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5 SetEndOfFile
+# Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_H" )
+# ENDIF ( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+
+IF( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+ # ----fix me----
+ # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5, or Windows VS 32 bit SetEndOfFile
+ Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_F" )
+ENDIF ( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+
+IF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+ Set( XB_INDEX_SUPPORT "1" )
+ENDIF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+
+
+# Set directories
+# PROJECT_PARENT_DIR is two nodes higher
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_BINARY_DIR} DIRECTORY )
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_PARENT_DIR} DIRECTORY )
+
+# MESSAGE( "PROJECT_PARENT_DIR = " ${PROJECT_PARENT_DIR} )
+# MESSAGE( "PROJECT_BINARY_DIR = " ${PROJECT_BINARY_DIR} )
+
+
+set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/${XB_PLATFORM})
+set( LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib/${XB_PLATFORM})
+set( PROJECT_SOURCE_DIR ${PROJECT_PARENT_DIR}/src)
+set( PROJECT_DATA_DIR ${PROJECT_PARENT_DIR}/data/)
+set( PROJECT_LOG_DIR ${PROJECT_PARENT_DIR}/logs/)
+set( EXTRA_LIBS ${EXTRA_LIBS} ${XB_LIBNAME})
+
+
+
+
+# Undo bad decisions
+IF( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+ MESSAGE( "--- Can't build 64 bit environment with a 32 bit compiler" )
+ MESSAGE( "--- XB_LARGEFILE_SUPPORT set to OFF" )
+ set( XB_LARGEFILE_SUPPORT OFF CACHE BOOL "Use 64 bit large file support?" FORCE )
+ENDIF ( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+
+IF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+ MESSAGE( "--- At lease one file format is required. Defaulting to Version 4" )
+ set( XB_DBF4_SUPPORT ON CACHE BOOL "Compile DBase File Format Version 4 support" FORCE )
+ENDIF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+
+IF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for DBF V4 Memo files. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for locking functions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+ MESSAGE( "--- Expression required for indices. Setting to ON" )
+ set( XB_EXPRESSION_SUPPORT ON CACHE BOOL "Compile Expression support into library" FORCE )
+ENDIF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_FUNCTION_SUPPORT ON CACHE BOOL "Compile XBase Function support into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+
+# Build configuration header file
+configure_file (
+ "${PROJECT_SOURCE_DIR}/include/xbconfig.h.in"
+ "${PROJECT_BINARY_DIR}/include/xbconfig.h"
+)
+
+# Microsoft Windows settings
+IF( WIN32 )
+# add_definitions( /D_CRT_SECURE_NO_WARNINGS)
+ add_definitions( /EHsc )
+ENDIF( WIN32 )
+
+
+# set up include directories
+include_directories( "${PROJECT_BINARY_DIR}/include" )
+include_directories( "${PROJECT_SOURCE_DIR}/include" )
+
+#build the library
+IF ( BUILD_SHARED_LIBS )
+ set( LIB_TYPE SHARED )
+ELSE( BUILD_SHARED_LIBS )
+ set( LIB_TYPE STATIC )
+ENDIF( BUILD_SHARED_LIBS )
+MESSAGE( "--- Lib type " ${LIB_TYPE} )
+
+
+
+set (SOURCES ${PROJECT_SOURCE_DIR}/core/xbstring.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbssv.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdate.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbtblmgr.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbxbase.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfile.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdbf.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfields.cpp
+ ${PROJECT_SOURCE_DIR}/core/xblog.cpp)
+
+IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo.cpp )
+ENDIF( XB_MEMO_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf3.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo3.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf4.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo4.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfuncs.cpp )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexpnode.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexp.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbuda.cpp )
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbbcd.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixbase.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbtag.cpp )
+ENDIF( XB_INDEX_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixndx.cpp )
+ENDIF( XB_NDX_SUPPORT )
+
+
+IF( XB_MDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixmdx.cpp )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbsql.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbinsert.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrtbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrpix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrptbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbset.cpp )
+ENDIF( XB_SQL_SUPPORT )
+
+
+IF( XB_FILTER_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfilter.cpp )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+
+include( GenerateExportHeader )
+#add_library( xbase ${LIB_TYPE} ${SOURCES} )
+add_library( ${XB_LIBNAME} ${LIB_TYPE} ${SOURCES} )
+#add_library( ${CMAKE_PROJECT_NAME} ${LIB_TYPE} ${SOURCES} )
+
+
+IF( WIN32 )
+MESSAGE( "--- Generating Windows Library Headers" )
+
+#GENERATE_EXPORT_HEADER( xbase
+# BASE_NAME xbase
+
+GENERATE_EXPORT_HEADER( ${XB_LIBNAME}
+ BASE_NAME ${XB_LIBNAME}
+ EXPORT_MACRO_NAME xbase_EXPORT
+ EXPORT_FILE_NAME xbase_Export.h
+ STATIC_DEFINE xbase_BUILT_AS_STATIC
+)
+ENDIF( WIN32 )
+
+
+#build test programs
+enable_testing()
+
+add_executable( xb_test_string ${PROJECT_SOURCE_DIR}/tests/xb_test_string.cpp )
+target_link_libraries( xb_test_string ${EXTRA_LIBS})
+add_test( NAME xbString COMMAND xb_test_string QUIET )
+
+add_executable( xb_test_date ${PROJECT_SOURCE_DIR}/tests/xb_test_date.cpp )
+target_link_libraries( xb_test_date ${EXTRA_LIBS})
+add_test( NAME xbDate COMMAND xb_test_date QUIET )
+
+add_executable( xb_test_tblmgr ${PROJECT_SOURCE_DIR}/tests/xb_test_tblmgr.cpp )
+target_link_libraries( xb_test_tblmgr ${EXTRA_LIBS})
+add_test( NAME xbTblMgr COMMAND xb_test_tblmgr QUIET )
+
+add_executable( xb_test_xbase ${PROJECT_SOURCE_DIR}/tests/xb_test_xbase.cpp )
+target_link_libraries( xb_test_xbase ${EXTRA_LIBS})
+add_test( NAME xbXBase COMMAND xb_test_xbase QUIET )
+
+add_executable( xb_test_file ${PROJECT_SOURCE_DIR}/tests/xb_test_file.cpp )
+target_link_libraries( xb_test_file ${EXTRA_LIBS})
+add_test( NAME xbFile COMMAND xb_test_file QUIET )
+
+add_executable( xb_test_log ${PROJECT_SOURCE_DIR}/tests/xb_test_log.cpp )
+target_link_libraries( xb_test_log ${EXTRA_LIBS})
+add_test( NAME xbLog COMMAND xb_test_log QUIET )
+
+IF( XB_LINKLIST_SUPPORT )
+add_executable( xb_test_linklist ${PROJECT_SOURCE_DIR}/tests/xb_test_linklist.cpp )
+target_link_libraries( xb_test_linklist ${EXTRA_LIBS})
+add_test( NAME xbLinkList COMMAND xb_test_linklist QUIET )
+ENDIF( XB_LINKLIST_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+add_executable( xb_test_dbf_v3_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v3_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3NoMemos COMMAND xb_test_dbf_v3_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v3_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_memos.cpp )
+target_link_libraries( xb_test_dbf_v3_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3Memos COMMAND xb_test_dbf_v3_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+add_executable( xb_test_dbf_v4_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v4_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4NoMemos COMMAND xb_test_dbf_v4_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v4_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_memos.cpp )
+target_link_libraries( xb_test_dbf_v4_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4Memos COMMAND xb_test_dbf_v4_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+add_executable( xb_test_funcs ${PROJECT_SOURCE_DIR}/tests/xb_test_funcs.cpp )
+target_link_libraries( xb_test_funcs ${EXTRA_LIBS})
+add_test( NAME xbFunctions COMMAND xb_test_funcs QUIET )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+add_executable( xb_test_ndx ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx.cpp )
+target_link_libraries( xb_test_ndx ${EXTRA_LIBS})
+add_test( NAME xbIxNdx COMMAND xb_test_ndx QUIET )
+add_executable( xb_test_ndx2 ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx2.cpp )
+target_link_libraries( xb_test_ndx2 ${EXTRA_LIBS})
+add_test( NAME xbIxNdx2 COMMAND xb_test_ndx2 QUIET )
+ENDIF( XB_NDX_SUPPORT )
+
+IF( XB_MDX_SUPPORT )
+add_executable( xb_test_mdx ${PROJECT_SOURCE_DIR}/tests/xb_test_mdx.cpp )
+target_link_libraries( xb_test_mdx ${EXTRA_LIBS})
+add_test( NAME xbIxMdx COMMAND xb_test_mdx QUIET )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+add_executable( xb_test_bcd ${PROJECT_SOURCE_DIR}/tests/xb_test_bcd.cpp )
+target_link_libraries( xb_test_bcd ${EXTRA_LIBS})
+add_test( NAME xbBcd COMMAND xb_test_bcd QUIET )
+ENDIF( XB_INDEX_SUPPORT )
+
+
+IF( XB_EXPRESSION_SUPPORT )
+
+add_executable( xb_test_expnode ${PROJECT_SOURCE_DIR}/tests/xb_test_expnode.cpp )
+target_link_libraries( xb_test_expnode ${EXTRA_LIBS})
+add_test( NAME xbExpNode COMMAND xb_test_expnode QUIET )
+
+
+add_executable( xb_test_expression ${PROJECT_SOURCE_DIR}/tests/xb_test_expression.cpp )
+target_link_libraries( xb_test_expression ${EXTRA_LIBS})
+add_test( NAME xbExpressions COMMAND xb_test_expression QUIET )
+
+add_executable( xb_test_uda ${PROJECT_SOURCE_DIR}/tests/xb_test_uda.cpp )
+target_link_libraries( xb_test_uda ${EXTRA_LIBS})
+add_test( NAME xbUda COMMAND xb_test_uda QUIET )
+
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+add_executable( xb_test_sql ${PROJECT_SOURCE_DIR}/tests/xb_test_sql.cpp )
+target_link_libraries( xb_test_sql ${EXTRA_LIBS})
+add_test( NAME xbSql COMMAND xb_test_sql QUIET )
+ENDIF( XB_SQL_SUPPORT )
+
+IF( XB_FILTER_SUPPORT )
+add_executable( xb_test_filter ${PROJECT_SOURCE_DIR}/tests/xb_test_filter.cpp )
+target_link_libraries( xb_test_filter ${EXTRA_LIBS})
+add_test( NAME xbFilter COMMAND xb_test_filter QUIET )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+IF( XB_LOCKING_SUPPORT )
+add_executable( xb_test_lock ${PROJECT_SOURCE_DIR}/tests/xb_test_lock.cpp )
+target_link_libraries( xb_test_lock ${EXTRA_LIBS})
+add_test( NAME xbLock COMMAND xb_test_lock QUIET )
+IF( HAVE_CREATEPROCESSW_F )
+add_executable( xb_test_lock2 ${PROJECT_SOURCE_DIR}/tests/xb_test_lock2.cpp )
+target_link_libraries( xb_test_lock2 ${EXTRA_LIBS})
+ENDIF( HAVE_CREATEPROCESSW_F )
+ENDIF( XB_LOCKING_SUPPORT )
+
+#build example programs
+IF( XB_EXAMPLES_SUPPORT )
+ add_executable( xb_ex_string ${PROJECT_SOURCE_DIR}/examples/xb_ex_string.cpp )
+ target_link_libraries( xb_ex_string ${EXTRA_LIBS})
+
+ add_executable( xb_ex_date ${PROJECT_SOURCE_DIR}/examples/xb_ex_date.cpp )
+ target_link_libraries( xb_ex_date ${EXTRA_LIBS})
+
+ IF( XB_DBF3_SUPPORT )
+ add_executable( xb_ex_v3_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_create_dbf.cpp )
+ target_link_libraries( xb_ex_v3_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v3_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v3_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF3_SUPPORT )
+
+ IF( XB_DBF4_SUPPORT )
+ add_executable( xb_ex_v4_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_create_dbf.cpp )
+ target_link_libraries( xb_ex_v4_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v4_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v4_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF4_SUPPORT )
+
+ENDIF( XB_EXAMPLES_SUPPORT )
+
+#build utility programs
+IF( XB_UTILS_SUPPORT )
+
+ add_executable( xb_cfg_check ${PROJECT_SOURCE_DIR}/utils/xb_cfg_check.cpp )
+ target_link_libraries( xb_cfg_check ${EXTRA_LIBS})
+
+ add_executable( xb_copydbf ${PROJECT_SOURCE_DIR}/utils/xb_copydbf.cpp )
+ target_link_libraries( xb_copydbf ${EXTRA_LIBS})
+
+ add_executable( xb_dbfutil ${PROJECT_SOURCE_DIR}/utils/xb_dbfutil.cpp )
+ target_link_libraries( xb_dbfutil ${EXTRA_LIBS})
+
+ add_executable( xb_deletall ${PROJECT_SOURCE_DIR}/utils/xb_deletall.cpp )
+ target_link_libraries( xb_deletall ${EXTRA_LIBS})
+
+ add_executable( xb_dumpdbt ${PROJECT_SOURCE_DIR}/utils/xb_dumpdbt.cpp )
+ target_link_libraries( xb_dumpdbt ${EXTRA_LIBS})
+
+ add_executable( xb_dumphdr ${PROJECT_SOURCE_DIR}/utils/xb_dumphdr.cpp )
+ target_link_libraries( xb_dumphdr ${EXTRA_LIBS})
+
+ add_executable( xb_dumprecs ${PROJECT_SOURCE_DIR}/utils/xb_dumprecs.cpp )
+ target_link_libraries( xb_dumprecs ${EXTRA_LIBS})
+
+
+ add_executable( xb_tblinfo ${PROJECT_SOURCE_DIR}/utils/xb_tblinfo.cpp )
+ target_link_libraries( xb_tblinfo ${EXTRA_LIBS})
+
+ IF( XB_SQL_SUPPORT )
+ add_executable( xb_execsql ${PROJECT_SOURCE_DIR}/utils/xb_execsql.cpp )
+ target_link_libraries( xb_execsql ${EXTRA_LIBS})
+ ENDIF( XB_SQL_SUPPORT )
+
+ add_executable( xb_pack ${PROJECT_SOURCE_DIR}/utils/xb_pack.cpp )
+ target_link_libraries( xb_pack ${EXTRA_LIBS})
+
+ add_executable( xb_undelall ${PROJECT_SOURCE_DIR}/utils/xb_undelall.cpp )
+ target_link_libraries( xb_undelall ${EXTRA_LIBS})
+
+ add_executable( xb_zap ${PROJECT_SOURCE_DIR}/utils/xb_zap.cpp )
+ target_link_libraries( xb_zap ${EXTRA_LIBS})
+
+
+ install (TARGETS xb_cfg_check DESTINATION bin)
+ install (TARGETS xb_copydbf DESTINATION bin)
+ install (TARGETS xb_dbfutil DESTINATION bin)
+ install (TARGETS xb_deletall DESTINATION bin)
+ install (TARGETS xb_dumpdbt DESTINATION bin)
+ install (TARGETS xb_dumphdr DESTINATION bin)
+ install (TARGETS xb_dumprecs DESTINATION bin)
+ install (TARGETS xb_pack DESTINATION bin)
+ install (TARGETS xb_undelall DESTINATION bin)
+ install (TARGETS xb_zap DESTINATION bin)
+ install (TARGETS xb_execsql DESTINATION bin)
+
+ENDIF( XB_UTILS_SUPPORT )
+
+install (FILES include/xbconfig.h
+ ${PROJECT_SOURCE_DIR}/include/xbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbbcd.h
+ ${PROJECT_SOURCE_DIR}/include/xbdate.h
+ ${PROJECT_SOURCE_DIR}/include/xbdbf.h
+ ${PROJECT_SOURCE_DIR}/include/xbexp.h
+ ${PROJECT_SOURCE_DIR}/include/xbexpnode.h
+ ${PROJECT_SOURCE_DIR}/include/xbfile.h
+ ${PROJECT_SOURCE_DIR}/include/xbindex.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklst.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklstord.h
+ ${PROJECT_SOURCE_DIR}/include/xblnknod.h
+ ${PROJECT_SOURCE_DIR}/include/xblog.h
+ ${PROJECT_SOURCE_DIR}/include/xbmemo.h
+ ${PROJECT_SOURCE_DIR}/include/xbretcod.h
+ ${PROJECT_SOURCE_DIR}/include/xbsql.h
+ ${PROJECT_SOURCE_DIR}/include/xbssv.h
+ ${PROJECT_SOURCE_DIR}/include/xbstring.h
+ ${PROJECT_SOURCE_DIR}/include/xbtblmgr.h
+ ${PROJECT_SOURCE_DIR}/include/xbtypes.h
+ ${PROJECT_SOURCE_DIR}/include/xbxbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbuda.h
+ ${PROJECT_SOURCE_DIR}/include/xbtag.h
+ ${PROJECT_SOURCE_DIR}/include/xbfilter.h
+ DESTINATION include/${CMAKE_PROJECT_NAME})
+
+
+SET_TARGET_PROPERTIES( ${XB_LIBNAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+#SET_TARGET_PROPERTIES( ${CMAKE_PROJECT_NAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+
+IF( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib64/${CMAKE_PROJECT_NAME})
+ELSE( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib/${CMAKE_PROJECT_NAME})
+ENDIF( EXISTS /usr/local/lib64 )
+
+
diff --git a/build/win32vs/CleanWin.bat b/build/win32vs/CleanWin.bat
new file mode 100755
index 0000000..ad5da5b
--- /dev/null
+++ b/build/win32vs/CleanWin.bat
@@ -0,0 +1,20 @@
+
+rem Use this batch file to completely clean the Windows directory tree for a clean build from scratch
+
+rem rd /S /Q bin
+rd /S /Q CMakeFiles
+rd /S /Q include
+rd /S /Q lib
+rd /S /Q testing
+rd /S /Q Win32VS
+rd /S /Q bin
+del *.cmake
+del CmakeCache.txt
+del Makefile
+del *.h
+del *.exp
+del *.lib
+del *.filters
+del *.vcxproj
+del *.sln
+
diff --git a/build/win64vs/BuildWin.bat b/build/win64vs/BuildWin.bat
new file mode 100755
index 0000000..2151838
--- /dev/null
+++ b/build/win64vs/BuildWin.bat
@@ -0,0 +1,11 @@
+rem Build using MS Visual Studio
+
+cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Debug .
+
+pause To build the Windows Visual Studio 64 bit version, execute this script from a Visual Studio 64 bit command window
+
+rem cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release .
+
+pause
+
+nmake \ No newline at end of file
diff --git a/build/win64vs/CMakeLists.txt b/build/win64vs/CMakeLists.txt
new file mode 100755
index 0000000..0a192b8
--- /dev/null
+++ b/build/win64vs/CMakeLists.txt
@@ -0,0 +1,706 @@
+cmake_minimum_required(VERSION 3.0)
+
+project (xbase64)
+set( xbase_VERSION_MAJOR 4 )
+set( xbase_VERSION_MINOR 0 )
+set( xbase_VERSION_PATCH 0 )
+
+MESSAGE( "--- Xbase build for: " ${CMAKE_SYSTEM_NAME} )
+MESSAGE( "--- Compiler: " ${CMAKE_CXX_COMPILER_ID} )
+MESSAGE( "--- Project Name: " ${CMAKE_PROJECT_NAME} )
+
+#Set compiler options
+
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ MESSAGE( "Setting GNU compiler options" )
+ add_compile_options( -Wall -Wsign-conversion )
+# add_compile_options( -Wall -Wconversion -Wsign-conversion )
+ SET( VERBOSE 1 )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+
+IF( BORLAND )
+ MESSAGE ("BORLAND COMPILER" )
+ #set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w-8022" )
+ add_compile_options( -w-8022 )
+ENDIF( BORLAND )
+
+
+MESSAGE( "--- Checking integer sizes" )
+INCLUDE(CheckTypeSize)
+CHECK_TYPE_SIZE( "short int" SHORT_INT )
+CHECK_TYPE_SIZE( int INT )
+CHECK_TYPE_SIZE( __int32 __INT32 )
+CHECK_TYPE_SIZE( int32_t INT32_T )
+CHECK_TYPE_SIZE( long LONG_INT )
+CHECK_TYPE_SIZE( __int64 __INT64 )
+CHECK_TYPE_SIZE( int64_t INT64_T )
+CHECK_TYPE_SIZE( "long long" LONG_LONG )
+CHECK_TYPE_SIZE( u_int64_t U_INT64_T )
+CHECK_TYPE_SIZE( uint64_t UINT64_T )
+CHECK_TYPE_SIZE( "unsigned __int64" UNSIGNED__INT64 )
+CHECK_TYPE_SIZE( "unsigned long long" UNSIGNED_LONG_LONG )
+
+CHECK_TYPE_SIZE( "double" DOUBLE )
+MESSAGE( "--- Double size = " ${DOUBLE} )
+
+
+#determine how 16 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+ SET( xbInt16 "short int" )
+ SET( xbUInt16 "unsigned short int" )
+ SET( iSize ${SHORT_INT} )
+ MESSAGE( "--- xbInt16 = [short int]" )
+ MESSAGE( "--- xbUInt16 = [unsigned short int]" )
+
+ENDIF( HAVE_SHORT_INT AND ${SHORT_INT} EQUAL 2 )
+IF( NOT ${iSize} EQUAL 2 )
+ MESSAGE( "FATAL_ERROR Could not detect 16 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 2 )
+
+#determine how 32 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_INT AND ${INT} EQUAL 4 )
+ SET( xbInt32 int )
+ SET( xbUInt32 "unsigned int" )
+ SET( iSize ${INT} )
+ MESSAGE( "--- xbInt32 = [int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned int]" )
+ENDIF( HAVE_INT AND ${INT} EQUAL 4 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+ MESSAGE( __int untested if block - see CMakeLists.txt)
+ SET( xbInt32 __int32 )
+ SET( xbUInt32 "unsigned __int32" )
+ SET( iSize ${__INT} )
+ MESSAGE( "--- xbInt32 = [__int]" )
+ MESSAGE( "--- xbUInt32 = [unsigned __int]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE___INT32 )
+
+IF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+ SET( xbInt32 int32_t )
+ SET( xbUInt32 "u_int32_t" )
+ SET( iSize ${INT32_T} )
+ MESSAGE( "--- xbInt32 = [int32_t]" )
+ MESSAGE( "--- xbUInt32 = [u_int32_t]" )
+ENDIF(( NOT iSize EQUAL 4 ) AND HAVE_INT32_T )
+
+IF( NOT ${iSize} EQUAL 4 )
+ MESSAGE( "FATAL_ERROR Could not detect 32 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 4 )
+
+#determine how 64 bit integer defined on this platform
+SET( iSize 0 )
+IF( HAVE___INT64 )
+ SET( xbInt64 __int64 )
+ SET( iSize ${__INT64} )
+ MESSAGE( "--- xbInt64 = [__int64]" )
+ENDIF( HAVE___INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+ SET( xbInt64 int64_t )
+ SET( iSize ${INT64_T} )
+ MESSAGE( "--- xbInt64 = [int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+ SET( xbInt64 "long long" )
+ SET( iSize ${LONG_LONG} )
+ MESSAGE( "--- xbInt64 = [long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#determine how 64 bit unsigned integer defined on this platform
+SET( iSize 0 )
+IF( HAVE_UNSIGNED__INT64 )
+ SET( xbUInt64 "unsigned __int64" )
+ SET( iSize ${UNSIGNED__INT64} )
+ MESSAGE( "--- xbUInt64 = [unsigned __int64]" )
+ENDIF( HAVE_UNSIGNED__INT64 )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+ SET( xbUInt64 "uint64_t" )
+ SET( iSize ${UINT64_T} )
+ MESSAGE( "--- xbUInt64 = [uint64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UINT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+ SET( xbUInt64 u_int64_t )
+ SET( iSize ${U_INT64_T} )
+ MESSAGE( "--- xbUInt64 = [u_int64_t]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_U_INT64_T )
+
+IF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+ SET( xbUInt64 "unsigned long long" )
+ SET( iSize ${UNSIGNED_LONG_LONG} )
+ MESSAGE( "--- xbUInt64 = [unsigned long long]" )
+ENDIF(( NOT iSize EQUAL 8 ) AND HAVE_UNSIGNED_LONG_LONG )
+
+IF( NOT ${iSize} EQUAL 8 )
+ MESSAGE( "FATAL_ERROR Could not detect 64 bit unsigned integer type" )
+ MESSAGE( ${iSize} )
+ RETURN()
+ENDIF( NOT ${iSize} EQUAL 8 )
+
+#Library options
+option( BUILD_SHARED_LIBS "Build shared libraries?" ON)
+option( XB_DEBUG_SUPPORT "Compile debug logic into library?" ON)
+option( XB_UTILS_SUPPORT "Compile utility programs?" ON)
+option( XB_EXAMPLES_SUPPORT "Compile example programs?" ON)
+option( XB_MEMO_SUPPORT "Compile memo field support into library?" ON)
+option( XB_LOGGING_SUPPORT "Compile message logging support into library" ON)
+option( XB_DBF3_SUPPORT "Compile DBase File Format Version 3 support" ON)
+option( XB_DBF4_SUPPORT "Compile DBase File Format Version 4 support" ON)
+option( XB_LINKLIST_SUPPORT "Compile Link List routines into library" ON)
+option( XB_LOCKING_SUPPORT "Compile Multi User Locking support into library" ON)
+option( XB_FUNCTION_SUPPORT "Compile XBase Function support into library" ON)
+option( XB_EXPRESSION_SUPPORT "Compile Expression support into library" ON)
+option( XB_NDX_SUPPORT "Compile NDX Index support into library" ON)
+option( XB_MDX_SUPPORT "Compile MDX Index support into library" ON)
+option( XB_SQL_SUPPORT "Compile SQL support into library" ON)
+option( XB_NDXINF_SUPPORT "Compile NDX INF file support into library" ON)
+option( XB_FILTER_SUPPORT "Compile Filter support into library" ON)
+
+
+Message( "--- BUILD_SHARED_LIBS " ${BUILD_SHARED_LIBS})
+Message( "--- XB_MEMO_SUPPORT " ${XB_MEMO_SUPPORT})
+Message( "--- XB_DEBUG_SUPPORT " ${XB_DEBUG_SUPPORT})
+Message( "--- XB_UTILS_SUPPORT " ${XB_UTILS_SUPPORT})
+Message( "--- XB_EXAMPLES_SUPPORT " ${XB_EXAMPLES_SUPPORT})
+Message( "--- XB_LOGGING_SUPPORT " ${XB_LOGGING_SUPPORT})
+Message( "--- XB_DBF3_SUPPORT " ${XB_DBF3_SUPPORT})
+Message( "--- XB_DBF4_SUPPORT " ${XB_DBF4_SUPPORT})
+Message( "--- XB_LINKLIST_SUPPORT " ${XB_LINKLIST_SUPPORT})
+Message( "--- XB_LOCKING_SUPPORT " ${XB_LOCKING_SUPPORT})
+Message( "--- XB_FUNCTION_SUPPORT " ${XB_FUNCTION_SUPPORT})
+Message( "--- XB_EXPRESSION_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_MDX_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_SQL_SUPPORT " ${XB_EXPRESSION_SUPPORT})
+Message( "--- XB_NDXINF_SUPPORT " ${XB_NDXINF_SUPPORT})
+Message( "--- XB_FILTER_SUPPORT " ${XB_FILTER_SUPPORT})
+
+IF( XB_DEBUG_SUPPORT )
+ Message( "--- Adding debug support" )
+ set( CMAKE_BUILD_TYPE Debug )
+IF( CMAKE_COMPILER_IS_GNUCXX )
+ add_compile_options( -Og )
+ENDIF( CMAKE_COMPILER_IS_GNUCXX )
+ENDIF( XB_DEBUG_SUPPORT )
+
+IF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 64 bit compiler detected" )
+ set( XB_PLATFORM "x64" )
+ set( XB_PLATFORM_64 1 )
+ set( XB_LIBNAME "xbase64" )
+
+ELSE( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+ MESSAGE( "--- 32 bit compiler detected" )
+ set( XB_PLATFORM "x86" )
+ set( XB_PLATFORM_32 1 )
+ set( XB_LIBNAME "xbase32" )
+
+ENDIF( CMAKE_SIZEOF_VOID_P EQUAL 8 )
+
+
+#Check for the existence of various header files
+INCLUDE (CheckIncludeFiles)
+CHECK_INCLUDE_FILES (ctype.h HAVE_CTYPE_H)
+CHECK_INCLUDE_FILES (dirent.h HAVE_DIRENT_H)
+CHECK_INCLUDE_FILES (fcntl.h HAVE_FCNTL_H)
+CHECK_INCLUDE_FILES (inttypes.h HAVE_INTTYPES_H)
+CHECK_INCLUDE_FILES (stdarg.h HAVE_STDARG_H)
+CHECK_INCLUDE_FILES (stdargs.h HAVE_STDARGS_H)
+CHECK_INCLUDE_FILES (string.h HAVE_STRING_H)
+CHECK_INCLUDE_FILES (strings.h HAVE_STRINGS_H)
+CHECK_INCLUDE_FILES (sys/stat.h HAVE_STAT_H)
+CHECK_INCLUDE_FILES (unistd.h HAVE_UNISTD_H)
+CHECK_INCLUDE_FILES (varargs.h HAVE_VARARGS_H)
+CHECK_INCLUDE_FILES (windows.h HAVE_WINDOWS_H)
+
+#Check for the existence of various function calls
+INCLUDE( CheckFunctionExists )
+CHECK_FUNCTION_EXISTS(_close HAVE__CLOSE_F)
+CHECK_FUNCTION_EXISTS(fcntl HAVE_FCNTL_F)
+CHECK_FUNCTION_EXISTS(_fdopen HAVE__FDOPEN_F)
+CHECK_FUNCTION_EXISTS(fopen_s HAVE_FOPEN_S_F)
+CHECK_FUNCTION_EXISTS(_fsopen HAVE__FSOPEN_F)
+CHECK_FUNCTION_EXISTS(_fileno HAVE__FILENO_F)
+CHECK_FUNCTION_EXISTS(fork HAVE_FORK_F)
+CHECK_FUNCTION_EXISTS(_fseeki64 HAVE__FSEEKI64_F)
+CHECK_FUNCTION_EXISTS(fseeko HAVE_FSEEKO_F)
+CHECK_FUNCTION_EXISTS(ftruncate HAVE_FTRUNCATE_F)
+CHECK_FUNCTION_EXISTS(_localtime64_s HAVE__LOCALTIME64_S_F)
+CHECK_FUNCTION_EXISTS(LockFile HAVE_LOCKFILE_F)
+CHECK_FUNCTION_EXISTS(locking HAVE_LOCKING_F)
+CHECK_FUNCTION_EXISTS(_locking HAVE__LOCKING_F)
+CHECK_FUNCTION_EXISTS(_open HAVE__OPEN_F)
+CHECK_FUNCTION_EXISTS(SetEndOfFile HAVE_SETENDOFFILE_F)
+
+CHECK_FUNCTION_EXISTS(vsnprintf HAVE_VSNPRINTF_F)
+CHECK_FUNCTION_EXISTS(_vsnprintf_s HAVE__VSNPRINTF_S_F)
+
+
+IF( WIN32 )
+
+# Use CHECK_SYMBOL_EXISTS for the Win32API instead of CHECK_FUNCTION_EXISTS
+# Can't detect inline functions in headers
+# Can't detect due to mismatch of calling conventions
+# Can't detect mangled names
+
+INCLUDE( CheckSymbolExists )
+CHECK_SYMBOL_EXISTS(CreateProcessW Windows.h HAVE_CREATEPROCESSW_F )
+CHECK_SYMBOL_EXISTS(vsprintf_s stdio.h HAVE_VSPRINTF_S_F )
+
+
+
+ENDIF ( WIN32 )
+
+# IF( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+# # ----fix me----
+# # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5 SetEndOfFile
+# Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_H" )
+# ENDIF ( NOT HAVE_SENTENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND BORLAND )
+
+IF( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+ # ----fix me----
+ # cmake CHECK_FUNCTION_EXISTS - could not find Borland 5.5, or Windows VS 32 bit SetEndOfFile
+ Set( HAVE_SETENDOFFILE_F "HAVE_SETENDOFFILE_F" )
+ENDIF ( NOT HAVE_SETENDOFFILE_F AND NOT HAVE_FTRUNCATE_F AND WIN32 )
+
+IF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+ Set( XB_INDEX_SUPPORT "1" )
+ENDIF( XB_NDX_SUPPORT OR XB_MDX_SUPPORT )
+
+
+# Set directories
+# PROJECT_PARENT_DIR is two nodes higher
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_BINARY_DIR} DIRECTORY )
+get_filename_component( PROJECT_PARENT_DIR ${PROJECT_PARENT_DIR} DIRECTORY )
+
+# MESSAGE( "PROJECT_PARENT_DIR = " ${PROJECT_PARENT_DIR} )
+# MESSAGE( "PROJECT_BINARY_DIR = " ${PROJECT_BINARY_DIR} )
+
+
+set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/${XB_PLATFORM})
+set( LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib/${XB_PLATFORM})
+set( PROJECT_SOURCE_DIR ${PROJECT_PARENT_DIR}/src)
+set( PROJECT_DATA_DIR ${PROJECT_PARENT_DIR}/data/)
+set( PROJECT_LOG_DIR ${PROJECT_PARENT_DIR}/logs/)
+set( EXTRA_LIBS ${EXTRA_LIBS} ${XB_LIBNAME})
+
+
+
+
+# Undo bad decisions
+IF( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+ MESSAGE( "--- Can't build 64 bit environment with a 32 bit compiler" )
+ MESSAGE( "--- XB_LARGEFILE_SUPPORT set to OFF" )
+ set( XB_LARGEFILE_SUPPORT OFF CACHE BOOL "Use 64 bit large file support?" FORCE )
+ENDIF ( XB_PLATFORM_32 AND XB_LARGEFILE_SUPPORT )
+
+IF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+ MESSAGE( "--- At lease one file format is required. Defaulting to Version 4" )
+ set( XB_DBF4_SUPPORT ON CACHE BOOL "Compile DBase File Format Version 4 support" FORCE )
+ENDIF( NOT XB_DBF3_SUPPORT AND NOT XB_DBF4_SUPPORT )
+
+IF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for DBF V4 Memo files. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_DBF_SUPPORT AND XB_MEMO_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Link List support required for locking functions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_LOCKING_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+IF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+ MESSAGE( "--- Expression required for indices. Setting to ON" )
+ set( XB_EXPRESSION_SUPPORT ON CACHE BOOL "Compile Expression support into library" FORCE )
+ENDIF( XB_INDEX_SUPPORT AND NOT XB_EXPRESSION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_FUNCTION_SUPPORT ON CACHE BOOL "Compile XBase Function support into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+ MESSAGE( "--- Function support required for expressions. Setting to ON" )
+ set( XB_LINKLIST_SUPPORT ON CACHE BOOL "Compile Link List routines into library" FORCE )
+ENDIF( XB_EXPRESSION_SUPPORT AND NOT XB_LINKLIST_SUPPORT )
+
+
+# Build configuration header file
+configure_file (
+ "${PROJECT_SOURCE_DIR}/include/xbconfig.h.in"
+ "${PROJECT_BINARY_DIR}/include/xbconfig.h"
+)
+
+# Microsoft Windows settings
+IF( WIN32 )
+# add_definitions( /D_CRT_SECURE_NO_WARNINGS)
+ add_definitions( /EHsc )
+ENDIF( WIN32 )
+
+
+# set up include directories
+include_directories( "${PROJECT_BINARY_DIR}/include" )
+include_directories( "${PROJECT_SOURCE_DIR}/include" )
+
+#build the library
+IF ( BUILD_SHARED_LIBS )
+ set( LIB_TYPE SHARED )
+ELSE( BUILD_SHARED_LIBS )
+ set( LIB_TYPE STATIC )
+ENDIF( BUILD_SHARED_LIBS )
+MESSAGE( "--- Lib type " ${LIB_TYPE} )
+
+
+
+set (SOURCES ${PROJECT_SOURCE_DIR}/core/xbstring.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbssv.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdate.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbtblmgr.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbxbase.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfile.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbdbf.cpp
+ ${PROJECT_SOURCE_DIR}/core/xbfields.cpp
+ ${PROJECT_SOURCE_DIR}/core/xblog.cpp)
+
+IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo.cpp )
+ENDIF( XB_MEMO_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf3.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo3.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbdbf4.cpp )
+ IF( XB_MEMO_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbmemo4.cpp )
+ ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfuncs.cpp )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_EXPRESSION_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexpnode.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbexp.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbuda.cpp )
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbbcd.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixbase.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbtag.cpp )
+ENDIF( XB_INDEX_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixndx.cpp )
+ENDIF( XB_NDX_SUPPORT )
+
+
+IF( XB_MDX_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbixmdx.cpp )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbsql.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbinsert.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrtbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbcrix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrpix.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbdrptbl.cpp )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/sql/xbset.cpp )
+ENDIF( XB_SQL_SUPPORT )
+
+
+IF( XB_FILTER_SUPPORT )
+ set (SOURCES ${SOURCES} ${PROJECT_SOURCE_DIR}/core/xbfilter.cpp )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+
+include( GenerateExportHeader )
+#add_library( xbase ${LIB_TYPE} ${SOURCES} )
+add_library( ${XB_LIBNAME} ${LIB_TYPE} ${SOURCES} )
+#add_library( ${CMAKE_PROJECT_NAME} ${LIB_TYPE} ${SOURCES} )
+
+
+IF( WIN32 )
+MESSAGE( "--- Generating Windows Library Headers" )
+
+#GENERATE_EXPORT_HEADER( xbase
+# BASE_NAME xbase
+
+GENERATE_EXPORT_HEADER( ${XB_LIBNAME}
+ BASE_NAME ${XB_LIBNAME}
+ EXPORT_MACRO_NAME xbase_EXPORT
+ EXPORT_FILE_NAME xbase_Export.h
+ STATIC_DEFINE xbase_BUILT_AS_STATIC
+)
+ENDIF( WIN32 )
+
+
+#build test programs
+enable_testing()
+
+add_executable( xb_test_string ${PROJECT_SOURCE_DIR}/tests/xb_test_string.cpp )
+target_link_libraries( xb_test_string ${EXTRA_LIBS})
+add_test( NAME xbString COMMAND xb_test_string QUIET )
+
+add_executable( xb_test_date ${PROJECT_SOURCE_DIR}/tests/xb_test_date.cpp )
+target_link_libraries( xb_test_date ${EXTRA_LIBS})
+add_test( NAME xbDate COMMAND xb_test_date QUIET )
+
+add_executable( xb_test_tblmgr ${PROJECT_SOURCE_DIR}/tests/xb_test_tblmgr.cpp )
+target_link_libraries( xb_test_tblmgr ${EXTRA_LIBS})
+add_test( NAME xbTblMgr COMMAND xb_test_tblmgr QUIET )
+
+add_executable( xb_test_xbase ${PROJECT_SOURCE_DIR}/tests/xb_test_xbase.cpp )
+target_link_libraries( xb_test_xbase ${EXTRA_LIBS})
+add_test( NAME xbXBase COMMAND xb_test_xbase QUIET )
+
+add_executable( xb_test_file ${PROJECT_SOURCE_DIR}/tests/xb_test_file.cpp )
+target_link_libraries( xb_test_file ${EXTRA_LIBS})
+add_test( NAME xbFile COMMAND xb_test_file QUIET )
+
+add_executable( xb_test_log ${PROJECT_SOURCE_DIR}/tests/xb_test_log.cpp )
+target_link_libraries( xb_test_log ${EXTRA_LIBS})
+add_test( NAME xbLog COMMAND xb_test_log QUIET )
+
+IF( XB_LINKLIST_SUPPORT )
+add_executable( xb_test_linklist ${PROJECT_SOURCE_DIR}/tests/xb_test_linklist.cpp )
+target_link_libraries( xb_test_linklist ${EXTRA_LIBS})
+add_test( NAME xbLinkList COMMAND xb_test_linklist QUIET )
+ENDIF( XB_LINKLIST_SUPPORT )
+
+IF( XB_DBF3_SUPPORT )
+add_executable( xb_test_dbf_v3_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v3_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3NoMemos COMMAND xb_test_dbf_v3_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v3_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v3_memos.cpp )
+target_link_libraries( xb_test_dbf_v3_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV3Memos COMMAND xb_test_dbf_v3_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF3_SUPPORT )
+
+IF( XB_DBF4_SUPPORT )
+add_executable( xb_test_dbf_v4_nomemos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_nomemos.cpp )
+target_link_libraries( xb_test_dbf_v4_nomemos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4NoMemos COMMAND xb_test_dbf_v4_nomemos QUIET )
+
+IF( XB_MEMO_SUPPORT )
+add_executable( xb_test_dbf_v4_memos ${PROJECT_SOURCE_DIR}/tests/xb_test_dbf_v4_memos.cpp )
+target_link_libraries( xb_test_dbf_v4_memos ${EXTRA_LIBS})
+add_test( NAME xbDbfV4Memos COMMAND xb_test_dbf_v4_memos QUIET )
+
+ENDIF( XB_MEMO_SUPPORT )
+ENDIF( XB_DBF4_SUPPORT )
+
+IF( XB_FUNCTION_SUPPORT )
+add_executable( xb_test_funcs ${PROJECT_SOURCE_DIR}/tests/xb_test_funcs.cpp )
+target_link_libraries( xb_test_funcs ${EXTRA_LIBS})
+add_test( NAME xbFunctions COMMAND xb_test_funcs QUIET )
+ENDIF( XB_FUNCTION_SUPPORT )
+
+IF( XB_NDX_SUPPORT )
+add_executable( xb_test_ndx ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx.cpp )
+target_link_libraries( xb_test_ndx ${EXTRA_LIBS})
+add_test( NAME xbIxNdx COMMAND xb_test_ndx QUIET )
+add_executable( xb_test_ndx2 ${PROJECT_SOURCE_DIR}/tests/xb_test_ndx2.cpp )
+target_link_libraries( xb_test_ndx2 ${EXTRA_LIBS})
+add_test( NAME xbIxNdx2 COMMAND xb_test_ndx2 QUIET )
+ENDIF( XB_NDX_SUPPORT )
+
+IF( XB_MDX_SUPPORT )
+add_executable( xb_test_mdx ${PROJECT_SOURCE_DIR}/tests/xb_test_mdx.cpp )
+target_link_libraries( xb_test_mdx ${EXTRA_LIBS})
+add_test( NAME xbIxMdx COMMAND xb_test_mdx QUIET )
+ENDIF( XB_MDX_SUPPORT )
+
+IF( XB_INDEX_SUPPORT )
+add_executable( xb_test_bcd ${PROJECT_SOURCE_DIR}/tests/xb_test_bcd.cpp )
+target_link_libraries( xb_test_bcd ${EXTRA_LIBS})
+add_test( NAME xbBcd COMMAND xb_test_bcd QUIET )
+ENDIF( XB_INDEX_SUPPORT )
+
+
+IF( XB_EXPRESSION_SUPPORT )
+
+add_executable( xb_test_expnode ${PROJECT_SOURCE_DIR}/tests/xb_test_expnode.cpp )
+target_link_libraries( xb_test_expnode ${EXTRA_LIBS})
+add_test( NAME xbExpNode COMMAND xb_test_expnode QUIET )
+
+
+add_executable( xb_test_expression ${PROJECT_SOURCE_DIR}/tests/xb_test_expression.cpp )
+target_link_libraries( xb_test_expression ${EXTRA_LIBS})
+add_test( NAME xbExpressions COMMAND xb_test_expression QUIET )
+
+add_executable( xb_test_uda ${PROJECT_SOURCE_DIR}/tests/xb_test_uda.cpp )
+target_link_libraries( xb_test_uda ${EXTRA_LIBS})
+add_test( NAME xbUda COMMAND xb_test_uda QUIET )
+
+ENDIF( XB_EXPRESSION_SUPPORT )
+
+IF( XB_SQL_SUPPORT )
+add_executable( xb_test_sql ${PROJECT_SOURCE_DIR}/tests/xb_test_sql.cpp )
+target_link_libraries( xb_test_sql ${EXTRA_LIBS})
+add_test( NAME xbSql COMMAND xb_test_sql QUIET )
+ENDIF( XB_SQL_SUPPORT )
+
+IF( XB_FILTER_SUPPORT )
+add_executable( xb_test_filter ${PROJECT_SOURCE_DIR}/tests/xb_test_filter.cpp )
+target_link_libraries( xb_test_filter ${EXTRA_LIBS})
+add_test( NAME xbFilter COMMAND xb_test_filter QUIET )
+ENDIF( XB_FILTER_SUPPORT )
+
+
+IF( XB_LOCKING_SUPPORT )
+add_executable( xb_test_lock ${PROJECT_SOURCE_DIR}/tests/xb_test_lock.cpp )
+target_link_libraries( xb_test_lock ${EXTRA_LIBS})
+add_test( NAME xbLock COMMAND xb_test_lock QUIET )
+IF( HAVE_CREATEPROCESSW_F )
+add_executable( xb_test_lock2 ${PROJECT_SOURCE_DIR}/tests/xb_test_lock2.cpp )
+target_link_libraries( xb_test_lock2 ${EXTRA_LIBS})
+ENDIF( HAVE_CREATEPROCESSW_F )
+ENDIF( XB_LOCKING_SUPPORT )
+
+#build example programs
+IF( XB_EXAMPLES_SUPPORT )
+ add_executable( xb_ex_string ${PROJECT_SOURCE_DIR}/examples/xb_ex_string.cpp )
+ target_link_libraries( xb_ex_string ${EXTRA_LIBS})
+
+ add_executable( xb_ex_date ${PROJECT_SOURCE_DIR}/examples/xb_ex_date.cpp )
+ target_link_libraries( xb_ex_date ${EXTRA_LIBS})
+
+ IF( XB_DBF3_SUPPORT )
+ add_executable( xb_ex_v3_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_create_dbf.cpp )
+ target_link_libraries( xb_ex_v3_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v3_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v3_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v3_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF3_SUPPORT )
+
+ IF( XB_DBF4_SUPPORT )
+ add_executable( xb_ex_v4_create_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_create_dbf.cpp )
+ target_link_libraries( xb_ex_v4_create_dbf ${EXTRA_LIBS})
+
+ add_executable( xb_ex_v4_upd_dbf ${PROJECT_SOURCE_DIR}/examples/xb_ex_v4_upd_dbf.cpp )
+ target_link_libraries( xb_ex_v4_upd_dbf ${EXTRA_LIBS})
+ ENDIF( XB_DBF4_SUPPORT )
+
+ENDIF( XB_EXAMPLES_SUPPORT )
+
+#build utility programs
+IF( XB_UTILS_SUPPORT )
+
+ add_executable( xb_cfg_check ${PROJECT_SOURCE_DIR}/utils/xb_cfg_check.cpp )
+ target_link_libraries( xb_cfg_check ${EXTRA_LIBS})
+
+ add_executable( xb_copydbf ${PROJECT_SOURCE_DIR}/utils/xb_copydbf.cpp )
+ target_link_libraries( xb_copydbf ${EXTRA_LIBS})
+
+ add_executable( xb_dbfutil ${PROJECT_SOURCE_DIR}/utils/xb_dbfutil.cpp )
+ target_link_libraries( xb_dbfutil ${EXTRA_LIBS})
+
+ add_executable( xb_deletall ${PROJECT_SOURCE_DIR}/utils/xb_deletall.cpp )
+ target_link_libraries( xb_deletall ${EXTRA_LIBS})
+
+ add_executable( xb_dumpdbt ${PROJECT_SOURCE_DIR}/utils/xb_dumpdbt.cpp )
+ target_link_libraries( xb_dumpdbt ${EXTRA_LIBS})
+
+ add_executable( xb_dumphdr ${PROJECT_SOURCE_DIR}/utils/xb_dumphdr.cpp )
+ target_link_libraries( xb_dumphdr ${EXTRA_LIBS})
+
+ add_executable( xb_dumprecs ${PROJECT_SOURCE_DIR}/utils/xb_dumprecs.cpp )
+ target_link_libraries( xb_dumprecs ${EXTRA_LIBS})
+
+
+ add_executable( xb_tblinfo ${PROJECT_SOURCE_DIR}/utils/xb_tblinfo.cpp )
+ target_link_libraries( xb_tblinfo ${EXTRA_LIBS})
+
+ IF( XB_SQL_SUPPORT )
+ add_executable( xb_execsql ${PROJECT_SOURCE_DIR}/utils/xb_execsql.cpp )
+ target_link_libraries( xb_execsql ${EXTRA_LIBS})
+ ENDIF( XB_SQL_SUPPORT )
+
+ add_executable( xb_pack ${PROJECT_SOURCE_DIR}/utils/xb_pack.cpp )
+ target_link_libraries( xb_pack ${EXTRA_LIBS})
+
+ add_executable( xb_undelall ${PROJECT_SOURCE_DIR}/utils/xb_undelall.cpp )
+ target_link_libraries( xb_undelall ${EXTRA_LIBS})
+
+ add_executable( xb_zap ${PROJECT_SOURCE_DIR}/utils/xb_zap.cpp )
+ target_link_libraries( xb_zap ${EXTRA_LIBS})
+
+
+ install (TARGETS xb_cfg_check DESTINATION bin)
+ install (TARGETS xb_copydbf DESTINATION bin)
+ install (TARGETS xb_dbfutil DESTINATION bin)
+ install (TARGETS xb_deletall DESTINATION bin)
+ install (TARGETS xb_dumpdbt DESTINATION bin)
+ install (TARGETS xb_dumphdr DESTINATION bin)
+ install (TARGETS xb_dumprecs DESTINATION bin)
+ install (TARGETS xb_pack DESTINATION bin)
+ install (TARGETS xb_undelall DESTINATION bin)
+ install (TARGETS xb_zap DESTINATION bin)
+ install (TARGETS xb_execsql DESTINATION bin)
+
+ENDIF( XB_UTILS_SUPPORT )
+
+install (FILES include/xbconfig.h
+ ${PROJECT_SOURCE_DIR}/include/xbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbbcd.h
+ ${PROJECT_SOURCE_DIR}/include/xbdate.h
+ ${PROJECT_SOURCE_DIR}/include/xbdbf.h
+ ${PROJECT_SOURCE_DIR}/include/xbexp.h
+ ${PROJECT_SOURCE_DIR}/include/xbexpnode.h
+ ${PROJECT_SOURCE_DIR}/include/xbfile.h
+ ${PROJECT_SOURCE_DIR}/include/xbindex.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklst.h
+ ${PROJECT_SOURCE_DIR}/include/xblnklstord.h
+ ${PROJECT_SOURCE_DIR}/include/xblnknod.h
+ ${PROJECT_SOURCE_DIR}/include/xblog.h
+ ${PROJECT_SOURCE_DIR}/include/xbmemo.h
+ ${PROJECT_SOURCE_DIR}/include/xbretcod.h
+ ${PROJECT_SOURCE_DIR}/include/xbsql.h
+ ${PROJECT_SOURCE_DIR}/include/xbssv.h
+ ${PROJECT_SOURCE_DIR}/include/xbstring.h
+ ${PROJECT_SOURCE_DIR}/include/xbtblmgr.h
+ ${PROJECT_SOURCE_DIR}/include/xbtypes.h
+ ${PROJECT_SOURCE_DIR}/include/xbxbase.h
+ ${PROJECT_SOURCE_DIR}/include/xbuda.h
+ ${PROJECT_SOURCE_DIR}/include/xbtag.h
+ ${PROJECT_SOURCE_DIR}/include/xbfilter.h
+ DESTINATION include/${CMAKE_PROJECT_NAME})
+
+
+SET_TARGET_PROPERTIES( ${XB_LIBNAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+#SET_TARGET_PROPERTIES( ${CMAKE_PROJECT_NAME} PROPERTIES VERSION 1.0.0 SOVERSION 0 )
+
+IF( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib64/${CMAKE_PROJECT_NAME})
+ELSE( EXISTS /usr/local/lib64 )
+install (TARGETS ${XB_LIBNAME} DESTINATION lib/${CMAKE_PROJECT_NAME})
+ENDIF( EXISTS /usr/local/lib64 )
+
+
diff --git a/build/win64vs/CleanWin.bat b/build/win64vs/CleanWin.bat
new file mode 100755
index 0000000..8de16ef
--- /dev/null
+++ b/build/win64vs/CleanWin.bat
@@ -0,0 +1,18 @@
+
+rem Use this batch file to completely clean the Windows directory tree for a clean build from scratch
+
+rem rd /S /Q bin
+rd /S /Q CMakeFiles
+rd /S /Q include
+rd /S /Q lib
+rd /S /Q testing
+rd /S /Q bin
+del *.cmake
+del CmakeCache.txt
+del Makefile
+del *.h
+del *.exp
+del *.lib
+del *.filters
+del *.vcxproj
+del *.sln \ No newline at end of file
diff --git a/config.guess b/config.guess
deleted file mode 100755
index dff9e48..0000000
--- a/config.guess
+++ /dev/null
@@ -1,1317 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-# Free Software Foundation, Inc.
-
-timestamp='2001-09-04'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Written by Per Bothner <bothner@cygnus.com>.
-# Please send patches to <config-patches@gnu.org>.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub. If it succeeds, it prints the system name on stdout, and
-# exits with 0. Otherwise, it exits with 1.
-#
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit 0 ;;
- --version | -v )
- echo "$version" ; exit 0 ;;
- --help | --h* | -h )
- echo "$usage"; exit 0 ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help" >&2
- exit 1 ;;
- * )
- break ;;
- esac
-done
-
-if test $# != 0; then
- echo "$me: too many arguments$help" >&2
- exit 1
-fi
-
-
-dummy=dummy-$$
-trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script.
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,) echo "int dummy(){}" > $dummy.c ;
- for c in cc gcc c89 ; do
- ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
- if test $? = 0 ; then
- CC_FOR_BUILD="$c"; break ;
- fi ;
- done ;
- rm -f $dummy.c $dummy.o $dummy.rel ;
- if test x"$CC_FOR_BUILD" = x ; then
- CC_FOR_BUILD=no_compiler_found ;
- fi
- ;;
- ,,*) CC_FOR_BUILD=$CC ;;
- ,*,*) CC_FOR_BUILD=$HOST_CC ;;
-esac'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
- PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
- *:NetBSD:*:*)
- # Netbsd (nbsd) targets should (where applicable) match one or
- # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
- # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
- # switched to ELF, *-*-netbsd* would select the old
- # object file format. This provides both forward
- # compatibility and a consistent mechanism for selecting the
- # object file format.
- # Determine the machine/vendor (is the vendor relevant).
- case "${UNAME_MACHINE}" in
- amiga) machine=m68k-unknown ;;
- arm32) machine=arm-unknown ;;
- atari*) machine=m68k-atari ;;
- sun3*) machine=m68k-sun ;;
- mac68k) machine=m68k-apple ;;
- macppc) machine=powerpc-apple ;;
- hp3[0-9][05]) machine=m68k-hp ;;
- ibmrt|romp-ibm) machine=romp-ibm ;;
- *) machine=${UNAME_MACHINE}-unknown ;;
- esac
- # The Operating System including object format, if it has switched
- # to ELF recently, or will in the future.
- case "${UNAME_MACHINE}" in
- i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
- eval $set_cc_for_build
- if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
- | grep __ELF__ >/dev/null
- then
- # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
- # Return netbsd for either. FIX?
- os=netbsd
- else
- os=netbsdelf
- fi
- ;;
- *)
- os=netbsd
- ;;
- esac
- # The OS release
- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
- # contains redundant information, the shorter form:
- # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "${machine}-${os}${release}"
- exit 0 ;;
- alpha:OSF1:*:*)
- if test $UNAME_RELEASE = "V4.0"; then
- UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
- fi
- # A Vn.n version is a released version.
- # A Tn.n version is a released field test version.
- # A Xn.n version is an unreleased experimental baselevel.
- # 1.2 uses "1.2" for uname -r.
- cat <<EOF >$dummy.s
- .data
-\$Lformat:
- .byte 37,100,45,37,120,10,0 # "%d-%x\n"
-
- .text
- .globl main
- .align 4
- .ent main
-main:
- .frame \$30,16,\$26,0
- ldgp \$29,0(\$27)
- .prologue 1
- .long 0x47e03d80 # implver \$0
- lda \$2,-1
- .long 0x47e20c21 # amask \$2,\$1
- lda \$16,\$Lformat
- mov \$0,\$17
- not \$1,\$18
- jsr \$26,printf
- ldgp \$29,0(\$26)
- mov 0,\$16
- jsr \$26,exit
- .end main
-EOF
- eval $set_cc_for_build
- $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
- if test "$?" = 0 ; then
- case `./$dummy` in
- 0-0)
- UNAME_MACHINE="alpha"
- ;;
- 1-0)
- UNAME_MACHINE="alphaev5"
- ;;
- 1-1)
- UNAME_MACHINE="alphaev56"
- ;;
- 1-101)
- UNAME_MACHINE="alphapca56"
- ;;
- 2-303)
- UNAME_MACHINE="alphaev6"
- ;;
- 2-307)
- UNAME_MACHINE="alphaev67"
- ;;
- 2-1307)
- UNAME_MACHINE="alphaev68"
- ;;
- esac
- fi
- rm -f $dummy.s $dummy
- echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- exit 0 ;;
- Alpha\ *:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # Should we change UNAME_MACHINE based on the output of uname instead
- # of the specific Alpha model?
- echo alpha-pc-interix
- exit 0 ;;
- 21064:Windows_NT:50:3)
- echo alpha-dec-winnt3.5
- exit 0 ;;
- Amiga*:UNIX_System_V:4.0:*)
- echo m68k-unknown-sysv4
- exit 0;;
- amiga:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- *:[Aa]miga[Oo][Ss]:*:*)
- echo ${UNAME_MACHINE}-unknown-amigaos
- exit 0 ;;
- arc64:OpenBSD:*:*)
- echo mips64el-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- arc:OpenBSD:*:*)
- echo mipsel-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- hkmips:OpenBSD:*:*)
- echo mips-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- pmax:OpenBSD:*:*)
- echo mipsel-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- sgi:OpenBSD:*:*)
- echo mips-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- wgrisc:OpenBSD:*:*)
- echo mipsel-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- *:OS/390:*:*)
- echo i370-ibm-openedition
- exit 0 ;;
- arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
- echo arm-acorn-riscix${UNAME_RELEASE}
- exit 0;;
- SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
- echo hppa1.1-hitachi-hiuxmpp
- exit 0;;
- Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
- # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
- if test "`(/bin/universe) 2>/dev/null`" = att ; then
- echo pyramid-pyramid-sysv3
- else
- echo pyramid-pyramid-bsd
- fi
- exit 0 ;;
- NILE*:*:*:dcosx)
- echo pyramid-pyramid-svr4
- exit 0 ;;
- sun4H:SunOS:5.*:*)
- echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit 0 ;;
- sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
- echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit 0 ;;
- i86pc:SunOS:5.*:*)
- echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit 0 ;;
- sun4*:SunOS:6*:*)
- # According to config.sub, this is the proper way to canonicalize
- # SunOS6. Hard to guess exactly what SunOS6 will be like, but
- # it's likely to be more like Solaris than SunOS4.
- echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit 0 ;;
- sun4*:SunOS:*:*)
- case "`/usr/bin/arch -k`" in
- Series*|S4*)
- UNAME_RELEASE=`uname -v`
- ;;
- esac
- # Japanese Language versions have a version number like `4.1.3-JL'.
- echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
- exit 0 ;;
- sun3*:SunOS:*:*)
- echo m68k-sun-sunos${UNAME_RELEASE}
- exit 0 ;;
- sun*:*:4.2BSD:*)
- UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
- test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
- case "`/bin/arch`" in
- sun3)
- echo m68k-sun-sunos${UNAME_RELEASE}
- ;;
- sun4)
- echo sparc-sun-sunos${UNAME_RELEASE}
- ;;
- esac
- exit 0 ;;
- aushp:SunOS:*:*)
- echo sparc-auspex-sunos${UNAME_RELEASE}
- exit 0 ;;
- sparc*:NetBSD:*)
- echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
- exit 0 ;;
- atari*:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- # The situation for MiNT is a little confusing. The machine name
- # can be virtually everything (everything which is not
- # "atarist" or "atariste" at least should have a processor
- # > m68000). The system name ranges from "MiNT" over "FreeMiNT"
- # to the lowercase version "mint" (or "freemint"). Finally
- # the system name "TOS" denotes a system which is actually not
- # MiNT. But MiNT is downward compatible to TOS, so this should
- # be no problem.
- atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit 0 ;;
- atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit 0 ;;
- *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
- echo m68k-atari-mint${UNAME_RELEASE}
- exit 0 ;;
- milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
- echo m68k-milan-mint${UNAME_RELEASE}
- exit 0 ;;
- hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
- echo m68k-hades-mint${UNAME_RELEASE}
- exit 0 ;;
- *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
- echo m68k-unknown-mint${UNAME_RELEASE}
- exit 0 ;;
- sun3*:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mac68k:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mvme68k:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- mvme88k:OpenBSD:*:*)
- echo m88k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- powerpc:machten:*:*)
- echo powerpc-apple-machten${UNAME_RELEASE}
- exit 0 ;;
- RISC*:Mach:*:*)
- echo mips-dec-mach_bsd4.3
- exit 0 ;;
- RISC*:ULTRIX:*:*)
- echo mips-dec-ultrix${UNAME_RELEASE}
- exit 0 ;;
- VAX*:ULTRIX*:*:*)
- echo vax-dec-ultrix${UNAME_RELEASE}
- exit 0 ;;
- 2020:CLIX:*:* | 2430:CLIX:*:*)
- echo clipper-intergraph-clix${UNAME_RELEASE}
- exit 0 ;;
- mips:*:*:UMIPS | mips:*:*:RISCos)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h> /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
- #if defined (host_mips) && defined (MIPSEB)
- #if defined (SYSTYPE_SYSV)
- printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_SVR4)
- printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
- #endif
- #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
- printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
- #endif
- #endif
- exit (-1);
- }
-EOF
- $CC_FOR_BUILD $dummy.c -o $dummy \
- && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
- && rm -f $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
- echo mips-mips-riscos${UNAME_RELEASE}
- exit 0 ;;
- Motorola:PowerMAX_OS:*:*)
- echo powerpc-motorola-powermax
- exit 0 ;;
- Night_Hawk:Power_UNIX:*:*)
- echo powerpc-harris-powerunix
- exit 0 ;;
- m88k:CX/UX:7*:*)
- echo m88k-harris-cxux7
- exit 0 ;;
- m88k:*:4*:R4*)
- echo m88k-motorola-sysv4
- exit 0 ;;
- m88k:*:3*:R3*)
- echo m88k-motorola-sysv3
- exit 0 ;;
- AViiON:dgux:*:*)
- # DG/UX returns AViiON for all architectures
- UNAME_PROCESSOR=`/usr/bin/uname -p`
- if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
- then
- if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
- [ ${TARGET_BINARY_INTERFACE}x = x ]
- then
- echo m88k-dg-dgux${UNAME_RELEASE}
- else
- echo m88k-dg-dguxbcs${UNAME_RELEASE}
- fi
- else
- echo i586-dg-dgux${UNAME_RELEASE}
- fi
- exit 0 ;;
- M88*:DolphinOS:*:*) # DolphinOS (SVR3)
- echo m88k-dolphin-sysv3
- exit 0 ;;
- M88*:*:R3*:*)
- # Delta 88k system running SVR3
- echo m88k-motorola-sysv3
- exit 0 ;;
- XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
- echo m88k-tektronix-sysv3
- exit 0 ;;
- Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
- echo m68k-tektronix-bsd
- exit 0 ;;
- *:IRIX*:*:*)
- echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
- exit 0 ;;
- ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
- echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
- exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
- i*86:AIX:*:*)
- echo i386-ibm-aix
- exit 0 ;;
- ia64:AIX:*:*)
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
- exit 0 ;;
- *:AIX:2:3)
- if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <sys/systemcfg.h>
-
- main()
- {
- if (!__power_pc())
- exit(1);
- puts("powerpc-ibm-aix3.2.5");
- exit(0);
- }
-EOF
- $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
- echo rs6000-ibm-aix3.2.5
- elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
- echo rs6000-ibm-aix3.2.4
- else
- echo rs6000-ibm-aix3.2
- fi
- exit 0 ;;
- *:AIX:*:[45])
- IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | head -1 | awk '{ print $1 }'`
- if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
- IBM_ARCH=rs6000
- else
- IBM_ARCH=powerpc
- fi
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
- else
- IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
- fi
- echo ${IBM_ARCH}-ibm-aix${IBM_REV}
- exit 0 ;;
- *:AIX:*:*)
- echo rs6000-ibm-aix
- exit 0 ;;
- ibmrt:4.4BSD:*|romp-ibm:BSD:*)
- echo romp-ibm-bsd4.4
- exit 0 ;;
- ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and
- echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
- exit 0 ;; # report: romp-ibm BSD 4.3
- *:BOSX:*:*)
- echo rs6000-bull-bosx
- exit 0 ;;
- DPX/2?00:B.O.S.:*:*)
- echo m68k-bull-sysv3
- exit 0 ;;
- 9000/[34]??:4.3bsd:1.*:*)
- echo m68k-hp-bsd
- exit 0 ;;
- hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
- echo m68k-hp-bsd4.4
- exit 0 ;;
- 9000/[34678]??:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- case "${UNAME_MACHINE}" in
- 9000/31? ) HP_ARCH=m68000 ;;
- 9000/[34]?? ) HP_ARCH=m68k ;;
- 9000/[678][0-9][0-9])
- case "${HPUX_REV}" in
- 11.[0-9][0-9])
- if [ -x /usr/bin/getconf ]; then
- sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
- sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
- case "${sc_cpu_version}" in
- 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
- 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
- 532) # CPU_PA_RISC2_0
- case "${sc_kernel_bits}" in
- 32) HP_ARCH="hppa2.0n" ;;
- 64) HP_ARCH="hppa2.0w" ;;
- esac ;;
- esac
- fi ;;
- esac
- if [ "${HP_ARCH}" = "" ]; then
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
-
- #define _HPUX_SOURCE
- #include <stdlib.h>
- #include <unistd.h>
-
- int main ()
- {
- #if defined(_SC_KERNEL_BITS)
- long bits = sysconf(_SC_KERNEL_BITS);
- #endif
- long cpu = sysconf (_SC_CPU_VERSION);
-
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
- case CPU_PA_RISC2_0:
- #if defined(_SC_KERNEL_BITS)
- switch (bits)
- {
- case 64: puts ("hppa2.0w"); break;
- case 32: puts ("hppa2.0n"); break;
- default: puts ("hppa2.0"); break;
- } break;
- #else /* !defined(_SC_KERNEL_BITS) */
- puts ("hppa2.0"); break;
- #endif
- default: puts ("hppa1.0"); break;
- }
- exit (0);
- }
-EOF
- (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null ) && HP_ARCH=`./$dummy`
- if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi
- rm -f $dummy.c $dummy
- fi ;;
- esac
- echo ${HP_ARCH}-hp-hpux${HPUX_REV}
- exit 0 ;;
- ia64:HP-UX:*:*)
- HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
- echo ia64-hp-hpux${HPUX_REV}
- exit 0 ;;
- 3050*:HI-UX:*:*)
- eval $set_cc_for_build
- sed 's/^ //' << EOF >$dummy.c
- #include <unistd.h>
- int
- main ()
- {
- long cpu = sysconf (_SC_CPU_VERSION);
- /* The order matters, because CPU_IS_HP_MC68K erroneously returns
- true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
- results, however. */
- if (CPU_IS_PA_RISC (cpu))
- {
- switch (cpu)
- {
- case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
- case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
- default: puts ("hppa-hitachi-hiuxwe2"); break;
- }
- }
- else if (CPU_IS_HP_MC68K (cpu))
- puts ("m68k-hitachi-hiuxwe2");
- else puts ("unknown-hitachi-hiuxwe2");
- exit (0);
- }
-EOF
- $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
- echo unknown-hitachi-hiuxwe2
- exit 0 ;;
- 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
- echo hppa1.1-hp-bsd
- exit 0 ;;
- 9000/8??:4.3bsd:*:*)
- echo hppa1.0-hp-bsd
- exit 0 ;;
- *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
- echo hppa1.0-hp-mpeix
- exit 0 ;;
- hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
- echo hppa1.1-hp-osf
- exit 0 ;;
- hp8??:OSF1:*:*)
- echo hppa1.0-hp-osf
- exit 0 ;;
- i*86:OSF1:*:*)
- if [ -x /usr/sbin/sysversion ] ; then
- echo ${UNAME_MACHINE}-unknown-osf1mk
- else
- echo ${UNAME_MACHINE}-unknown-osf1
- fi
- exit 0 ;;
- parisc*:Lites*:*:*)
- echo hppa1.1-hp-lites
- exit 0 ;;
- hppa*:OpenBSD:*:*)
- echo hppa-unknown-openbsd
- exit 0 ;;
- C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
- echo c1-convex-bsd
- exit 0 ;;
- C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit 0 ;;
- C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
- echo c34-convex-bsd
- exit 0 ;;
- C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
- echo c38-convex-bsd
- exit 0 ;;
- C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
- echo c4-convex-bsd
- exit 0 ;;
- CRAY*X-MP:*:*:*)
- echo xmp-cray-unicos
- exit 0 ;;
- CRAY*Y-MP:*:*:*)
- echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
- CRAY*[A-Z]90:*:*:*)
- echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
- | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
- -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
- -e 's/\.[^.]*$/.X/'
- exit 0 ;;
- CRAY*TS:*:*:*)
- echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
- CRAY*T3D:*:*:*)
- echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
- CRAY*T3E:*:*:*)
- echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
- CRAY*SV1:*:*:*)
- echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
- exit 0 ;;
- CRAY-2:*:*:*)
- echo cray2-cray-unicos
- exit 0 ;;
- F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
- FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
- FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
- FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
- echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
- exit 0 ;;
- hp300:OpenBSD:*:*)
- echo m68k-unknown-openbsd${UNAME_RELEASE}
- exit 0 ;;
- i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
- echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
- exit 0 ;;
- sparc*:BSD/OS:*:*)
- echo sparc-unknown-bsdi${UNAME_RELEASE}
- exit 0 ;;
- *:BSD/OS:*:*)
- echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
- exit 0 ;;
- *:FreeBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
- exit 0 ;;
- *:OpenBSD:*:*)
- echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
- exit 0 ;;
- i*:CYGWIN*:*)
- echo ${UNAME_MACHINE}-pc-cygwin
- exit 0 ;;
- i*:MINGW*:*)
- echo ${UNAME_MACHINE}-pc-mingw32
- exit 0 ;;
- i*:PW*:*)
- echo ${UNAME_MACHINE}-pc-pw32
- exit 0 ;;
- i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
- # How do we know it's Interix rather than the generic POSIX subsystem?
- # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
- # UNAME_MACHINE based on the output of uname instead of i386?
- echo i386-pc-interix
- exit 0 ;;
- i*:UWIN*:*)
- echo ${UNAME_MACHINE}-pc-uwin
- exit 0 ;;
- p*:CYGWIN*:*)
- echo powerpcle-unknown-cygwin
- exit 0 ;;
- prep*:SunOS:5.*:*)
- echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
- exit 0 ;;
- *:GNU:*:*)
- echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
- exit 0 ;;
- i*86:Minix:*:*)
- echo ${UNAME_MACHINE}-pc-minix
- exit 0 ;;
- arm*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- ia64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux
- exit 0 ;;
- m68*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- mips:Linux:*:*)
- case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
- big) echo mips-unknown-linux-gnu && exit 0 ;;
- little) echo mipsel-unknown-linux-gnu && exit 0 ;;
- esac
- ;;
- ppc:Linux:*:*)
- echo powerpc-unknown-linux-gnu
- exit 0 ;;
- ppc64:Linux:*:*)
- echo powerpc64-unknown-linux-gnu
- exit 0 ;;
- alpha:Linux:*:*)
- case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
- EV5) UNAME_MACHINE=alphaev5 ;;
- EV56) UNAME_MACHINE=alphaev56 ;;
- PCA56) UNAME_MACHINE=alphapca56 ;;
- PCA57) UNAME_MACHINE=alphapca56 ;;
- EV6) UNAME_MACHINE=alphaev6 ;;
- EV67) UNAME_MACHINE=alphaev67 ;;
- EV68*) UNAME_MACHINE=alphaev68 ;;
- esac
- objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
- if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
- echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
- exit 0 ;;
- parisc:Linux:*:* | hppa:Linux:*:*)
- # Look for CPU level
- case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
- PA7*) echo hppa1.1-unknown-linux-gnu ;;
- PA8*) echo hppa2.0-unknown-linux-gnu ;;
- *) echo hppa-unknown-linux-gnu ;;
- esac
- exit 0 ;;
- parisc64:Linux:*:* | hppa64:Linux:*:*)
- echo hppa64-unknown-linux-gnu
- exit 0 ;;
- s390:Linux:*:* | s390x:Linux:*:*)
- echo ${UNAME_MACHINE}-ibm-linux
- exit 0 ;;
- sh*:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- sparc:Linux:*:* | sparc64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-gnu
- exit 0 ;;
- x86_64:Linux:*:*)
- echo x86_64-unknown-linux-gnu
- exit 0 ;;
- i*86:Linux:*:*)
- # The BFD linker knows what the default object file format is, so
- # first see if it will tell us. cd to the root directory to prevent
- # problems with other programs or directories called `ld' in the path.
- ld_supported_targets=`cd /; ld --help 2>&1 \
- | sed -ne '/supported targets:/!d
- s/[ ][ ]*/ /g
- s/.*supported targets: *//
- s/ .*//
- p'`
- case "$ld_supported_targets" in
- elf32-i386)
- TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
- ;;
- a.out-i386-linux)
- echo "${UNAME_MACHINE}-pc-linux-gnuaout"
- exit 0 ;;
- coff-i386)
- echo "${UNAME_MACHINE}-pc-linux-gnucoff"
- exit 0 ;;
- "")
- # Either a pre-BFD a.out linker (linux-gnuoldld) or
- # one that does not give us useful --help.
- echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
- exit 0 ;;
- esac
- # Determine whether the default compiler is a.out or elf
- eval $set_cc_for_build
- cat >$dummy.c <<EOF
-#include <features.h>
-#ifdef __cplusplus
-#include <stdio.h> /* for printf() prototype */
- int main (int argc, char *argv[]) {
-#else
- int main (argc, argv) int argc; char *argv[]; {
-#endif
-#ifdef __ELF__
-# ifdef __GLIBC__
-# if __GLIBC__ >= 2
- printf ("%s-pc-linux-gnu\n", argv[1]);
-# else
- printf ("%s-pc-linux-gnulibc1\n", argv[1]);
-# endif
-# else
- printf ("%s-pc-linux-gnulibc1\n", argv[1]);
-# endif
-#else
- printf ("%s-pc-linux-gnuaout\n", argv[1]);
-#endif
- return 0;
-}
-EOF
- $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
- rm -f $dummy.c $dummy
- test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
- ;;
- i*86:DYNIX/ptx:4*:*)
- # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
- # earlier versions are messed up and put the nodename in both
- # sysname and nodename.
- echo i386-sequent-sysv4
- exit 0 ;;
- i*86:UNIX_SV:4.2MP:2.*)
- # Unixware is an offshoot of SVR4, but it has its own version
- # number series starting with 2...
- # I am not positive that other SVR4 systems won't match this,
- # I just have to hope. -- rms.
- # Use sysv4.2uw... so that sysv4* matches it.
- echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
- exit 0 ;;
- i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
- UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
- if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
- echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
- else
- echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
- fi
- exit 0 ;;
- i*86:*:5:[78]*)
- case `/bin/uname -X | grep "^Machine"` in
- *486*) UNAME_MACHINE=i486 ;;
- *Pentium) UNAME_MACHINE=i586 ;;
- *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
- esac
- echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
- exit 0 ;;
- i*86:*:3.2:*)
- if test -f /usr/options/cb.name; then
- UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
- echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
- elif /bin/uname -X 2>/dev/null >/dev/null ; then
- UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
- (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
- (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
- && UNAME_MACHINE=i586
- (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \
- && UNAME_MACHINE=i686
- (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \
- && UNAME_MACHINE=i686
- echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
- else
- echo ${UNAME_MACHINE}-pc-sysv32
- fi
- exit 0 ;;
- i*86:*DOS:*:*)
- echo ${UNAME_MACHINE}-pc-msdosdjgpp
- exit 0 ;;
- pc:*:*:*)
- # Left here for compatibility:
- # uname -m prints for DJGPP always 'pc', but it prints nothing about
- # the processor, so we play safe by assuming i386.
- echo i386-pc-msdosdjgpp
- exit 0 ;;
- Intel:Mach:3*:*)
- echo i386-pc-mach3
- exit 0 ;;
- paragon:*:*:*)
- echo i860-intel-osf1
- exit 0 ;;
- i860:*:4.*:*) # i860-SVR4
- if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
- echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
- else # Add other i860-SVR4 vendors below as they are discovered.
- echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
- fi
- exit 0 ;;
- mini*:CTIX:SYS*5:*)
- # "miniframe"
- echo m68010-convergent-sysv
- exit 0 ;;
- M68*:*:R3V[567]*:*)
- test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
- 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
- OS_REL=''
- test -r /etc/.relid \
- && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && echo i486-ncr-sysv4.3${OS_REL} && exit 0
- /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
- && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
- 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
- /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
- && echo i486-ncr-sysv4 && exit 0 ;;
- m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
- echo m68k-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
- mc68030:UNIX_System_V:4.*:*)
- echo m68k-atari-sysv4
- exit 0 ;;
- i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
- echo i386-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
- TSUNAMI:LynxOS:2.*:*)
- echo sparc-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
- rs6000:LynxOS:2.*:*)
- echo rs6000-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
- PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
- echo powerpc-unknown-lynxos${UNAME_RELEASE}
- exit 0 ;;
- SM[BE]S:UNIX_SV:*:*)
- echo mips-dde-sysv${UNAME_RELEASE}
- exit 0 ;;
- RM*:ReliantUNIX-*:*:*)
- echo mips-sni-sysv4
- exit 0 ;;
- RM*:SINIX-*:*:*)
- echo mips-sni-sysv4
- exit 0 ;;
- *:SINIX-*:*:*)
- if uname -p 2>/dev/null >/dev/null ; then
- UNAME_MACHINE=`(uname -p) 2>/dev/null`
- echo ${UNAME_MACHINE}-sni-sysv4
- else
- echo ns32k-sni-sysv
- fi
- exit 0 ;;
- PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
- # says <Richard.M.Bartel@ccMail.Census.GOV>
- echo i586-unisys-sysv4
- exit 0 ;;
- *:UNIX_System_V:4*:FTX*)
- # From Gerald Hewes <hewes@openmarket.com>.
- # How about differentiating between stratus architectures? -djm
- echo hppa1.1-stratus-sysv4
- exit 0 ;;
- *:*:*:FTX*)
- # From seanf@swdc.stratus.com.
- echo i860-stratus-sysv4
- exit 0 ;;
- *:VOS:*:*)
- # From Paul.Green@stratus.com.
- echo hppa1.1-stratus-vos
- exit 0 ;;
- mc68*:A/UX:*:*)
- echo m68k-apple-aux${UNAME_RELEASE}
- exit 0 ;;
- news*:NEWS-OS:6*:*)
- echo mips-sony-newsos6
- exit 0 ;;
- R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
- if [ -d /usr/nec ]; then
- echo mips-nec-sysv${UNAME_RELEASE}
- else
- echo mips-unknown-sysv${UNAME_RELEASE}
- fi
- exit 0 ;;
- BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
- echo powerpc-be-beos
- exit 0 ;;
- BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
- echo powerpc-apple-beos
- exit 0 ;;
- BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
- echo i586-pc-beos
- exit 0 ;;
- SX-4:SUPER-UX:*:*)
- echo sx4-nec-superux${UNAME_RELEASE}
- exit 0 ;;
- SX-5:SUPER-UX:*:*)
- echo sx5-nec-superux${UNAME_RELEASE}
- exit 0 ;;
- Power*:Rhapsody:*:*)
- echo powerpc-apple-rhapsody${UNAME_RELEASE}
- exit 0 ;;
- *:Rhapsody:*:*)
- echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
- exit 0 ;;
- *:Darwin:*:*)
- echo `uname -p`-apple-darwin${UNAME_RELEASE}
- exit 0 ;;
- *:procnto*:*:* | *:QNX:[0123456789]*:*)
- if test "${UNAME_MACHINE}" = "x86pc"; then
- UNAME_MACHINE=pc
- fi
- echo `uname -p`-${UNAME_MACHINE}-nto-qnx
- exit 0 ;;
- *:QNX:*:4*)
- echo i386-pc-qnx
- exit 0 ;;
- NSR-[KW]:NONSTOP_KERNEL:*:*)
- echo nsr-tandem-nsk${UNAME_RELEASE}
- exit 0 ;;
- *:NonStop-UX:*:*)
- echo mips-compaq-nonstopux
- exit 0 ;;
- BS2000:POSIX*:*:*)
- echo bs2000-siemens-sysv
- exit 0 ;;
- DS/*:UNIX_System_V:*:*)
- echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
- exit 0 ;;
- *:Plan9:*:*)
- # "uname -m" is not consistent, so use $cputype instead. 386
- # is converted to i386 for consistency with other x86
- # operating systems.
- if test "$cputype" = "386"; then
- UNAME_MACHINE=i386
- else
- UNAME_MACHINE="$cputype"
- fi
- echo ${UNAME_MACHINE}-unknown-plan9
- exit 0 ;;
- i*86:OS/2:*:*)
- # If we were able to find `uname', then EMX Unix compatibility
- # is probably installed.
- echo ${UNAME_MACHINE}-pc-os2-emx
- exit 0 ;;
- *:TOPS-10:*:*)
- echo pdp10-unknown-tops10
- exit 0 ;;
- *:TENEX:*:*)
- echo pdp10-unknown-tenex
- exit 0 ;;
- KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
- echo pdp10-dec-tops20
- exit 0 ;;
- XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
- echo pdp10-xkl-tops20
- exit 0 ;;
- *:TOPS-20:*:*)
- echo pdp10-unknown-tops20
- exit 0 ;;
- *:ITS:*:*)
- echo pdp10-unknown-its
- exit 0 ;;
- i*86:XTS-300:*:STOP)
- echo ${UNAME_MACHINE}-unknown-stop
- exit 0 ;;
- i*86:atheos:*:*)
- echo ${UNAME_MACHINE}-unknown-atheos
- exit 0 ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
- printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
-
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-# include <sys/param.h>
-# if defined (BSD)
-# if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-# else
-# if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# endif
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# else
- printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0
-rm -f $dummy.c $dummy
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
- case `getsysinfo -f cpu_type` in
- c1*)
- echo c1-convex-bsd
- exit 0 ;;
- c2*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit 0 ;;
- c34*)
- echo c34-convex-bsd
- exit 0 ;;
- c38*)
- echo c38-convex-bsd
- exit 0 ;;
- c4*)
- echo c4-convex-bsd
- exit 0 ;;
- esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
- ftp://ftp.gnu.org/pub/gnu/config/
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo = `(hostinfo) 2>/dev/null`
-/bin/universe = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/config.sub b/config.sub
deleted file mode 100755
index 393f13d..0000000
--- a/config.sub
+++ /dev/null
@@ -1,1411 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-# Free Software Foundation, Inc.
-
-timestamp='2001-09-07'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine. It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330,
-# Boston, MA 02111-1307, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Please send patches to <config-patches@gnu.org>.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support. The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
- $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
- -h, --help print this help, then exit
- -t, --time-stamp print date of last modification, then exit
- -v, --version print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions. There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
- case $1 in
- --time-stamp | --time* | -t )
- echo "$timestamp" ; exit 0 ;;
- --version | -v )
- echo "$version" ; exit 0 ;;
- --help | --h* | -h )
- echo "$usage"; exit 0 ;;
- -- ) # Stop option processing
- shift; break ;;
- - ) # Use stdin as input.
- break ;;
- -* )
- echo "$me: invalid option $1$help"
- exit 1 ;;
-
- *local*)
- # First pass through any local machine types.
- echo $1
- exit 0;;
-
- * )
- break ;;
- esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
- exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
- exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
- nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
- os=-$maybe_os
- basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
- ;;
- *)
- basic_machine=`echo $1 | sed 's/-[^-]*$//'`
- if [ $basic_machine != $1 ]
- then os=`echo $1 | sed 's/.*-/-/'`
- else os=; fi
- ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work. We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
- -sun*os*)
- # Prevent following clause from handling this invalid input.
- ;;
- -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
- -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
- -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
- -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
- -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
- -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
- -apple | -axis)
- os=
- basic_machine=$1
- ;;
- -sim | -cisco | -oki | -wec | -winbond)
- os=
- basic_machine=$1
- ;;
- -scout)
- ;;
- -wrs)
- os=-vxworks
- basic_machine=$1
- ;;
- -chorusos*)
- os=-chorusos
- basic_machine=$1
- ;;
- -chorusrdb)
- os=-chorusrdb
- basic_machine=$1
- ;;
- -hiux*)
- os=-hiuxwe2
- ;;
- -sco5)
- os=-sco3.2v5
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco4)
- os=-sco3.2v4
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2.[4-9]*)
- os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco3.2v[4-9]*)
- # Don't forget version if it is 3.2v4 or newer.
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -sco*)
- os=-sco3.2v2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -udk*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -isc)
- os=-isc2.2
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -clix*)
- basic_machine=clipper-intergraph
- ;;
- -isc*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
- ;;
- -lynx*)
- os=-lynxos
- ;;
- -ptx*)
- basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
- ;;
- -windowsnt*)
- os=`echo $os | sed -e 's/windowsnt/winnt/'`
- ;;
- -psos*)
- os=-psos
- ;;
- -mint | -mint[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
- # Recognize the basic CPU types without company name.
- # Some are omitted here because they have special meanings below.
- 1750a | 580 \
- | a29k \
- | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
- | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
- | c4x | clipper \
- | d10v | d30v | dsp16xx \
- | fr30 \
- | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
- | i370 | i860 | i960 | ia64 \
- | m32r | m68000 | m68k | m88k | mcore \
- | mips16 | mips64 | mips64el | mips64orion | mips64orionel \
- | mips64vr4100 | mips64vr4100el | mips64vr4300 \
- | mips64vr4300el | mips64vr5000 | mips64vr5000el \
- | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \
- | mipsisa32 \
- | mn10200 | mn10300 \
- | ns16k | ns32k \
- | openrisc \
- | pdp10 | pdp11 | pj | pjl \
- | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
- | pyramid \
- | s390 | s390x \
- | sh | sh[34] | sh[34]eb | shbe | shle \
- | sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
- | stormy16 | strongarm \
- | tahoe | thumb | tic80 | tron \
- | v850 \
- | we32k \
- | x86 | xscale \
- | z8k)
- basic_machine=$basic_machine-unknown
- ;;
- m6811 | m68hc11 | m6812 | m68hc12)
- # Motorola 68HC11/12.
- basic_machine=$basic_machine-unknown
- os=-none
- ;;
- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
- ;;
-
- # We use `pc' rather than `unknown'
- # because (1) that's what they normally are, and
- # (2) the word "unknown" tends to confuse beginning users.
- i*86 | x86_64)
- basic_machine=$basic_machine-pc
- ;;
- # Object if more than one company name word.
- *-*-*)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
- # Recognize the basic CPU types with company name.
- 580-* \
- | a29k-* \
- | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
- | alphapca5[67]-* | arc-* \
- | arm-* | armbe-* | armle-* | armv*-* \
- | bs2000-* \
- | c[123]* | c30-* | [cjt]90-* | c54x-* \
- | clipper-* | cray2-* | cydra-* \
- | d10v-* | d30v-* \
- | elxsi-* \
- | f30[01]-* | f700-* | fr30-* | fx80-* \
- | h8300-* | h8500-* \
- | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
- | i*86-* | i860-* | i960-* | ia64-* \
- | m32r-* \
- | m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
- | m88110-* | m88k-* | mcore-* \
- | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
- | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
- | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \
- | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \
- | none-* | np1-* | ns16k-* | ns32k-* \
- | orion-* \
- | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
- | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
- | pyramid-* \
- | romp-* | rs6000-* \
- | s390-* | s390x-* \
- | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
- | sparc-* | sparc64-* | sparc86x-* | sparclite-* \
- | sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \
- | t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
- | v850-* | vax-* \
- | we32k-* \
- | x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
- | ymp-* \
- | z8k-*)
- ;;
- # Recognize the various machine names and aliases which stand
- # for a CPU type and a company and sometimes even an OS.
- 386bsd)
- basic_machine=i386-unknown
- os=-bsd
- ;;
- 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
- basic_machine=m68000-att
- ;;
- 3b*)
- basic_machine=we32k-att
- ;;
- a29khif)
- basic_machine=a29k-amd
- os=-udi
- ;;
- adobe68k)
- basic_machine=m68010-adobe
- os=-scout
- ;;
- alliant | fx80)
- basic_machine=fx80-alliant
- ;;
- altos | altos3068)
- basic_machine=m68k-altos
- ;;
- am29k)
- basic_machine=a29k-none
- os=-bsd
- ;;
- amdahl)
- basic_machine=580-amdahl
- os=-sysv
- ;;
- amiga | amiga-*)
- basic_machine=m68k-unknown
- ;;
- amigaos | amigados)
- basic_machine=m68k-unknown
- os=-amigaos
- ;;
- amigaunix | amix)
- basic_machine=m68k-unknown
- os=-sysv4
- ;;
- apollo68)
- basic_machine=m68k-apollo
- os=-sysv
- ;;
- apollo68bsd)
- basic_machine=m68k-apollo
- os=-bsd
- ;;
- aux)
- basic_machine=m68k-apple
- os=-aux
- ;;
- balance)
- basic_machine=ns32k-sequent
- os=-dynix
- ;;
- convex-c1)
- basic_machine=c1-convex
- os=-bsd
- ;;
- convex-c2)
- basic_machine=c2-convex
- os=-bsd
- ;;
- convex-c32)
- basic_machine=c32-convex
- os=-bsd
- ;;
- convex-c34)
- basic_machine=c34-convex
- os=-bsd
- ;;
- convex-c38)
- basic_machine=c38-convex
- os=-bsd
- ;;
- cray | ymp)
- basic_machine=ymp-cray
- os=-unicos
- ;;
- cray2)
- basic_machine=cray2-cray
- os=-unicos
- ;;
- [cjt]90)
- basic_machine=${basic_machine}-cray
- os=-unicos
- ;;
- crds | unos)
- basic_machine=m68k-crds
- ;;
- cris | cris-* | etrax*)
- basic_machine=cris-axis
- ;;
- da30 | da30-*)
- basic_machine=m68k-da30
- ;;
- decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
- basic_machine=mips-dec
- ;;
- delta | 3300 | motorola-3300 | motorola-delta \
- | 3300-motorola | delta-motorola)
- basic_machine=m68k-motorola
- ;;
- delta88)
- basic_machine=m88k-motorola
- os=-sysv3
- ;;
- dpx20 | dpx20-*)
- basic_machine=rs6000-bull
- os=-bosx
- ;;
- dpx2* | dpx2*-bull)
- basic_machine=m68k-bull
- os=-sysv3
- ;;
- ebmon29k)
- basic_machine=a29k-amd
- os=-ebmon
- ;;
- elxsi)
- basic_machine=elxsi-elxsi
- os=-bsd
- ;;
- encore | umax | mmax)
- basic_machine=ns32k-encore
- ;;
- es1800 | OSE68k | ose68k | ose | OSE)
- basic_machine=m68k-ericsson
- os=-ose
- ;;
- fx2800)
- basic_machine=i860-alliant
- ;;
- genix)
- basic_machine=ns32k-ns
- ;;
- gmicro)
- basic_machine=tron-gmicro
- os=-sysv
- ;;
- go32)
- basic_machine=i386-pc
- os=-go32
- ;;
- h3050r* | hiux*)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- h8300hms)
- basic_machine=h8300-hitachi
- os=-hms
- ;;
- h8300xray)
- basic_machine=h8300-hitachi
- os=-xray
- ;;
- h8500hms)
- basic_machine=h8500-hitachi
- os=-hms
- ;;
- harris)
- basic_machine=m88k-harris
- os=-sysv3
- ;;
- hp300-*)
- basic_machine=m68k-hp
- ;;
- hp300bsd)
- basic_machine=m68k-hp
- os=-bsd
- ;;
- hp300hpux)
- basic_machine=m68k-hp
- os=-hpux
- ;;
- hp3k9[0-9][0-9] | hp9[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k2[0-9][0-9] | hp9k31[0-9])
- basic_machine=m68000-hp
- ;;
- hp9k3[2-9][0-9])
- basic_machine=m68k-hp
- ;;
- hp9k6[0-9][0-9] | hp6[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hp9k7[0-79][0-9] | hp7[0-79][0-9])
- basic_machine=hppa1.1-hp
- ;;
- hp9k78[0-9] | hp78[0-9])
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
- # FIXME: really hppa2.0-hp
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][13679] | hp8[0-9][13679])
- basic_machine=hppa1.1-hp
- ;;
- hp9k8[0-9][0-9] | hp8[0-9][0-9])
- basic_machine=hppa1.0-hp
- ;;
- hppa-next)
- os=-nextstep3
- ;;
- hppaosf)
- basic_machine=hppa1.1-hp
- os=-osf
- ;;
- hppro)
- basic_machine=hppa1.1-hp
- os=-proelf
- ;;
- i370-ibm* | ibm*)
- basic_machine=i370-ibm
- ;;
-# I'm not sure what "Sysv32" means. Should this be sysv3.2?
- i*86v32)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv32
- ;;
- i*86v4*)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv4
- ;;
- i*86v)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-sysv
- ;;
- i*86sol2)
- basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
- os=-solaris2
- ;;
- i386mach)
- basic_machine=i386-mach
- os=-mach
- ;;
- i386-vsta | vsta)
- basic_machine=i386-unknown
- os=-vsta
- ;;
- iris | iris4d)
- basic_machine=mips-sgi
- case $os in
- -irix*)
- ;;
- *)
- os=-irix4
- ;;
- esac
- ;;
- isi68 | isi)
- basic_machine=m68k-isi
- os=-sysv
- ;;
- m88k-omron*)
- basic_machine=m88k-omron
- ;;
- magnum | m3230)
- basic_machine=mips-mips
- os=-sysv
- ;;
- merlin)
- basic_machine=ns32k-utek
- os=-sysv
- ;;
- mingw32)
- basic_machine=i386-pc
- os=-mingw32
- ;;
- miniframe)
- basic_machine=m68000-convergent
- ;;
- *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
- basic_machine=m68k-atari
- os=-mint
- ;;
- mipsel*-linux*)
- basic_machine=mipsel-unknown
- os=-linux-gnu
- ;;
- mips*-linux*)
- basic_machine=mips-unknown
- os=-linux-gnu
- ;;
- mips3*-*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
- ;;
- mips3*)
- basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
- ;;
- mmix*)
- basic_machine=mmix-knuth
- os=-mmixware
- ;;
- monitor)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- msdos)
- basic_machine=i386-pc
- os=-msdos
- ;;
- mvs)
- basic_machine=i370-ibm
- os=-mvs
- ;;
- ncr3000)
- basic_machine=i486-ncr
- os=-sysv4
- ;;
- netbsd386)
- basic_machine=i386-unknown
- os=-netbsd
- ;;
- netwinder)
- basic_machine=armv4l-rebel
- os=-linux
- ;;
- news | news700 | news800 | news900)
- basic_machine=m68k-sony
- os=-newsos
- ;;
- news1000)
- basic_machine=m68030-sony
- os=-newsos
- ;;
- news-3600 | risc-news)
- basic_machine=mips-sony
- os=-newsos
- ;;
- necv70)
- basic_machine=v70-nec
- os=-sysv
- ;;
- next | m*-next )
- basic_machine=m68k-next
- case $os in
- -nextstep* )
- ;;
- -ns2*)
- os=-nextstep2
- ;;
- *)
- os=-nextstep3
- ;;
- esac
- ;;
- nh3000)
- basic_machine=m68k-harris
- os=-cxux
- ;;
- nh[45]000)
- basic_machine=m88k-harris
- os=-cxux
- ;;
- nindy960)
- basic_machine=i960-intel
- os=-nindy
- ;;
- mon960)
- basic_machine=i960-intel
- os=-mon960
- ;;
- nonstopux)
- basic_machine=mips-compaq
- os=-nonstopux
- ;;
- np1)
- basic_machine=np1-gould
- ;;
- nsr-tandem)
- basic_machine=nsr-tandem
- ;;
- op50n-* | op60c-*)
- basic_machine=hppa1.1-oki
- os=-proelf
- ;;
- OSE68000 | ose68000)
- basic_machine=m68000-ericsson
- os=-ose
- ;;
- os68k)
- basic_machine=m68k-none
- os=-os68k
- ;;
- pa-hitachi)
- basic_machine=hppa1.1-hitachi
- os=-hiuxwe2
- ;;
- paragon)
- basic_machine=i860-intel
- os=-osf
- ;;
- pbd)
- basic_machine=sparc-tti
- ;;
- pbb)
- basic_machine=m68k-tti
- ;;
- pc532 | pc532-*)
- basic_machine=ns32k-pc532
- ;;
- pentium | p5 | k5 | k6 | nexgen)
- basic_machine=i586-pc
- ;;
- pentiumpro | p6 | 6x86 | athlon)
- basic_machine=i686-pc
- ;;
- pentiumii | pentium2)
- basic_machine=i686-pc
- ;;
- pentium-* | p5-* | k5-* | k6-* | nexgen-*)
- basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumpro-* | p6-* | 6x86-* | athlon-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pentiumii-* | pentium2-*)
- basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- pn)
- basic_machine=pn-gould
- ;;
- power) basic_machine=power-ibm
- ;;
- ppc) basic_machine=powerpc-unknown
- ;;
- ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppcle | powerpclittle | ppc-le | powerpc-little)
- basic_machine=powerpcle-unknown
- ;;
- ppcle-* | powerpclittle-*)
- basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64) basic_machine=powerpc64-unknown
- ;;
- ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ppc64le | powerpc64little | ppc64-le | powerpc64-little)
- basic_machine=powerpc64le-unknown
- ;;
- ppc64le-* | powerpc64little-*)
- basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
- ;;
- ps2)
- basic_machine=i386-ibm
- ;;
- pw32)
- basic_machine=i586-unknown
- os=-pw32
- ;;
- rom68k)
- basic_machine=m68k-rom68k
- os=-coff
- ;;
- rm[46]00)
- basic_machine=mips-siemens
- ;;
- rtpc | rtpc-*)
- basic_machine=romp-ibm
- ;;
- sa29200)
- basic_machine=a29k-amd
- os=-udi
- ;;
- sequent)
- basic_machine=i386-sequent
- ;;
- sh)
- basic_machine=sh-hitachi
- os=-hms
- ;;
- sparclite-wrs)
- basic_machine=sparclite-wrs
- os=-vxworks
- ;;
- sps7)
- basic_machine=m68k-bull
- os=-sysv2
- ;;
- spur)
- basic_machine=spur-unknown
- ;;
- st2000)
- basic_machine=m68k-tandem
- ;;
- stratus)
- basic_machine=i860-stratus
- os=-sysv4
- ;;
- sun2)
- basic_machine=m68000-sun
- ;;
- sun2os3)
- basic_machine=m68000-sun
- os=-sunos3
- ;;
- sun2os4)
- basic_machine=m68000-sun
- os=-sunos4
- ;;
- sun3os3)
- basic_machine=m68k-sun
- os=-sunos3
- ;;
- sun3os4)
- basic_machine=m68k-sun
- os=-sunos4
- ;;
- sun4os3)
- basic_machine=sparc-sun
- os=-sunos3
- ;;
- sun4os4)
- basic_machine=sparc-sun
- os=-sunos4
- ;;
- sun4sol2)
- basic_machine=sparc-sun
- os=-solaris2
- ;;
- sun3 | sun3-*)
- basic_machine=m68k-sun
- ;;
- sun4)
- basic_machine=sparc-sun
- ;;
- sun386 | sun386i | roadrunner)
- basic_machine=i386-sun
- ;;
- sv1)
- basic_machine=sv1-cray
- os=-unicos
- ;;
- symmetry)
- basic_machine=i386-sequent
- os=-dynix
- ;;
- t3e)
- basic_machine=t3e-cray
- os=-unicos
- ;;
- tic54x | c54x*)
- basic_machine=tic54x-unknown
- os=-coff
- ;;
- tx39)
- basic_machine=mipstx39-unknown
- ;;
- tx39el)
- basic_machine=mipstx39el-unknown
- ;;
- tower | tower-32)
- basic_machine=m68k-ncr
- ;;
- udi29k)
- basic_machine=a29k-amd
- os=-udi
- ;;
- ultra3)
- basic_machine=a29k-nyu
- os=-sym1
- ;;
- v810 | necv810)
- basic_machine=v810-nec
- os=-none
- ;;
- vaxv)
- basic_machine=vax-dec
- os=-sysv
- ;;
- vms)
- basic_machine=vax-dec
- os=-vms
- ;;
- vpp*|vx|vx-*)
- basic_machine=f301-fujitsu
- ;;
- vxworks960)
- basic_machine=i960-wrs
- os=-vxworks
- ;;
- vxworks68)
- basic_machine=m68k-wrs
- os=-vxworks
- ;;
- vxworks29k)
- basic_machine=a29k-wrs
- os=-vxworks
- ;;
- w65*)
- basic_machine=w65-wdc
- os=-none
- ;;
- w89k-*)
- basic_machine=hppa1.1-winbond
- os=-proelf
- ;;
- windows32)
- basic_machine=i386-pc
- os=-windows32-msvcrt
- ;;
- xmp)
- basic_machine=xmp-cray
- os=-unicos
- ;;
- xps | xps100)
- basic_machine=xps100-honeywell
- ;;
- z8k-*-coff)
- basic_machine=z8k-unknown
- os=-sim
- ;;
- none)
- basic_machine=none-none
- os=-none
- ;;
-
-# Here we handle the default manufacturer of certain CPU types. It is in
-# some cases the only manufacturer, in others, it is the most popular.
- w89k)
- basic_machine=hppa1.1-winbond
- ;;
- op50n)
- basic_machine=hppa1.1-oki
- ;;
- op60c)
- basic_machine=hppa1.1-oki
- ;;
- mips)
- if [ x$os = x-linux-gnu ]; then
- basic_machine=mips-unknown
- else
- basic_machine=mips-mips
- fi
- ;;
- romp)
- basic_machine=romp-ibm
- ;;
- rs6000)
- basic_machine=rs6000-ibm
- ;;
- vax)
- basic_machine=vax-dec
- ;;
- pdp10)
- # there are many clones, so DEC is not a safe bet
- basic_machine=pdp10-unknown
- ;;
- pdp11)
- basic_machine=pdp11-dec
- ;;
- we32k)
- basic_machine=we32k-att
- ;;
- sh3 | sh4 | sh3eb | sh4eb)
- basic_machine=sh-unknown
- ;;
- sparc | sparcv9 | sparcv9b)
- basic_machine=sparc-sun
- ;;
- cydra)
- basic_machine=cydra-cydrome
- ;;
- orion)
- basic_machine=orion-highlevel
- ;;
- orion105)
- basic_machine=clipper-highlevel
- ;;
- mac | mpw | mac-mpw)
- basic_machine=m68k-apple
- ;;
- pmac | pmac-mpw)
- basic_machine=powerpc-apple
- ;;
- c4x*)
- basic_machine=c4x-none
- os=-coff
- ;;
- *-unknown)
- # Make sure to match an already-canonicalized machine name.
- ;;
- *)
- echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
- exit 1
- ;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
- *-digital*)
- basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
- ;;
- *-commodore*)
- basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
- ;;
- *)
- ;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
- # First match some system type aliases
- # that might get confused with valid system types.
- # -solaris* is a basic system type, with this one exception.
- -solaris1 | -solaris1.*)
- os=`echo $os | sed -e 's|solaris1|sunos4|'`
- ;;
- -solaris)
- os=-solaris2
- ;;
- -svr4*)
- os=-sysv4
- ;;
- -unixware*)
- os=-sysv4.2uw
- ;;
- -gnu/linux*)
- os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
- ;;
- # First accept the basic system types.
- # The portable systems comes first.
- # Each alternative MUST END IN A *, to match a version number.
- # -sysv* is not here because it comes later, after sysvr4.
- -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
- | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
- | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
- | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* \
- | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
- | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
- | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
- | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
- | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
- | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
- | -chorusos* | -chorusrdb* \
- | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
- | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
- | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
- | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
- | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
- | -os2* | -vos*)
- # Remember, each alternative MUST END IN *, to match a version number.
- ;;
- -qnx*)
- case $basic_machine in
- x86-* | i*86-*)
- ;;
- *)
- os=-nto$os
- ;;
- esac
- ;;
- -nto*)
- os=-nto-qnx
- ;;
- -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
- | -windows* | -osx | -abug | -netware* | -os9* | -beos* \
- | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
- ;;
- -mac*)
- os=`echo $os | sed -e 's|mac|macos|'`
- ;;
- -linux*)
- os=`echo $os | sed -e 's|linux|linux-gnu|'`
- ;;
- -sunos5*)
- os=`echo $os | sed -e 's|sunos5|solaris2|'`
- ;;
- -sunos6*)
- os=`echo $os | sed -e 's|sunos6|solaris3|'`
- ;;
- -opened*)
- os=-openedition
- ;;
- -wince*)
- os=-wince
- ;;
- -osfrose*)
- os=-osfrose
- ;;
- -osf*)
- os=-osf
- ;;
- -utek*)
- os=-bsd
- ;;
- -dynix*)
- os=-bsd
- ;;
- -acis*)
- os=-aos
- ;;
- -386bsd)
- os=-bsd
- ;;
- -ctix* | -uts*)
- os=-sysv
- ;;
- -ns2 )
- os=-nextstep2
- ;;
- -nsk*)
- os=-nsk
- ;;
- # Preserve the version number of sinix5.
- -sinix5.*)
- os=`echo $os | sed -e 's|sinix|sysv|'`
- ;;
- -sinix*)
- os=-sysv4
- ;;
- -triton*)
- os=-sysv3
- ;;
- -oss*)
- os=-sysv3
- ;;
- -svr4)
- os=-sysv4
- ;;
- -svr3)
- os=-sysv3
- ;;
- -sysvr4)
- os=-sysv4
- ;;
- # This must come after -sysvr4.
- -sysv*)
- ;;
- -ose*)
- os=-ose
- ;;
- -es1800*)
- os=-ose
- ;;
- -xenix)
- os=-xenix
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- os=-mint
- ;;
- -none)
- ;;
- *)
- # Get rid of the `-' at the beginning of $os.
- os=`echo $os | sed 's/[^-]*-//'`
- echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
- exit 1
- ;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system. Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
- *-acorn)
- os=-riscix1.2
- ;;
- arm*-rebel)
- os=-linux
- ;;
- arm*-semi)
- os=-aout
- ;;
- pdp10-*)
- os=-tops20
- ;;
- pdp11-*)
- os=-none
- ;;
- *-dec | vax-*)
- os=-ultrix4.2
- ;;
- m68*-apollo)
- os=-domain
- ;;
- i386-sun)
- os=-sunos4.0.2
- ;;
- m68000-sun)
- os=-sunos3
- # This also exists in the configure program, but was not the
- # default.
- # os=-sunos4
- ;;
- m68*-cisco)
- os=-aout
- ;;
- mips*-cisco)
- os=-elf
- ;;
- mips*-*)
- os=-elf
- ;;
- *-tti) # must be before sparc entry or we get the wrong os.
- os=-sysv3
- ;;
- sparc-* | *-sun)
- os=-sunos4.1.1
- ;;
- *-be)
- os=-beos
- ;;
- *-ibm)
- os=-aix
- ;;
- *-wec)
- os=-proelf
- ;;
- *-winbond)
- os=-proelf
- ;;
- *-oki)
- os=-proelf
- ;;
- *-hp)
- os=-hpux
- ;;
- *-hitachi)
- os=-hiux
- ;;
- i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
- os=-sysv
- ;;
- *-cbm)
- os=-amigaos
- ;;
- *-dg)
- os=-dgux
- ;;
- *-dolphin)
- os=-sysv3
- ;;
- m68k-ccur)
- os=-rtu
- ;;
- m88k-omron*)
- os=-luna
- ;;
- *-next )
- os=-nextstep
- ;;
- *-sequent)
- os=-ptx
- ;;
- *-crds)
- os=-unos
- ;;
- *-ns)
- os=-genix
- ;;
- i370-*)
- os=-mvs
- ;;
- *-next)
- os=-nextstep3
- ;;
- *-gould)
- os=-sysv
- ;;
- *-highlevel)
- os=-bsd
- ;;
- *-encore)
- os=-bsd
- ;;
- *-sgi)
- os=-irix
- ;;
- *-siemens)
- os=-sysv4
- ;;
- *-masscomp)
- os=-rtu
- ;;
- f30[01]-fujitsu | f700-fujitsu)
- os=-uxpv
- ;;
- *-rom68k)
- os=-coff
- ;;
- *-*bug)
- os=-coff
- ;;
- *-apple)
- os=-macos
- ;;
- *-atari*)
- os=-mint
- ;;
- *)
- os=-none
- ;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer. We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
- *-unknown)
- case $os in
- -riscix*)
- vendor=acorn
- ;;
- -sunos*)
- vendor=sun
- ;;
- -aix*)
- vendor=ibm
- ;;
- -beos*)
- vendor=be
- ;;
- -hpux*)
- vendor=hp
- ;;
- -mpeix*)
- vendor=hp
- ;;
- -hiux*)
- vendor=hitachi
- ;;
- -unos*)
- vendor=crds
- ;;
- -dgux*)
- vendor=dg
- ;;
- -luna*)
- vendor=omron
- ;;
- -genix*)
- vendor=ns
- ;;
- -mvs* | -opened*)
- vendor=ibm
- ;;
- -ptx*)
- vendor=sequent
- ;;
- -vxsim* | -vxworks*)
- vendor=wrs
- ;;
- -aux*)
- vendor=apple
- ;;
- -hms*)
- vendor=hitachi
- ;;
- -mpw* | -macos*)
- vendor=apple
- ;;
- -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
- vendor=atari
- ;;
- -vos*)
- vendor=stratus
- ;;
- esac
- basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
- ;;
-esac
-
-echo $basic_machine$os
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/configure b/configure
deleted file mode 100755
index fabec7e..0000000
--- a/configure
+++ /dev/null
@@ -1,10750 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.53 for xbase64 3.1.2.
-#
-# Report bugs to <xbase64-devel@lists.sourceforge.net>.
-#
-# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-
-# Find the correct PATH separator. Usually this is `:', but
-# DJGPP uses `;' like DOS.
-if test "X${PATH_SEPARATOR+set}" != Xset; then
- UNAME=${UNAME-`uname 2>/dev/null`}
- case X$UNAME in
- *-DOS) lt_cv_sys_path_separator=';' ;;
- *) lt_cv_sys_path_separator=':' ;;
- esac
- PATH_SEPARATOR=$lt_cv_sys_path_separator
-fi
-
-
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-case X$ECHO in
-X*--fallback-echo)
- # Remove one level of quotation (which was required for Make).
- ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
- ;;
-esac
-
-echo=${ECHO-echo}
-if test "X$1" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
-elif test "X$1" = X--fallback-echo; then
- # Avoid inline document here, it may be left over
- :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
- # Yippee, $echo works!
- :
-else
- # Restart under the correct shell.
- exec $SHELL "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
- # used as fallback echo
- shift
- cat <<EOF
-
-EOF
- exit 0
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-
-if test -z "$ECHO"; then
-if test "X${echo_test_string+set}" != Xset; then
-# find a string as large as possible, as long as the shell can cope with it
- for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
- if (echo_test_string="`eval $cmd`") 2>/dev/null &&
- echo_test_string="`eval $cmd`" &&
- (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
- then
- break
- fi
- done
-fi
-
-if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- :
-else
- # The Solaris, AIX, and Digital Unix default echo programs unquote
- # backslashes. This makes it impossible to quote backslashes using
- # echo "$something" | sed 's/\\/\\\\/g'
- #
- # So, first we look for a working echo in the user's PATH.
-
- IFS="${IFS= }"; save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for dir in $PATH /usr/ucb; do
- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- echo="$dir/echo"
- break
- fi
- done
- IFS="$save_ifs"
-
- if test "X$echo" = Xecho; then
- # We didn't find a better echo, so look for alternatives.
- if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- # This shell has a builtin print -r that does the trick.
- echo='print -r'
- elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
- test "X$CONFIG_SHELL" != X/bin/ksh; then
- # If we have ksh, try running configure again with it.
- ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
- export ORIGINAL_CONFIG_SHELL
- CONFIG_SHELL=/bin/ksh
- export CONFIG_SHELL
- exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
- else
- # Try using printf.
- echo='printf %s\n'
- if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
- echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- # Cool, printf works
- :
- elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
- test "X$echo_testing_string" = 'X\t' &&
- echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
- export CONFIG_SHELL
- SHELL="$CONFIG_SHELL"
- export SHELL
- echo="$CONFIG_SHELL $0 --fallback-echo"
- elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
- test "X$echo_testing_string" = 'X\t' &&
- echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
- test "X$echo_testing_string" = "X$echo_test_string"; then
- echo="$CONFIG_SHELL $0 --fallback-echo"
- else
- # maybe with a smaller string...
- prev=:
-
- for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
- if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
- then
- break
- fi
- prev="$cmd"
- done
-
- if test "$prev" != 'sed 50q "$0"'; then
- echo_test_string=`eval $prev`
- export echo_test_string
- exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
- else
- # Oops. We lost completely, so just stick with echo.
- echo=echo
- fi
- fi
- fi
- fi
-fi
-fi
-
-# Copy echo and quote the copy suitably for passing to libtool from
-# the Makefile, instead of quoting the original, which is used later.
-ECHO=$echo
-if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
- ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
-fi
-
-
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-
-## --------------------- ##
-## M4sh Initialization. ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
- set -o posix
-fi
-
-# NLS nuisances.
-# Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
- as_unset=unset
-else
- as_unset=false
-fi
-
-(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
- { $as_unset LANG || test "${LANG+set}" != set; } ||
- { LANG=C; export LANG; }
-(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
- { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
- { LC_ALL=C; export LC_ALL; }
-(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
- { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
- { LC_TIME=C; export LC_TIME; }
-(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
- { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
- { LC_CTYPE=C; export LC_CTYPE; }
-(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
- { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
- { LANGUAGE=C; export LANGUAGE; }
-(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
- { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
- { LC_COLLATE=C; export LC_COLLATE; }
-(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
- { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
- { LC_NUMERIC=C; export LC_NUMERIC; }
-(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
- { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
- { LC_MESSAGES=C; export LC_MESSAGES; }
-
-
-# Name of the executable.
-as_me=`(basename "$0") 2>/dev/null ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)$' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
- /^X\/\(\/\/\)$/{ s//\1/; q; }
- /^X\/\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conftest.sh
- echo "exit 0" >>conftest.sh
- chmod +x conftest.sh
- if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conftest.sh
-fi
-
-
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x$as_lineno_3" = "x$as_lineno_2" || {
- # Find who we are. Look in the path if we contain no path at all
- # relative or not.
- case $0 in
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
- ;;
- esac
- # We did not find ourselves, most probably we were run as `sh COMMAND'
- # in which case we are not to be found in the path.
- if test "x$as_myself" = x; then
- as_myself=$0
- fi
- if test ! -f "$as_myself"; then
- { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
- { (exit 1); exit 1; }; }
- fi
- case $CONFIG_SHELL in
- '')
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for as_base in sh bash ksh sh5; do
- case $as_dir in
- /*)
- if ("$as_dir/$as_base" -c '
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
- CONFIG_SHELL=$as_dir/$as_base
- export CONFIG_SHELL
- exec "$CONFIG_SHELL" "$0" ${1+"$@"}
- fi;;
- esac
- done
-done
-;;
- esac
-
- # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
- # uniformly replaced by the line number. The first 'sed' inserts a
- # line-number line before each line; the second 'sed' does the real
- # work. The second script uses 'N' to pair each line-number line
- # with the numbered line, and appends trailing '-' during
- # substitution so that $LINENO is not a special case at line end.
- # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
- # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
- sed '=' <$as_myself |
- sed '
- N
- s,$,-,
- : loop
- s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
- t loop
- s,-$,,
- s,^['$as_cr_digits']*\n,,
- ' >$as_me.lineno &&
- chmod +x $as_me.lineno ||
- { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
- { (exit 1); exit 1; }; }
-
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensible to this).
- . ./$as_me.lineno
- # Exit status is that of the last command.
- exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
- *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T=' ' ;;
- *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
- *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
- # We could just check for DJGPP; but this test a) works b) is more generic
- # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
- if test -f conf$$.exe; then
- # Don't use ln at all; we don't have any links
- as_ln_s='cp -p'
- else
- as_ln_s='ln -s'
- fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
-else
- as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-as_executable_p="test -f"
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" $as_nl"
-
-# CDPATH.
-$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
-
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-exec 6>&1
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-# Maximum number of lines to put in a shell here document.
-# This variable seems obsolete. It should probably be removed, and
-# only ac_max_sed_lines should be used.
-: ${ac_max_here_lines=38}
-
-# Identity of this package.
-PACKAGE_NAME='xbase64'
-PACKAGE_TARNAME='xbase64'
-PACKAGE_VERSION='3.1.2'
-PACKAGE_STRING='xbase64 3.1.2'
-PACKAGE_BUGREPORT='xbase64-devel@lists.sourceforge.net'
-
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#if HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#if HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#if STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# if HAVE_STDLIB_H
-# include <stdlib.h>
-# endif
-#endif
-#if HAVE_STRING_H
-# if !STDC_HEADERS && HAVE_MEMORY_H
-# include <memory.h>
-# endif
-# include <string.h>
-#endif
-#if HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#if HAVE_INTTYPES_H
-# include <inttypes.h>
-#else
-# if HAVE_STDINT_H
-# include <stdint.h>
-# endif
-#endif
-#if HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_unique_file="examples/exfilter.cpp"
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datadir='${prefix}/share'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-libdir='${exec_prefix}/lib'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-infodir='${prefix}/info'
-mandir='${prefix}/man'
-
-ac_prev=
-for ac_option
-do
- # If the previous option needs an argument, assign it.
- if test -n "$ac_prev"; then
- eval "$ac_prev=\$ac_option"
- ac_prev=
- continue
- fi
-
- ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
-
- # Accept the important Cygnus configure options, so we can diagnose typos.
-
- case $ac_option in
-
- -bindir | --bindir | --bindi | --bind | --bin | --bi)
- ac_prev=bindir ;;
- -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
- bindir=$ac_optarg ;;
-
- -build | --build | --buil | --bui | --bu)
- ac_prev=build_alias ;;
- -build=* | --build=* | --buil=* | --bui=* | --bu=*)
- build_alias=$ac_optarg ;;
-
- -cache-file | --cache-file | --cache-fil | --cache-fi \
- | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
- ac_prev=cache_file ;;
- -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
- | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
- cache_file=$ac_optarg ;;
-
- --config-cache | -C)
- cache_file=config.cache ;;
-
- -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
- ac_prev=datadir ;;
- -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
- | --da=*)
- datadir=$ac_optarg ;;
-
- -disable-* | --disable-*)
- ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid feature name: $ac_feature" >&2
- { (exit 1); exit 1; }; }
- ac_feature=`echo $ac_feature | sed 's/-/_/g'`
- eval "enable_$ac_feature=no" ;;
-
- -enable-* | --enable-*)
- ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid feature name: $ac_feature" >&2
- { (exit 1); exit 1; }; }
- ac_feature=`echo $ac_feature | sed 's/-/_/g'`
- case $ac_option in
- *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
- *) ac_optarg=yes ;;
- esac
- eval "enable_$ac_feature='$ac_optarg'" ;;
-
- -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
- | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
- | --exec | --exe | --ex)
- ac_prev=exec_prefix ;;
- -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
- | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
- | --exec=* | --exe=* | --ex=*)
- exec_prefix=$ac_optarg ;;
-
- -gas | --gas | --ga | --g)
- # Obsolete; use --with-gas.
- with_gas=yes ;;
-
- -help | --help | --hel | --he | -h)
- ac_init_help=long ;;
- -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
- ac_init_help=recursive ;;
- -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
- ac_init_help=short ;;
-
- -host | --host | --hos | --ho)
- ac_prev=host_alias ;;
- -host=* | --host=* | --hos=* | --ho=*)
- host_alias=$ac_optarg ;;
-
- -includedir | --includedir | --includedi | --included | --include \
- | --includ | --inclu | --incl | --inc)
- ac_prev=includedir ;;
- -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
- | --includ=* | --inclu=* | --incl=* | --inc=*)
- includedir=$ac_optarg ;;
-
- -infodir | --infodir | --infodi | --infod | --info | --inf)
- ac_prev=infodir ;;
- -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
- infodir=$ac_optarg ;;
-
- -libdir | --libdir | --libdi | --libd)
- ac_prev=libdir ;;
- -libdir=* | --libdir=* | --libdi=* | --libd=*)
- libdir=$ac_optarg ;;
-
- -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
- | --libexe | --libex | --libe)
- ac_prev=libexecdir ;;
- -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
- | --libexe=* | --libex=* | --libe=*)
- libexecdir=$ac_optarg ;;
-
- -localstatedir | --localstatedir | --localstatedi | --localstated \
- | --localstate | --localstat | --localsta | --localst \
- | --locals | --local | --loca | --loc | --lo)
- ac_prev=localstatedir ;;
- -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
- | --localstate=* | --localstat=* | --localsta=* | --localst=* \
- | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
- localstatedir=$ac_optarg ;;
-
- -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
- ac_prev=mandir ;;
- -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
- mandir=$ac_optarg ;;
-
- -nfp | --nfp | --nf)
- # Obsolete; use --without-fp.
- with_fp=no ;;
-
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c | -n)
- no_create=yes ;;
-
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
- no_recursion=yes ;;
-
- -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
- | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
- | --oldin | --oldi | --old | --ol | --o)
- ac_prev=oldincludedir ;;
- -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
- | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
- | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
- oldincludedir=$ac_optarg ;;
-
- -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
- ac_prev=prefix ;;
- -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
- prefix=$ac_optarg ;;
-
- -program-prefix | --program-prefix | --program-prefi | --program-pref \
- | --program-pre | --program-pr | --program-p)
- ac_prev=program_prefix ;;
- -program-prefix=* | --program-prefix=* | --program-prefi=* \
- | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
- program_prefix=$ac_optarg ;;
-
- -program-suffix | --program-suffix | --program-suffi | --program-suff \
- | --program-suf | --program-su | --program-s)
- ac_prev=program_suffix ;;
- -program-suffix=* | --program-suffix=* | --program-suffi=* \
- | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
- program_suffix=$ac_optarg ;;
-
- -program-transform-name | --program-transform-name \
- | --program-transform-nam | --program-transform-na \
- | --program-transform-n | --program-transform- \
- | --program-transform | --program-transfor \
- | --program-transfo | --program-transf \
- | --program-trans | --program-tran \
- | --progr-tra | --program-tr | --program-t)
- ac_prev=program_transform_name ;;
- -program-transform-name=* | --program-transform-name=* \
- | --program-transform-nam=* | --program-transform-na=* \
- | --program-transform-n=* | --program-transform-=* \
- | --program-transform=* | --program-transfor=* \
- | --program-transfo=* | --program-transf=* \
- | --program-trans=* | --program-tran=* \
- | --progr-tra=* | --program-tr=* | --program-t=*)
- program_transform_name=$ac_optarg ;;
-
- -q | -quiet | --quiet | --quie | --qui | --qu | --q \
- | -silent | --silent | --silen | --sile | --sil)
- silent=yes ;;
-
- -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
- ac_prev=sbindir ;;
- -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
- | --sbi=* | --sb=*)
- sbindir=$ac_optarg ;;
-
- -sharedstatedir | --sharedstatedir | --sharedstatedi \
- | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
- | --sharedst | --shareds | --shared | --share | --shar \
- | --sha | --sh)
- ac_prev=sharedstatedir ;;
- -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
- | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
- | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
- | --sha=* | --sh=*)
- sharedstatedir=$ac_optarg ;;
-
- -site | --site | --sit)
- ac_prev=site ;;
- -site=* | --site=* | --sit=*)
- site=$ac_optarg ;;
-
- -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
- ac_prev=srcdir ;;
- -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
- srcdir=$ac_optarg ;;
-
- -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
- | --syscon | --sysco | --sysc | --sys | --sy)
- ac_prev=sysconfdir ;;
- -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
- | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
- sysconfdir=$ac_optarg ;;
-
- -target | --target | --targe | --targ | --tar | --ta | --t)
- ac_prev=target_alias ;;
- -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
- target_alias=$ac_optarg ;;
-
- -v | -verbose | --verbose | --verbos | --verbo | --verb)
- verbose=yes ;;
-
- -version | --version | --versio | --versi | --vers | -V)
- ac_init_version=: ;;
-
- -with-* | --with-*)
- ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid package name: $ac_package" >&2
- { (exit 1); exit 1; }; }
- ac_package=`echo $ac_package| sed 's/-/_/g'`
- case $ac_option in
- *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
- *) ac_optarg=yes ;;
- esac
- eval "with_$ac_package='$ac_optarg'" ;;
-
- -without-* | --without-*)
- ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
- # Reject names that are not valid shell variable names.
- expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid package name: $ac_package" >&2
- { (exit 1); exit 1; }; }
- ac_package=`echo $ac_package | sed 's/-/_/g'`
- eval "with_$ac_package=no" ;;
-
- --x)
- # Obsolete; use --with-x.
- with_x=yes ;;
-
- -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
- | --x-incl | --x-inc | --x-in | --x-i)
- ac_prev=x_includes ;;
- -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
- | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
- x_includes=$ac_optarg ;;
-
- -x-libraries | --x-libraries | --x-librarie | --x-librari \
- | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
- ac_prev=x_libraries ;;
- -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
- | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
- x_libraries=$ac_optarg ;;
-
- -*) { echo "$as_me: error: unrecognized option: $ac_option
-Try \`$0 --help' for more information." >&2
- { (exit 1); exit 1; }; }
- ;;
-
- *=*)
- ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
- # Reject names that are not valid shell variable names.
- expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
- { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
- { (exit 1); exit 1; }; }
- ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
- eval "$ac_envvar='$ac_optarg'"
- export $ac_envvar ;;
-
- *)
- # FIXME: should be removed in autoconf 3.0.
- echo "$as_me: WARNING: you should use --build, --host, --target" >&2
- expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
- echo "$as_me: WARNING: invalid host type: $ac_option" >&2
- : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
- ;;
-
- esac
-done
-
-if test -n "$ac_prev"; then
- ac_option=--`echo $ac_prev | sed 's/_/-/g'`
- { echo "$as_me: error: missing argument to $ac_option" >&2
- { (exit 1); exit 1; }; }
-fi
-
-# Be sure to have absolute paths.
-for ac_var in exec_prefix prefix
-do
- eval ac_val=$`echo $ac_var`
- case $ac_val in
- [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
- *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
- { (exit 1); exit 1; }; };;
- esac
-done
-
-# Be sure to have absolute paths.
-for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
- localstatedir libdir includedir oldincludedir infodir mandir
-do
- eval ac_val=$`echo $ac_var`
- case $ac_val in
- [\\/$]* | ?:[\\/]* ) ;;
- *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
- { (exit 1); exit 1; }; };;
- esac
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
- if test "x$build_alias" = x; then
- cross_compiling=maybe
- echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
- If a cross compiler is detected then cross compile mode will be used." >&2
- elif test "x$build_alias" != "x$host_alias"; then
- cross_compiling=yes
- fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
- ac_srcdir_defaulted=yes
- # Try the directory containing this script, then its parent.
- ac_confdir=`(dirname "$0") 2>/dev/null ||
-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$0" : 'X\(//\)[^/]' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$0" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- srcdir=$ac_confdir
- if test ! -r $srcdir/$ac_unique_file; then
- srcdir=..
- fi
-else
- ac_srcdir_defaulted=no
-fi
-if test ! -r $srcdir/$ac_unique_file; then
- if test "$ac_srcdir_defaulted" = yes; then
- { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
- { (exit 1); exit 1; }; }
- else
- { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
- { (exit 1); exit 1; }; }
- fi
-fi
-srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
-ac_env_build_alias_set=${build_alias+set}
-ac_env_build_alias_value=$build_alias
-ac_cv_env_build_alias_set=${build_alias+set}
-ac_cv_env_build_alias_value=$build_alias
-ac_env_host_alias_set=${host_alias+set}
-ac_env_host_alias_value=$host_alias
-ac_cv_env_host_alias_set=${host_alias+set}
-ac_cv_env_host_alias_value=$host_alias
-ac_env_target_alias_set=${target_alias+set}
-ac_env_target_alias_value=$target_alias
-ac_cv_env_target_alias_set=${target_alias+set}
-ac_cv_env_target_alias_value=$target_alias
-ac_env_CC_set=${CC+set}
-ac_env_CC_value=$CC
-ac_cv_env_CC_set=${CC+set}
-ac_cv_env_CC_value=$CC
-ac_env_CFLAGS_set=${CFLAGS+set}
-ac_env_CFLAGS_value=$CFLAGS
-ac_cv_env_CFLAGS_set=${CFLAGS+set}
-ac_cv_env_CFLAGS_value=$CFLAGS
-ac_env_LDFLAGS_set=${LDFLAGS+set}
-ac_env_LDFLAGS_value=$LDFLAGS
-ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
-ac_cv_env_LDFLAGS_value=$LDFLAGS
-ac_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_env_CPPFLAGS_value=$CPPFLAGS
-ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
-ac_cv_env_CPPFLAGS_value=$CPPFLAGS
-ac_env_CPP_set=${CPP+set}
-ac_env_CPP_value=$CPP
-ac_cv_env_CPP_set=${CPP+set}
-ac_cv_env_CPP_value=$CPP
-ac_env_CXX_set=${CXX+set}
-ac_env_CXX_value=$CXX
-ac_cv_env_CXX_set=${CXX+set}
-ac_cv_env_CXX_value=$CXX
-ac_env_CXXFLAGS_set=${CXXFLAGS+set}
-ac_env_CXXFLAGS_value=$CXXFLAGS
-ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
-ac_cv_env_CXXFLAGS_value=$CXXFLAGS
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
- # Omit some internal or obsolete options to make the list less imposing.
- # This message is too long to be a string in the A/UX 3.1 sh.
- cat <<_ACEOF
-\`configure' configures xbase64 3.1.2 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE. See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
- -h, --help display this help and exit
- --help=short display options specific to this package
- --help=recursive display the short help of all the included packages
- -V, --version display version information and exit
- -q, --quiet, --silent do not print \`checking...' messages
- --cache-file=FILE cache test results in FILE [disabled]
- -C, --config-cache alias for \`--cache-file=config.cache'
- -n, --no-create do not create output files
- --srcdir=DIR find the sources in DIR [configure dir or \`..']
-
-_ACEOF
-
- cat <<_ACEOF
-Installation directories:
- --prefix=PREFIX install architecture-independent files in PREFIX
- [$ac_default_prefix]
- --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
- [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
- --bindir=DIR user executables [EPREFIX/bin]
- --sbindir=DIR system admin executables [EPREFIX/sbin]
- --libexecdir=DIR program executables [EPREFIX/libexec]
- --datadir=DIR read-only architecture-independent data [PREFIX/share]
- --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
- --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
- --localstatedir=DIR modifiable single-machine data [PREFIX/var]
- --libdir=DIR object code libraries [EPREFIX/lib]
- --includedir=DIR C header files [PREFIX/include]
- --oldincludedir=DIR C header files for non-gcc [/usr/include]
- --infodir=DIR info documentation [PREFIX/info]
- --mandir=DIR man documentation [PREFIX/man]
-_ACEOF
-
- cat <<\_ACEOF
-
-Program names:
- --program-prefix=PREFIX prepend PREFIX to installed program names
- --program-suffix=SUFFIX append SUFFIX to installed program names
- --program-transform-name=PROGRAM run sed PROGRAM on installed program names
-
-System types:
- --build=BUILD configure for building on BUILD [guessed]
- --host=HOST cross-compile to build programs to run on HOST [BUILD]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
- case $ac_init_help in
- short | recursive ) echo "Configuration of xbase64 3.1.2:";;
- esac
- cat <<\_ACEOF
-
-Optional Features:
- --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
- --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
- --disable-dependency-tracking Speeds up one-time builds
- --enable-dependency-tracking Do not reject slow dependency extractors
- --enable-shared=PKGS build shared libraries default=yes
- --enable-static=PKGS build static libraries default=yes
- --enable-fast-install=PKGS optimize for fast installation default=yes
- --disable-libtool-lock avoid locking (might break parallel builds)
- --disable-largefile omit support for large files
-
-Optional Packages:
- --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
- --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
- --with-gnu-ld assume the C compiler uses GNU ld default=no
- --with-pic try to use only PIC/non-PIC objects default=use both
- --without-index-ndx turn off .ndx index support
- --without-index-ntx turn off .ntx index support
- --without-memo-fields turn off memo fields support
- --without-expressions turn off expressions support
- --without-xbase-locking turn off XBase file locking
- --without-realdelete turn off XBase record deletion
- --without-xbase-filters turn off XBase filter logic
- --without-xbase-debug turn off XBase specific debug
- --without-largefile-support turn off Xbase 64 bit largefile support
-
-Some influential environment variables:
- CC C compiler command
- CFLAGS C compiler flags
- LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
- nonstandard directory <lib dir>
- CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
- headers in a nonstandard directory <include dir>
- CPP C preprocessor
- CXX C++ compiler command
- CXXFLAGS C++ compiler flags
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-Report bugs to <xbase64-devel@lists.sourceforge.net>.
-_ACEOF
-fi
-
-if test "$ac_init_help" = "recursive"; then
- # If there are subdirs, report their specific --help.
- ac_popdir=`pwd`
- for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
- test -d $ac_dir || continue
- ac_builddir=.
-
-if test "$ac_dir" != .; then
- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
- # A "../" for each directory in $ac_dir_suffix.
- ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
- ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
- .) # No --srcdir option. We are building in place.
- ac_srcdir=.
- if test -z "$ac_top_builddir"; then
- ac_top_srcdir=.
- else
- ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
- fi ;;
- [\\/]* | ?:[\\/]* ) # Absolute path.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir ;;
- *) # Relative path.
- ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
-
- cd $ac_dir
- # Check for guested configure; otherwise get Cygnus style configure.
- if test -f $ac_srcdir/configure.gnu; then
- echo
- $SHELL $ac_srcdir/configure.gnu --help=recursive
- elif test -f $ac_srcdir/configure; then
- echo
- $SHELL $ac_srcdir/configure --help=recursive
- elif test -f $ac_srcdir/configure.ac ||
- test -f $ac_srcdir/configure.in; then
- echo
- $ac_configure --help
- else
- echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
- fi
- cd $ac_popdir
- done
-fi
-
-test -n "$ac_init_help" && exit 0
-if $ac_init_version; then
- cat <<\_ACEOF
-xbase64 configure 3.1.2
-generated by GNU Autoconf 2.53
-
-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002
-Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
- exit 0
-fi
-exec 5>config.log
-cat >&5 <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by xbase64 $as_me 3.1.2, which was
-generated by GNU Autoconf 2.53. Invocation command line was
-
- $ $0 $@
-
-_ACEOF
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
-
-/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
-/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
-/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
-/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
-/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- echo "PATH: $as_dir"
-done
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Also quote any args containing shell meta-characters.
-ac_configure_args=
-ac_sep=
-for ac_arg
-do
- case $ac_arg in
- -no-create | --no-create | --no-creat | --no-crea | --no-cre \
- | --no-cr | --no-c | -n ) continue ;;
- -no-recursion | --no-recursion | --no-recursio | --no-recursi \
- | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
- continue ;;
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
- ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
- esac
- case " $ac_configure_args " in
- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
- *) ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
- ac_sep=" " ;;
- esac
- # Get rid of the leading space.
-done
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log. We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Be sure not to use single quotes in there, as some shells,
-# such as our DU 5.0 friend, will then `close' the trap.
-trap 'exit_status=$?
- # Save into config.log some information that might help in debugging.
- {
- echo
- cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
- echo
- # The following way of writing the cache mishandles newlines in values,
-{
- (set) 2>&1 |
- case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
- *ac_space=\ *)
- sed -n \
- "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
- ;;
- *)
- sed -n \
- "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
- ;;
- esac;
-}
- echo
- if test -s confdefs.h; then
- cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
- echo
- sed "/^$/d" confdefs.h
- echo
- fi
- test "$ac_signal" != 0 &&
- echo "$as_me: caught signal $ac_signal"
- echo "$as_me: exit $exit_status"
- } >&5
- rm -f core core.* *.core &&
- rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
- exit $exit_status
- ' 0
-for ac_signal in 1 2 13 15; do
- trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -rf conftest* confdefs.h
-# AIX cpp loses on an empty file, so make sure it contains at least a newline.
-echo >confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
- if test "x$prefix" != xNONE; then
- CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
- else
- CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
- fi
-fi
-for ac_site_file in $CONFIG_SITE; do
- if test -r "$ac_site_file"; then
- { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
-echo "$as_me: loading site script $ac_site_file" >&6;}
- sed 's/^/| /' "$ac_site_file" >&5
- . "$ac_site_file"
- fi
-done
-
-if test -r "$cache_file"; then
- # Some versions of bash will fail to source /dev/null (special
- # files actually), so we avoid doing that.
- if test -f "$cache_file"; then
- { echo "$as_me:$LINENO: loading cache $cache_file" >&5
-echo "$as_me: loading cache $cache_file" >&6;}
- case $cache_file in
- [\\/]* | ?:[\\/]* ) . $cache_file;;
- *) . ./$cache_file;;
- esac
- fi
-else
- { echo "$as_me:$LINENO: creating cache $cache_file" >&5
-echo "$as_me: creating cache $cache_file" >&6;}
- >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in `(set) 2>&1 |
- sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
- eval ac_old_set=\$ac_cv_env_${ac_var}_set
- eval ac_new_set=\$ac_env_${ac_var}_set
- eval ac_old_val="\$ac_cv_env_${ac_var}_value"
- eval ac_new_val="\$ac_env_${ac_var}_value"
- case $ac_old_set,$ac_new_set in
- set,)
- { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,set)
- { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
- ac_cache_corrupted=: ;;
- ,);;
- *)
- if test "x$ac_old_val" != "x$ac_new_val"; then
- { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
- { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
-echo "$as_me: former value: $ac_old_val" >&2;}
- { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
-echo "$as_me: current value: $ac_new_val" >&2;}
- ac_cache_corrupted=:
- fi;;
- esac
- # Pass precious variables to config.status.
- if test "$ac_new_set" = set; then
- case $ac_new_val in
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
- ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
- *) ac_arg=$ac_var=$ac_new_val ;;
- esac
- case " $ac_configure_args " in
- *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
- *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
- esac
- fi
-done
-if $ac_cache_corrupted; then
- { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
-echo "$as_me: error: changes in the environment can compromise the build" >&2;}
- { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-# set variable XSUBVARS with a list of sub directories to process
-XSUBDIRS="xbase64 examples bin html libtest"
-
-
-# look for AIX and MINIX environments
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}gcc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="gcc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- CC=$ac_ct_CC
-else
- CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="${ac_tool_prefix}cc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_CC"; then
- ac_ct_CC=$CC
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="cc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- CC=$ac_ct_CC
-else
- CC="$ac_cv_prog_CC"
-fi
-
-fi
-if test -z "$CC"; then
- # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
- ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
- ac_prog_rejected=yes
- continue
- fi
- ac_cv_prog_CC="cc"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-if test $ac_prog_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $ac_cv_prog_CC
- shift
- if test $# != 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same basename, so the bogon will be chosen
- # first if we set CC to just the basename; use the full file name.
- shift
- set dummy "$as_dir/$ac_word" ${1+"$@"}
- shift
- ac_cv_prog_CC="$@"
- fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$CC"; then
- if test -n "$ac_tool_prefix"; then
- for ac_prog in cl
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$CC"; then
- ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
- echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- test -n "$CC" && break
- done
-fi
-if test -z "$CC"; then
- ac_ct_CC=$CC
- for ac_prog in cl
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_CC"; then
- ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CC="$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
- echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- test -n "$ac_ct_CC" && break
-done
-
- CC=$ac_ct_CC
-fi
-
-fi
-
-
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH" >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH" >&2;}
- { (exit 1); exit 1; }; }
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
- "checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
- (eval $ac_compiler --version </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
- (eval $ac_compiler -v </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
- (eval $ac_compiler -V </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-echo "$as_me:$LINENO: checking for C compiler default output" >&5
-echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
- (eval $ac_link_default) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
- # Find the output, starting from the most likely. This scheme is
-# not robust to junk in `.', hence go to wildcards (a.*) only as a last
-# resort.
-
-# Be careful to initialize this variable, since it used to be cached.
-# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
-ac_cv_exeext=
-for ac_file in `ls a_out.exe a.exe conftest.exe 2>/dev/null;
- ls a.out conftest 2>/dev/null;
- ls a.* conftest.* 2>/dev/null`; do
- case $ac_file in
- *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb | *.xSYM ) ;;
- a.out ) # We found the default executable, but exeext='' is most
- # certainly right.
- break;;
- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
- export ac_cv_exeext
- break;;
- * ) break;;
- esac
-done
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables" >&5
-echo "$as_me: error: C compiler cannot create executables" >&2;}
- { (exit 77); exit 77; }; }
-fi
-
-ac_exeext=$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6
-
-# Check the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
- if { ac_try='./$ac_file'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- cross_compiling=no
- else
- if test "$cross_compiling" = maybe; then
- cross_compiling=yes
- else
- { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'." >&5
-echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'." >&2;}
- { (exit 1); exit 1; }; }
- fi
- fi
-fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-
-rm -f a.out a.exe conftest$ac_cv_exeext
-ac_clean_files=$ac_clean_files_save
-# Check the compiler produces executables we can run. If not, either
-# the compiler is broken, or we cross compile.
-echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6
-
-echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
- # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
- case $ac_file in
- *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;;
- *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
- export ac_cv_exeext
- break;;
- * ) break;;
- esac
-done
-else
- { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link" >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link" >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest$ac_cv_exeext
-echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
-if test "${ac_cv_objext+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
- for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
- case $ac_file in
- *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb ) ;;
- *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
- break;;
- esac
-done
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile" >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile" >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_compiler_gnu=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_compiler_gnu=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
-GCC=`test $ac_compiler_gnu = yes && echo yes`
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-CFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cc_g+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_prog_cc_g=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_prog_cc_g=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
-if test "$ac_test_CFLAGS" = set; then
- CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
- if test "$GCC" = yes; then
- CFLAGS="-g -O2"
- else
- CFLAGS="-g"
- fi
-else
- if test "$GCC" = yes; then
- CFLAGS="-O2"
- else
- CFLAGS=
- fi
-fi
-# Some people use a C++ compiler to compile C. Since we use `exit',
-# in C++ we need to declare it. In case someone uses the same compiler
-# for both compiling C and C++ we need to have the C++ compiler decide
-# the declaration of exit, since it's the most demanding environment.
-cat >conftest.$ac_ext <<_ACEOF
-#ifndef __cplusplus
- choke me
-#endif
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- for ac_declaration in \
- ''\
- '#include <stdlib.h>' \
- 'extern "C" void std::exit (int) throw (); using std::exit;' \
- 'extern "C" void std::exit (int); using std::exit;' \
- 'extern "C" void exit (int) throw ();' \
- 'extern "C" void exit (int);' \
- 'void exit (int);'
-do
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-$ac_declaration
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-exit (42);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-continue
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_declaration
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-exit (42);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- break
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
- echo '#ifdef __cplusplus' >>confdefs.h
- echo $ac_declaration >>confdefs.h
- echo '#endif' >>confdefs.h
-fi
-
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
- CPP=
-fi
-if test -z "$CPP"; then
- if test "${ac_cv_prog_CPP+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- # Double quotes because CPP needs to be expanded
- for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
- do
- ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <assert.h>
- Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- :
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether non-existent headers
- # can be detected and how.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- # Broken: success on invalid input.
-continue
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
- break
-fi
-
- done
- ac_cv_prog_CPP=$CPP
-
-fi
- CPP=$ac_cv_prog_CPP
-else
- ac_cv_prog_CPP=$CPP
-fi
-echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
- # Use a header file that comes with gcc, so configuring glibc
- # with a fresh cross-compiler works.
- # On the NeXT, cc -E runs the code through the compiler's parser,
- # not just through cpp. "Syntax error" is here to catch this case.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <assert.h>
- Syntax error
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- :
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- # Broken: fails on valid input.
-continue
-fi
-rm -f conftest.err conftest.$ac_ext
-
- # OK, works on sane cases. Now check whether non-existent headers
- # can be detected and how.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <ac_nonexistent.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- # Broken: success on invalid input.
-continue
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
- :
-else
- { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check" >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-echo "$as_me:$LINENO: checking for AIX" >&5
-echo $ECHO_N "checking for AIX... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#ifdef _AIX
- yes
-#endif
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "yes" >/dev/null 2>&1; then
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-cat >>confdefs.h <<\_ACEOF
-#define _ALL_SOURCE 1
-_ACEOF
-
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-rm -f conftest*
-
-
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
-if test "${ac_cv_header_stdc+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_cv_header_stdc=yes
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_cv_header_stdc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "memchr" >/dev/null 2>&1; then
- :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "free" >/dev/null 2>&1; then
- :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then
- :
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <ctype.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- exit(2);
- exit (0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-( exit $ac_status )
-ac_cv_header_stdc=no
-fi
-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
-if test $ac_cv_header_stdc = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-
-
-
-
-
-
-
-
-
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
- inttypes.h stdint.h unistd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_includes_default
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_Header=yes"
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-eval "$as_ac_Header=no"
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-if test "${ac_cv_header_minix_config_h+set}" = set; then
- echo "$as_me:$LINENO: checking for minix/config.h" >&5
-echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6
-if test "${ac_cv_header_minix_config_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
-echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking minix/config.h usability" >&5
-echo $ECHO_N "checking minix/config.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_includes_default
-#include <minix/config.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking minix/config.h presence" >&5
-echo $ECHO_N "checking minix/config.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <minix/config.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;};;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;};;
-esac
-echo "$as_me:$LINENO: checking for minix/config.h" >&5
-echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6
-if test "${ac_cv_header_minix_config_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_header_minix_config_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5
-echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6
-
-fi
-if test $ac_cv_header_minix_config_h = yes; then
- MINIX=yes
-else
- MINIX=
-fi
-
-
-if test "$MINIX" = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define _POSIX_SOURCE 1
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define _POSIX_1_SOURCE 2
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define _MINIX 1
-_ACEOF
-
-fi
-
-
-# build the following programs
-
-
-# init automake
-am__api_version="1.6"
-ac_aux_dir=
-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
- if test -f $ac_dir/install-sh; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install-sh -c"
- break
- elif test -f $ac_dir/install.sh; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/install.sh -c"
- break
- elif test -f $ac_dir/shtool; then
- ac_aux_dir=$ac_dir
- ac_install_sh="$ac_aux_dir/shtool install -c"
- break
- fi
-done
-if test -z "$ac_aux_dir"; then
- { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
-echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
- { (exit 1); exit 1; }; }
-fi
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"
-ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
-
-# Find a good install program. We prefer a C program (faster),
-# so one script is as good as another. But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# ./install, which can be erroneously created by make from ./install.sh.
-echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in
- ./ | .// | /cC/* | \
- /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
- /usr/ucb/* ) ;;
- *)
- # OSF1 and SCO ODT 3.0 have their own names for install.
- # Don't use installbsd from OSF since it installs stuff as root
- # by default.
- for ac_prog in ginstall scoinst install; do
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
- if test $ac_prog = install &&
- grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
- # AIX install. It has an incompatible calling convention.
- :
- elif test $ac_prog = install &&
- grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
- # program-specific install script used by HP pwplus--don't use.
- :
- else
- ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
- break 3
- fi
- fi
- done
- done
- ;;
-esac
-done
-
-
-fi
- if test "${ac_cv_path_install+set}" = set; then
- INSTALL=$ac_cv_path_install
- else
- # As a last resort, use the slow shell script. We don't cache a
- # path for INSTALL within a source directory, because that will
- # break other packages using the cache if that directory is
- # removed, or if the path is relative.
- INSTALL=$ac_install_sh
- fi
-fi
-echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-echo "$as_me:$LINENO: checking whether build environment is sane" >&5
-echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments. Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
- set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
- if test "$*" = "X"; then
- # -L didn't work.
- set X `ls -t $srcdir/configure conftest.file`
- fi
- rm -f conftest.file
- if test "$*" != "X $srcdir/configure conftest.file" \
- && test "$*" != "X conftest.file $srcdir/configure"; then
-
- # If neither matched, then we have a broken ls. This can happen
- # if, for instance, CONFIG_SHELL is bash and it inherits a
- # broken ls alias from the environment. This has actually
- # happened. Such a system could not be considered "sane".
- { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
-alias in your environment" >&5
-echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
-alias in your environment" >&2;}
- { (exit 1); exit 1; }; }
- fi
-
- test "$2" = conftest.file
- )
-then
- # Ok.
- :
-else
- { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
-Check your system clock" >&5
-echo "$as_me: error: newly created file is older than distributed files!
-Check your system clock" >&2;}
- { (exit 1); exit 1; }; }
-fi
-echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-test "$program_prefix" != NONE &&
- program_transform_name="s,^,$program_prefix,;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
- program_transform_name="s,\$,$program_suffix,;$program_transform_name"
-# Double any \ or $. echo might interpret backslashes.
-# By default was `s,x,x', remove it if useless.
-cat <<\_ACEOF >conftest.sed
-s/[\\$]/&&/g;s/;s,x,x,$//
-_ACEOF
-program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
-rm conftest.sed
-
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
- am_missing_run="$MISSING --run "
-else
- am_missing_run=
- { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
-echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-for ac_prog in gawk mawk nawk awk
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_AWK+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$AWK"; then
- ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_AWK="$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
- echo "$as_me:$LINENO: result: $AWK" >&5
-echo "${ECHO_T}$AWK" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- test -n "$AWK" && break
-done
-
-echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \${MAKE}" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
-set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
-if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.make <<\_ACEOF
-all:
- @echo 'ac_maketemp="${MAKE}"'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
-if test -n "$ac_maketemp"; then
- eval ac_cv_prog_make_${ac_make}_set=yes
-else
- eval ac_cv_prog_make_${ac_make}_set=no
-fi
-rm -f conftest.make
-fi
-if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
- SET_MAKE=
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
- SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -f .deps 2>/dev/null
-mkdir .deps 2>/dev/null
-if test -d .deps; then
- DEPDIR=.deps
-else
- # MS-DOS does not allow filenames that begin with a dot.
- DEPDIR=_deps
-fi
-rmdir .deps 2>/dev/null
-
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-doit:
- @echo done
-END
-# If we don't find an include directive, just comment out the code.
-echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
-echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# We grep out `Entering directory' and `Leaving directory'
-# messages which can occur if `w' ends up in MAKEFLAGS.
-# In particular we don't look at `^make:' because GNU make might
-# be invoked under some other name (usually "gmake"), in which
-# case it prints its new name instead of `make'.
-if test "`$am_make -s -f confmf 2> /dev/null | fgrep -v 'ing directory'`" = "done"; then
- am__include=include
- am__quote=
- _am_result=GNU
-fi
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
- echo '.include "confinc"' > confmf
- if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
- am__include=.include
- am__quote="\""
- _am_result=BSD
- fi
-fi
-
-
-echo "$as_me:$LINENO: result: $_am_result" >&5
-echo "${ECHO_T}$_am_result" >&6
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then
- enableval="$enable_dependency_tracking"
-
-fi;
-if test "x$enable_dependency_tracking" != xno; then
- am_depcomp="$ac_aux_dir/depcomp"
- AMDEPBACKSLASH='\'
-fi
-
-
-if test "x$enable_dependency_tracking" != xno; then
- AMDEP_TRUE=
- AMDEP_FALSE='#'
-else
- AMDEP_TRUE='#'
- AMDEP_FALSE=
-fi
-
-
-
- # test to see if srcdir already configured
-if test "`cd $srcdir && pwd`" != "`pwd`" &&
- test -f $srcdir/config.status; then
- { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
-echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-# Define the identity of the package.
- PACKAGE=xbase64
- VERSION=3.1.2
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-install_sh=${install_sh-"$am_aux_dir/install-sh"}
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'. However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
- if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_STRIP+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$STRIP"; then
- ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_STRIP="${ac_tool_prefix}strip"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
- echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
- ac_ct_STRIP=$STRIP
- # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_STRIP"; then
- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_STRIP="strip"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
- test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
- echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- STRIP=$ac_ct_STRIP
-else
- STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
-
-# We need awk for the "check" target. The system "awk" is bad on
-# some platforms.
-
-
-depcc="$CC" am_compiler_list=
-
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
-
- am_cv_CC_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
- fi
- for depmode in $am_compiler_list; do
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- echo '#include "conftest.h"' > conftest.c
- echo 'int i;' > conftest.h
- echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf
-
- case $depmode in
- nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- none) break ;;
- esac
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this.
- if depmode=$depmode \
- source=conftest.c object=conftest.o \
- depfile=conftest.Po tmpdepfile=conftest.TPo \
- $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 &&
- grep conftest.h conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- am_cv_CC_dependencies_compiler_type=$depmode
- break
- fi
- done
-
- cd ..
- rm -rf conftest.dir
-else
- am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
-
-
-
-# create this header file
-# Add the stamp file to the list of files AC keeps track of,
-# along with our hook.
-ac_config_headers="$ac_config_headers xbase64/xbconfig.h:xbase64/xbconfig.in"
-
-
-
-
-#create a library
-# Check whether --enable-shared or --disable-shared was given.
-if test "${enable_shared+set}" = set; then
- enableval="$enable_shared"
- p=${PACKAGE-default}
-case $enableval in
-yes) enable_shared=yes ;;
-no) enable_shared=no ;;
-*)
- enable_shared=no
- # Look at the argument we got. We use all the common list separators.
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
- for pkg in $enableval; do
- if test "X$pkg" = "X$p"; then
- enable_shared=yes
- fi
- done
- IFS="$ac_save_ifs"
- ;;
-esac
-else
- enable_shared=yes
-fi;
-# Check whether --enable-static or --disable-static was given.
-if test "${enable_static+set}" = set; then
- enableval="$enable_static"
- p=${PACKAGE-default}
-case $enableval in
-yes) enable_static=yes ;;
-no) enable_static=no ;;
-*)
- enable_static=no
- # Look at the argument we got. We use all the common list separators.
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
- for pkg in $enableval; do
- if test "X$pkg" = "X$p"; then
- enable_static=yes
- fi
- done
- IFS="$ac_save_ifs"
- ;;
-esac
-else
- enable_static=yes
-fi;
-# Check whether --enable-fast-install or --disable-fast-install was given.
-if test "${enable_fast_install+set}" = set; then
- enableval="$enable_fast_install"
- p=${PACKAGE-default}
-case $enableval in
-yes) enable_fast_install=yes ;;
-no) enable_fast_install=no ;;
-*)
- enable_fast_install=no
- # Look at the argument we got. We use all the common list separators.
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
- for pkg in $enableval; do
- if test "X$pkg" = "X$p"; then
- enable_fast_install=yes
- fi
- done
- IFS="$ac_save_ifs"
- ;;
-esac
-else
- enable_fast_install=yes
-fi;
-# Make sure we can run config.sub.
-$ac_config_sub sun4 >/dev/null 2>&1 ||
- { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
-echo "$as_me: error: cannot run $ac_config_sub" >&2;}
- { (exit 1); exit 1; }; }
-
-echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6
-if test "${ac_cv_build+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_build_alias=$build_alias
-test -z "$ac_cv_build_alias" &&
- ac_cv_build_alias=`$ac_config_guess`
-test -z "$ac_cv_build_alias" &&
- { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
- { (exit 1); exit 1; }; }
-ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
- { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
- { (exit 1); exit 1; }; }
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6
-build=$ac_cv_build
-build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-
-echo "$as_me:$LINENO: checking host system type" >&5
-echo $ECHO_N "checking host system type... $ECHO_C" >&6
-if test "${ac_cv_host+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_host_alias=$host_alias
-test -z "$ac_cv_host_alias" &&
- ac_cv_host_alias=$ac_cv_build_alias
-ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
- { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
-echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
- { (exit 1); exit 1; }; }
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_host" >&5
-echo "${ECHO_T}$ac_cv_host" >&6
-host=$ac_cv_host
-host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-
-# Find the correct PATH separator. Usually this is `:', but
-# DJGPP uses `;' like DOS.
-if test "X${PATH_SEPARATOR+set}" != Xset; then
- UNAME=${UNAME-`uname 2>/dev/null`}
- case X$UNAME in
- *-DOS) lt_cv_sys_path_separator=';' ;;
- *) lt_cv_sys_path_separator=':' ;;
- esac
- PATH_SEPARATOR=$lt_cv_sys_path_separator
-fi
-
-
-# Check whether --with-gnu-ld or --without-gnu-ld was given.
-if test "${with_gnu_ld+set}" = set; then
- withval="$with_gnu_ld"
- test "$withval" = no || with_gnu_ld=yes
-else
- with_gnu_ld=no
-fi;
-ac_prog=ld
-if test "$GCC" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- echo "$as_me:$LINENO: checking for ld used by GCC" >&5
-echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6
- case $host in
- *-*-mingw*)
- # gcc leaves a trailing carriage return which upsets mingw
- ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
- *)
- ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
- esac
- case $ac_prog in
- # Accept absolute paths.
- [\\/]* | [A-Za-z]:[\\/]*)
- re_direlt='/[^/][^/]*/\.\./'
- # Canonicalize the path of ld
- ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
- while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
- done
- test -z "$LD" && LD="$ac_prog"
- ;;
- "")
- # If it fails, then pretend we aren't using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
-elif test "$with_gnu_ld" = yes; then
- echo "$as_me:$LINENO: checking for GNU ld" >&5
-echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
-else
- echo "$as_me:$LINENO: checking for non-GNU ld" >&5
-echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
-fi
-if test "${lt_cv_path_LD+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -z "$LD"; then
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH; do
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
- lt_cv_path_LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some GNU ld's only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- if "$lt_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
- test "$with_gnu_ld" != no && break
- else
- test "$with_gnu_ld" != yes && break
- fi
- fi
- done
- IFS="$ac_save_ifs"
-else
- lt_cv_path_LD="$LD" # Let the user override the test with a path.
-fi
-fi
-
-LD="$lt_cv_path_LD"
-if test -n "$LD"; then
- echo "$as_me:$LINENO: result: $LD" >&5
-echo "${ECHO_T}$LD" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
-echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
- { (exit 1); exit 1; }; }
-echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
-echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
-if test "${lt_cv_prog_gnu_ld+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- # I'd rather use --version here, but apparently some GNU ld's only accept -v.
-if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
- lt_cv_prog_gnu_ld=yes
-else
- lt_cv_prog_gnu_ld=no
-fi
-fi
-echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
-echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
-with_gnu_ld=$lt_cv_prog_gnu_ld
-
-
-echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
-echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
-if test "${lt_cv_ld_reload_flag+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- lt_cv_ld_reload_flag='-r'
-fi
-echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
-echo "${ECHO_T}$lt_cv_ld_reload_flag" >&6
-reload_flag=$lt_cv_ld_reload_flag
-test -n "$reload_flag" && reload_flag=" $reload_flag"
-
-echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
-echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
-if test "${lt_cv_path_NM+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$NM"; then
- # Let the user override the test.
- lt_cv_path_NM="$NM"
-else
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
- for ac_dir in $PATH /usr/ccs/bin /usr/ucb /bin; do
- test -z "$ac_dir" && ac_dir=.
- tmp_nm=$ac_dir/${ac_tool_prefix}nm
- if test -f $tmp_nm || test -f $tmp_nm$ac_exeext ; then
- # Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
- # nm: unknown option "B" ignored
- # Tru64's nm complains that /dev/null is an invalid object file
- if ($tmp_nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep '(/dev/null|Invalid file or object type)' >/dev/null; then
- lt_cv_path_NM="$tmp_nm -B"
- break
- elif ($tmp_nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
- lt_cv_path_NM="$tmp_nm -p"
- break
- else
- lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
- continue # so that we can try to find one that supports BSD flags
- fi
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
-fi
-fi
-
-NM="$lt_cv_path_NM"
-echo "$as_me:$LINENO: result: $NM" >&5
-echo "${ECHO_T}$NM" >&6
-
-echo "$as_me:$LINENO: checking whether ln -s works" >&5
-echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
-LN_S=$as_ln_s
-if test "$LN_S" = "ln -s"; then
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
- echo "$as_me:$LINENO: result: no, using $LN_S" >&5
-echo "${ECHO_T}no, using $LN_S" >&6
-fi
-
-echo "$as_me:$LINENO: checking how to recognise dependant libraries" >&5
-echo $ECHO_N "checking how to recognise dependant libraries... $ECHO_C" >&6
-if test "${lt_cv_deplibs_check_method+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- lt_cv_file_magic_cmd='$MAGIC_CMD'
-lt_cv_file_magic_test_file=
-lt_cv_deplibs_check_method='unknown'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# `unknown' -- same as none, but documents that we really don't know.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_magic [[regex]]' -- check by looking for files in library path
-# which responds to the $file_magic_cmd with a given egrep regex.
-# If you have `file' or equivalent on your system and you're not sure
-# whether `pass_all' will *always* work, you probably want this one.
-
-case $host_os in
-aix4* | aix5*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-beos*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-bsdi4*)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
- lt_cv_file_magic_test_file=/shlib/libc.so
- ;;
-
-cygwin* | mingw* | pw32*)
- lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
- lt_cv_file_magic_cmd='$OBJDUMP -f'
- ;;
-
-darwin* | rhapsody*)
- lt_cv_deplibs_check_method='file_magic Mach-O dynamically linked shared library'
- lt_cv_file_magic_cmd='/usr/bin/file -L'
- case "$host_os" in
- rhapsody* | darwin1.[012])
- lt_cv_file_magic_test_file=`echo /System/Library/Frameworks/System.framework/Versions/*/System | head -1`
- ;;
- *) # Darwin 1.3 on
- lt_cv_file_magic_test_file='/usr/lib/libSystem.dylib'
- ;;
- esac
- ;;
-
-freebsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
- case $host_cpu in
- i*86 )
- # Not sure whether the presence of OpenBSD here was a mistake.
- # Let's accept both of them until this is cleared up.
- lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD)/i[3-9]86 (compact )?demand paged shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
- ;;
- esac
- else
- lt_cv_deplibs_check_method=pass_all
- fi
- ;;
-
-gnu*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-hpux10.20*|hpux11*)
- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=/usr/lib/libc.sl
- ;;
-
-irix5* | irix6*)
- case $host_os in
- irix5*)
- # this will be overridden with pass_all, but let us keep it just in case
- lt_cv_deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1"
- ;;
- *)
- case $LD in
- *-32|*"-32 ") libmagic=32-bit;;
- *-n32|*"-n32 ") libmagic=N32;;
- *-64|*"-64 ") libmagic=64-bit;;
- *) libmagic=never-match;;
- esac
- # this will be overridden with pass_all, but let us keep it just in case
- lt_cv_deplibs_check_method="file_magic ELF ${libmagic} MSB mips-[1234] dynamic lib MIPS - version 1"
- ;;
- esac
- lt_cv_file_magic_test_file=`echo /lib${libsuff}/libc.so*`
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-# This must be Linux ELF.
-linux-gnu*)
- case $host_cpu in
- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | s390* )
- lt_cv_deplibs_check_method=pass_all ;;
- *)
- # glibc up to 2.1.1 does not perform some relocations on ARM
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;;
- esac
- lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so`
- ;;
-
-netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
- lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'
- else
- lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so$'
- fi
- ;;
-
-newos6*)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=/usr/lib/libnls.so
- ;;
-
-openbsd*)
- lt_cv_file_magic_cmd=/usr/bin/file
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object'
- else
- lt_cv_deplibs_check_method='file_magic OpenBSD.* shared library'
- fi
- ;;
-
-osf3* | osf4* | osf5*)
- # this will be overridden with pass_all, but let us keep it just in case
- lt_cv_deplibs_check_method='file_magic COFF format alpha shared library'
- lt_cv_file_magic_test_file=/shlib/libc.so
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sco3.2v5*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-solaris*)
- lt_cv_deplibs_check_method=pass_all
- lt_cv_file_magic_test_file=/lib/libc.so
- ;;
-
-sysv5uw[78]* | sysv4*uw2*)
- lt_cv_deplibs_check_method=pass_all
- ;;
-
-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- case $host_vendor in
- motorola)
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
- lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
- ;;
- ncr)
- lt_cv_deplibs_check_method=pass_all
- ;;
- sequent)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
- ;;
- sni)
- lt_cv_file_magic_cmd='/bin/file'
- lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
- lt_cv_file_magic_test_file=/lib/libc.so
- ;;
- esac
- ;;
-esac
-
-fi
-echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
-echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
-file_magic_cmd=$lt_cv_file_magic_cmd
-deplibs_check_method=$lt_cv_deplibs_check_method
-
-
-
-
-
-
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-echo "$as_me:$LINENO: checking command to parse $NM output" >&5
-echo $ECHO_N "checking command to parse $NM output... $ECHO_C" >&6
-if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix. What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRST]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Transform the above into a raw symbol and a C symbol.
-symxfrm='\1 \2\3 \3'
-
-# Transform an extracted symbol line into a proper C declaration
-lt_cv_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'"
-
-# Transform an extracted symbol line into symbol name and symbol address
-lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
-
-# Define system-specific variables.
-case $host_os in
-aix*)
- symcode='[BCDT]'
- ;;
-cygwin* | mingw* | pw32*)
- symcode='[ABCDGISTW]'
- ;;
-hpux*) # Its linker distinguishes data from code symbols
- lt_cv_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
- lt_cv_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
- ;;
-irix*)
- symcode='[BCDEGRST]'
- ;;
-solaris* | sysv5*)
- symcode='[BDT]'
- ;;
-sysv4)
- symcode='[DFNSTU]'
- ;;
-esac
-
-# Handle CRLF in mingw tool chain
-opt_cr=
-case $host_os in
-mingw*)
- opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
- ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
- symcode='[ABCDGISTW]'
-fi
-
-# Try without a prefix undercore, then with it.
-for ac_symprfx in "" "_"; do
-
- # Write the raw and C identifiers.
-lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*\($ac_symprfx\)$sympat$opt_cr$/$symxfrm/p'"
-
- # Check to see that the pipe works correctly.
- pipe_works=no
- rm -f conftest*
- cat > conftest.$ac_ext <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-int main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
-
- if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
- # Now try to grab the symbols.
- nlist=conftest.nm
- if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5
- (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && test -s "$nlist"; then
- # Try sorting and uniquifying the output.
- if sort "$nlist" | uniq > "$nlist"T; then
- mv -f "$nlist"T "$nlist"
- else
- rm -f "$nlist"T
- fi
-
- # Make sure that we snagged all the symbols we need.
- if egrep ' nm_test_var$' "$nlist" >/dev/null; then
- if egrep ' nm_test_func$' "$nlist" >/dev/null; then
- cat <<EOF > conftest.$ac_ext
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EOF
- # Now generate the symbol file.
- eval "$lt_cv_global_symbol_to_cdecl"' < "$nlist" >> conftest.$ac_ext'
-
- cat <<EOF >> conftest.$ac_ext
-#if defined (__STDC__) && __STDC__
-# define lt_ptr void *
-#else
-# define lt_ptr char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
- const char *name;
- lt_ptr address;
-}
-lt_preloaded_symbols[] =
-{
-EOF
- sed "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr) \&\2},/" < "$nlist" >> conftest.$ac_ext
- cat <<\EOF >> conftest.$ac_ext
- {0, (lt_ptr) 0}
-};
-
-#ifdef __cplusplus
-}
-#endif
-EOF
- # Now try linking the two files.
- mv conftest.$ac_objext conftstm.$ac_objext
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
- LIBS="conftstm.$ac_objext"
- CFLAGS="$CFLAGS$no_builtin_flag"
- if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && test -s conftest; then
- pipe_works=yes
- fi
- LIBS="$save_LIBS"
- CFLAGS="$save_CFLAGS"
- else
- echo "cannot find nm_test_func in $nlist" >&5
- fi
- else
- echo "cannot find nm_test_var in $nlist" >&5
- fi
- else
- echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
- fi
- else
- echo "$progname: failed program was:" >&5
- cat conftest.$ac_ext >&5
- fi
- rm -f conftest* conftst*
-
- # Do not use the global_symbol_pipe unless it works.
- if test "$pipe_works" = yes; then
- break
- else
- lt_cv_sys_global_symbol_pipe=
- fi
-done
-
-fi
-
-global_symbol_pipe="$lt_cv_sys_global_symbol_pipe"
-if test -z "$lt_cv_sys_global_symbol_pipe"; then
- global_symbol_to_cdecl=
- global_symbol_to_c_name_address=
-else
- global_symbol_to_cdecl="$lt_cv_global_symbol_to_cdecl"
- global_symbol_to_c_name_address="$lt_cv_global_symbol_to_c_name_address"
-fi
-if test -z "$global_symbol_pipe$global_symbol_to_cdec$global_symbol_to_c_name_address";
-then
- echo "$as_me:$LINENO: result: failed" >&5
-echo "${ECHO_T}failed" >&6
-else
- echo "$as_me:$LINENO: result: ok" >&5
-echo "${ECHO_T}ok" >&6
-fi
-
-
-for ac_header in dlfcn.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
- echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking $ac_header usability" >&5
-echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_includes_default
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking $ac_header presence" >&5
-echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <$ac_header>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
-echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;};;
-esac
-echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
-if eval "test \"\${$as_ac_Header+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- eval "$as_ac_Header=$ac_header_preproc"
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
-
-fi
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-
-
-
-# Only perform the check for file, if the check method requires it
-case $deplibs_check_method in
-file_magic*)
- if test "$file_magic_cmd" = '$MAGIC_CMD'; then
- echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
-echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- case $MAGIC_CMD in
- /*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
- ?:/*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
- ;;
- *)
- ac_save_MAGIC_CMD="$MAGIC_CMD"
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="/usr/bin:$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/${ac_tool_prefix}file; then
- lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- egrep "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$ac_save_ifs"
- MAGIC_CMD="$ac_save_MAGIC_CMD"
- ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-if test -z "$lt_cv_path_MAGIC_CMD"; then
- if test -n "$ac_tool_prefix"; then
- echo "$as_me:$LINENO: checking for file" >&5
-echo $ECHO_N "checking for file... $ECHO_C" >&6
-if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- case $MAGIC_CMD in
- /*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
- ;;
- ?:/*)
- lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a dos path.
- ;;
- *)
- ac_save_MAGIC_CMD="$MAGIC_CMD"
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
- ac_dummy="/usr/bin:$PATH"
- for ac_dir in $ac_dummy; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/file; then
- lt_cv_path_MAGIC_CMD="$ac_dir/file"
- if test -n "$file_magic_test_file"; then
- case $deplibs_check_method in
- "file_magic "*)
- file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`"
- MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
- if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
- egrep "$file_magic_regex" > /dev/null; then
- :
- else
- cat <<EOF 1>&2
-
-*** Warning: the command libtool uses to detect shared libraries,
-*** $file_magic_cmd, produces output that libtool cannot recognize.
-*** The result is that libtool may fail to recognize shared libraries
-*** as such. This will affect the creation of libtool libraries that
-*** depend on shared libraries, but programs linked with such libtool
-*** libraries will work regardless of this problem. Nevertheless, you
-*** may want to report the problem to your system manager and/or to
-*** bug-libtool@gnu.org
-
-EOF
- fi ;;
- esac
- fi
- break
- fi
- done
- IFS="$ac_save_ifs"
- MAGIC_CMD="$ac_save_MAGIC_CMD"
- ;;
-esac
-fi
-
-MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
-if test -n "$MAGIC_CMD"; then
- echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
-echo "${ECHO_T}$MAGIC_CMD" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- else
- MAGIC_CMD=:
- fi
-fi
-
- fi
- ;;
-esac
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_RANLIB+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$RANLIB"; then
- ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
- echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
- ac_ct_RANLIB=$RANLIB
- # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_RANLIB"; then
- ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_RANLIB="ranlib"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
- test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
- echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- RANLIB=$ac_ct_RANLIB
-else
- RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-if test -n "$ac_tool_prefix"; then
- # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_STRIP+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$STRIP"; then
- ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_STRIP="${ac_tool_prefix}strip"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
- echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
- ac_ct_STRIP=$STRIP
- # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_STRIP"; then
- ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_STRIP="strip"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
- test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
- echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- STRIP=$ac_ct_STRIP
-else
- STRIP="$ac_cv_prog_STRIP"
-fi
-
-
-enable_dlopen=no
-enable_win32_dll=no
-
-# Check whether --enable-libtool-lock or --disable-libtool-lock was given.
-if test "${enable_libtool_lock+set}" = set; then
- enableval="$enable_libtool_lock"
-
-fi;
-test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
-# Some flags need to be propagated to the compiler or linker for good
-# libtool support.
-case $host in
-*-*-irix6*)
- # Find out which ABI we are using.
- echo '#line 4360 "configure"' > conftest.$ac_ext
- if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
- case `/usr/bin/file conftest.$ac_objext` in
- *32-bit*)
- LD="${LD-ld} -32"
- ;;
- *N32*)
- LD="${LD-ld} -n32"
- ;;
- *64-bit*)
- LD="${LD-ld} -64"
- ;;
- esac
- fi
- rm -rf conftest*
- ;;
-
-*-*-sco3.2v5*)
- # On SCO OpenServer 5, we need -belf to get full-featured binaries.
- SAVE_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -belf"
- echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
-echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
-if test "${lt_cv_cc_needs_belf+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- lt_cv_cc_needs_belf=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-lt_cv_cc_needs_belf=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-fi
-echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
-echo "${ECHO_T}$lt_cv_cc_needs_belf" >&6
- if test x"$lt_cv_cc_needs_belf" != x"yes"; then
- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
- CFLAGS="$SAVE_CFLAGS"
- fi
- ;;
-
-
-esac
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e s/^X//'
-sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
-
-# Sed substitution to delay expansion of an escaped shell variable in a
-# double_quote_subst'ed string.
-delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-# Constants:
-rm="rm -f"
-
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
-
-# All known linkers require a `.a' archive for static linking (except M$VC,
-# which needs '.lib').
-libext=a
-ltmain="$ac_aux_dir/ltmain.sh"
-ofile="$default_ofile"
-with_gnu_ld="$lt_cv_prog_gnu_ld"
-need_locks="$enable_libtool_lock"
-
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-
-# Set sane defaults for various variables
-test -z "$AR" && AR=ar
-test -z "$AR_FLAGS" && AR_FLAGS=cru
-test -z "$AS" && AS=as
-test -z "$CC" && CC=cc
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$LD" && LD=ld
-test -z "$LN_S" && LN_S="ln -s"
-test -z "$MAGIC_CMD" && MAGIC_CMD=file
-test -z "$NM" && NM=nm
-test -z "$OBJDUMP" && OBJDUMP=objdump
-test -z "$RANLIB" && RANLIB=:
-test -z "$STRIP" && STRIP=:
-test -z "$ac_objext" && ac_objext=o
-
-if test x"$host" != x"$build"; then
- ac_tool_prefix=${host_alias}-
-else
- ac_tool_prefix=
-fi
-
-# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
-case $host_os in
-linux-gnu*) ;;
-linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
-esac
-
-case $host_os in
-aix3*)
- # AIX sometimes has problems with the GCC collect2 program. For some
- # reason, if we set the COLLECT_NAMES environment variable, the problems
- # vanish in a puff of smoke.
- if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
- fi
- ;;
-esac
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-if test -n "$RANLIB"; then
- case $host_os in
- openbsd*)
- old_postinstall_cmds="\$RANLIB -t \$oldlib~$old_postinstall_cmds"
- ;;
- *)
- old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
- ;;
- esac
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
-fi
-
-# Allow CC to be a program name with arguments.
-set dummy $CC
-compiler="$2"
-
-echo "$as_me:$LINENO: checking for objdir" >&5
-echo $ECHO_N "checking for objdir... $ECHO_C" >&6
-rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
- objdir=.libs
-else
- # MS-DOS does not allow filenames that begin with a dot.
- objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-echo "$as_me:$LINENO: result: $objdir" >&5
-echo "${ECHO_T}$objdir" >&6
-
-
-
-# Check whether --with-pic or --without-pic was given.
-if test "${with_pic+set}" = set; then
- withval="$with_pic"
- pic_mode="$withval"
-else
- pic_mode=default
-fi;
-test -z "$pic_mode" && pic_mode=default
-
-# We assume here that the value for lt_cv_prog_cc_pic will not be cached
-# in isolation, and that seeing it set (from the cache) indicates that
-# the associated values are set (in the cache) correctly too.
-echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
-echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
-if test "${lt_cv_prog_cc_pic+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- lt_cv_prog_cc_pic=
- lt_cv_prog_cc_shlib=
- lt_cv_prog_cc_wl=
- lt_cv_prog_cc_static=
- lt_cv_prog_cc_no_builtin=
- lt_cv_prog_cc_can_build_shared=$can_build_shared
-
- if test "$GCC" = yes; then
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static='-static'
-
- case $host_os in
- aix*)
- # Below there is a dirty hack to force normal static linking with -ldl
- # The problem is because libdl dynamically linked with both libc and
- # libC (AIX C++ library), which obviously doesn't included in libraries
- # list by gcc. This cause undefined symbols with -static flags.
- # This hack allows C programs to be linked with "-static -ldl", but
- # not sure about C++ programs.
- lt_cv_prog_cc_static="$lt_cv_prog_cc_static ${lt_cv_prog_cc_wl}-lC"
- ;;
- amigaos*)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- lt_cv_prog_cc_pic='-m68020 -resident32 -malways-restore-a4'
- ;;
- beos* | irix5* | irix6* | osf3* | osf4* | osf5*)
- # PIC is the default for these OSes.
- ;;
- darwin* | rhapsody*)
- # PIC is the default on this platform
- # Common symbols not allowed in MH_DYLIB files
- lt_cv_prog_cc_pic='-fno-common'
- ;;
- cygwin* | mingw* | pw32* | os2*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- lt_cv_prog_cc_pic='-DDLL_EXPORT'
- ;;
- sysv4*MP*)
- if test -d /usr/nec; then
- lt_cv_prog_cc_pic=-Kconform_pic
- fi
- ;;
- *)
- lt_cv_prog_cc_pic='-fPIC'
- ;;
- esac
- else
- # PORTME Check for PIC flags for the system compiler.
- case $host_os in
- aix3* | aix4* | aix5*)
- lt_cv_prog_cc_wl='-Wl,'
- # All AIX code is PIC.
- if test "$host_cpu" = ia64; then
- # AIX 5 now supports IA64 processor
- lt_cv_prog_cc_static='-Bstatic'
- else
- lt_cv_prog_cc_static='-bnso -bI:/lib/syscalls.exp'
- fi
- ;;
-
- hpux9* | hpux10* | hpux11*)
- # Is there a better lt_cv_prog_cc_static that works with the bundled CC?
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static="${lt_cv_prog_cc_wl}-a ${lt_cv_prog_cc_wl}archive"
- lt_cv_prog_cc_pic='+Z'
- ;;
-
- irix5* | irix6*)
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static='-non_shared'
- # PIC (with -KPIC) is the default.
- ;;
-
- cygwin* | mingw* | pw32* | os2*)
- # This hack is so that the source file can tell whether it is being
- # built for inclusion in a dll (and should export symbols for example).
- lt_cv_prog_cc_pic='-DDLL_EXPORT'
- ;;
-
- newsos6)
- lt_cv_prog_cc_pic='-KPIC'
- lt_cv_prog_cc_static='-Bstatic'
- ;;
-
- osf3* | osf4* | osf5*)
- # All OSF/1 code is PIC.
- lt_cv_prog_cc_wl='-Wl,'
- lt_cv_prog_cc_static='-non_shared'
- ;;
-
- sco3.2v5*)
- lt_cv_prog_cc_pic='-Kpic'
- lt_cv_prog_cc_static='-dn'
- lt_cv_prog_cc_shlib='-belf'
- ;;
-
- solaris*)
- lt_cv_prog_cc_pic='-KPIC'
- lt_cv_prog_cc_static='-Bstatic'
- lt_cv_prog_cc_wl='-Wl,'
- ;;
-
- sunos4*)
- lt_cv_prog_cc_pic='-PIC'
- lt_cv_prog_cc_static='-Bstatic'
- lt_cv_prog_cc_wl='-Qoption ld '
- ;;
-
- sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- lt_cv_prog_cc_pic='-KPIC'
- lt_cv_prog_cc_static='-Bstatic'
- if test "x$host_vendor" = xsni; then
- lt_cv_prog_cc_wl='-LD'
- else
- lt_cv_prog_cc_wl='-Wl,'
- fi
- ;;
-
- uts4*)
- lt_cv_prog_cc_pic='-pic'
- lt_cv_prog_cc_static='-Bstatic'
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec ;then
- lt_cv_prog_cc_pic='-Kconform_pic'
- lt_cv_prog_cc_static='-Bstatic'
- fi
- ;;
-
- *)
- lt_cv_prog_cc_can_build_shared=no
- ;;
- esac
- fi
-
-fi
-
-if test -z "$lt_cv_prog_cc_pic"; then
- echo "$as_me:$LINENO: result: none" >&5
-echo "${ECHO_T}none" >&6
-else
- echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic" >&5
-echo "${ECHO_T}$lt_cv_prog_cc_pic" >&6
-
- # Check to make sure the pic_flag actually works.
- echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_cv_prog_cc_pic works" >&5
-echo $ECHO_N "checking if $compiler PIC flag $lt_cv_prog_cc_pic works... $ECHO_C" >&6
- if test "${lt_cv_prog_cc_pic_works+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $lt_cv_prog_cc_pic -DPIC"
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- case $host_os in
- hpux9* | hpux10* | hpux11*)
- # On HP-UX, both CC and GCC only warn that PIC is supported... then
- # they create non-PIC objects. So, if there were any warnings, we
- # assume that PIC is not supported.
- if test -s conftest.err; then
- lt_cv_prog_cc_pic_works=no
- else
- lt_cv_prog_cc_pic_works=yes
- fi
- ;;
- *)
- lt_cv_prog_cc_pic_works=yes
- ;;
- esac
-
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
- lt_cv_prog_cc_pic_works=no
-
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- CFLAGS="$save_CFLAGS"
-
-fi
-
-
- if test "X$lt_cv_prog_cc_pic_works" = Xno; then
- lt_cv_prog_cc_pic=
- lt_cv_prog_cc_can_build_shared=no
- else
- lt_cv_prog_cc_pic=" $lt_cv_prog_cc_pic"
- fi
-
- echo "$as_me:$LINENO: result: $lt_cv_prog_cc_pic_works" >&5
-echo "${ECHO_T}$lt_cv_prog_cc_pic_works" >&6
-fi
-
-# Check for any special shared library compilation flags.
-if test -n "$lt_cv_prog_cc_shlib"; then
- { echo "$as_me:$LINENO: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&5
-echo "$as_me: WARNING: \`$CC' requires \`$lt_cv_prog_cc_shlib' to build shared libraries" >&2;}
- if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$lt_cv_prog_cc_shlib[ ]" >/dev/null; then :
- else
- { echo "$as_me:$LINENO: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&5
-echo "$as_me: WARNING: add \`$lt_cv_prog_cc_shlib' to the CC or CFLAGS env variable and reconfigure" >&2;}
- lt_cv_prog_cc_can_build_shared=no
- fi
-fi
-
-echo "$as_me:$LINENO: checking if $compiler static flag $lt_cv_prog_cc_static works" >&5
-echo $ECHO_N "checking if $compiler static flag $lt_cv_prog_cc_static works... $ECHO_C" >&6
-if test "${lt_cv_prog_cc_static_works+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- lt_cv_prog_cc_static_works=no
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS $lt_cv_prog_cc_static"
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- lt_cv_prog_cc_static_works=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
- LDFLAGS="$save_LDFLAGS"
-
-fi
-
-
-# Belt *and* braces to stop my trousers falling down:
-test "X$lt_cv_prog_cc_static_works" = Xno && lt_cv_prog_cc_static=
-echo "$as_me:$LINENO: result: $lt_cv_prog_cc_static_works" >&5
-echo "${ECHO_T}$lt_cv_prog_cc_static_works" >&6
-
-pic_flag="$lt_cv_prog_cc_pic"
-special_shlib_compile_flags="$lt_cv_prog_cc_shlib"
-wl="$lt_cv_prog_cc_wl"
-link_static_flag="$lt_cv_prog_cc_static"
-no_builtin_flag="$lt_cv_prog_cc_no_builtin"
-can_build_shared="$lt_cv_prog_cc_can_build_shared"
-
-
-# Check to see if options -o and -c are simultaneously supported by compiler
-echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
-if test "${lt_cv_compiler_c_o+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
-$rm -r conftest 2>/dev/null
-mkdir conftest
-cd conftest
-echo "int some_variable = 0;" > conftest.$ac_ext
-mkdir out
-# According to Tom Tromey, Ian Lance Taylor reported there are C compilers
-# that will create temporary files in the current directory regardless of
-# the output directory. Thus, making CWD read-only will cause this test
-# to fail, enabling locking or at least warning the user not to do parallel
-# builds.
-chmod -w .
-save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -o out/conftest2.$ac_objext"
-compiler_c_o=no
-if { (eval echo configure:4896: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.$ac_objext; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s out/conftest.err; then
- lt_cv_compiler_c_o=no
- else
- lt_cv_compiler_c_o=yes
- fi
-else
- # Append any errors to the config.log.
- cat out/conftest.err 1>&5
- lt_cv_compiler_c_o=no
-fi
-CFLAGS="$save_CFLAGS"
-chmod u+w .
-$rm conftest* out/*
-rmdir out
-cd ..
-rmdir conftest
-$rm -r conftest 2>/dev/null
-
-fi
-
-compiler_c_o=$lt_cv_compiler_c_o
-echo "$as_me:$LINENO: result: $compiler_c_o" >&5
-echo "${ECHO_T}$compiler_c_o" >&6
-
-if test x"$compiler_c_o" = x"yes"; then
- # Check to see if we can write to a .lo
- echo "$as_me:$LINENO: checking if $compiler supports -c -o file.lo" >&5
-echo $ECHO_N "checking if $compiler supports -c -o file.lo... $ECHO_C" >&6
- if test "${lt_cv_compiler_o_lo+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-
- lt_cv_compiler_o_lo=no
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -c -o conftest.lo"
- save_objext="$ac_objext"
- ac_objext=lo
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-int some_variable = 0;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- lt_cv_compiler_o_lo=no
- else
- lt_cv_compiler_o_lo=yes
- fi
-
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- ac_objext="$save_objext"
- CFLAGS="$save_CFLAGS"
-
-fi
-
- compiler_o_lo=$lt_cv_compiler_o_lo
- echo "$as_me:$LINENO: result: $compiler_o_lo" >&5
-echo "${ECHO_T}$compiler_o_lo" >&6
-else
- compiler_o_lo=no
-fi
-
-# Check to see if we can do hard links to lock some files if needed
-hard_links="nottested"
-if test "$compiler_c_o" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
-echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&6
- hard_links=yes
- $rm conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- echo "$as_me:$LINENO: result: $hard_links" >&5
-echo "${ECHO_T}$hard_links" >&6
- if test "$hard_links" = no; then
- { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
-echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-
-if test "$GCC" = yes; then
- # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
- echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
-echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
- echo "int some_variable = 0;" > conftest.$ac_ext
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.$ac_ext"
- compiler_rtti_exceptions=no
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-int some_variable = 0;
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- compiler_rtti_exceptions=no
- else
- compiler_rtti_exceptions=yes
- fi
-
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- CFLAGS="$save_CFLAGS"
- echo "$as_me:$LINENO: result: $compiler_rtti_exceptions" >&5
-echo "${ECHO_T}$compiler_rtti_exceptions" >&6
-
- if test "$compiler_rtti_exceptions" = "yes"; then
- no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
- else
- no_builtin_flag=' -fno-builtin'
- fi
-fi
-
-# See if the linker supports building shared libraries.
-echo "$as_me:$LINENO: checking whether the linker ($LD) supports shared libraries" >&5
-echo $ECHO_N "checking whether the linker ($LD) supports shared libraries... $ECHO_C" >&6
-
-allow_undefined_flag=
-no_undefined_flag=
-need_lib_prefix=unknown
-need_version=unknown
-# when you set need_version to no, make sure it does not cause -set_version
-# flags to be left without arguments
-archive_cmds=
-archive_expsym_cmds=
-old_archive_from_new_cmds=
-old_archive_from_expsyms_cmds=
-export_dynamic_flag_spec=
-whole_archive_flag_spec=
-thread_safe_flag_spec=
-hardcode_into_libs=no
-hardcode_libdir_flag_spec=
-hardcode_libdir_separator=
-hardcode_direct=no
-hardcode_minus_L=no
-hardcode_shlibpath_var=unsupported
-runpath_var=
-link_all_deplibs=unknown
-always_export_symbols=no
-export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols'
-# include_expsyms should be a list of space-separated symbols to be *always*
-# included in the symbol list
-include_expsyms=
-# exclude_expsyms can be an egrep regular expression of symbols to exclude
-# it will be wrapped by ` (' and `)$', so one must not match beginning or
-# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
-# as well as any symbol that contains `d'.
-exclude_expsyms="_GLOBAL_OFFSET_TABLE_"
-# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
-# platforms (ab)use it in PIC code, but their linkers get confused if
-# the symbol is explicitly referenced. Since portable code cannot
-# rely on this symbol name, it's probably fine to never include it in
-# preloaded symbol tables.
-extract_expsyms_cmds=
-
-case $host_os in
-cygwin* | mingw* | pw32*)
- # FIXME: the MSVC++ port hasn't been tested in a loooong time
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- if test "$GCC" != yes; then
- with_gnu_ld=no
- fi
- ;;
-openbsd*)
- with_gnu_ld=no
- ;;
-esac
-
-ld_shlibs=yes
-if test "$with_gnu_ld" = yes; then
- # If archive_cmds runs LD, not CC, wlarc should be empty
- wlarc='${wl}'
-
- # See if GNU ld supports shared libraries.
- case $host_os in
- aix3* | aix4* | aix5*)
- # On AIX, the GNU linker is very broken
- # Note:Check GNU linker on AIX 5-IA64 when/if it becomes available.
- ld_shlibs=no
- cat <<EOF 1>&2
-
-*** Warning: the GNU linker, at least up to release 2.9.1, is reported
-*** to be unable to reliably create shared libraries on AIX.
-*** Therefore, libtool is disabling shared libraries support. If you
-*** really care for shared libraries, you may want to modify your PATH
-*** so that a non-GNU linker is found, and then restart.
-
-EOF
- ;;
-
- amigaos*)
- archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
-
- # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
- # that the semantics of dynamic libraries on AmigaOS, at least up
- # to version 4, is to share data among multiple programs linked
- # with the same dynamic library. Since this doesn't match the
- # behavior of shared libraries on other platforms, we can use
- # them.
- ld_shlibs=no
- ;;
-
- beos*)
- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- allow_undefined_flag=unsupported
- # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
- # support --undefined. This deserves some investigation. FIXME
- archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- cygwin* | mingw* | pw32*)
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec='-L$libdir'
- allow_undefined_flag=unsupported
- always_export_symbols=yes
-
- extract_expsyms_cmds='test -f $output_objdir/impgen.c || \
- sed -e "/^# \/\* impgen\.c starts here \*\//,/^# \/\* impgen.c ends here \*\// { s/^# //;s/^# *$//; p; }" -e d < $''0 > $output_objdir/impgen.c~
- test -f $output_objdir/impgen.exe || (cd $output_objdir && \
- if test "x$HOST_CC" != "x" ; then $HOST_CC -o impgen impgen.c ; \
- else $CC -o impgen impgen.c ; fi)~
- $output_objdir/impgen $dir/$soroot > $output_objdir/$soname-def'
-
- old_archive_from_expsyms_cmds='$DLLTOOL --as=$AS --dllname $soname --def $output_objdir/$soname-def --output-lib $output_objdir/$newlib'
-
- # cygwin and mingw dlls have different entry points and sets of symbols
- # to exclude.
- # FIXME: what about values for MSVC?
- dll_entry=__cygwin_dll_entry@12
- dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12~
- case $host_os in
- mingw*)
- # mingw values
- dll_entry=_DllMainCRTStartup@12
- dll_exclude_symbols=DllMain@12,DllMainCRTStartup@12,DllEntryPoint@12~
- ;;
- esac
-
- # mingw and cygwin differ, and it's simplest to just exclude the union
- # of the two symbol sets.
- dll_exclude_symbols=DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12,DllMainCRTStartup@12,DllEntryPoint@12
-
- # recent cygwin and mingw systems supply a stub DllMain which the user
- # can override, but on older systems we have to supply one (in ltdll.c)
- if test "x$lt_cv_need_dllmain" = "xyes"; then
- ltdll_obj='$output_objdir/$soname-ltdll.'"$ac_objext "
- ltdll_cmds='test -f $output_objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $''0 > $output_objdir/$soname-ltdll.c~
- test -f $output_objdir/$soname-ltdll.$ac_objext || (cd $output_objdir && $CC -c $soname-ltdll.c)~'
- else
- ltdll_obj=
- ltdll_cmds=
- fi
-
- # Extract the symbol export list from an `--export-all' def file,
- # then regenerate the def file from the symbol export list, so that
- # the compiled dll only exports the symbol export list.
- # Be careful not to strip the DATA tag left be newer dlltools.
- export_symbols_cmds="$ltdll_cmds"'
- $DLLTOOL --export-all --exclude-symbols '$dll_exclude_symbols' --output-def $output_objdir/$soname-def '$ltdll_obj'$libobjs $convenience~
- sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]*//" -e "s/ *;.*$//" < $output_objdir/$soname-def > $export_symbols'
-
- # If the export-symbols file already is a .def file (1st line
- # is EXPORTS), use it as is.
- # If DATA tags from a recent dlltool are present, honour them!
- archive_expsym_cmds='if test "x`head -1 $export_symbols`" = xEXPORTS; then
- cp $export_symbols $output_objdir/$soname-def;
- else
- echo EXPORTS > $output_objdir/$soname-def;
- _lt_hint=1;
- cat $export_symbols | while read symbol; do
- set dummy \$symbol;
- case \$# in
- 2) echo " \$2 @ \$_lt_hint ; " >> $output_objdir/$soname-def;;
- *) echo " \$2 @ \$_lt_hint \$3 ; " >> $output_objdir/$soname-def;;
- esac;
- _lt_hint=`expr 1 + \$_lt_hint`;
- done;
- fi~
- '"$ltdll_cmds"'
- $CC -Wl,--base-file,$output_objdir/$soname-base '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp~
- $CC -Wl,--base-file,$output_objdir/$soname-base $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbols '$dll_exclude_symbols' --def $output_objdir/$soname-def --base-file $output_objdir/$soname-base --output-exp $output_objdir/$soname-exp --output-lib $output_objdir/$libname.dll.a~
- $CC $output_objdir/$soname-exp '$lt_cv_cc_dll_switch' -Wl,-e,'$dll_entry' -o $output_objdir/$soname '$ltdll_obj'$libobjs $deplibs $compiler_flags'
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
- wlarc=
- else
- archive_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared -nodefaultlibs $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- fi
- ;;
-
- solaris* | sysv5*)
- if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then
- ld_shlibs=no
- cat <<EOF 1>&2
-
-*** Warning: The releases 2.8.* of the GNU linker cannot reliably
-*** create shared libraries on Solaris systems. Therefore, libtool
-*** is disabling shared libraries support. We urge you to upgrade GNU
-*** binutils to release 2.9.1 or newer. Another option is to modify
-*** your PATH or compiler configuration so that the native linker is
-*** used, and then restart.
-
-EOF
- elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
-
- sunos4*)
- archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- wlarc=
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- *)
- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
- archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
- else
- ld_shlibs=no
- fi
- ;;
- esac
-
- if test "$ld_shlibs" = yes; then
- runpath_var=LD_RUN_PATH
- hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
- export_dynamic_flag_spec='${wl}--export-dynamic'
- case $host_os in
- cygwin* | mingw* | pw32*)
- # dlltool doesn't understand --whole-archive et. al.
- whole_archive_flag_spec=
- ;;
- *)
- # ancient GNU ld didn't support --whole-archive et. al.
- if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then
- whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
- else
- whole_archive_flag_spec=
- fi
- ;;
- esac
- fi
-else
- # PORTME fill in a description of your system's linker (not GNU ld)
- case $host_os in
- aix3*)
- allow_undefined_flag=unsupported
- always_export_symbols=yes
- archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
- # Note: this linker hardcodes the directories in LIBPATH if there
- # are no directories specified by -L.
- hardcode_minus_L=yes
- if test "$GCC" = yes && test -z "$link_static_flag"; then
- # Neither direct hardcoding nor static linking is supported with a
- # broken collect2.
- hardcode_direct=unsupported
- fi
- ;;
-
- aix4* | aix5*)
- if test "$host_cpu" = ia64; then
- # On IA64, the linker does run time linking by default, so we don't
- # have to do anything special.
- aix_use_runtimelinking=no
- exp_sym_flag='-Bexport'
- no_entry_flag=""
- else
- aix_use_runtimelinking=no
-
- # Test if we are trying to use run time linking or normal
- # AIX style linking. If -brtl is somewhere in LDFLAGS, we
- # need to do runtime linking.
- case $host_os in aix4.[23]|aix4.[23].*|aix5*)
- for ld_flag in $LDFLAGS; do
- if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
- aix_use_runtimelinking=yes
- break
- fi
- done
- esac
-
- exp_sym_flag='-bexport'
- no_entry_flag='-bnoentry'
- fi
-
- # When large executables or shared objects are built, AIX ld can
- # have problems creating the table of contents. If linking a library
- # or program results in "error TOC overflow" add -mminimal-toc to
- # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
- # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
-
- hardcode_direct=yes
- archive_cmds=''
- hardcode_libdir_separator=':'
- if test "$GCC" = yes; then
- case $host_os in aix4.[012]|aix4.[012].*)
- collect2name=`${CC} -print-prog-name=collect2`
- if test -f "$collect2name" && \
- strings "$collect2name" | grep resolve_lib_name >/dev/null
- then
- # We have reworked collect2
- hardcode_direct=yes
- else
- # We have old collect2
- hardcode_direct=unsupported
- # It fails to find uninstalled libraries when the uninstalled
- # path is not listed in the libpath. Setting hardcode_minus_L
- # to unsupported forces relinking
- hardcode_minus_L=yes
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_libdir_separator=
- fi
- esac
-
- shared_flag='-shared'
- else
- # not using gcc
- if test "$host_cpu" = ia64; then
- shared_flag='${wl}-G'
- else
- if test "$aix_use_runtimelinking" = yes; then
- shared_flag='${wl}-G'
- else
- shared_flag='${wl}-bM:SRE'
- fi
- fi
- fi
-
- # It seems that -bexpall can do strange things, so it is better to
- # generate a list of symbols to export.
- always_export_symbols=yes
- if test "$aix_use_runtimelinking" = yes; then
- # Warning - without using the other runtime loading flags (-brtl),
- # -berok will link without error, but may produce a broken library.
- allow_undefined_flag='-berok'
- hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:/usr/lib:/lib'
- archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols $shared_flag"
- else
- if test "$host_cpu" = ia64; then
- hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
- allow_undefined_flag="-z nodefs"
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname ${wl}-h$soname $libobjs $deplibs $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"
- else
- hardcode_libdir_flag_spec='${wl}-bnolibpath ${wl}-blibpath:$libdir:/usr/lib:/lib'
- # Warning - without using the other run time loading flags,
- # -berok will link without error, but may produce a broken library.
- allow_undefined_flag='${wl}-berok'
- # This is a bit strange, but is similar to how AIX traditionally builds
- # it's shared libraries.
- archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs $compiler_flags ${allow_undefined_flag} '"\${wl}$no_entry_flag \${wl}$exp_sym_flag:\$export_symbols"' ~$AR -crlo $objdir/$libname$release.a $objdir/$soname'
- fi
- fi
- ;;
-
- amigaos*)
- archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- # see comment about different semantics on the GNU ld section
- ld_shlibs=no
- ;;
-
- cygwin* | mingw* | pw32*)
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- old_archive_from_new_cmds='true'
- # FIXME: Should let the user specify the lib program.
- old_archive_cmds='lib /OUT:$oldlib$oldobjs$old_deplibs'
- fix_srcfile_path='`cygpath -w "$srcfile"`'
- ;;
-
- darwin* | rhapsody*)
- case "$host_os" in
- rhapsody* | darwin1.[012])
- allow_undefined_flag='-undefined suppress'
- ;;
- *) # Darwin 1.3 on
- allow_undefined_flag='-flat_namespace -undefined suppress'
- ;;
- esac
- # FIXME: Relying on posixy $() will cause problems for
- # cross-compilation, but unfortunately the echo tests do not
- # yet detect zsh echo's removal of \ escapes.
- archive_cmds='$nonopt $(test "x$module" = xyes && echo -bundle || echo -dynamiclib) $allow_undefined_flag -o $lib $libobjs $deplibs$linker_flags -install_name $rpath/$soname $verstring'
- # We need to add '_' to the symbols in $export_symbols first
- #archive_expsym_cmds="$archive_cmds"' && strip -s $export_symbols'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- whole_archive_flag_spec='-all_load $convenience'
- ;;
-
- freebsd1*)
- ld_shlibs=no
- ;;
-
- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
- # support. Future versions do this automatically, but an explicit c++rt0.o
- # does not break anything, and helps significantly (at the cost of a little
- # extra space).
- freebsd2.2*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- # Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
- freebsd*)
- archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- hpux9* | hpux10* | hpux11*)
- case $host_os in
- hpux9*) archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' ;;
- *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' ;;
- esac
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_direct=yes
- hardcode_minus_L=yes # Not in the search PATH, but as the default
- # location of the library.
- export_dynamic_flag_spec='${wl}-E'
- ;;
-
- irix5* | irix6*)
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
- fi
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- link_all_deplibs=yes
- ;;
-
- netbsd*)
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
- else
- archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
- fi
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- newsos6)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- hardcode_shlibpath_var=no
- ;;
-
- openbsd*)
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- export_dynamic_flag_spec='${wl}-E'
- else
- case "$host_os" in
- openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
- archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-R$libdir'
- ;;
- *)
- archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
- ;;
- esac
- fi
- ;;
-
- os2*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- allow_undefined_flag=unsupported
- archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
- old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
- ;;
-
- osf3*)
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
- fi
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
-
- osf4* | osf5*) # as osf3* with the addition of -msym flag
- if test "$GCC" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
- archive_expsym_cmds='for i in `cat $export_symbols`; do printf "-exported_symbol " >> $lib.exp; echo "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
- $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib~$rm $lib.exp'
-
- #Both c and cxx compiler support -rpath directly
- hardcode_libdir_flag_spec='-rpath $libdir'
- fi
- hardcode_libdir_separator=:
- ;;
-
- sco3.2v5*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- export_dynamic_flag_spec='${wl}-Bexport'
- ;;
-
- solaris*)
- # gcc --version < 3.0 without binutils cannot create self contained
- # shared libraries reliably, requiring libgcc.a to resolve some of
- # the object symbols generated in some cases. Libraries that use
- # assert need libgcc.a to resolve __eprintf, for example. Linking
- # a copy of libgcc.a into every shared library to guarantee resolving
- # such symbols causes other problems: According to Tim Van Holder
- # <tim.van.holder@pandora.be>, C++ libraries end up with a separate
- # (to the application) exception stack for one thing.
- no_undefined_flag=' -z defs'
- if test "$GCC" = yes; then
- case `$CC --version 2>/dev/null` in
- [12].*)
- cat <<EOF 1>&2
-
-*** Warning: Releases of GCC earlier than version 3.0 cannot reliably
-*** create self contained shared libraries on Solaris systems, without
-*** introducing a dependency on libgcc.a. Therefore, libtool is disabling
-*** -no-undefined support, which will at least allow you to build shared
-*** libraries. However, you may find that when you link such libraries
-*** into an application without using GCC, you have to manually add
-*** \`gcc --print-libgcc-file-name\` to the link command. We urge you to
-*** upgrade to a newer version of GCC. Another option is to rebuild your
-*** current GCC to use the GNU linker from GNU binutils 2.9.1 or newer.
-
-EOF
- no_undefined_flag=
- ;;
- esac
- fi
- # $CC -shared without GNU ld will not create a library from C++
- # object files and a static libstdc++, better avoid it by now
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_shlibpath_var=no
- case $host_os in
- solaris2.[0-5] | solaris2.[0-5].*) ;;
- *) # Supported since Solaris 2.6 (maybe 2.5.1?)
- whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
- esac
- link_all_deplibs=yes
- ;;
-
- sunos4*)
- if test "x$host_vendor" = xsequent; then
- # Use $CC to link under sequent, because it throws in some extra .o
- # files that make .init and .fini sections work.
- archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
- fi
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- sysv4)
- if test "x$host_vendor" = xsno; then
- archive_cmds='$LD -G -Bsymbolic -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes # is this really true???
- else
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=no #Motorola manual says yes, but my tests say they lie
- fi
- runpath_var='LD_RUN_PATH'
- hardcode_shlibpath_var=no
- ;;
-
- sysv4.3*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- export_dynamic_flag_spec='-Bexport'
- ;;
-
- sysv5*)
- no_undefined_flag=' -z text'
- # $CC -shared without GNU ld will not create a library from C++
- # object files and a static libstdc++, better avoid it by now
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
- archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
- $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
- hardcode_libdir_flag_spec=
- hardcode_shlibpath_var=no
- runpath_var='LD_RUN_PATH'
- ;;
-
- uts4*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- dgux*)
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_shlibpath_var=no
- ;;
-
- sysv4*MP*)
- if test -d /usr/nec; then
- archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
- hardcode_shlibpath_var=no
- runpath_var=LD_RUN_PATH
- hardcode_runpath_var=yes
- ld_shlibs=yes
- fi
- ;;
-
- sysv4.2uw2*)
- archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
- hardcode_direct=yes
- hardcode_minus_L=no
- hardcode_shlibpath_var=no
- hardcode_runpath_var=yes
- runpath_var=LD_RUN_PATH
- ;;
-
- sysv5uw7* | unixware7*)
- no_undefined_flag='${wl}-z ${wl}text'
- if test "$GCC" = yes; then
- archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- else
- archive_cmds='$CC -G ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
- fi
- runpath_var='LD_RUN_PATH'
- hardcode_shlibpath_var=no
- ;;
-
- *)
- ld_shlibs=no
- ;;
- esac
-fi
-echo "$as_me:$LINENO: result: $ld_shlibs" >&5
-echo "${ECHO_T}$ld_shlibs" >&6
-test "$ld_shlibs" = no && can_build_shared=no
-
-# Check hardcoding attributes.
-echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
-echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" || \
- test -n "$runpath_var"; then
-
- # We can hardcode non-existant directories.
- if test "$hardcode_direct" != no &&
- # If the only mechanism to avoid hardcoding is shlibpath_var, we
- # have to relink, otherwise we might link with an installed library
- # when we should be linking with a yet-to-be-installed one
- ## test "$hardcode_shlibpath_var" != no &&
- test "$hardcode_minus_L" != no; then
- # Linking always hardcodes the temporary library directory.
- hardcode_action=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- hardcode_action=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- hardcode_action=unsupported
-fi
-echo "$as_me:$LINENO: result: $hardcode_action" >&5
-echo "${ECHO_T}$hardcode_action" >&6
-
-striplib=
-old_striplib=
-echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
-echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&6
-if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
- test -z "$striplib" && striplib="$STRIP --strip-unneeded"
- echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-test -z "$deplibs_check_method" && deplibs_check_method=unknown
-
-# PORTME Fill in your ld.so characteristics
-echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
-echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&6
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-shlibpath_overrides_runpath=unknown
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_dlsearch_path_spec="/lib /usr/lib"
-sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
-
-case $host_os in
-aix3*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}.so$major'
- ;;
-
-aix4* | aix5*)
- version_type=linux
- if test "$host_cpu" = ia64; then
- # AIX 5 supports IA64
- library_names_spec='${libname}${release}.so$major ${libname}${release}.so$versuffix $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- else
- # With GCC up to 2.95.x, collect2 would create an import file
- # for dependence libraries. The import file would start with
- # the line `#! .'. This would cause the generated library to
- # depend on `.', always an invalid library. This was fixed in
- # development snapshots of GCC prior to 3.0.
- case $host_os in
- aix4 | aix4.[01] | aix4.[01].*)
- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
- echo ' yes '
- echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
- :
- else
- can_build_shared=no
- fi
- ;;
- esac
- # AIX (on Power*) has no versioning support, so currently we can
- # not hardcode correct soname into executable. Probably we can
- # add versioning support to collect2, so additional links can
- # be useful in future.
- if test "$aix_use_runtimelinking" = yes; then
- # If using run time linking (on AIX 4.2 or later) use lib<name>.so
- # instead of lib<name>.a to let people know that these are not
- # typical AIX shared libraries.
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- else
- # We preserve .a as extension for shared libraries through AIX4.2
- # and later when we are not doing run time linking.
- library_names_spec='${libname}${release}.a $libname.a'
- soname_spec='${libname}${release}.so$major'
- fi
- shlibpath_var=LIBPATH
- fi
- ;;
-
-amigaos*)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
- ;;
-
-beos*)
- library_names_spec='${libname}.so'
- dynamic_linker="$host_os ld.so"
- shlibpath_var=LIBRARY_PATH
- ;;
-
-bsdi4*)
- version_type=linux
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
- export_dynamic_flag_spec=-rdynamic
- # the default ld.so.conf also contains /usr/contrib/lib and
- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
- # libtool to hard-code these into programs
- ;;
-
-cygwin* | mingw* | pw32*)
- version_type=windows
- need_version=no
- need_lib_prefix=no
- case $GCC,$host_os in
- yes,cygwin*)
- library_names_spec='$libname.dll.a'
- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
- postinstall_cmds='dlpath=`bash 2>&1 -c '\''. $dir/${file}i;echo \$dlname'\''`~
- dldir=$destdir/`dirname \$dlpath`~
- test -d \$dldir || mkdir -p \$dldir~
- $install_prog .libs/$dlname \$dldir/$dlname'
- postuninstall_cmds='dldll=`bash 2>&1 -c '\''. $file; echo \$dlname'\''`~
- dlpath=$dir/\$dldll~
- $rm \$dlpath'
- ;;
- yes,mingw*)
- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll'
- sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | sed -e "s/^libraries://" -e "s/;/ /g"`
- ;;
- yes,pw32*)
- library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | sed -e 's/./-/g'`${versuffix}.dll'
- ;;
- *)
- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
- ;;
- esac
- dynamic_linker='Win32 ld.exe'
- # FIXME: first we should search . and the directory the executable is in
- shlibpath_var=PATH
- ;;
-
-darwin* | rhapsody*)
- dynamic_linker="$host_os dyld"
- version_type=darwin
- need_lib_prefix=no
- need_version=no
- # FIXME: Relying on posixy $() will cause problems for
- # cross-compilation, but unfortunately the echo tests do not
- # yet detect zsh echo's removal of \ escapes.
- library_names_spec='${libname}${release}${versuffix}.$(test .$module = .yes && echo so || echo dylib) ${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib) ${libname}.$(test .$module = .yes && echo so || echo dylib)'
- soname_spec='${libname}${release}${major}.$(test .$module = .yes && echo so || echo dylib)'
- shlibpath_overrides_runpath=yes
- shlibpath_var=DYLD_LIBRARY_PATH
- ;;
-
-freebsd1*)
- dynamic_linker=no
- ;;
-
-freebsd*)
- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
- version_type=freebsd-$objformat
- case $version_type in
- freebsd-elf*)
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
- need_version=no
- need_lib_prefix=no
- ;;
- freebsd-*)
- library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix'
- need_version=yes
- ;;
- esac
- shlibpath_var=LD_LIBRARY_PATH
- case $host_os in
- freebsd2*)
- shlibpath_overrides_runpath=yes
- ;;
- *)
- shlibpath_overrides_runpath=no
- hardcode_into_libs=yes
- ;;
- esac
- ;;
-
-gnu*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- hardcode_into_libs=yes
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- dynamic_linker="$host_os dld.sl"
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- shlibpath_var=SHLIB_PATH
- shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
- library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
- soname_spec='${libname}${release}.sl$major'
- # HP-UX runs *really* slowly unless shared libraries are mode 555.
- postinstall_cmds='chmod 555 $lib'
- ;;
-
-irix5* | irix6*)
- version_type=irix
- need_lib_prefix=no
- need_version=no
- soname_spec='${libname}${release}.so$major'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so $libname.so'
- case $host_os in
- irix5*)
- libsuff= shlibsuff=
- ;;
- *)
- case $LD in # libtool.m4 will add one of these switches to LD
- *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;;
- *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;;
- *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;;
- *) libsuff= shlibsuff= libmagic=never-match;;
- esac
- ;;
- esac
- shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
- sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
- dynamic_linker=no
- ;;
-
-# This must be Linux ELF.
-linux-gnu*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=no
- # This implies no fast_install, which is unacceptable.
- # Some rework will be needed to allow for fast_install
- # before this can be enabled.
- hardcode_into_libs=yes
-
- # We used to test for /lib/ld.so.1 and disable shared libraries on
- # powerpc, because MkLinux only supported shared libraries with the
- # GNU dynamic linker. Since this was broken with cross compilers,
- # most powerpc-linux boxes support dynamic linking these days and
- # people can always --disable-shared, the test was removed, and we
- # assume the GNU/Linux dynamic linker is in use.
- dynamic_linker='GNU/Linux ld.so'
- ;;
-
-netbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- dynamic_linker='NetBSD (a.out) ld.so'
- else
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so'
- soname_spec='${libname}${release}.so$major'
- dynamic_linker='NetBSD ld.elf_so'
- fi
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- ;;
-
-newsos6)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- ;;
-
-openbsd*)
- version_type=sunos
- need_lib_prefix=no
- need_version=no
- if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
- case "$host_os" in
- openbsd2.[89] | openbsd2.[89].*)
- shlibpath_overrides_runpath=no
- ;;
- *)
- shlibpath_overrides_runpath=yes
- ;;
- esac
- else
- shlibpath_overrides_runpath=yes
- fi
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-os2*)
- libname_spec='$name'
- need_lib_prefix=no
- library_names_spec='$libname.dll $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4* | osf5*)
- version_type=osf
- need_version=no
- soname_spec='${libname}${release}.so'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
- sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
- ;;
-
-sco3.2v5*)
- version_type=osf
- soname_spec='${libname}${release}.so$major'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-solaris*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- hardcode_into_libs=yes
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- shlibpath_overrides_runpath=yes
- if test "$with_gnu_ld" = yes; then
- need_lib_prefix=no
- fi
- need_version=yes
- ;;
-
-sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- case $host_vendor in
- sni)
- shlibpath_overrides_runpath=no
- ;;
- motorola)
- need_lib_prefix=no
- need_version=no
- shlibpath_overrides_runpath=no
- sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
- ;;
- esac
- ;;
-
-uts4*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-dgux*)
- version_type=linux
- need_lib_prefix=no
- need_version=no
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-sysv4*MP*)
- if test -d /usr/nec ;then
- version_type=linux
- library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so'
- soname_spec='$libname.so.$major'
- shlibpath_var=LD_LIBRARY_PATH
- fi
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-echo "$as_me:$LINENO: result: $dynamic_linker" >&5
-echo "${ECHO_T}$dynamic_linker" >&6
-test "$dynamic_linker" = no && can_build_shared=no
-
-# Report the final consequences.
-echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
-echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
-echo "$as_me:$LINENO: result: $can_build_shared" >&5
-echo "${ECHO_T}$can_build_shared" >&6
-
-echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
-echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&6
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case "$host_os" in
-aix3*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
-
-aix4*)
- if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
- test "$enable_shared" = yes && enable_static=no
- fi
- ;;
-esac
-echo "$as_me:$LINENO: result: $enable_shared" >&5
-echo "${ECHO_T}$enable_shared" >&6
-
-echo "$as_me:$LINENO: checking whether to build static libraries" >&5
-echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-echo "$as_me:$LINENO: result: $enable_static" >&5
-echo "${ECHO_T}$enable_static" >&6
-
-if test "$hardcode_action" = relink; then
- # Fast installation is not supported
- enable_fast_install=no
-elif test "$shlibpath_overrides_runpath" = yes ||
- test "$enable_shared" = no; then
- # Fast installation is not necessary
- enable_fast_install=needless
-fi
-
-variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
-if test "$GCC" = yes; then
- variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
-fi
-
-if test "x$enable_dlopen" != xyes; then
- enable_dlopen=unknown
- enable_dlopen_self=unknown
- enable_dlopen_self_static=unknown
-else
- lt_cv_dlopen=no
- lt_cv_dlopen_libs=
-
- case $host_os in
- beos*)
- lt_cv_dlopen="load_add_on"
- lt_cv_dlopen_libs=
- lt_cv_dlopen_self=yes
- ;;
-
- cygwin* | mingw* | pw32*)
- lt_cv_dlopen="LoadLibrary"
- lt_cv_dlopen_libs=
- ;;
-
- *)
- echo "$as_me:$LINENO: checking for shl_load" >&5
-echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
-if test "${ac_cv_func_shl_load+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char shl_load (); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char shl_load ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_shl_load) || defined (__stub___shl_load)
-choke me
-#else
-f = shl_load;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_func_shl_load=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_func_shl_load=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
-echo "${ECHO_T}$ac_cv_func_shl_load" >&6
-if test $ac_cv_func_shl_load = yes; then
- lt_cv_dlopen="shl_load"
-else
- echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
-echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
-if test "${ac_cv_lib_dld_shl_load+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char shl_load ();
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-shl_load ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_lib_dld_shl_load=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_lib_dld_shl_load=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
-if test $ac_cv_lib_dld_shl_load = yes; then
- lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
-else
- echo "$as_me:$LINENO: checking for dlopen" >&5
-echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
-if test "${ac_cv_func_dlopen+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char dlopen (); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char dlopen ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_dlopen) || defined (__stub___dlopen)
-choke me
-#else
-f = dlopen;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_func_dlopen=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_func_dlopen=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
-echo "${ECHO_T}$ac_cv_func_dlopen" >&6
-if test $ac_cv_func_dlopen = yes; then
- lt_cv_dlopen="dlopen"
-else
- echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
-echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
-if test "${ac_cv_lib_dl_dlopen+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldl $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char dlopen ();
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-dlopen ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_lib_dl_dlopen=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_lib_dl_dlopen=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
-if test $ac_cv_lib_dl_dlopen = yes; then
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
-else
- echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
-echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
-if test "${ac_cv_lib_svld_dlopen+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-lsvld $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char dlopen ();
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-dlopen ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_lib_svld_dlopen=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_lib_svld_dlopen=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
-echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
-if test $ac_cv_lib_svld_dlopen = yes; then
- lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
-else
- echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
-echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
-if test "${ac_cv_lib_dld_dld_link+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_check_lib_save_LIBS=$LIBS
-LIBS="-ldld $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char dld_link ();
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-dld_link ();
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_lib_dld_dld_link=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_lib_dld_dld_link=no
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
-echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
-if test $ac_cv_lib_dld_dld_link = yes; then
- lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
-
-fi
-
- ;;
- esac
-
- if test "x$lt_cv_dlopen" != xno; then
- enable_dlopen=yes
- else
- enable_dlopen=no
- fi
-
- case $lt_cv_dlopen in
- dlopen)
- save_CPPFLAGS="$CPPFLAGS"
- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
-
- save_LDFLAGS="$LDFLAGS"
- eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-
- save_LIBS="$LIBS"
- LIBS="$lt_cv_dlopen_libs $LIBS"
-
- echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
-echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
-if test "${lt_cv_dlopen_self+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test "$cross_compiling" = yes; then :
- lt_cv_dlopen_self=cross
-else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<EOF
-#line 6689 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- /* dlclose (self); */
- }
-
- exit (status);
-}
-EOF
- if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
- x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
- x$lt_unknown|x*) lt_cv_dlopen_self=no ;;
- esac
- else :
- # compilation failed
- lt_cv_dlopen_self=no
- fi
-fi
-rm -fr conftest*
-
-
-fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self" >&6
-
- if test "x$lt_cv_dlopen_self" = xyes; then
- LDFLAGS="$LDFLAGS $link_static_flag"
- echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
-echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
-if test "${lt_cv_dlopen_self_static+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test "$cross_compiling" = yes; then :
- lt_cv_dlopen_self_static=cross
-else
- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
- lt_status=$lt_dlunknown
- cat > conftest.$ac_ext <<EOF
-#line 6787 "configure"
-#include "confdefs.h"
-
-#if HAVE_DLFCN_H
-#include <dlfcn.h>
-#endif
-
-#include <stdio.h>
-
-#ifdef RTLD_GLOBAL
-# define LT_DLGLOBAL RTLD_GLOBAL
-#else
-# ifdef DL_GLOBAL
-# define LT_DLGLOBAL DL_GLOBAL
-# else
-# define LT_DLGLOBAL 0
-# endif
-#endif
-
-/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
- find out it does not work in some platform. */
-#ifndef LT_DLLAZY_OR_NOW
-# ifdef RTLD_LAZY
-# define LT_DLLAZY_OR_NOW RTLD_LAZY
-# else
-# ifdef DL_LAZY
-# define LT_DLLAZY_OR_NOW DL_LAZY
-# else
-# ifdef RTLD_NOW
-# define LT_DLLAZY_OR_NOW RTLD_NOW
-# else
-# ifdef DL_NOW
-# define LT_DLLAZY_OR_NOW DL_NOW
-# else
-# define LT_DLLAZY_OR_NOW 0
-# endif
-# endif
-# endif
-# endif
-#endif
-
-#ifdef __cplusplus
-extern "C" void exit (int);
-#endif
-
-void fnord() { int i=42;}
-int main ()
-{
- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
- int status = $lt_dlunknown;
-
- if (self)
- {
- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
- /* dlclose (self); */
- }
-
- exit (status);
-}
-EOF
- if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then
- (./conftest; exit; ) 2>/dev/null
- lt_status=$?
- case x$lt_status in
- x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
- x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
- x$lt_unknown|x*) lt_cv_dlopen_self_static=no ;;
- esac
- else :
- # compilation failed
- lt_cv_dlopen_self_static=no
- fi
-fi
-rm -fr conftest*
-
-
-fi
-echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
-echo "${ECHO_T}$lt_cv_dlopen_self_static" >&6
- fi
-
- CPPFLAGS="$save_CPPFLAGS"
- LDFLAGS="$save_LDFLAGS"
- LIBS="$save_LIBS"
- ;;
- esac
-
- case $lt_cv_dlopen_self in
- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
- *) enable_dlopen_self=unknown ;;
- esac
-
- case $lt_cv_dlopen_self_static in
- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
- *) enable_dlopen_self_static=unknown ;;
- esac
-fi
-
-
-if test "$enable_shared" = yes && test "$GCC" = yes; then
- case $archive_cmds in
- *'~'*)
- # FIXME: we may have to deal with multi-command sequences.
- ;;
- '$CC '*)
- # Test whether the compiler implicitly links with -lc since on some
- # systems, -lgcc has to come before -lc. If gcc already passes -lc
- # to ld, don't add -lc before -lgcc.
- echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
-echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
- if test "${lt_cv_archive_cmds_need_lc+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- $rm conftest*
- echo 'static int dummy;' > conftest.$ac_ext
-
- if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; then
- soname=conftest
- lib=conftest
- libobjs=conftest.$ac_objext
- deplibs=
- wl=$lt_cv_prog_cc_wl
- compiler_flags=-v
- linker_flags=-v
- verstring=
- output_objdir=.
- libname=conftest
- save_allow_undefined_flag=$allow_undefined_flag
- allow_undefined_flag=
- if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
- (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
- then
- lt_cv_archive_cmds_need_lc=no
- else
- lt_cv_archive_cmds_need_lc=yes
- fi
- allow_undefined_flag=$save_allow_undefined_flag
- else
- cat conftest.err 1>&5
- fi
-fi
-
- echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5
-echo "${ECHO_T}$lt_cv_archive_cmds_need_lc" >&6
- ;;
- esac
-fi
-need_lc=${lt_cv_archive_cmds_need_lc-yes}
-
-# The second clause should only fire when bootstrapping the
-# libtool distribution, otherwise you forgot to ship ltmain.sh
-# with your package, and you will get complaints that there are
-# no rules to generate ltmain.sh.
-if test -f "$ltmain"; then
- :
-else
- # If there is no Makefile yet, we rely on a make rule to execute
- # `config.status --recheck' to rerun these tests and create the
- # libtool script then.
- test -f Makefile && make "$ltmain"
-fi
-
-if test -f "$ltmain"; then
- trap "$rm \"${ofile}T\"; exit 1" 1 2 15
- $rm -f "${ofile}T"
-
- echo creating $ofile
-
- # Now quote all the things that may contain metacharacters while being
- # careful not to overquote the AC_SUBSTed values. We take copies of the
- # variables and quote the copies for generation of the libtool script.
- for var in echo old_CC old_CFLAGS \
- AR AR_FLAGS CC LD LN_S NM SHELL \
- reload_flag reload_cmds wl \
- pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
- thread_safe_flag_spec whole_archive_flag_spec libname_spec \
- library_names_spec soname_spec \
- RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
- old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds \
- postuninstall_cmds extract_expsyms_cmds old_archive_from_expsyms_cmds \
- old_striplib striplib file_magic_cmd export_symbols_cmds \
- deplibs_check_method allow_undefined_flag no_undefined_flag \
- finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \
- global_symbol_to_c_name_address \
- hardcode_libdir_flag_spec hardcode_libdir_separator \
- sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
- compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do
-
- case $var in
- reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
- old_postinstall_cmds | old_postuninstall_cmds | \
- export_symbols_cmds | archive_cmds | archive_expsym_cmds | \
- extract_expsyms_cmds | old_archive_from_expsyms_cmds | \
- postinstall_cmds | postuninstall_cmds | \
- finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
- # Double-quote double-evaled strings.
- eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
- ;;
- *)
- eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
- ;;
- esac
- done
-
- cat <<__EOF__ > "${ofile}T"
-#! $SHELL
-
-# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
-# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-#
-# Copyright (C) 1996-2000 Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="sed -e s/^X//"
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi
-
-# ### BEGIN LIBTOOL CONFIG
-
-# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-
-# Shell to use when invoking shell scripts.
-SHELL=$lt_SHELL
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# Whether or not to add -lc for building shared libraries.
-build_libtool_need_lc=$need_lc
-
-# Whether or not to optimize for fast installation.
-fast_install=$enable_fast_install
-
-# The host system.
-host_alias=$host_alias
-host=$host
-
-# An echo program that does not interpret backslashes.
-echo=$lt_echo
-
-# The archiver.
-AR=$lt_AR
-AR_FLAGS=$lt_AR_FLAGS
-
-# The default C compiler.
-CC=$lt_CC
-
-# Is the compiler the GNU C compiler?
-with_gcc=$GCC
-
-# The linker used to build libraries.
-LD=$lt_LD
-
-# Whether we need hard or soft links.
-LN_S=$lt_LN_S
-
-# A BSD-compatible nm program.
-NM=$lt_NM
-
-# A symbol stripping program
-STRIP=$STRIP
-
-# Used to examine libraries when file_magic_cmd begins "file"
-MAGIC_CMD=$MAGIC_CMD
-
-# Used on cygwin: DLL creation program.
-DLLTOOL="$DLLTOOL"
-
-# Used on cygwin: object dumper.
-OBJDUMP="$OBJDUMP"
-
-# Used on cygwin: assembler.
-AS="$AS"
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# How to create reloadable object files.
-reload_flag=$lt_reload_flag
-reload_cmds=$lt_reload_cmds
-
-# How to pass a linker flag through the compiler.
-wl=$lt_wl
-
-# Object file suffix (normally "o").
-objext="$ac_objext"
-
-# Old archive suffix (normally "a").
-libext="$libext"
-
-# Executable file suffix (normally "").
-exeext="$exeext"
-
-# Additional compiler flags for building library objects.
-pic_flag=$lt_pic_flag
-pic_mode=$pic_mode
-
-# Does compiler simultaneously support -c and -o options?
-compiler_c_o=$lt_compiler_c_o
-
-# Can we write directly to a .lo ?
-compiler_o_lo=$lt_compiler_o_lo
-
-# Must we lock files when doing compilation ?
-need_locks=$lt_need_locks
-
-# Do we need the lib prefix for modules?
-need_lib_prefix=$need_lib_prefix
-
-# Do we need a version for libraries?
-need_version=$need_version
-
-# Whether dlopen is supported.
-dlopen_support=$enable_dlopen
-
-# Whether dlopen of programs is supported.
-dlopen_self=$enable_dlopen_self
-
-# Whether dlopen of statically linked programs is supported.
-dlopen_self_static=$enable_dlopen_self_static
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$lt_link_static_flag
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$lt_no_builtin_flag
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$lt_whole_archive_flag_spec
-
-# Compiler flag to generate thread-safe objects.
-thread_safe_flag_spec=$lt_thread_safe_flag_spec
-
-# Library versioning type.
-version_type=$version_type
-
-# Format of library name prefix.
-libname_spec=$lt_libname_spec
-
-# List of archive names. First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$lt_library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$lt_soname_spec
-
-# Commands used to build and install an old-style archive.
-RANLIB=$lt_RANLIB
-old_archive_cmds=$lt_old_archive_cmds
-old_postinstall_cmds=$lt_old_postinstall_cmds
-old_postuninstall_cmds=$lt_old_postuninstall_cmds
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
-
-# Create a temporary old-style archive to link instead of a shared archive.
-old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
-
-# Commands used to build and install a shared archive.
-archive_cmds=$lt_archive_cmds
-archive_expsym_cmds=$lt_archive_expsym_cmds
-postinstall_cmds=$lt_postinstall_cmds
-postuninstall_cmds=$lt_postuninstall_cmds
-
-# Commands to strip libraries.
-old_striplib=$lt_old_striplib
-striplib=$lt_striplib
-
-# Method to check whether dependent libraries are shared objects.
-deplibs_check_method=$lt_deplibs_check_method
-
-# Command to use when deplibs_check_method == file_magic.
-file_magic_cmd=$lt_file_magic_cmd
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$lt_allow_undefined_flag
-
-# Flag that forces no undefined symbols.
-no_undefined_flag=$lt_no_undefined_flag
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$lt_finish_cmds
-
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$lt_finish_eval
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$lt_global_symbol_pipe
-
-# Transform the output of nm in a proper C declaration
-global_symbol_to_cdecl=$lt_global_symbol_to_cdecl
-
-# Transform the output of nm in a C name address pair
-global_symbol_to_c_name_address=$lt_global_symbol_to_c_name_address
-
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# Is shlibpath searched before the hard-coded library search path?
-shlibpath_overrides_runpath=$shlibpath_overrides_runpath
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# Whether we should hardcode library paths into libraries.
-hardcode_into_libs=$hardcode_into_libs
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$lt_hardcode_libdir_separator
-
-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# Variables whose values should be saved in libtool wrapper scripts and
-# restored at relink time.
-variables_saved_for_relink="$variables_saved_for_relink"
-
-# Whether libtool must link a program against all its dependency libraries.
-link_all_deplibs=$link_all_deplibs
-
-# Compile-time system search path for libraries
-sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
-
-# Run-time system search path for libraries
-sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path"
-
-# Set to yes if exported symbols are required.
-always_export_symbols=$always_export_symbols
-
-# The commands to list exported symbols.
-export_symbols_cmds=$lt_export_symbols_cmds
-
-# The commands to extract the exported symbol list from a shared archive.
-extract_expsyms_cmds=$lt_extract_expsyms_cmds
-
-# Symbols that should not be listed in the preloaded symbols.
-exclude_expsyms=$lt_exclude_expsyms
-
-# Symbols that must always be exported.
-include_expsyms=$lt_include_expsyms
-
-# ### END LIBTOOL CONFIG
-
-__EOF__
-
- case $host_os in
- aix3*)
- cat <<\EOF >> "${ofile}T"
-
-# AIX sometimes has problems with the GCC collect2 program. For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "X${COLLECT_NAMES+set}" != Xset; then
- COLLECT_NAMES=
- export COLLECT_NAMES
-fi
-EOF
- ;;
- esac
-
- case $host_os in
- cygwin* | mingw* | pw32* | os2*)
- cat <<'EOF' >> "${ofile}T"
- # This is a source program that is used to create dlls on Windows
- # Don't remove nor modify the starting and closing comments
-# /* ltdll.c starts here */
-# #define WIN32_LEAN_AND_MEAN
-# #include <windows.h>
-# #undef WIN32_LEAN_AND_MEAN
-# #include <stdio.h>
-#
-# #ifndef __CYGWIN__
-# # ifdef __CYGWIN32__
-# # define __CYGWIN__ __CYGWIN32__
-# # endif
-# #endif
-#
-# #ifdef __cplusplus
-# extern "C" {
-# #endif
-# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-# #ifdef __cplusplus
-# }
-# #endif
-#
-# #ifdef __CYGWIN__
-# #include <cygwin/cygwin_dll.h>
-# DECLARE_CYGWIN_DLL( DllMain );
-# #endif
-# HINSTANCE __hDllInstance_base;
-#
-# BOOL APIENTRY
-# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-# {
-# __hDllInstance_base = hInst;
-# return TRUE;
-# }
-# /* ltdll.c ends here */
- # This is a source program that is used to create import libraries
- # on Windows for dlls which lack them. Don't remove nor modify the
- # starting and closing comments
-# /* impgen.c starts here */
-# /* Copyright (C) 1999-2000 Free Software Foundation, Inc.
-#
-# This file is part of GNU libtool.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-# */
-#
-# #include <stdio.h> /* for printf() */
-# #include <unistd.h> /* for open(), lseek(), read() */
-# #include <fcntl.h> /* for O_RDONLY, O_BINARY */
-# #include <string.h> /* for strdup() */
-#
-# /* O_BINARY isn't required (or even defined sometimes) under Unix */
-# #ifndef O_BINARY
-# #define O_BINARY 0
-# #endif
-#
-# static unsigned int
-# pe_get16 (fd, offset)
-# int fd;
-# int offset;
-# {
-# unsigned char b[2];
-# lseek (fd, offset, SEEK_SET);
-# read (fd, b, 2);
-# return b[0] + (b[1]<<8);
-# }
-#
-# static unsigned int
-# pe_get32 (fd, offset)
-# int fd;
-# int offset;
-# {
-# unsigned char b[4];
-# lseek (fd, offset, SEEK_SET);
-# read (fd, b, 4);
-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-# }
-#
-# static unsigned int
-# pe_as32 (ptr)
-# void *ptr;
-# {
-# unsigned char *b = ptr;
-# return b[0] + (b[1]<<8) + (b[2]<<16) + (b[3]<<24);
-# }
-#
-# int
-# main (argc, argv)
-# int argc;
-# char *argv[];
-# {
-# int dll;
-# unsigned long pe_header_offset, opthdr_ofs, num_entries, i;
-# unsigned long export_rva, export_size, nsections, secptr, expptr;
-# unsigned long name_rvas, nexp;
-# unsigned char *expdata, *erva;
-# char *filename, *dll_name;
-#
-# filename = argv[1];
-#
-# dll = open(filename, O_RDONLY|O_BINARY);
-# if (dll < 1)
-# return 1;
-#
-# dll_name = filename;
-#
-# for (i=0; filename[i]; i++)
-# if (filename[i] == '/' || filename[i] == '\\' || filename[i] == ':')
-# dll_name = filename + i +1;
-#
-# pe_header_offset = pe_get32 (dll, 0x3c);
-# opthdr_ofs = pe_header_offset + 4 + 20;
-# num_entries = pe_get32 (dll, opthdr_ofs + 92);
-#
-# if (num_entries < 1) /* no exports */
-# return 1;
-#
-# export_rva = pe_get32 (dll, opthdr_ofs + 96);
-# export_size = pe_get32 (dll, opthdr_ofs + 100);
-# nsections = pe_get16 (dll, pe_header_offset + 4 +2);
-# secptr = (pe_header_offset + 4 + 20 +
-# pe_get16 (dll, pe_header_offset + 4 + 16));
-#
-# expptr = 0;
-# for (i = 0; i < nsections; i++)
-# {
-# char sname[8];
-# unsigned long secptr1 = secptr + 40 * i;
-# unsigned long vaddr = pe_get32 (dll, secptr1 + 12);
-# unsigned long vsize = pe_get32 (dll, secptr1 + 16);
-# unsigned long fptr = pe_get32 (dll, secptr1 + 20);
-# lseek(dll, secptr1, SEEK_SET);
-# read(dll, sname, 8);
-# if (vaddr <= export_rva && vaddr+vsize > export_rva)
-# {
-# expptr = fptr + (export_rva - vaddr);
-# if (export_rva + export_size > vaddr + vsize)
-# export_size = vsize - (export_rva - vaddr);
-# break;
-# }
-# }
-#
-# expdata = (unsigned char*)malloc(export_size);
-# lseek (dll, expptr, SEEK_SET);
-# read (dll, expdata, export_size);
-# erva = expdata - export_rva;
-#
-# nexp = pe_as32 (expdata+24);
-# name_rvas = pe_as32 (expdata+32);
-#
-# printf ("EXPORTS\n");
-# for (i = 0; i<nexp; i++)
-# {
-# unsigned long name_rva = pe_as32 (erva+name_rvas+i*4);
-# printf ("\t%s @ %ld ;\n", erva+name_rva, 1+ i);
-# }
-#
-# return 0;
-# }
-# /* impgen.c ends here */
-
-EOF
- ;;
- esac
-
- # We use sed instead of cat because bash on DJGPP gets confused if
- # if finds mixed CR/LF and LF-only lines. Since sed operates in
- # text mode, it properly converts lines to CR/LF. This bash problem
- # is reportedly fixed, but why not run on old versions too?
- sed '$q' "$ltmain" >> "${ofile}T" || (rm -f "${ofile}T"; exit 1)
-
- mv -f "${ofile}T" "$ofile" || \
- (rm -f "$ofile" && cp "${ofile}T" "$ofile" && rm -f "${ofile}T")
- chmod +x "$ofile"
-fi
-
-
-
-
-
-# This can be used to rebuild libtool when needed
-LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
-
-# Always use our own libtool.
-LIBTOOL='$(SHELL) $(top_builddir)/libtool'
-
-# Prevent multiple expansion
-
-
-
-# C++ Code
-ac_ext=cc
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-if test -n "$ac_tool_prefix"; then
- for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
- do
- # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_CXX+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$CXX"; then
- ac_cv_prog_CXX="$CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-CXX=$ac_cv_prog_CXX
-if test -n "$CXX"; then
- echo "$as_me:$LINENO: result: $CXX" >&5
-echo "${ECHO_T}$CXX" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- test -n "$CXX" && break
- done
-fi
-if test -z "$CXX"; then
- ac_ct_CXX=$CXX
- for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
-do
- # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$ac_ct_CXX"; then
- ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_ac_ct_CXX="$ac_prog"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
-fi
-fi
-ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
-if test -n "$ac_ct_CXX"; then
- echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
-echo "${ECHO_T}$ac_ct_CXX" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
- test -n "$ac_ct_CXX" && break
-done
-test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
-
- CXX=$ac_ct_CXX
-fi
-
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO:" \
- "checking for C++ compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
- (eval $ac_compiler --version </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
- (eval $ac_compiler -v </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
- (eval $ac_compiler -V </dev/null >&5) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }
-
-echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
-if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-#ifndef __GNUC__
- choke me
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_compiler_gnu=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_compiler_gnu=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
-
-fi
-echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
-GXX=`test $ac_compiler_gnu = yes && echo yes`
-ac_test_CXXFLAGS=${CXXFLAGS+set}
-ac_save_CXXFLAGS=$CXXFLAGS
-CXXFLAGS="-g"
-echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
-echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
-if test "${ac_cv_prog_cxx_g+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_prog_cxx_g=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_cv_prog_cxx_g=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
-if test "$ac_test_CXXFLAGS" = set; then
- CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
- if test "$GXX" = yes; then
- CXXFLAGS="-g -O2"
- else
- CXXFLAGS="-g"
- fi
-else
- if test "$GXX" = yes; then
- CXXFLAGS="-O2"
- else
- CXXFLAGS=
- fi
-fi
-for ac_declaration in \
- ''\
- '#include <stdlib.h>' \
- 'extern "C" void std::exit (int) throw (); using std::exit;' \
- 'extern "C" void std::exit (int); using std::exit;' \
- 'extern "C" void exit (int) throw ();' \
- 'extern "C" void exit (int);' \
- 'void exit (int);'
-do
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-$ac_declaration
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-exit (42);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-continue
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_declaration
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-exit (42);
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- break
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-done
-rm -f conftest*
-if test -n "$ac_declaration"; then
- echo '#ifdef __cplusplus' >>confdefs.h
- echo $ac_declaration >>confdefs.h
- echo '#endif' >>confdefs.h
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-depcc="$CXX" am_compiler_list=
-
-echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
-if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named `D' -- because `-MD' means `put the output
- # in D'.
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
-
- am_cv_CXX_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
- fi
- for depmode in $am_compiler_list; do
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- echo '#include "conftest.h"' > conftest.c
- echo 'int i;' > conftest.h
- echo "${am__include} ${am__quote}conftest.Po${am__quote}" > confmf
-
- case $depmode in
- nosideeffect)
- # after this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- none) break ;;
- esac
- # We check with `-c' and `-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle `-M -o', and we need to detect this.
- if depmode=$depmode \
- source=conftest.c object=conftest.o \
- depfile=conftest.Po tmpdepfile=conftest.TPo \
- $SHELL ./depcomp $depcc -c conftest.c -o conftest.o >/dev/null 2>&1 &&
- grep conftest.h conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- am_cv_CXX_dependencies_compiler_type=$depmode
- break
- fi
- done
-
- cd ..
- rm -rf conftest.dir
-else
- am_cv_CXX_dependencies_compiler_type=none
-fi
-
-fi
-echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
-
-
-
-# look for doxygen software
-# Extract the first word of "doxygen", so it can be a program name with args.
-set dummy doxygen; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_prog_doxygen+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- if test -n "$doxygen"; then
- ac_cv_prog_doxygen="$doxygen" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for ac_exec_ext in '' $ac_executable_extensions; do
- if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
- ac_cv_prog_doxygen="yes"
- echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
- break 2
- fi
-done
-done
-
- test -z "$ac_cv_prog_doxygen" && ac_cv_prog_doxygen="no"
-fi
-fi
-doxygen=$ac_cv_prog_doxygen
-if test -n "$doxygen"; then
- echo "$as_me:$LINENO: result: $doxygen" >&5
-echo "${ECHO_T}$doxygen" >&6
-else
- echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6
-fi
-
-if test "$doxygen" = "yes"; then
- XSUBDIRS="$XSUBDIRS docs"
-fi
-
-# get RedHat release
-if test -f /etc/redhat-release ; then
- RHREL=`cut -d " " -f 5 /etc/redhat-release`
- RHREL="rh${RHREL}"
-else
- RHREL="X"
-fi
-
-
-# get G++ version
-if test "$GXX" = "yes"; then
- GXXVER=`${CXX} -v 2>&1 | grep version | cut -d " " -f 3 -`
- GXXVER="gcc${GXXVER}"
-else
- GXXVER=""
-fi
-
-
-RELEASE="${RHREL}-${GXXVER}-2.1"
-
-
-# setup topdir
-topdir=`pwd`
-
-
-# Checks for header files
-echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
-if test "${ac_cv_header_stdc+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_cv_header_stdc=yes
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_cv_header_stdc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
- # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "memchr" >/dev/null 2>&1; then
- :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
- egrep "free" >/dev/null 2>&1; then
- :
-else
- ac_cv_header_stdc=no
-fi
-rm -f conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
- # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
- if test "$cross_compiling" = yes; then
- :
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <ctype.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
- || ('j' <= (c) && (c) <= 'r') \
- || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
- int i;
- for (i = 0; i < 256; i++)
- if (XOR (islower (i), ISLOWER (i))
- || toupper (i) != TOUPPER (i))
- exit(2);
- exit (0);
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- :
-else
- echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-( exit $ac_status )
-ac_cv_header_stdc=no
-fi
-rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6
-if test $ac_cv_header_stdc = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
-
-fi
-
-if test "${ac_cv_header_io_h+set}" = set; then
- echo "$as_me:$LINENO: checking for io.h" >&5
-echo $ECHO_N "checking for io.h... $ECHO_C" >&6
-if test "${ac_cv_header_io_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_io_h" >&5
-echo "${ECHO_T}$ac_cv_header_io_h" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking io.h usability" >&5
-echo $ECHO_N "checking io.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_includes_default
-#include <io.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking io.h presence" >&5
-echo $ECHO_N "checking io.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <io.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: io.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: io.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: io.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: io.h: proceeding with the preprocessor's result" >&2;};;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: io.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: io.h: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: io.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: io.h: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: io.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: io.h: proceeding with the preprocessor's result" >&2;};;
-esac
-echo "$as_me:$LINENO: checking for io.h" >&5
-echo $ECHO_N "checking for io.h... $ECHO_C" >&6
-if test "${ac_cv_header_io_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_header_io_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_io_h" >&5
-echo "${ECHO_T}$ac_cv_header_io_h" >&6
-
-fi
-
-
-if test "${ac_cv_header_sys_locking_h+set}" = set; then
- echo "$as_me:$LINENO: checking for sys/locking.h" >&5
-echo $ECHO_N "checking for sys/locking.h... $ECHO_C" >&6
-if test "${ac_cv_header_sys_locking_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_sys_locking_h" >&5
-echo "${ECHO_T}$ac_cv_header_sys_locking_h" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking sys/locking.h usability" >&5
-echo $ECHO_N "checking sys/locking.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_includes_default
-#include <sys/locking.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking sys/locking.h presence" >&5
-echo $ECHO_N "checking sys/locking.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <sys/locking.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: sys/locking.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: sys/locking.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: sys/locking.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: sys/locking.h: proceeding with the preprocessor's result" >&2;};;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: sys/locking.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: sys/locking.h: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: sys/locking.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: sys/locking.h: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: sys/locking.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: sys/locking.h: proceeding with the preprocessor's result" >&2;};;
-esac
-echo "$as_me:$LINENO: checking for sys/locking.h" >&5
-echo $ECHO_N "checking for sys/locking.h... $ECHO_C" >&6
-if test "${ac_cv_header_sys_locking_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_header_sys_locking_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_sys_locking_h" >&5
-echo "${ECHO_T}$ac_cv_header_sys_locking_h" >&6
-
-fi
-
-
-if test "${ac_cv_header_fcntl_h+set}" = set; then
- echo "$as_me:$LINENO: checking for fcntl.h" >&5
-echo $ECHO_N "checking for fcntl.h... $ECHO_C" >&6
-if test "${ac_cv_header_fcntl_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_fcntl_h" >&5
-echo "${ECHO_T}$ac_cv_header_fcntl_h" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking fcntl.h usability" >&5
-echo $ECHO_N "checking fcntl.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_includes_default
-#include <fcntl.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking fcntl.h presence" >&5
-echo $ECHO_N "checking fcntl.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <fcntl.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: fcntl.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: fcntl.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: fcntl.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: fcntl.h: proceeding with the preprocessor's result" >&2;};;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: fcntl.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: fcntl.h: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: fcntl.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: fcntl.h: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: fcntl.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: fcntl.h: proceeding with the preprocessor's result" >&2;};;
-esac
-echo "$as_me:$LINENO: checking for fcntl.h" >&5
-echo $ECHO_N "checking for fcntl.h... $ECHO_C" >&6
-if test "${ac_cv_header_fcntl_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_header_fcntl_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_fcntl_h" >&5
-echo "${ECHO_T}$ac_cv_header_fcntl_h" >&6
-
-fi
-if test $ac_cv_header_fcntl_h = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define HAVE_FCNTL_H 1
-_ACEOF
-
-fi
-
-
-if test "${ac_cv_header_ctype_h+set}" = set; then
- echo "$as_me:$LINENO: checking for ctype.h" >&5
-echo $ECHO_N "checking for ctype.h... $ECHO_C" >&6
-if test "${ac_cv_header_ctype_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_ctype_h" >&5
-echo "${ECHO_T}$ac_cv_header_ctype_h" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking ctype.h usability" >&5
-echo $ECHO_N "checking ctype.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_includes_default
-#include <ctype.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking ctype.h presence" >&5
-echo $ECHO_N "checking ctype.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <ctype.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: ctype.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: ctype.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: ctype.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: ctype.h: proceeding with the preprocessor's result" >&2;};;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: ctype.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: ctype.h: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: ctype.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: ctype.h: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: ctype.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: ctype.h: proceeding with the preprocessor's result" >&2;};;
-esac
-echo "$as_me:$LINENO: checking for ctype.h" >&5
-echo $ECHO_N "checking for ctype.h... $ECHO_C" >&6
-if test "${ac_cv_header_ctype_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_header_ctype_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_ctype_h" >&5
-echo "${ECHO_T}$ac_cv_header_ctype_h" >&6
-
-fi
-
-
-if test "${ac_cv_header_unistd_h+set}" = set; then
- echo "$as_me:$LINENO: checking for unistd.h" >&5
-echo $ECHO_N "checking for unistd.h... $ECHO_C" >&6
-if test "${ac_cv_header_unistd_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_unistd_h" >&5
-echo "${ECHO_T}$ac_cv_header_unistd_h" >&6
-else
- # Is the header compilable?
-echo "$as_me:$LINENO: checking unistd.h usability" >&5
-echo $ECHO_N "checking unistd.h usability... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-$ac_includes_default
-#include <unistd.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_header_compiler=yes
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-ac_header_compiler=no
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6
-
-# Is the header present?
-echo "$as_me:$LINENO: checking unistd.h presence" >&5
-echo $ECHO_N "checking unistd.h presence... $ECHO_C" >&6
-cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <unistd.h>
-_ACEOF
-if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
- (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
- ac_status=$?
- egrep -v '^ *\+' conftest.er1 >conftest.err
- rm -f conftest.er1
- cat conftest.err >&5
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } >/dev/null; then
- if test -s conftest.err; then
- ac_cpp_err=$ac_c_preproc_warn_flag
- else
- ac_cpp_err=
- fi
-else
- ac_cpp_err=yes
-fi
-if test -z "$ac_cpp_err"; then
- ac_header_preproc=yes
-else
- echo "$as_me: failed program was:" >&5
- cat conftest.$ac_ext >&5
- ac_header_preproc=no
-fi
-rm -f conftest.err conftest.$ac_ext
-echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6
-
-# So? What about this header?
-case $ac_header_compiler:$ac_header_preproc in
- yes:no )
- { echo "$as_me:$LINENO: WARNING: unistd.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: unistd.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
- { echo "$as_me:$LINENO: WARNING: unistd.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: unistd.h: proceeding with the preprocessor's result" >&2;};;
- no:yes )
- { echo "$as_me:$LINENO: WARNING: unistd.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: unistd.h: present but cannot be compiled" >&2;}
- { echo "$as_me:$LINENO: WARNING: unistd.h: check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: unistd.h: check for missing prerequisite headers?" >&2;}
- { echo "$as_me:$LINENO: WARNING: unistd.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: unistd.h: proceeding with the preprocessor's result" >&2;};;
-esac
-echo "$as_me:$LINENO: checking for unistd.h" >&5
-echo $ECHO_N "checking for unistd.h... $ECHO_C" >&6
-if test "${ac_cv_header_unistd_h+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_header_unistd_h=$ac_header_preproc
-fi
-echo "$as_me:$LINENO: result: $ac_cv_header_unistd_h" >&5
-echo "${ECHO_T}$ac_cv_header_unistd_h" >&6
-
-fi
-
-
-
-# Checks for library functions.
-
-for ac_func in vsnprintf
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func (); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-f = $ac_func;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_var=yes"
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-eval "$as_ac_var=no"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-for ac_func in vsprintf
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func (); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-f = $ac_func;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_var=yes"
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-eval "$as_ac_var=no"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-for ac_func in strcasecmp
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func (); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-f = $ac_func;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_var=yes"
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-eval "$as_ac_var=no"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-# Checks for 64 bit file support
-# Check whether --enable-largefile or --disable-largefile was given.
-if test "${enable_largefile+set}" = set; then
- enableval="$enable_largefile"
-
-fi;
-if test "$enable_largefile" != no; then
-
- echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5
-echo $ECHO_N "checking for special C compiler options needed for large files... $ECHO_C" >&6
-if test "${ac_cv_sys_largefile_CC+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- ac_cv_sys_largefile_CC=no
- if test "$GCC" != yes; then
- ac_save_CC=$CC
- while :; do
- # IRIX 6.2 and later do not support large files by default,
- # so use the C compiler's -n32 option if that helps.
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
- rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- break
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext
- CC="$CC -n32"
- rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_sys_largefile_CC=' -n32'; break
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext
- break
- done
- CC=$ac_save_CC
- rm -f conftest.$ac_ext
- fi
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5
-echo "${ECHO_T}$ac_cv_sys_largefile_CC" >&6
- if test "$ac_cv_sys_largefile_CC" != no; then
- CC=$CC$ac_cv_sys_largefile_CC
- fi
-
- echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5
-echo $ECHO_N "checking for _FILE_OFFSET_BITS value needed for large files... $ECHO_C" >&6
-if test "${ac_cv_sys_file_offset_bits+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- while :; do
- ac_cv_sys_file_offset_bits=no
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- break
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#define _FILE_OFFSET_BITS 64
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_sys_file_offset_bits=64; break
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- break
-done
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5
-echo "${ECHO_T}$ac_cv_sys_file_offset_bits" >&6
-if test "$ac_cv_sys_file_offset_bits" != no; then
-
-cat >>confdefs.h <<_ACEOF
-#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
-_ACEOF
-
-fi
-rm -f conftest*
- echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5
-echo $ECHO_N "checking for _LARGE_FILES value needed for large files... $ECHO_C" >&6
-if test "${ac_cv_sys_large_files+set}" = set; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- while :; do
- ac_cv_sys_large_files=no
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- break
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-#define _LARGE_FILES 1
-#include <sys/types.h>
- /* Check that off_t can represent 2**63 - 1 correctly.
- We can't simply define LARGE_OFF_T to be 9223372036854775807,
- since some C++ compilers masquerading as C compilers
- incorrectly reject 9223372036854775807. */
-#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62))
- int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
- && LARGE_OFF_T % 2147483647 == 1)
- ? 1 : -1];
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
- (eval $ac_compile) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest.$ac_objext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- ac_cv_sys_large_files=1; break
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-fi
-rm -f conftest.$ac_objext conftest.$ac_ext
- break
-done
-fi
-echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5
-echo "${ECHO_T}$ac_cv_sys_large_files" >&6
-if test "$ac_cv_sys_large_files" != no; then
-
-cat >>confdefs.h <<_ACEOF
-#define _LARGE_FILES $ac_cv_sys_large_files
-_ACEOF
-
-fi
-rm -f conftest*
-fi
-
-
-for ac_func in ftello
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func (); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-f = $ac_func;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_var=yes"
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-eval "$as_ac_var=no"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-for ac_func in fseeko
-do
-as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
-echo "$as_me:$LINENO: checking for $ac_func" >&5
-echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
-if eval "test \"\${$as_ac_var+set}\" = set"; then
- echo $ECHO_N "(cached) $ECHO_C" >&6
-else
- cat >conftest.$ac_ext <<_ACEOF
-#line $LINENO "configure"
-#include "confdefs.h"
-/* System header to define __stub macros and hopefully few prototypes,
- which can conflict with char $ac_func (); below. */
-#include <assert.h>
-/* Override any gcc2 internal prototype to avoid an error. */
-#ifdef __cplusplus
-extern "C"
-#endif
-/* We use char because int might match the return type of a gcc2
- builtin and then its argument prototype would still apply. */
-char $ac_func ();
-char (*f) ();
-
-#ifdef F77_DUMMY_MAIN
-# ifdef __cplusplus
- extern "C"
-# endif
- int F77_DUMMY_MAIN() { return 1; }
-#endif
-int
-main ()
-{
-/* The GNU C library defines this for functions which it implements
- to always fail with ENOSYS. Some functions are actually named
- something starting with __ and the normal name is an alias. */
-#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
-choke me
-#else
-f = $ac_func;
-#endif
-
- ;
- return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
- (eval $ac_link) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); } &&
- { ac_try='test -s conftest$ac_exeext'
- { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
- (eval $ac_try) 2>&5
- ac_status=$?
- echo "$as_me:$LINENO: \$? = $ac_status" >&5
- (exit $ac_status); }; }; then
- eval "$as_ac_var=yes"
-else
- echo "$as_me: failed program was:" >&5
-cat conftest.$ac_ext >&5
-eval "$as_ac_var=no"
-fi
-rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
-fi
-echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
-echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
-if test `eval echo '${'$as_ac_var'}'` = yes; then
- cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-done
-
-
-
-# compile support for ndx index logic
-
-# Check whether --with-index-ndx or --without-index-ndx was given.
-if test "${with_index_ndx+set}" = set; then
- withval="$with_index_ndx"
- enable_index_ndx="$withval"
-else
- enable_index_ndx="yes"
-fi;
-if test "$enable_index_ndx" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_INDEX_NDX 1
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_EXPRESSIONS 1
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_INDEX_ANY 1
-_ACEOF
-
-fi
-
-# compile support for ntx index logic
-
-# Check whether --with-index-ntx or --without-index-ntx was given.
-if test "${with_index_ntx+set}" = set; then
- withval="$with_index_ntx"
- enable_index_ntx="$withval"
-else
- enable_index_ntx="yes"
-fi;
-if test "$enable_index_ntx" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_INDEX_NTX 1
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_EXPRESSIONS 1
-_ACEOF
-
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_INDEX_ANY 1
-_ACEOF
-
-fi
-
-# compile support for memo fields
-
-# Check whether --with-memo-fields or --without-memo-fields was given.
-if test "${with_memo_fields+set}" = set; then
- withval="$with_memo_fields"
- enable_memo_fields="$withval"
-else
- enable_memo_fields="yes"
-fi;
-if test "$enable_memo_fields" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_MEMO_FIELDS 1
-_ACEOF
-
-fi
-
-# compile support for expressions
-# index logic requires this be enabled
-
-# Check whether --with-expressions or --without-expressions was given.
-if test "${with_expressions+set}" = set; then
- withval="$with_expressions"
- enable_expressions="$withval"
-else
- enable_expressions="yes"
-fi;
-if test "$enable_expressions" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_EXPRESSIONS 1
-_ACEOF
-
-fi
-
-# compile support for record locking
-
-# Check whether --with-xbase-locking or --without-xbase-locking was given.
-if test "${with_xbase_locking+set}" = set; then
- withval="$with_xbase_locking"
- enable_xbase_locking="$withval"
-else
- enable_xbase_locking="yes"
-fi;
-if test "$enable_xbase_locking" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_LOCKING_ON 1
-_ACEOF
-
-fi
-
-# compile support for true record deletion
-
-# Check whether --with-realdelete or --without-realdelete was given.
-if test "${with_realdelete+set}" = set; then
- withval="$with_realdelete"
- enable_realdelete="$withval"
-else
- enable_realdelete="yes"
-fi;
-if test "$enable_realdelete" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_REAL_DELETE 1
-_ACEOF
-
-fi
-
-# compile support for filters
-
-# Check whether --with-xbase-filters or --without-xbase-filters was given.
-if test "${with_xbase_filters+set}" = set; then
- withval="$with_xbase_filters"
- enable_xbase_filters="$withval"
-else
- enable_xbase_filters="yes"
-fi;
-if test "$enable_xbase_filters" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_FILTERS 1
-_ACEOF
-
-fi
-
-# compile in debug logic
-
-# Check whether --with-xbase-debug or --without-xbase-debug was given.
-if test "${with_xbase_debug+set}" = set; then
- withval="$with_xbase_debug"
- enable_xbase_debug="$withval"
-else
- enable_xbase_debug="yes"
-fi;
-if test "$enable_xbase_debug" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define XBASE_DEBUG 1
-_ACEOF
-
-fi
-
-# compile in largefile support
-
-# Check whether --with-xbase-largefile or --without-xbase-largefile was given.
-if test "${with_xbase_largefile+set}" = set; then
- withval="$with_xbase_largefile"
- enable_largefile_support="$withval"
-else
- enable_largefile_support="yes"
-fi;
-if test "$enable_largefile_support" = "yes"; then
-
-cat >>confdefs.h <<\_ACEOF
-#define XB_LARGEFILE_SUPPORT 1
-_ACEOF
-
-fi
-
-# path separator
-
-
-
-# default memo file block size
-
-
-
-# build the following Makefiles
-ac_config_files="$ac_config_files Makefile xbase64/Makefile examples/Makefile bin/Makefile html/Makefile libtest/Makefile xbase64-config xbase64.spec docs/doxygen.cfg docs/Makefile"
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems. If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overriden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, don't put newlines in cache variables' values.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-{
- (set) 2>&1 |
- case `(ac_space=' '; set | grep ac_space) 2>&1` in
- *ac_space=\ *)
- # `set' does not quote correctly, so add quotes (double-quote
- # substitution turns \\\\ into \\, and sed turns \\ into \).
- sed -n \
- "s/'/'\\\\''/g;
- s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
- ;;
- *)
- # `set' quotes correctly as required by POSIX, so do not add quotes.
- sed -n \
- "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
- ;;
- esac;
-} |
- sed '
- t clear
- : clear
- s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
- t end
- /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
- : end' >>confcache
-if cmp -s $cache_file confcache; then :; else
- if test -w $cache_file; then
- test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
- cat confcache >$cache_file
- else
- echo "not updating unwritable cache $cache_file"
- fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
- ac_vpsub='/^[ ]*VPATH[ ]*=/{
-s/:*\$(srcdir):*/:/;
-s/:*\${srcdir}:*/:/;
-s/:*@srcdir@:*/:/;
-s/^\([^=]*=[ ]*\):*/\1/;
-s/:*$//;
-s/^[^=]*=[ ]*$//;
-}'
-fi
-
-DEFS=-DHAVE_CONFIG_H
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
- { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
- { (exit 1); exit 1; }; }
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-## --------------------- ##
-## M4sh Initialization. ##
-## --------------------- ##
-
-# Be Bourne compatible
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
- emulate sh
- NULLCMD=:
-elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
- set -o posix
-fi
-
-# NLS nuisances.
-# Support unset when possible.
-if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
- as_unset=unset
-else
- as_unset=false
-fi
-
-(set +x; test -n "`(LANG=C; export LANG) 2>&1`") &&
- { $as_unset LANG || test "${LANG+set}" != set; } ||
- { LANG=C; export LANG; }
-(set +x; test -n "`(LC_ALL=C; export LC_ALL) 2>&1`") &&
- { $as_unset LC_ALL || test "${LC_ALL+set}" != set; } ||
- { LC_ALL=C; export LC_ALL; }
-(set +x; test -n "`(LC_TIME=C; export LC_TIME) 2>&1`") &&
- { $as_unset LC_TIME || test "${LC_TIME+set}" != set; } ||
- { LC_TIME=C; export LC_TIME; }
-(set +x; test -n "`(LC_CTYPE=C; export LC_CTYPE) 2>&1`") &&
- { $as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set; } ||
- { LC_CTYPE=C; export LC_CTYPE; }
-(set +x; test -n "`(LANGUAGE=C; export LANGUAGE) 2>&1`") &&
- { $as_unset LANGUAGE || test "${LANGUAGE+set}" != set; } ||
- { LANGUAGE=C; export LANGUAGE; }
-(set +x; test -n "`(LC_COLLATE=C; export LC_COLLATE) 2>&1`") &&
- { $as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set; } ||
- { LC_COLLATE=C; export LC_COLLATE; }
-(set +x; test -n "`(LC_NUMERIC=C; export LC_NUMERIC) 2>&1`") &&
- { $as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set; } ||
- { LC_NUMERIC=C; export LC_NUMERIC; }
-(set +x; test -n "`(LC_MESSAGES=C; export LC_MESSAGES) 2>&1`") &&
- { $as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set; } ||
- { LC_MESSAGES=C; export LC_MESSAGES; }
-
-
-# Name of the executable.
-as_me=`(basename "$0") 2>/dev/null ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
- X"$0" : 'X\(//\)$' \| \
- X"$0" : 'X\(/\)$' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X/"$0" |
- sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
- /^X\/\(\/\/\)$/{ s//\1/; q; }
- /^X\/\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
-
-# PATH needs CR, and LINENO needs CR and PATH.
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
- echo "#! /bin/sh" >conftest.sh
- echo "exit 0" >>conftest.sh
- chmod +x conftest.sh
- if (PATH=".;."; conftest.sh) >/dev/null 2>&1; then
- PATH_SEPARATOR=';'
- else
- PATH_SEPARATOR=:
- fi
- rm -f conftest.sh
-fi
-
-
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x$as_lineno_3" = "x$as_lineno_2" || {
- # Find who we are. Look in the path if we contain no path at all
- # relative or not.
- case $0 in
- *[\\/]* ) as_myself=$0 ;;
- *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-
- ;;
- esac
- # We did not find ourselves, most probably we were run as `sh COMMAND'
- # in which case we are not to be found in the path.
- if test "x$as_myself" = x; then
- as_myself=$0
- fi
- if test ! -f "$as_myself"; then
- { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
-echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
- { (exit 1); exit 1; }; }
- fi
- case $CONFIG_SHELL in
- '')
- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
- IFS=$as_save_IFS
- test -z "$as_dir" && as_dir=.
- for as_base in sh bash ksh sh5; do
- case $as_dir in
- /*)
- if ("$as_dir/$as_base" -c '
- as_lineno_1=$LINENO
- as_lineno_2=$LINENO
- as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
- test "x$as_lineno_1" != "x$as_lineno_2" &&
- test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
- CONFIG_SHELL=$as_dir/$as_base
- export CONFIG_SHELL
- exec "$CONFIG_SHELL" "$0" ${1+"$@"}
- fi;;
- esac
- done
-done
-;;
- esac
-
- # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
- # uniformly replaced by the line number. The first 'sed' inserts a
- # line-number line before each line; the second 'sed' does the real
- # work. The second script uses 'N' to pair each line-number line
- # with the numbered line, and appends trailing '-' during
- # substitution so that $LINENO is not a special case at line end.
- # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
- # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
- sed '=' <$as_myself |
- sed '
- N
- s,$,-,
- : loop
- s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
- t loop
- s,-$,,
- s,^['$as_cr_digits']*\n,,
- ' >$as_me.lineno &&
- chmod +x $as_me.lineno ||
- { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
-echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
- { (exit 1); exit 1; }; }
-
- # Don't try to exec as it changes $[0], causing all sort of problems
- # (the dirname of $[0] is not the place where we might find the
- # original and so on. Autoconf is especially sensible to this).
- . ./$as_me.lineno
- # Exit status is that of the last command.
- exit
-}
-
-
-case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
- *c*,-n*) ECHO_N= ECHO_C='
-' ECHO_T=' ' ;;
- *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
- *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1; then
- as_expr=expr
-else
- as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
- # We could just check for DJGPP; but this test a) works b) is more generic
- # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
- if test -f conf$$.exe; then
- # Don't use ln at all; we don't have any links
- as_ln_s='cp -p'
- else
- as_ln_s='ln -s'
- fi
-elif ln conf$$.file conf$$ 2>/dev/null; then
- as_ln_s=ln
-else
- as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.file
-
-as_executable_p="test -f"
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.
-as_nl='
-'
-IFS=" $as_nl"
-
-# CDPATH.
-$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=$PATH_SEPARATOR; export CDPATH; }
-
-exec 6>&1
-
-# Open the log real soon, to keep \$[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling. Logging --version etc. is OK.
-exec 5>>config.log
-{
- echo
- sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-} >&5
-cat >&5 <<_CSEOF
-
-This file was extended by xbase64 $as_me 3.1.2, which was
-generated by GNU Autoconf 2.53. Invocation command line was
-
- CONFIG_FILES = $CONFIG_FILES
- CONFIG_HEADERS = $CONFIG_HEADERS
- CONFIG_LINKS = $CONFIG_LINKS
- CONFIG_COMMANDS = $CONFIG_COMMANDS
- $ $0 $@
-
-_CSEOF
-echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
-echo >&5
-_ACEOF
-
-# Files that config.status was made for.
-if test -n "$ac_config_files"; then
- echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_headers"; then
- echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_links"; then
- echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
-fi
-
-if test -n "$ac_config_commands"; then
- echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
-
-Usage: $0 [OPTIONS] [FILE]...
-
- -h, --help print this help, then exit
- -V, --version print version number, then exit
- -d, --debug don't remove temporary files
- --recheck update $as_me by reconfiguring in the same conditions
- --file=FILE[:TEMPLATE]
- instantiate the configuration file FILE
- --header=FILE[:TEMPLATE]
- instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <bug-autoconf@gnu.org>."
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-ac_cs_version="\\
-xbase64 config.status 3.1.2
-configured by $0, generated by GNU Autoconf 2.53,
- with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
-Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-srcdir=$srcdir
-INSTALL="$INSTALL"
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value. By we need to know if files were specified by the user.
-ac_need_defaults=:
-while test $# != 0
-do
- case $1 in
- --*=*)
- ac_option=`expr "x$1" : 'x\([^=]*\)='`
- ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
- shift
- set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
- shift
- ;;
- -*);;
- *) # This is not an option, so the user has probably given explicit
- # arguments.
- ac_need_defaults=false;;
- esac
-
- case $1 in
- # Handling of the options.
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
- -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
- echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
- exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
- --version | --vers* | -V )
- echo "$ac_cs_version"; exit 0 ;;
- --he | --h)
- # Conflict between --help and --header
- { { echo "$as_me:$LINENO: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2;}
- { (exit 1); exit 1; }; };;
- --help | --hel | -h )
- echo "$ac_cs_usage"; exit 0 ;;
- --debug | --d* | -d )
- debug=: ;;
- --file | --fil | --fi | --f )
- shift
- CONFIG_FILES="$CONFIG_FILES $1"
- ac_need_defaults=false;;
- --header | --heade | --head | --hea )
- shift
- CONFIG_HEADERS="$CONFIG_HEADERS $1"
- ac_need_defaults=false;;
-
- # This is an error.
- -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&5
-echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2;}
- { (exit 1); exit 1; }; } ;;
-
- *) ac_config_targets="$ac_config_targets $1" ;;
-
- esac
- shift
-done
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-#
-# INIT-COMMANDS section.
-#
-
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-_ACEOF
-
-
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_config_target in $ac_config_targets
-do
- case "$ac_config_target" in
- # Handling of arguments.
- "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
- "xbase64/Makefile" ) CONFIG_FILES="$CONFIG_FILES xbase64/Makefile" ;;
- "examples/Makefile" ) CONFIG_FILES="$CONFIG_FILES examples/Makefile" ;;
- "bin/Makefile" ) CONFIG_FILES="$CONFIG_FILES bin/Makefile" ;;
- "html/Makefile" ) CONFIG_FILES="$CONFIG_FILES html/Makefile" ;;
- "libtest/Makefile" ) CONFIG_FILES="$CONFIG_FILES libtest/Makefile" ;;
- "xbase64-config" ) CONFIG_FILES="$CONFIG_FILES xbase64-config" ;;
- "xbase64.spec" ) CONFIG_FILES="$CONFIG_FILES xbase64.spec" ;;
- "docs/doxygen.cfg" ) CONFIG_FILES="$CONFIG_FILES docs/doxygen.cfg" ;;
- "docs/Makefile" ) CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
- "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
- "xbase64/xbconfig.h" ) CONFIG_HEADERS="$CONFIG_HEADERS xbase64/xbconfig.h:xbase64/xbconfig.in" ;;
- *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
- { (exit 1); exit 1; }; };;
- esac
-done
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used. Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
- test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
- test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
- test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Create a temporary directory, and hook for its removal unless debugging.
-$debug ||
-{
- trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
- trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
-
-# Create a (secure) tmp directory for tmp files.
-: ${TMPDIR=/tmp}
-{
- tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
- test -n "$tmp" && test -d "$tmp"
-} ||
-{
- tmp=$TMPDIR/cs$$-$RANDOM
- (umask 077 && mkdir $tmp)
-} ||
-{
- echo "$me: cannot create a temporary directory in $TMPDIR" >&2
- { (exit 1); exit 1; }
-}
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-
-#
-# CONFIG_FILES section.
-#
-
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
-if test -n "\$CONFIG_FILES"; then
- # Protect against being on the right side of a sed subst in config.status.
- sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
- s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
-s,@SHELL@,$SHELL,;t t
-s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
-s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
-s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
-s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
-s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
-s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
-s,@exec_prefix@,$exec_prefix,;t t
-s,@prefix@,$prefix,;t t
-s,@program_transform_name@,$program_transform_name,;t t
-s,@bindir@,$bindir,;t t
-s,@sbindir@,$sbindir,;t t
-s,@libexecdir@,$libexecdir,;t t
-s,@datadir@,$datadir,;t t
-s,@sysconfdir@,$sysconfdir,;t t
-s,@sharedstatedir@,$sharedstatedir,;t t
-s,@localstatedir@,$localstatedir,;t t
-s,@libdir@,$libdir,;t t
-s,@includedir@,$includedir,;t t
-s,@oldincludedir@,$oldincludedir,;t t
-s,@infodir@,$infodir,;t t
-s,@mandir@,$mandir,;t t
-s,@build_alias@,$build_alias,;t t
-s,@host_alias@,$host_alias,;t t
-s,@target_alias@,$target_alias,;t t
-s,@DEFS@,$DEFS,;t t
-s,@ECHO_C@,$ECHO_C,;t t
-s,@ECHO_N@,$ECHO_N,;t t
-s,@ECHO_T@,$ECHO_T,;t t
-s,@LIBS@,$LIBS,;t t
-s,@XSUBDIRS@,$XSUBDIRS,;t t
-s,@CC@,$CC,;t t
-s,@CFLAGS@,$CFLAGS,;t t
-s,@LDFLAGS@,$LDFLAGS,;t t
-s,@CPPFLAGS@,$CPPFLAGS,;t t
-s,@ac_ct_CC@,$ac_ct_CC,;t t
-s,@EXEEXT@,$EXEEXT,;t t
-s,@OBJEXT@,$OBJEXT,;t t
-s,@CPP@,$CPP,;t t
-s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
-s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
-s,@INSTALL_DATA@,$INSTALL_DATA,;t t
-s,@PACKAGE@,$PACKAGE,;t t
-s,@VERSION@,$VERSION,;t t
-s,@ACLOCAL@,$ACLOCAL,;t t
-s,@AUTOCONF@,$AUTOCONF,;t t
-s,@AUTOMAKE@,$AUTOMAKE,;t t
-s,@AUTOHEADER@,$AUTOHEADER,;t t
-s,@MAKEINFO@,$MAKEINFO,;t t
-s,@AMTAR@,$AMTAR,;t t
-s,@install_sh@,$install_sh,;t t
-s,@STRIP@,$STRIP,;t t
-s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t
-s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
-s,@AWK@,$AWK,;t t
-s,@SET_MAKE@,$SET_MAKE,;t t
-s,@DEPDIR@,$DEPDIR,;t t
-s,@am__include@,$am__include,;t t
-s,@am__quote@,$am__quote,;t t
-s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t
-s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t
-s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
-s,@CCDEPMODE@,$CCDEPMODE,;t t
-s,@build@,$build,;t t
-s,@build_cpu@,$build_cpu,;t t
-s,@build_vendor@,$build_vendor,;t t
-s,@build_os@,$build_os,;t t
-s,@host@,$host,;t t
-s,@host_cpu@,$host_cpu,;t t
-s,@host_vendor@,$host_vendor,;t t
-s,@host_os@,$host_os,;t t
-s,@LN_S@,$LN_S,;t t
-s,@ECHO@,$ECHO,;t t
-s,@RANLIB@,$RANLIB,;t t
-s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
-s,@LIBTOOL@,$LIBTOOL,;t t
-s,@CXX@,$CXX,;t t
-s,@CXXFLAGS@,$CXXFLAGS,;t t
-s,@ac_ct_CXX@,$ac_ct_CXX,;t t
-s,@CXXDEPMODE@,$CXXDEPMODE,;t t
-s,@doxygen@,$doxygen,;t t
-s,@RHREL@,$RHREL,;t t
-s,@GXXVER@,$GXXVER,;t t
-s,@RELEASE@,$RELEASE,;t t
-s,@topdir@,$topdir,;t t
-CEOF
-
-_ACEOF
-
- cat >>$CONFIG_STATUS <<\_ACEOF
- # Split the substitutions into bite-sized pieces for seds with
- # small command number limits, like on Digital OSF/1 and HP-UX.
- ac_max_sed_lines=48
- ac_sed_frag=1 # Number of current file.
- ac_beg=1 # First line for current file.
- ac_end=$ac_max_sed_lines # Line after last line for current file.
- ac_more_lines=:
- ac_sed_cmds=
- while $ac_more_lines; do
- if test $ac_beg -gt 1; then
- sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
- else
- sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
- fi
- if test ! -s $tmp/subs.frag; then
- ac_more_lines=false
- else
- # The purpose of the label and of the branching condition is to
- # speed up the sed processing (if there are no `@' at all, there
- # is no need to browse any of the substitutions).
- # These are the two extra sed commands mentioned above.
- (echo ':t
- /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
- if test -z "$ac_sed_cmds"; then
- ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
- else
- ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
- fi
- ac_sed_frag=`expr $ac_sed_frag + 1`
- ac_beg=$ac_end
- ac_end=`expr $ac_end + $ac_max_sed_lines`
- fi
- done
- if test -z "$ac_sed_cmds"; then
- ac_sed_cmds=cat
- fi
-fi # test -n "$CONFIG_FILES"
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
- case $ac_file in
- - | *:- | *:-:* ) # input from stdin
- cat >$tmp/stdin
- ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
- *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
- * ) ac_file_in=$ac_file.in ;;
- esac
-
- # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
- ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_file" : 'X\(//\)[^/]' \| \
- X"$ac_file" : 'X\(//\)$' \| \
- X"$ac_file" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- { case "$ac_dir" in
- [\\/]* | ?:[\\/]* ) as_incr_dir=;;
- *) as_incr_dir=.;;
-esac
-as_dummy="$ac_dir"
-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
- case $as_mkdir_dir in
- # Skip DOS drivespec
- ?:) as_incr_dir=$as_mkdir_dir ;;
- *)
- as_incr_dir=$as_incr_dir/$as_mkdir_dir
- test -d "$as_incr_dir" ||
- mkdir "$as_incr_dir" ||
- { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
- { (exit 1); exit 1; }; }
- ;;
- esac
-done; }
-
- ac_builddir=.
-
-if test "$ac_dir" != .; then
- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
- # A "../" for each directory in $ac_dir_suffix.
- ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
- ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
- .) # No --srcdir option. We are building in place.
- ac_srcdir=.
- if test -z "$ac_top_builddir"; then
- ac_top_srcdir=.
- else
- ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
- fi ;;
- [\\/]* | ?:[\\/]* ) # Absolute path.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir ;;
- *) # Relative path.
- ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
-
-
- case $INSTALL in
- [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
- *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
- esac
-
- if test x"$ac_file" != x-; then
- { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
- rm -f "$ac_file"
- fi
- # Let's still pretend it is `configure' which instantiates (i.e., don't
- # use $as_me), people would be surprised to read:
- # /* config.h. Generated by config.status. */
- if test x"$ac_file" = x-; then
- configure_input=
- else
- configure_input="$ac_file. "
- fi
- configure_input=$configure_input"Generated from `echo $ac_file_in |
- sed 's,.*/,,'` by configure."
-
- # First look for the input files in the build tree, otherwise in the
- # src tree.
- ac_file_inputs=`IFS=:
- for f in $ac_file_in; do
- case $f in
- -) echo $tmp/stdin ;;
- [\\/$]*)
- # Absolute (can't be DOS-style, as IFS=:)
- test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
- { (exit 1); exit 1; }; }
- echo $f;;
- *) # Relative
- if test -f "$f"; then
- # Build tree
- echo $f
- elif test -f "$srcdir/$f"; then
- # Source tree
- echo $srcdir/$f
- else
- # /dev/null tree
- { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
- { (exit 1); exit 1; }; }
- fi;;
- esac
- done` || { (exit 1); exit 1; }
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
- sed "$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s,@configure_input@,$configure_input,;t t
-s,@srcdir@,$ac_srcdir,;t t
-s,@abs_srcdir@,$ac_abs_srcdir,;t t
-s,@top_srcdir@,$ac_top_srcdir,;t t
-s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
-s,@builddir@,$ac_builddir,;t t
-s,@abs_builddir@,$ac_abs_builddir,;t t
-s,@top_builddir@,$ac_top_builddir,;t t
-s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
-s,@INSTALL@,$ac_INSTALL,;t t
-" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
- rm -f $tmp/stdin
- if test x"$ac_file" != x-; then
- mv $tmp/out $ac_file
- else
- cat $tmp/out
- rm -f $tmp/out
- fi
-
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-#
-# CONFIG_HEADER section.
-#
-
-# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
-# NAME is the cpp macro being defined and VALUE is the value it is being given.
-#
-# ac_d sets the value in "#define NAME VALUE" lines.
-ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
-ac_dB='[ ].*$,\1#\2'
-ac_dC=' '
-ac_dD=',;t'
-# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
-ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
-ac_uB='$,\1#\2define\3'
-ac_uC=' '
-ac_uD=',;t'
-
-for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
- # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
- case $ac_file in
- - | *:- | *:-:* ) # input from stdin
- cat >$tmp/stdin
- ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
- *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
- ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
- * ) ac_file_in=$ac_file.in ;;
- esac
-
- test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-
- # First look for the input files in the build tree, otherwise in the
- # src tree.
- ac_file_inputs=`IFS=:
- for f in $ac_file_in; do
- case $f in
- -) echo $tmp/stdin ;;
- [\\/$]*)
- # Absolute (can't be DOS-style, as IFS=:)
- test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
- { (exit 1); exit 1; }; }
- echo $f;;
- *) # Relative
- if test -f "$f"; then
- # Build tree
- echo $f
- elif test -f "$srcdir/$f"; then
- # Source tree
- echo $srcdir/$f
- else
- # /dev/null tree
- { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
-echo "$as_me: error: cannot find input file: $f" >&2;}
- { (exit 1); exit 1; }; }
- fi;;
- esac
- done` || { (exit 1); exit 1; }
- # Remove the trailing spaces.
- sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
-
-_ACEOF
-
-# Transform confdefs.h into two sed scripts, `conftest.defines' and
-# `conftest.undefs', that substitutes the proper values into
-# config.h.in to produce config.h. The first handles `#define'
-# templates, and the second `#undef' templates.
-# And first: Protect against being on the right side of a sed subst in
-# config.status. Protect against being in an unquoted here document
-# in config.status.
-rm -f conftest.defines conftest.undefs
-# Using a here document instead of a string reduces the quoting nightmare.
-# Putting comments in sed scripts is not portable.
-#
-# `end' is used to avoid that the second main sed command (meant for
-# 0-ary CPP macros) applies to n-ary macro definitions.
-# See the Autoconf documentation for `clear'.
-cat >confdef2sed.sed <<\_ACEOF
-s/[\\&,]/\\&/g
-s,[\\$`],\\&,g
-t clear
-: clear
-s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
-t end
-s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
-: end
-_ACEOF
-# If some macros were called several times there might be several times
-# the same #defines, which is useless. Nevertheless, we may not want to
-# sort them, since we want the *last* AC-DEFINE to be honored.
-uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
-sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
-rm -f confdef2sed.sed
-
-# This sed command replaces #undef with comments. This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-cat >>conftest.undefs <<\_ACEOF
-s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
-_ACEOF
-
-# Break up conftest.defines because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
-echo ' if egrep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
-echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
-echo ' :' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.defines >/dev/null
-do
- # Write a limited-size here document to $tmp/defines.sed.
- echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
- # Speed up: don't consider the non `#define' lines.
- echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
- # Work around the forget-to-reset-the-flag bug.
- echo 't clr' >>$CONFIG_STATUS
- echo ': clr' >>$CONFIG_STATUS
- sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
- echo 'CEOF
- sed -f $tmp/defines.sed $tmp/in >$tmp/out
- rm -f $tmp/in
- mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
- sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
- rm -f conftest.defines
- mv conftest.tail conftest.defines
-done
-rm -f conftest.defines
-echo ' fi # egrep' >>$CONFIG_STATUS
-echo >>$CONFIG_STATUS
-
-# Break up conftest.undefs because some shells have a limit on the size
-# of here documents, and old seds have small limits too (100 cmds).
-echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
-rm -f conftest.tail
-while grep . conftest.undefs >/dev/null
-do
- # Write a limited-size here document to $tmp/undefs.sed.
- echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
- # Speed up: don't consider the non `#undef'
- echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
- # Work around the forget-to-reset-the-flag bug.
- echo 't clr' >>$CONFIG_STATUS
- echo ': clr' >>$CONFIG_STATUS
- sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
- echo 'CEOF
- sed -f $tmp/undefs.sed $tmp/in >$tmp/out
- rm -f $tmp/in
- mv $tmp/out $tmp/in
-' >>$CONFIG_STATUS
- sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
- rm -f conftest.undefs
- mv conftest.tail conftest.undefs
-done
-rm -f conftest.undefs
-
-cat >>$CONFIG_STATUS <<\_ACEOF
- # Let's still pretend it is `configure' which instantiates (i.e., don't
- # use $as_me), people would be surprised to read:
- # /* config.h. Generated by config.status. */
- if test x"$ac_file" = x-; then
- echo "/* Generated by configure. */" >$tmp/config.h
- else
- echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
- fi
- cat $tmp/in >>$tmp/config.h
- rm -f $tmp/in
- if test x"$ac_file" != x-; then
- if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
- { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
- else
- ac_dir=`(dirname "$ac_file") 2>/dev/null ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_file" : 'X\(//\)[^/]' \| \
- X"$ac_file" : 'X\(//\)$' \| \
- X"$ac_file" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$ac_file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- { case "$ac_dir" in
- [\\/]* | ?:[\\/]* ) as_incr_dir=;;
- *) as_incr_dir=.;;
-esac
-as_dummy="$ac_dir"
-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
- case $as_mkdir_dir in
- # Skip DOS drivespec
- ?:) as_incr_dir=$as_mkdir_dir ;;
- *)
- as_incr_dir=$as_incr_dir/$as_mkdir_dir
- test -d "$as_incr_dir" ||
- mkdir "$as_incr_dir" ||
- { { echo "$as_me:$LINENO: error: cannot create \"$ac_dir\"" >&5
-echo "$as_me: error: cannot create \"$ac_dir\"" >&2;}
- { (exit 1); exit 1; }; }
- ;;
- esac
-done; }
-
- rm -f $ac_file
- mv $tmp/config.h $ac_file
- fi
- else
- cat $tmp/config.h
- rm -f $tmp/config.h
- fi
- # Run the commands associated with the file.
- case $ac_file in
- xbase64/xbconfig.h ) # update the timestamp
-echo 'timestamp for xbase64/xbconfig.h:xbase64/xbconfig.in' >"xbase64/stamp-h1"
- ;;
- esac
-done
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-#
-# CONFIG_COMMANDS section.
-#
-for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
- ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
- ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
- ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
-$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$ac_dest" : 'X\(//\)[^/]' \| \
- X"$ac_dest" : 'X\(//\)$' \| \
- X"$ac_dest" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$ac_dest" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- ac_builddir=.
-
-if test "$ac_dir" != .; then
- ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
- # A "../" for each directory in $ac_dir_suffix.
- ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
-else
- ac_dir_suffix= ac_top_builddir=
-fi
-
-case $srcdir in
- .) # No --srcdir option. We are building in place.
- ac_srcdir=.
- if test -z "$ac_top_builddir"; then
- ac_top_srcdir=.
- else
- ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
- fi ;;
- [\\/]* | ?:[\\/]* ) # Absolute path.
- ac_srcdir=$srcdir$ac_dir_suffix;
- ac_top_srcdir=$srcdir ;;
- *) # Relative path.
- ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
- ac_top_srcdir=$ac_top_builddir$srcdir ;;
-esac
-# Don't blindly perform a `cd "$ac_dir"/$ac_foo && pwd` since $ac_foo can be
-# absolute.
-ac_abs_builddir=`cd "$ac_dir" && cd $ac_builddir && pwd`
-ac_abs_top_builddir=`cd "$ac_dir" && cd $ac_top_builddir && pwd`
-ac_abs_srcdir=`cd "$ac_dir" && cd $ac_srcdir && pwd`
-ac_abs_top_srcdir=`cd "$ac_dir" && cd $ac_top_srcdir && pwd`
-
-
- { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
-echo "$as_me: executing $ac_dest commands" >&6;}
- case $ac_dest in
- depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
- # Strip MF so we end up with the name of the file.
- mf=`echo "$mf" | sed -e 's/:.*$//'`
- # Check whether this is an Automake generated Makefile or not.
- # We used to match only the files named `Makefile.in', but
- # some people rename them; so instead we look at the file content.
- # Grep'ing the first line is not enough: some people post-process
- # each Makefile.in and add a new line on top of each file to say so.
- # So let's grep whole file.
- if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
- dirpart=`(dirname "$mf") 2>/dev/null ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$mf" : 'X\(//\)[^/]' \| \
- X"$mf" : 'X\(//\)$' \| \
- X"$mf" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$mf" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- else
- continue
- fi
- grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue
- # Extract the definition of DEP_FILES from the Makefile without
- # running `make'.
- DEPDIR=`sed -n -e '/^DEPDIR = / s///p' < "$mf"`
- test -z "$DEPDIR" && continue
- # When using ansi2knr, U may be empty or an underscore; expand it
- U=`sed -n -e '/^U = / s///p' < "$mf"`
- test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR"
- # We invoke sed twice because it is the simplest approach to
- # changing $(DEPDIR) to its actual value in the expansion.
- for file in `sed -n -e '
- /^DEP_FILES = .*\\\\$/ {
- s/^DEP_FILES = //
- :loop
- s/\\\\$//
- p
- n
- /\\\\$/ b loop
- p
- }
- /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \
- sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
- # Make sure the directory exists.
- test -f "$dirpart/$file" && continue
- fdir=`(dirname "$file") 2>/dev/null ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
- X"$file" : 'X\(//\)[^/]' \| \
- X"$file" : 'X\(//\)$' \| \
- X"$file" : 'X\(/\)' \| \
- . : '\(.\)' 2>/dev/null ||
-echo X"$file" |
- sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
- /^X\(\/\/\)[^/].*/{ s//\1/; q; }
- /^X\(\/\/\)$/{ s//\1/; q; }
- /^X\(\/\).*/{ s//\1/; q; }
- s/.*/./; q'`
- { case $dirpart/$fdir in
- [\\/]* | ?:[\\/]* ) as_incr_dir=;;
- *) as_incr_dir=.;;
-esac
-as_dummy=$dirpart/$fdir
-for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
- case $as_mkdir_dir in
- # Skip DOS drivespec
- ?:) as_incr_dir=$as_mkdir_dir ;;
- *)
- as_incr_dir=$as_incr_dir/$as_mkdir_dir
- test -d "$as_incr_dir" ||
- mkdir "$as_incr_dir" ||
- { { echo "$as_me:$LINENO: error: cannot create $dirpart/$fdir" >&5
-echo "$as_me: error: cannot create $dirpart/$fdir" >&2;}
- { (exit 1); exit 1; }; }
- ;;
- esac
-done; }
-
- # echo "creating $dirpart/$file"
- echo '# dummy' > "$dirpart/$file"
- done
-done
- ;;
- esac
-done
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-{ (exit 0); exit 0; }
-_ACEOF
-chmod +x $CONFIG_STATUS
-ac_clean_files=$ac_clean_files_save
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded. So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status. When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
- ac_cs_success=:
- exec 5>/dev/null
- $SHELL $CONFIG_STATUS || ac_cs_success=false
- exec 5>>config.log
- # Use ||, not &&, to avoid exiting from the if with $? = 1, which
- # would make configure fail if this is the last instruction.
- $ac_cs_success || { (exit 1); exit 1; }
-fi
-
-
diff --git a/configure.in b/configure.in
deleted file mode 100755
index 3110c70..0000000
--- a/configure.in
+++ /dev/null
@@ -1,207 +0,0 @@
-# $Id: configure.in,v 1.20 2003/08/22 14:27:20 gkunkel Exp $
-# Created by Denis Pershin <dyp@inetlab.com>
-#
-# 8/10/03 Recreated by Gary Kunkel <gkunkel@zhsac.com>
-# for Redhat 8.0, autoheader 2.53, autoconf 2.53, automake 1.63
-# simplified, removed unused and obsolete macros, etc
-#
-# All configuration parms moved to this file - if you make updates
-# please add meaningful comments
-
-
-AC_INIT(xbase64,3.1.2,xdb-devel@lists.sourceforge.net)
-
-# set variable XSUBVARS with a list of sub directories to process
-XSUBDIRS="xbase64 examples bin html libtest"
-AC_SUBST(XSUBDIRS)
-
-# look for AIX and MINIX environments
-AC_AIX
-AC_MINIX
-
-# build the following programs
-AC_CONFIG_SRCDIR( examples/exfilter.cpp,
- examples/sample1.cpp,
- examples/sample2.cpp,
- examples/sample3.cpp,
- examples/sample4.cpp,
- examples/sample5.cpp,
- bin/checkndx.cpp,
- bin/copydbf.cpp,
- bin/dbfxtrct.cpp,
- bin/dbfutil1.cpp,
- bin/deletall.cpp,
- bin/dumpdbt.cpp,
- bin/dumphdr.cpp,
- bin/dumprecs.cpp,
- bin/packdbf.cpp,
- bin/reindex.cpp,
- bin/undelall.cpp,
- bin/zap.cpp,
- libtest/indextst.cpp,
- libtest/exptest.cpp,
- libtest/locktest.cpp,
- libtest/testdate.cpp,
- libtest/testhtml.cpp
- )
-
-# init automake
-AM_INIT_AUTOMAKE(xbase64, 3.1.2)
-
-# create this header file
-AM_CONFIG_HEADER(xbase64/xbconfig.h:xbase64/xbconfig.in)
-
-#create a library
-AM_PROG_LIBTOOL
-
-# C++ Code
-AC_PROG_CXX
-
-# look for doxygen software
-AC_CHECK_PROG(doxygen, doxygen, yes, no)
-if test "$doxygen" = "yes"; then
- XSUBDIRS="$XSUBDIRS docs"
-fi
-
-# get RedHat release
-if test -f /etc/redhat-release ; then
- RHREL=`cut -d " " -f 5 /etc/redhat-release`
- RHREL="rh${RHREL}"
-else
- RHREL="X"
-fi
-AC_SUBST(RHREL)
-
-# get G++ version
-if test "$GXX" = "yes"; then
- GXXVER=`${CXX} -v 2>&1 | grep version | cut -d " " -f 3 -`
- GXXVER="gcc${GXXVER}"
-else
- GXXVER=""
-fi
-AC_SUBST(GXXVER)
-
-RELEASE="${RHREL}-${GXXVER}-2.1"
-AC_SUBST(RELEASE)
-
-# setup topdir
-topdir=`pwd`
-AC_SUBST(topdir)
-
-# Checks for header files
-AC_HEADER_STDC
-AC_CHECK_HEADER(io.h)
-AC_CHECK_HEADER(sys/locking.h)
-AC_CHECK_HEADER(fcntl.h,
- [AC_DEFINE(HAVE_FCNTL_H,1,[Define to 1 if you have the <fcntl.h> header file.])])
-AC_CHECK_HEADER(ctype.h)
-AC_CHECK_HEADER(unistd.h)
-
-# Checks for library functions.
-AC_CHECK_FUNCS(vsnprintf)
-AC_CHECK_FUNCS(vsprintf)
-AC_CHECK_FUNCS(strcasecmp)
-
-# Checks for 64 bit file support
-AC_SYS_LARGEFILE
-AC_CHECK_FUNCS(ftello)
-AC_CHECK_FUNCS(fseeko)
-
-
-# compile support for ndx index logic
-AC_ARG_WITH(index-ndx,
- [ --without-index-ndx turn off .ndx index support ],
- enable_index_ndx="$withval", enable_index_ndx="yes")
-if test "$enable_index_ndx" = "yes"; then
- AC_DEFINE(XB_INDEX_NDX, 1, XB_INDEX_NDX)
- AC_DEFINE(XB_EXPRESSIONS, 1, XB_EXPRESSIONS)
- AC_DEFINE(XB_INDEX_ANY, 1, XB_INDEX_ANY)
-fi
-
-# compile support for ntx index logic
-AC_ARG_WITH(index-ntx,
- [ --without-index-ntx turn off .ntx index support ],
- enable_index_ntx="$withval", enable_index_ntx="yes")
-if test "$enable_index_ntx" = "yes"; then
- AC_DEFINE(XB_INDEX_NTX, 1, XB_INDEX_NTX)
- AC_DEFINE(XB_EXPRESSIONS, 1, XB_EXPRESSIONS)
- AC_DEFINE(XB_INDEX_ANY, 1, XB_INDEX_ANY)
-fi
-
-# compile support for memo fields
-AC_ARG_WITH(memo-fields,
- [ --without-memo-fields turn off memo fields support ],
- enable_memo_fields="$withval", enable_memo_fields="yes")
-if test "$enable_memo_fields" = "yes"; then
- AC_DEFINE(XB_MEMO_FIELDS, 1, XB_MEMO_FIELDS)
-fi
-
-# compile support for expressions
-# index logic requires this be enabled
-AC_ARG_WITH(expressions,
- [ --without-expressions turn off expressions support ],
- enable_expressions="$withval", enable_expressions="yes")
-if test "$enable_expressions" = "yes"; then
- AC_DEFINE(XB_EXPRESSIONS, 1, XB_EXPRESSIONS)
-fi
-
-# compile support for record locking
-AC_ARG_WITH(xbase-locking,
- [ --without-xbase-locking turn off XBase file locking ],
- enable_xbase_locking="$withval", enable_xbase_locking="yes")
-if test "$enable_xbase_locking" = "yes"; then
- AC_DEFINE(XB_LOCKING_ON, 1, XB_LOCKING_ON)
-fi
-
-# compile support for true record deletion
-AC_ARG_WITH(realdelete,
- [ --without-realdelete turn off XBase record deletion ],
- enable_realdelete="$withval", enable_realdelete="yes")
-if test "$enable_realdelete" = "yes"; then
- AC_DEFINE(XB_REAL_DELETE, 1, XB_REAL_DELETE)
-fi
-
-# compile support for filters
-AC_ARG_WITH(xbase-filters,
- [ --without-xbase-filters turn off XBase filter logic ],
- enable_xbase_filters="$withval", enable_xbase_filters="yes")
-if test "$enable_xbase_filters" = "yes"; then
- AC_DEFINE(XB_FILTERS, 1, XB_FILTERS)
-fi
-
-# compile in debug logic
-AC_ARG_WITH(xbase-debug,
- [ --without-xbase-debug turn off XBase specific debug ],
- enable_xbase_debug="$withval", enable_xbase_debug="yes")
-if test "$enable_xbase_debug" = "yes"; then
- AC_DEFINE(XBASE_DEBUG, 1, XB_DEBUG)
-fi
-
-# compile in largefile support
-AC_ARG_WITH(xbase-largefile,
- [ --without-largefile-support turn off Xbase 64 bit largefile support ],
- enable_largefile_support="$withval", enable_largefile_support="yes")
-if test "$enable_largefile_support" = "yes"; then
- AC_DEFINE(XB_LARGEFILE_SUPPORT, 1, XB_LARGEFILE_SUPPORT)
-fi
-
-# path separator
-AH_VERBATIM([PATH_SEPARATOR],[#define PATH_SEPARATOR '/'])
-
-# default memo file block size
-AH_VERBATIM([XB_DBT_BLOCK_SIZE],[#define XB_DBT_BLOCK_SIZE 512])
-
-# build the following Makefiles
-AC_OUTPUT(
- Makefile
- xbase64/Makefile
- examples/Makefile
- bin/Makefile
- html/Makefile
- libtest/Makefile
- xbase64-config
- xbase64.spec
- docs/doxygen.cfg
- docs/Makefile
-)
-
diff --git a/copying b/copying
deleted file mode 100755
index 9f6549b..0000000
--- a/copying
+++ /dev/null
@@ -1,858 +0,0 @@
-The XBase library itself is released under the GNU Lesser General Public
-License, see the text of the GNU LGPL below.
-
-The executable programs in the bin, examples, and libtest directories
-are release under the GNU General Public License, see the text of the
-GNU GPL below.
-
------------------------------------------------------------------------------
-
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
-
------------------------------------------------------------------------------
-
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19yy name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
-
------------------------------------------------------------------------------ \ No newline at end of file
diff --git a/data/CopyStructureV3NoMemos.DBF b/data/CopyStructureV3NoMemos.DBF
new file mode 100644
index 0000000..341e667
--- /dev/null
+++ b/data/CopyStructureV3NoMemos.DBF
Binary files differ
diff --git a/data/CopyStructureV4NoMemos.DBF b/data/CopyStructureV4NoMemos.DBF
new file mode 100644
index 0000000..1e27a29
--- /dev/null
+++ b/data/CopyStructureV4NoMemos.DBF
Binary files differ
diff --git a/data/ExpTest.DBF b/data/ExpTest.DBF
new file mode 100644
index 0000000..d9eb058
--- /dev/null
+++ b/data/ExpTest.DBF
Binary files differ
diff --git a/data/Functest.DBF b/data/Functest.DBF
new file mode 100644
index 0000000..f5988c4
--- /dev/null
+++ b/data/Functest.DBF
Binary files differ
diff --git a/data/LockTest.DBF b/data/LockTest.DBF
new file mode 100644
index 0000000..26e138a
--- /dev/null
+++ b/data/LockTest.DBF
Binary files differ
diff --git a/data/LockTest.DBT b/data/LockTest.DBT
new file mode 100644
index 0000000..9fc546e
--- /dev/null
+++ b/data/LockTest.DBT
Binary files differ
diff --git a/data/TMDXDB01.DBF b/data/TMDXDB01.DBF
new file mode 100644
index 0000000..0f1124b
--- /dev/null
+++ b/data/TMDXDB01.DBF
Binary files differ
diff --git a/data/TMDXDB01.MDX b/data/TMDXDB01.MDX
new file mode 100644
index 0000000..1e0119d
--- /dev/null
+++ b/data/TMDXDB01.MDX
Binary files differ
diff --git a/data/TestFilt.DBF b/data/TestFilt.DBF
new file mode 100644
index 0000000..0691389
--- /dev/null
+++ b/data/TestFilt.DBF
Binary files differ
diff --git a/data/TestFilt.NDX b/data/TestFilt.NDX
new file mode 100644
index 0000000..e2c76fd
--- /dev/null
+++ b/data/TestFilt.NDX
Binary files differ
diff --git a/data/TestNdx.DBF b/data/TestNdx.DBF
new file mode 100644
index 0000000..1b54b95
--- /dev/null
+++ b/data/TestNdx.DBF
Binary files differ
diff --git a/data/TestNdx.INF b/data/TestNdx.INF
new file mode 100644
index 0000000..cb4ba66
--- /dev/null
+++ b/data/TestNdx.INF
@@ -0,0 +1,5 @@
+[dbase]
+NDX=TestNdxC.NDX
+NDX1=TestNdxD.NDX
+NDX2=TestNdxN.NDX
+
diff --git a/data/TestNdxC.NDX b/data/TestNdxC.NDX
new file mode 100644
index 0000000..d8afd5f
--- /dev/null
+++ b/data/TestNdxC.NDX
Binary files differ
diff --git a/data/TestNdxD.NDX b/data/TestNdxD.NDX
new file mode 100644
index 0000000..647c3b8
--- /dev/null
+++ b/data/TestNdxD.NDX
Binary files differ
diff --git a/data/TestNdxN.NDX b/data/TestNdxN.NDX
new file mode 100644
index 0000000..7bc71a3
--- /dev/null
+++ b/data/TestNdxN.NDX
Binary files differ
diff --git a/data/TestSQL.DBF b/data/TestSQL.DBF
new file mode 100644
index 0000000..34bb7b2
--- /dev/null
+++ b/data/TestSQL.DBF
Binary files differ
diff --git a/data/TestSQL.DBT b/data/TestSQL.DBT
new file mode 100644
index 0000000..f457ac8
--- /dev/null
+++ b/data/TestSQL.DBT
Binary files differ
diff --git a/data/TestV3.DBF b/data/TestV3.DBF
new file mode 100644
index 0000000..341e667
--- /dev/null
+++ b/data/TestV3.DBF
Binary files differ
diff --git a/data/TestV3_memos.DBF b/data/TestV3_memos.DBF
new file mode 100644
index 0000000..4c731d6
--- /dev/null
+++ b/data/TestV3_memos.DBF
Binary files differ
diff --git a/data/TestV3_memos.DBT b/data/TestV3_memos.DBT
new file mode 100644
index 0000000..48dc068
--- /dev/null
+++ b/data/TestV3_memos.DBT
Binary files differ
diff --git a/data/TestV4.DBF b/data/TestV4.DBF
new file mode 100644
index 0000000..0fbd2cd
--- /dev/null
+++ b/data/TestV4.DBF
Binary files differ
diff --git a/data/TestV4_memos.DBF b/data/TestV4_memos.DBF
new file mode 100644
index 0000000..bcf0609
--- /dev/null
+++ b/data/TestV4_memos.DBF
Binary files differ
diff --git a/data/TestV4_memos.DBT b/data/TestV4_memos.DBT
new file mode 100644
index 0000000..c7b5526
--- /dev/null
+++ b/data/TestV4_memos.DBT
Binary files differ
diff --git a/data/xbfile.txt b/data/xbfile.txt
new file mode 100644
index 0000000..cb8d0ca
--- /dev/null
+++ b/data/xbfile.txt
@@ -0,0 +1 @@
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB \ No newline at end of file
diff --git a/depcomp b/depcomp
deleted file mode 100755
index 807b991..0000000
--- a/depcomp
+++ /dev/null
@@ -1,423 +0,0 @@
-#! /bin/sh
-
-# depcomp - compile a program generating dependencies as side-effects
-# Copyright 1999, 2000 Free Software Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
- echo "depcomp: Variables source, object and depmode must be set" 1>&2
- exit 1
-fi
-# `libtool' can also be set to `yes' or `no'.
-
-if test -z "$depfile"; then
- base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
- dir=`echo "$object" | sed 's,/.*$,/,'`
- if test "$dir" = "$object"; then
- dir=
- fi
- # FIXME: should be _deps on DOS.
- depfile="$dir.deps/$base"
-fi
-
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags. We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write. Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
- # HP compiler uses -M and no extra arg.
- gccflag=-M
- depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
- # This is just like dashmstdout with a different argument.
- dashmflag=-xM
- depmode=dashmstdout
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want. Yay! Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff. Hmm.
- "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- mv "$tmpdepfile" "$depfile"
- ;;
-
-gcc)
-## There are various ways to get dependency output from gcc. Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-## up in a subdir. Having to rename by hand is ugly.
-## (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-## -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-## than renaming).
- if test -z "$gccflag"; then
- gccflag=-MD,
- fi
- "$@" -Wp,"$gccflag$tmpdepfile"
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
- sed -e 's/^[^:]*: / /' \
- -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header). We avoid this by adding
-## dummy dependencies for each header file. Too bad gcc doesn't do
-## this for us directly.
- tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'. On the theory
-## that the space means something, we add a space to the output as
-## well.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-hp)
- # This case exists only to let depend.m4 do its work. It works by
- # looking at the text of this script. This case will never be run,
- # since it is checked for above.
- exit 1
- ;;
-
-sgi)
- if test "$libtool" = yes; then
- "$@" "-Wp,-MDupdate,$tmpdepfile"
- else
- "$@" -MDupdate "$tmpdepfile"
- fi
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
- rm -f "$depfile"
-
- if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
- echo "$object : \\" > "$depfile"
-
- # Clip off the initial element (the dependent). Don't try to be
- # clever and replace this with sed code, as IRIX sed won't handle
- # lines with more than a fixed number of characters (4096 in
- # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
- # the IRIX cc adds comments like `#:fec' to the end of the
- # dependency line.
- tr ' ' '
-' < "$tmpdepfile" \
- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
- tr '
-' ' ' >> $depfile
- echo >> $depfile
-
- # The second pass generates a dummy entry for each header file.
- tr ' ' '
-' < "$tmpdepfile" \
- | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
- >> $depfile
- else
- # The sourcefile does not contain any dependencies, so just
- # store a dummy comment line, to avoid errors with the Makefile
- # "include basename.Plo" scheme.
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
-
-aix)
- # The C for AIX Compiler uses -M and outputs the dependencies
- # in a .u file. This file always lives in the current directory.
- # Also, the AIX compiler puts `$object:' at the start of each line;
- # $object doesn't have directory information.
- stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
- tmpdepfile="$stripped.u"
- outname="$stripped.o"
- if test "$libtool" = yes; then
- "$@" -Wc,-M
- else
- "$@" -M
- fi
-
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile"
- exit $stat
- fi
-
- if test -f "$tmpdepfile"; then
- # Each line is of the form `foo.o: dependent.h'.
- # Do two passes, one to just change these to
- # `$object: dependent.h' and one to simply `dependent.h:'.
- sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
- sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
- else
- # The sourcefile does not contain any dependencies, so just
- # store a dummy comment line, to avoid errors with the Makefile
- # "include basename.Plo" scheme.
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
-
-tru64)
- # The Tru64 compiler uses -MD to generate dependencies as a side
- # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
- # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
- # dependencies in `foo.d' instead, so we check for that too.
- # Subdirectories are respected.
- dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
- test "x$dir" = "x$object" && dir=
- base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
- if test "$libtool" = yes; then
- tmpdepfile1="$dir.libs/$base.lo.d"
- tmpdepfile2="$dir.libs/$base.d"
- "$@" -Wc,-MD
- else
- tmpdepfile1="$dir$base.o.d"
- tmpdepfile2="$dir$base.d"
- "$@" -MD
- fi
-
- stat=$?
- if test $stat -eq 0; then :
- else
- rm -f "$tmpdepfile1" "$tmpdepfile2"
- exit $stat
- fi
-
- if test -f "$tmpdepfile1"; then
- tmpdepfile="$tmpdepfile1"
- else
- tmpdepfile="$tmpdepfile2"
- fi
- if test -f "$tmpdepfile"; then
- sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
- # That's a space and a tab in the [].
- sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
- else
- echo "#dummy" > "$depfile"
- fi
- rm -f "$tmpdepfile"
- ;;
-
-#nosideeffect)
- # This comment above is used by automake to tell side-effect
- # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
- # Important note: in order to support this mode, a compiler *must*
- # always write the proprocessed file to stdout, regardless of -o.
- "$@" || exit $?
-
- # Remove the call to Libtool.
- if test "$libtool" = yes; then
- while test $1 != '--mode=compile'; do
- shift
- done
- shift
- fi
-
- # Remove `-o $object'. We will use -o /dev/null later,
- # however we can't do the remplacement now because
- # `-o $object' might simply not be used
- IFS=" "
- for arg
- do
- case $arg in
- -o)
- shift
- ;;
- $object)
- shift
- ;;
- *)
- set fnord "$@" "$arg"
- shift # fnord
- shift # $arg
- ;;
- esac
- done
-
- test -z "$dashmflag" && dashmflag=-M
- "$@" -o /dev/null $dashmflag | sed 's:^[^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
- rm -f "$depfile"
- cat < "$tmpdepfile" > "$depfile"
- tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-dashXmstdout)
- # This case only exists to satisfy depend.m4. It is never actually
- # run, as this mode is specially recognized in the preamble.
- exit 1
- ;;
-
-makedepend)
- "$@" || exit $?
- # X makedepend
- shift
- cleared=no
- for arg in "$@"; do
- case $cleared in
- no)
- set ""; shift
- cleared=yes ;;
- esac
- case "$arg" in
- -D*|-I*)
- set fnord "$@" "$arg"; shift ;;
- -*)
- ;;
- *)
- set fnord "$@" "$arg"; shift ;;
- esac
- done
- obj_suffix="`echo $object | sed 's/^.*\././'`"
- touch "$tmpdepfile"
- ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
- rm -f "$depfile"
- cat < "$tmpdepfile" > "$depfile"
- sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly. Breaking it into two sed invocations is a workaround.
- sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile" "$tmpdepfile".bak
- ;;
-
-cpp)
- # Important note: in order to support this mode, a compiler *must*
- # always write the proprocessed file to stdout.
- "$@" || exit $?
-
- # Remove the call to Libtool.
- if test "$libtool" = yes; then
- while test $1 != '--mode=compile'; do
- shift
- done
- shift
- fi
-
- # Remove `-o $object'.
- IFS=" "
- for arg
- do
- case $arg in
- -o)
- shift
- ;;
- $object)
- shift
- ;;
- *)
- set fnord "$@" "$arg"
- shift # fnord
- shift # $arg
- ;;
- esac
- done
-
- "$@" -E |
- sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
- sed '$ s: \\$::' > "$tmpdepfile"
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- cat < "$tmpdepfile" >> "$depfile"
- sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-msvisualcpp)
- # Important note: in order to support this mode, a compiler *must*
- # always write the proprocessed file to stdout, regardless of -o,
- # because we must use -o when running libtool.
- "$@" || exit $?
- IFS=" "
- for arg
- do
- case "$arg" in
- "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
- set fnord "$@"
- shift
- shift
- ;;
- *)
- set fnord "$@" "$arg"
- shift
- shift
- ;;
- esac
- done
- "$@" -E |
- sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
- rm -f "$depfile"
- echo "$object : \\" > "$depfile"
- . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
- echo " " >> "$depfile"
- . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
- rm -f "$tmpdepfile"
- ;;
-
-none)
- exec "$@"
- ;;
-
-*)
- echo "Unknown depmode $depmode" 1>&2
- exit 1
- ;;
-esac
-
-exit 0
diff --git a/docs/Makefile.am b/docs/Makefile.am
deleted file mode 100755
index c2f12fd..0000000
--- a/docs/Makefile.am
+++ /dev/null
@@ -1,14 +0,0 @@
-all : docs
-
-docs :
- doxygen doxygen.cfg
-
-clean :
- -rm -r html
- -rm -r latex
- -rm -r man
-
-EXTRA_DIST = \
- Makefile.am \
- Makefile.in \
- doxygen.cfg.in
diff --git a/docs/Makefile.in b/docs/Makefile.in
deleted file mode 100755
index 236d04b..0000000
--- a/docs/Makefile.in
+++ /dev/null
@@ -1,240 +0,0 @@
-# Makefile.in generated by automake 1.6.3 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = @program_transform_name@
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-
-EXEEXT = @EXEEXT@
-OBJEXT = @OBJEXT@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-AMTAR = @AMTAR@
-AS = @AS@
-AWK = @AWK@
-CC = @CC@
-CXX = @CXX@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
-GXXVER = @GXXVER@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-RELEASE = @RELEASE@
-RHREL = @RHREL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XSUBDIRS = @XSUBDIRS@
-am__include = @am__include@
-am__quote = @am__quote@
-doxygen = @doxygen@
-install_sh = @install_sh@
-topdir = @topdir@
-
-EXTRA_DIST = \
- Makefile.am \
- Makefile.in \
- doxygen.cfg.in
-
-subdir = docs
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/xbase64/xbconfig.h
-CONFIG_CLEAN_FILES = doxygen.cfg
-DIST_SOURCES =
-DIST_COMMON = Makefile.am Makefile.in doxygen.cfg.in
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && \
- $(AUTOMAKE) --gnu docs/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-doxygen.cfg: $(top_builddir)/config.status doxygen.cfg.in
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
- -rm -f libtool
-uninstall-info-am:
-tags: TAGS
-TAGS:
-
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
- @list='$(DISTFILES)'; for file in $$list; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
- dir="/$$dir"; \
- $(mkinstalldirs) "$(distdir)$$dir"; \
- else \
- dir=''; \
- fi; \
- if test -d $$d/$$file; then \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
- else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile
-
-installdirs:
-
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-generic distclean-libtool
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-uninstall-am: uninstall-info-am
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
- distclean distclean-generic distclean-libtool distdir dvi \
- dvi-am info info-am install install-am install-data \
- install-data-am install-exec install-exec-am install-info \
- install-info-am install-man install-strip installcheck \
- installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool uninstall uninstall-am uninstall-info-am
-
-all : docs
-
-docs :
- doxygen doxygen.cfg
-
-clean :
- -rm -r html
- -rm -r latex
- -rm -r man
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/docs/doxygen.cfg.in b/docs/doxygen.cfg.in
deleted file mode 100755
index ec22ae9..0000000
--- a/docs/doxygen.cfg.in
+++ /dev/null
@@ -1,732 +0,0 @@
-# Doxyfile 1.2.3
-
-# This file describes the settings to be used by doxygen for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-# TAG = value [value, ...]
-# For lists items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# General configuration options
-#---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
-PROJECT_NAME = "Xbase64 Class Library"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER = @VERSION@
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY =
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese,
-# Korean, Hungarian, Spanish, Romanian, Russian, Croatian, Polish,
-# Portuguese and Slovene.
-
-OUTPUT_LANGUAGE = English
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
-EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-EXTRACT_STATIC = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these class will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF = YES
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. It is allowed to use relative paths in the argument list.
-
-STRIP_FROM_PATH =
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS = NO
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a class diagram (in Html and LaTeX) for classes with base or
-# super classes. Setting the tag to NO turns the diagrams off.
-
-CLASS_DIAGRAMS = YES
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-
-SOURCE_BROWSER = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower case letters. If set to YES upper case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# users are adviced to set this option to NO.
-
-CASE_SENSE_NAMES = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS = YES
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like the Qt-style comments (thus requiring an
-# explict @brief command for a brief description.
-
-JAVADOC_AUTOBRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# reimplements.
-
-INHERIT_DOCS = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE = 8
-
-# The ENABLE_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS =
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST = YES
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES =
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text.
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT = ../xbase64
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-FILE_PATTERNS = *.cpp *.h
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE =
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-
-EXCLUDE_PATTERNS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS =
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.
-
-INPUT_FILTER =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse.
-
-FILTER_SOURCE_FILES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT = html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet
-
-HTML_STYLESHEET =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
-DISABLE_INDEX = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE = 4
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX = YES
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT = latex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS = NO
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX = NO
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimised for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using a WORD or other.
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assigments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION = .3
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation. Warning: This feature
-# is still experimental and very incomplete.
-
-GENERATE_XML = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION = NO
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_PREDEFINED tags.
-
-EXPAND_ONLY_PREDEF = NO
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed.
-
-PREDEFINED =
-
-# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED =
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tagfiles.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS = NO
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT = NO
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to
-# YES then doxygen will generate a graph for each documented file showing
-# the direct and indirect include dependencies of the file with other
-# documented files.
-
-INCLUDE_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to
-# YES then doxygen will generate a graph for each documented header file showing
-# the documented files that directly or indirectly include this file
-
-INCLUDED_BY_GRAPH = YES
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY = YES
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found on the path.
-
-DOT_PATH =
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_WIDTH = 1024
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT = 1024
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND = YES
-
-#---------------------------------------------------------------------------
-# Configuration::addtions related to the search engine
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE = NO
-
-# The CGI_NAME tag should be the name of the CGI script that
-# starts the search engine (doxysearch) with the correct parameters.
-# A script with this name will be generated by doxygen.
-
-CGI_NAME = search.cgi
-
-# The CGI_URL tag should be the absolute URL to the directory where the
-# cgi binaries are located. See the documentation of your http daemon for
-# details.
-
-CGI_URL =
-
-# The DOC_URL tag should be the absolute URL to the directory where the
-# documentation is located. If left blank the absolute path to the
-# documentation, with file:// prepended to it, will be used.
-
-DOC_URL =
-
-# The DOC_ABSPATH tag should be the absolute path to the directory where the
-# documentation is located. If left blank the directory on the local machine
-# will be used.
-
-DOC_ABSPATH =
-
-# The BIN_ABSPATH tag must point to the directory where the doxysearch binary
-# is installed.
-
-BIN_ABSPATH = /usr/local/bin/
-
-# The EXT_DOC_PATHS tag can be used to specify one or more paths to
-# documentation generated for other projects. This allows doxysearch to search
-# the documentation for these projects as well.
-
-EXT_DOC_PATHS =
diff --git a/docs/doxygen/config/Doxyfile b/docs/doxygen/config/Doxyfile
new file mode 100644
index 0000000..4101206
--- /dev/null
+++ b/docs/doxygen/config/Doxyfile
@@ -0,0 +1,2694 @@
+# Doxyfile 1.9.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project.
+#
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
+# The format is:
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the configuration
+# file that follow. The default is UTF-8 which is also the encoding used for all
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
+# iconv built into libc) for the transcoding. See
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
+# The default value is: UTF-8.
+
+DOXYFILE_ENCODING = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
+
+PROJECT_NAME = "Xbase64"
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
+
+PROJECT_NUMBER = 4.0.1
+
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
+
+PROJECT_BRIEF = "C++ Library for handling Xbase (DBF) format type files"
+
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
+
+PROJECT_LOGO =
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = ../
+
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
+
+CREATE_SUBDIRS = NO
+
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
+
+OUTPUT_LANGUAGE = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+# The default value is: YES.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
+
+ABBREVIATE_BRIEF = "The $name class" \
+ "The $name widget" \
+ "The $name file" \
+ is \
+ provides \
+ specifies \
+ contains \
+ represents \
+ a \
+ an \
+ the
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
+# description.
+# The default value is: NO.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+# The default value is: NO.
+
+#INLINE_INHERITED_MEMB = NO
+INLINE_INHERITED_MEMB = YES
+
+
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
+
+FULL_PATH_NAMES = YES
+
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
+
+JAVADOC_AUTOBRIEF = NO
+
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
+# such as
+# /***************
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
+# Javadoc-style will behave just like regular comments and it will not be
+# interpreted by doxygen.
+# The default value is: NO.
+
+JAVADOC_BANNER = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
+
+QT_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# By default Python docstrings are displayed as preformatted text and doxygen's
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
+# doxygen's special commands can be used and the contents of the docstring
+# documentation blocks is shown as doxygen documentation.
+# The default value is: YES.
+
+PYTHON_DOCSTRING = YES
+
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
+
+TAB_SIZE = 4
+
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:^^"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
+# to insert newlines (in the resulting output). You can put ^^ in the value part
+# of an alias to insert a newline as if a physical newline was in the original
+# file. When you need a literal { or } or , in the value part of an alias you
+# have to escape them by means of a backslash (\), this can lead to conflicts
+# with the commands \{ and \} for these it is advised to use the version @{ and
+# @} or use a double escape (\\{ and \\})
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_FOR_C = YES
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
+
+OPTIMIZE_FOR_FORTRAN = NO
+
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_VHDL = NO
+
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
+# sources only. Doxygen will then generate output that is more tailored for that
+# language. For instance, namespaces will be presented as modules, types will be
+# separated into more groups, etc.
+# The default value is: NO.
+
+OPTIMIZE_OUTPUT_SLICE = NO
+
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
+# tries to guess whether the code is fixed or free formatted code, this is the
+# default for Fortran type files). For instance to make doxygen treat .inc files
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
+# use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen. When specifying no_extension you should add
+# * to the FILE_PATTERNS.
+#
+# Note see also the list of default file extension mappings.
+
+EXTENSION_MAPPING =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT = YES
+
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
+# to that level are automatically included in the table of contents, even if
+# they do not have an id attribute.
+# Note: This feature currently applies only to Markdown headings.
+# Minimum value: 0, maximum value: 99, default value: 5.
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
+
+TOC_INCLUDE_HEADINGS = 5
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+# The default value is: NO.
+
+CPP_CLI_SUPPORT = NO
+
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
+
+SIP_SUPPORT = NO
+
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
+
+IDL_PROPERTY_SUPPORT = YES
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+# The default value is: NO.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
+
+SUBGROUPING = YES
+
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
+
+INLINE_GROUPED_CLASSES = NO
+
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
+
+INLINE_SIMPLE_STRUCTS = NO
+
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
+# types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
+
+TYPEDEF_HIDES_STRUCT = NO
+
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
+
+LOOKUP_CACHE_SIZE = 0
+
+# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use
+# during processing. When set to 0 doxygen will based this on the number of
+# cores available in the system. You can set it explicitly to a value larger
+# than 0 to get more control over the balance between CPU load and processing
+# speed. At this moment only the input processing can be done using multiple
+# threads. Since this is still an experimental feature the default is set to 1,
+# which effectively disables parallel processing. Please report any issues you
+# encounter. Generating dot graphs in parallel is controlled by the
+# DOT_NUM_THREADS setting.
+# Minimum value: 0, maximum value: 32, default value: 1.
+
+NUM_PROC_THREADS = 1
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
+# methods of a class will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PRIV_VIRTUAL = NO
+
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
+
+EXTRACT_ANON_NSPACES = NO
+
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
+# will be determined by the corresponding definition. By default unnamed
+# parameters remain unnamed in the output.
+# The default value is: YES.
+
+RESOLVE_UNNAMED_PARAMS = YES
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# declarations. If set to NO, these declarations will be included in the
+# documentation.
+# The default value is: NO.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
+
+INTERNAL_DOCS = NO
+
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
+# able to match the capabilities of the underlying filesystem. In case the
+# filesystem is case sensitive (i.e. it supports files in the same directory
+# whose names only differ in casing), the option must be set to YES to properly
+# deal with such files in case they appear in the input. For filesystems that
+# are not case sensitive the option should be be set to NO to properly deal with
+# output files written for symbols that only differ in casing, such as for two
+# classes, one named CLASS and the other named Class, and to also support
+# references to files without having to specify the exact matching casing. On
+# Windows (including Cygwin) and MacOS, users should typically set this option
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
+# YES.
+# The default value is: system dependent.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
+# will show which file needs to be included to use the class.
+# The default value is: YES.
+
+SHOW_HEADERFILE = YES
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
+
+FORCE_LOCAL_INCLUDES = NO
+
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
+
+SORT_MEMBERS_CTORS_1ST = NO
+
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
+
+SORT_GROUP_NAMES = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
+
+SORT_BY_SCOPE_NAME = NO
+
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
+
+STRICT_PROTO_MATCHING = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
+
+MAX_INITIALIZER_LINES = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
+# list will mention the files that were used to generate the documentation.
+# The default value is: YES.
+
+SHOW_USED_FILES = YES
+
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
+
+SHOW_FILES = YES
+
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
+
+SHOW_NAMESPACES = YES
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file. See also section "Changing the
+# layout of pages" for information.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
+
+LAYOUT_FILE =
+
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
+
+CITE_BIB_FILES =
+
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
+
+QUIET = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
+
+WARNINGS = YES
+
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as documenting some parameters in
+# a documented function twice, or documenting parameters that don't exist or
+# using markup commands wrongly.
+# The default value is: YES.
+
+WARN_IF_DOC_ERROR = YES
+
+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
+# function parameter documentation. If set to NO, doxygen will accept that some
+# parameters have no documentation without warning.
+# The default value is: YES.
+
+WARN_IF_INCOMPLETE_DOC = YES
+
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong parameter
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
+# set to YES then this flag will automatically be disabled. See also
+# WARN_IF_INCOMPLETE_DOC
+# The default value is: NO.
+
+WARN_NO_PARAMDOC = NO
+
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
+# at the end of the doxygen process doxygen will return with a non-zero status.
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
+# The default value is: NO.
+
+WARN_AS_ERROR = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr). In case the file specified cannot be opened for writing the
+# warning and error messages are written to standard error. When as file - is
+# specified the warning and error messages are written to standard output
+# (stdout).
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
+
+INPUT = ../../../src
+#INPUT = /mnt/1Tdata/xbase/xbase64-4.0.1/src/core
+
+
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see:
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
+# The default value is: UTF-8.
+
+INPUT_ENCODING = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# Note the list of default checked file patterns might differ from the list of
+# default file extension mappings.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
+# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
+# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
+# *.vhdl, *.ucf, *.qsf and *.ice.
+
+FILE_PATTERNS = *.c \
+ *.cc \
+ *.cxx \
+ *.cpp \
+ *.c++ \
+ *.java \
+ *.ii \
+ *.ixx \
+ *.ipp \
+ *.i++ \
+ *.inl \
+ *.idl \
+ *.ddl \
+ *.odl \
+ *.h \
+ *.hh \
+ *.hxx \
+ *.hpp \
+ *.h++ \
+ *.l \
+ *.cs \
+ *.d \
+ *.php \
+ *.php4 \
+ *.php5 \
+ *.phtml \
+ *.inc \
+ *.m \
+ *.markdown \
+ *.md \
+ *.mm \
+ *.dox \
+ *.py \
+ *.pyw \
+ *.f90 \
+ *.f95 \
+ *.f03 \
+ *.f08 \
+ *.f18 \
+ *.f \
+ *.for \
+ *.vhd \
+ *.vhdl \
+ *.ucf \
+ *.qsf \
+ *.ice
+
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
+# run.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
+# from the input.
+# The default value is: NO.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
+# ANamespace::AClass, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
+
+EXCLUDE_SYMBOLS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
+
+EXAMPLE_PATTERNS = *
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
+
+FILTER_SOURCE_FILES = NO
+
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
+
+FILTER_SOURCE_PATTERNS =
+
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
+
+USE_MDFILE_AS_MAINPAGE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# entity all documented functions referencing it will be listed.
+# The default value is: NO.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
+
+REFERENCES_RELATION = NO
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see https://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
+
+ALPHABETICAL_INDEX = YES
+
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a color-wheel, see
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_HUE = 220
+
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_SAT = 100
+
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_COLORSTYLE_GAMMA = 80
+
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_TIMESTAMP = NO
+
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
+# documentation will contain a main index with vertical navigation menus that
+# are dynamically created via JavaScript. If disabled, the navigation index will
+# consists of multiple levels of tabs that are statically embedded in every HTML
+# page. Disable this option to support browsers that do not have JavaScript,
+# like the Qt help browser.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_MENUS = YES
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_DYNAMIC_SECTIONS = NO
+
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see:
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
+# create a documentation set, doxygen will generate a Makefile in the HTML
+# output directory. Running make will produce the docset in that directory and
+# running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
+# genXcode/_index.html for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_DOCSET = NO
+
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDNAME = "Doxygen generated docs"
+
+# This tag determines the URL of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_FEEDURL =
+
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_BUNDLE_ID = org.doxygen.Project
+
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
+# string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_ID = org.doxygen.Publisher
+
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
+
+DOCSET_PUBLISHER_NAME = Publisher
+
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
+# a.o. the download links, offline the HTML help workshop was already many years
+# in maintenance mode). You can download the HTML help workshop from the web
+# archives at Installation executable (see:
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_HTMLHELP = NO
+
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
+# written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_FILE =
+
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+HHC_LOCATION =
+
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the main .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+GENERATE_CHI = NO
+
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+CHM_INDEX_ENCODING =
+
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
+
+TOC_EXPAND = NO
+
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_QHP = NO
+
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QCH_FILE =
+
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_NAMESPACE = org.doxygen.Project
+
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_VIRTUAL_FOLDER = doc
+
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_NAME =
+
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_CUST_FILTER_ATTRS =
+
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHP_SECT_FILTER_ATTRS =
+
+# The QHG_LOCATION tag can be used to specify the location (absolute path
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
+# run qhelpgenerator on the generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
+
+QHG_LOCATION =
+
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_ECLIPSEHELP = NO
+
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
+
+ECLIPSE_DOC_ID = org.doxygen.Project
+
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+DISABLE_INDEX = NO
+
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
+# example, the default style sheet generated by doxygen has an example that
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
+# Since the tree basically has the same information as the tab index, you could
+# consider setting DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+GENERATE_TREEVIEW = NO
+
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
+# area (value NO) or if it should extend to the full height of the window (value
+# YES). Setting this to YES gives a layout similar to
+# https://docs.readthedocs.io with more room for contents, but less room for the
+# project logo, title, and description. If either GENERATE_TREEVIEW or
+# DISABLE_INDEX is set to NO, this option has no effect.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FULL_SIDEBAR = NO
+
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+TREEVIEW_WIDTH = 250
+
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+EXT_LINKS_IN_WINDOW = NO
+
+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
+# addresses.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+OBFUSCATE_EMAILS = YES
+
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
+# the HTML output. These images will generally look nicer at scaled resolutions.
+# Possible values are: png (the default) and svg (looks nicer but requires the
+# pdf2svg or inkscape tool).
+# The default value is: png.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FORMULA_FORMAT = png
+
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_FONTSIZE = 10
+
+# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+FORMULA_TRANSPARENT = YES
+
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
+# to create new LaTeX commands to be used in formulas as building blocks. See
+# the section "Including formulas" for details.
+
+FORMULA_MACROFILE =
+
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+USE_MATHJAX = NO
+
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
+# Note that the different versions of MathJax have different requirements with
+# regards to the different settings, so it is possible that also other MathJax
+# settings have to be changed when switching between the different MathJax
+# versions.
+# Possible values are: MathJax_2 and MathJax_3.
+# The default value is: MathJax_2.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_VERSION = MathJax_2
+
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. For more details about the output format see MathJax
+# version 2 (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
+# (see:
+# http://docs.mathjax.org/en/latest/web/components/output.html).
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
+# is the name for Mathjax version 3, for MathJax version 2 this will be
+# translated into HTML-CSS) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from https://www.mathjax.org before deployment. The default value is:
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_RELPATH =
+
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# for MathJax version 2 (see
+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# For example for MathJax version 3 (see
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
+# MATHJAX_EXTENSIONS = ams
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see:
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+SEARCHENGINE = YES
+
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using JavaScript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SERVER_BASED_SEARCH = NO
+
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see:
+# https://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see:
+# https://xapian.org/). See the section "External Indexing and Searching" for
+# details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
+# chosen this is overwritten by pdflatex. For specific output languages the
+# default can have been set differently, this depends on the implementation of
+# the output language.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_CMD_NAME =
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# Note: This tag is used in the Makefile / make.bat.
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
+# (.tex).
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
+# generate index for LaTeX. In case there is no backslash (\) as first character
+# it will be automatically added in the LaTeX code.
+# Note: This tag is used in the generated output file (.tex).
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
+# The default value is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_MAKEINDEX_CMD = makeindex
+
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+COMPACT_LATEX = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PAPER_TYPE = a4
+
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES =
+
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
+# the generated LaTeX document. The header should contain everything until the
+# first chapter. If it is left blank doxygen will generate a standard header. It
+# is highly recommended to start with a default header using
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
+# information on how to generate the default header that doxygen normally uses.
+#
+# Note: Only use a user-defined header if you know what you are doing!
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. The following
+# commands have a special meaning inside the header (and footer): For a
+# description of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER =
+
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
+# the generated LaTeX document. The footer should contain everything after the
+# last chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer. See also section "Doxygen
+# usage" for information on how to generate the default footer that doxygen
+# normally uses. Note: Only use a user-defined footer if you know what you are
+# doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_FOOTER =
+
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_STYLESHEET =
+
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EXTRA_FILES =
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
+# files. Set this option to YES, to get a higher quality PDF documentation.
+#
+# See also section LATEX_CMD_NAME for selecting the engine.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BATCHMODE = NO
+
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HIDE_INDICES = NO
+
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_BIB_STYLE = plain
+
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP = NO
+
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
+# path from which the emoji images will be read. If a relative path is entered,
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
+# LATEX_OUTPUT directory will be used.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_EMOJI_DIRECTORY =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_HYPERLINKS = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# configuration file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's configuration file. A template extensions file can be
+# generated using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_EXTENSION = .3
+
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_OUTPUT = xml
+
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_PROGRAMLISTING = YES
+
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
+# namespace members in file scope as well, matching the HTML output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_XML is set to YES.
+
+XML_NS_MEMB_FILE_SCOPE = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
+
+GENERATE_DOCBOOK = NO
+
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT = docbook
+
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
+# the structure of the code including all documentation. Note that this feature
+# is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# Configuration options related to Sqlite3 output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_SQLITE3 tag is set to YES doxygen will generate a Sqlite3
+# database with symbols found by doxygen stored in tables.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_sqlite3=ON option for CMake.
+# The default value is: NO.
+
+GENERATE_SQLITE3 = NO
+
+# The SQLITE3_OUTPUT tag is used to specify where the Sqlite3 database will be
+# put. If a relative path is entered the value of OUTPUT_DIRECTORY will be put
+# in front of it.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_sqlite3=ON option for CMake.
+# The default directory is: sqlite3.
+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
+
+SQLITE3_OUTPUT = sqlite3
+
+# The SQLITE3_OVERWRITE_DB tag is set to YES, the existing doxygen_sqlite3.db
+# database file will be recreated with each doxygen run. If set to NO, doxygen
+# will warn if an a database file is already found and not modify it.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse_sqlite3=ON option for CMake.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_SQLITE3 is set to YES.
+
+SQLITE3_RECREATE_DB = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+MACRO_EXPANSION = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_ONLY_PREDEF = NO
+
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+PREDEFINED =
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+EXPAND_AS_DEFINED =
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
+
+EXTERNAL_GROUPS = YES
+
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES = YES
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
+
+DIA_PATH =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
+
+HAVE_DOT = NO
+
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_NUM_THREADS = 0
+
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTNAME = Helvetica
+
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTSIZE = 10
+
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_FONTPATH =
+
+# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
+# graph for each documented class showing the direct and indirect inheritance
+# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
+# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
+# to TEXT the direct and indirect inheritance relations will be shown as texts /
+# links.
+# Possible values are: NO, YES, TEXT and GRAPH.
+# The default value is: YES.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LOOK = NO
+
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+UML_LIMIT_NUM_FIELDS = 10
+
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
+# tag is set to YES, doxygen will add type and arguments for attributes and
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
+# will not generate fields with class member information in the UML graphs. The
+# class diagrams will look similar to the default class diagrams but using UML
+# notation for the relationships.
+# Possible values are: NO, YES and NONE.
+# The default value is: NO.
+# This tag requires that the tag UML_LOOK is set to YES.
+
+DOT_UML_DETAILS = NO
+
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
+# to display on a single line. If the actual line length exceeds this threshold
+# significantly it will wrapped across multiple lines. Some heuristics are apply
+# to avoid ugly line breaks.
+# Minimum value: 0, maximum value: 1000, default value: 17.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_WRAP_THRESHOLD = 17
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+TEMPLATE_RELATIONS = NO
+
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDE_GRAPH = YES
+
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALL_GRAPH = NO
+
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+CALLER_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DIRECTORY_GRAPH = YES
+
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
+# of child directories generated in directory dependency graphs by dot.
+# Minimum value: 1, maximum value: 25, default value: 1.
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
+
+DIR_GRAPH_MAX_DEPTH = 1
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_IMAGE_FORMAT = png
+
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+INTERACTIVE_SVG = NO
+
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOTFILE_DIRS =
+
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
+
+MSCFILE_DIRS =
+
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
+
+DIAFILE_DIRS =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file or to the filename of jar file
+# to be used. If left blank, it is assumed PlantUML is not used or called during
+# a preprocessing step. Doxygen will generate a warning when it encounters a
+# \startuml command in this case and will not generate output for the diagram.
+
+PLANTUML_JAR_PATH =
+
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
+# configuration file for plantuml.
+
+PLANTUML_CFG_FILE =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_GRAPH_MAX_NODES = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
+# graphical representation for inheritance and collaboration diagrams is used.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
+# files that are used to generate the various graphs.
+#
+# Note: This setting is not only used for dot files but also for msc temporary
+# files.
+# The default value is: YES.
+
+DOT_CLEANUP = YES
diff --git a/docs/doxygen/config/doxyout.txt b/docs/doxygen/config/doxyout.txt
new file mode 100644
index 0000000..3551bf8
--- /dev/null
+++ b/docs/doxygen/config/doxyout.txt
@@ -0,0 +1,438 @@
+Doxygen version used: 1.9.3
+Searching for include files...
+Searching for example files...
+Searching for images...
+Searching for dot files...
+Searching for msc files...
+Searching for dia files...
+Searching for files to exclude
+Searching INPUT for files to process...
+Searching for files in directory /mnt/1Tdata/xbase/xbase64-4.0.2/src
+Searching for files in directory /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples
+Searching for files in directory /mnt/1Tdata/xbase/xbase64-4.0.2/src/include
+Searching for files in directory /mnt/1Tdata/xbase/xbase64-4.0.2/src/core
+Searching for files in directory /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils
+Searching for files in directory /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql
+Searching for files in directory /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests
+Reading and parsing tag files
+Parsing files
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbbcd.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbbcd.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdate.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdate.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf3.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf3.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf4.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf4.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbexp.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbexp.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbexpnode.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbexpnode.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfields.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfields.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfile.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfile.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfilter.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfilter.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfuncs.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfuncs.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixbase.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixbase.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixmdx.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixmdx.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixndx.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixndx.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xblog.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xblog.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo3.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo3.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo4.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo4.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbssv.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbssv.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbstring.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbstring.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbtag.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbtag.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbtblmgr.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbtblmgr.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbuda.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbuda.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbxbase.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbxbase.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_date.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_date.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_sql.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_sql.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_string.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_string.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v3_create_dbf.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v3_create_dbf.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v3_upd_dbf.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v3_upd_dbf.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v4_create_dbf.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v4_create_dbf.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v4_upd_dbf.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v4_upd_dbf.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbase.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbase.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbbcd.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbbcd.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdate.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdate.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdbf.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdbf.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexp.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexp.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexpnode.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexpnode.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfile.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfile.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfilter.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfilter.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbindex.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbindex.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklst.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklst.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklstord.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklstord.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnknod.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnknod.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblog.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblog.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbmemo.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbmemo.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbretcod.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbretcod.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbsql.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbsql.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbssv.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbssv.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbstring.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbstring.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtag.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtag.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtblmgr.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtblmgr.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtypes.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtypes.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbuda.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbuda.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbxbase.h...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbxbase.h...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbcrix.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbcrix.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbcrtbl.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbcrtbl.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbdrpix.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbdrpix.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbdrptbl.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbdrptbl.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbinsert.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbinsert.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbset.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbset.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbsql.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbsql.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/tstfuncs.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/tstfuncs.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_bcd.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_bcd.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_date.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_date.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v3_memos.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v3_memos.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v3_nomemos.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v3_nomemos.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v4_memos.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v4_memos.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v4_nomemos.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v4_nomemos.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_expnode.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_expnode.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_expression.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_expression.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_file.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_file.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_filter.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_filter.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_funcs.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_funcs.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_linklist.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_linklist.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_lock.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_lock.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_lock2.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_lock2.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_log.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_log.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_mdx.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_mdx.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_ndx.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_ndx.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_ndx2.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_ndx2.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_sql.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_sql.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_string.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_string.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_tblmgr.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_tblmgr.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_uda.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_uda.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_xbase.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_xbase.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/checkndx.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/checkndx.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/dbfxtrct.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/dbfxtrct.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/reindex.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/reindex.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_cfg_check.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_cfg_check.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_copydbf.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_copydbf.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dbfutil.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dbfutil.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_deletall.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_deletall.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumpdbt.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumpdbt.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumphdr.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumphdr.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumpix.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumpix.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumprecs.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumprecs.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_execsql.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_execsql.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_pack.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_pack.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_tblinfo.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_tblinfo.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_undelall.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_undelall.cpp...
+Preprocessing /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_zap.cpp...
+Parsing file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_zap.cpp...
+Building macro definition list...
+Building group list...
+Building directory list...
+Building namespace list...
+Building file list...
+Building class list...
+Building concept list...
+Computing nesting relations for classes...
+Associating documentation with classes...
+Associating documentation with concepts...
+Building example list...
+Searching for enumerations...
+Searching for documented typedefs...
+Searching for members imported via using declarations...
+Searching for included using directives...
+Searching for documented variables...
+Building interface member list...
+Building member list...
+Searching for friends...
+Searching for documented defines...
+Computing class inheritance relations...
+Computing class usage relations...
+Flushing cached template relations that have become invalid...
+Computing class relations...
+Add enum values to enums...
+Searching for member function documentation...
+Creating members for template instances...
+Building page list...
+Search for main page...
+Computing page relations...
+Determining the scope of groups...
+Sorting lists...
+Determining which enums are documented
+Computing member relations...
+Building full member lists recursively...
+Adding members to member groups.
+Computing member references...
+Inheriting documentation...
+Generating disk names...
+Adding source references...
+Adding xrefitems...
+Sorting member lists...
+Setting anonymous enum type...
+Computing dependencies between directories...
+Generating citations page...
+Counting members...
+Counting data structures...
+Resolving user defined references...
+Finding anchors and sections in the documentation...
+Transferring function references...
+Combining using relations...
+Adding members to index pages...
+Correcting members for VHDL...
+Computing tooltip texts...
+Generating style sheet...
+Generating search indices...
+Generating example documentation...
+Generating file sources...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbase.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbbcd.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdate.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdbf.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexp.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexpnode.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfile.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfilter.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbindex.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklst.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklstord.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnknod.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblog.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbmemo.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbretcod.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbsql.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbssv.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbstring.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtag.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtblmgr.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtypes.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbuda.h...
+Generating code for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbxbase.h...
+Generating file documentation...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbbcd.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdate.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf3.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf4.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbexp.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbexpnode.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfields.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfile.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfilter.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfuncs.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixbase.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixmdx.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixndx.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xblog.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo3.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo4.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbssv.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbstring.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbtag.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbtblmgr.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbuda.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbxbase.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_date.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_sql.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_string.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v3_create_dbf.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v3_upd_dbf.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v4_create_dbf.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v4_upd_dbf.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbase.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbbcd.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdate.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdbf.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexp.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexpnode.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfile.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfilter.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbindex.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklst.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklstord.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnknod.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblog.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbmemo.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbretcod.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbsql.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbssv.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbstring.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtag.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtblmgr.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtypes.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbuda.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbxbase.h...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbcrix.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbcrtbl.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbdrpix.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbdrptbl.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbinsert.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbset.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbsql.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/tstfuncs.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_bcd.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_date.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v3_memos.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v3_nomemos.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v4_memos.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v4_nomemos.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_expnode.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_expression.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_file.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_filter.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_funcs.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_linklist.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_lock.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_lock2.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_log.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_mdx.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_ndx.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_ndx2.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_sql.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_string.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_tblmgr.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_uda.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_xbase.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/checkndx.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/dbfxtrct.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/reindex.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_cfg_check.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_copydbf.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dbfutil.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_deletall.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumpdbt.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumphdr.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumpix.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumprecs.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_execsql.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_pack.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_tblinfo.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_undelall.cpp...
+Generating docs for file /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_zap.cpp...
+Generating page documentation...
+Generating group documentation...
+Generating class documentation...
+Generating concept documentation...
+Generating namespace index...
+Generating docs for namespace xb
+Generating docs for compound xb::xbDate...
+Generating docs for compound xb::xbDbf...
+Generating docs for compound xb::xbFile...
+Generating docs for compound xb::xbSchema...
+Generating docs for compound xb::xbSsv...
+Generating docs for compound xb::xbString...
+Generating docs for compound xb::xbTblList...
+Generating docs for compound xb::xbTblMgr...
+Generating docs for compound xb::xbXBase...
+Generating graph info page...
+Generating directory documentation...
+Generating index page...
+Generating page index...
+Generating module index...
+Generating namespace index...
+Generating namespace member index...
+Generating concept index...
+Generating annotated compound index...
+Generating alphabetical compound index...
+Generating hierarchical class index...
+Generating member index...
+Generating file index...
+Generating file member index...
+Generating example index...
+finalizing index lists...
+writing tag file...
+Running plantuml with JAVA...
+lookup cache used 1038/65536 hits=6034 misses=1083
+finished...
diff --git a/docs/doxygen/html/annotated.html b/docs/doxygen/html/annotated.html
new file mode 100644
index 0000000..5124dd1
--- /dev/null
+++ b/docs/doxygen/html/annotated.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Structures</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle"><div class="title">Data Structures</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the data structures with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><a class="el" href="namespacexb.html" target="_self">xb</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbDate.html" target="_self">xbDate</a></td><td class="desc">XbDate class </td></tr>
+<tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbDbf.html" target="_self">xbDbf</a></td><td class="desc">Base class for handling dbf files/tables </td></tr>
+<tr id="row_0_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbFile.html" target="_self">xbFile</a></td><td class="desc">Class for handling low level file I/O </td></tr>
+<tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structxb_1_1xbSchema.html" target="_self">xbSchema</a></td><td class="desc">Schema used for defining tables with CreateTable methods </td></tr>
+<tr id="row_0_4_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbSsv.html" target="_self">xbSsv</a></td><td class="desc">Class for handling shared system variables </td></tr>
+<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbString.html" target="_self">xbString</a></td><td class="desc">Class for handling string data </td></tr>
+<tr id="row_0_6_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structxb_1_1xbTblList.html" target="_self">xbTblList</a></td><td class="desc"></td></tr>
+<tr id="row_0_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbTblMgr.html" target="_self">xbTblMgr</a></td><td class="desc"></td></tr>
+<tr id="row_0_8_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbXBase.html" target="_self">xbXBase</a></td><td class="desc">XbXbase class </td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/bc_s.png b/docs/doxygen/html/bc_s.png
new file mode 100644
index 0000000..224b29a
--- /dev/null
+++ b/docs/doxygen/html/bc_s.png
Binary files differ
diff --git a/docs/doxygen/html/bdwn.png b/docs/doxygen/html/bdwn.png
new file mode 100644
index 0000000..940a0b9
--- /dev/null
+++ b/docs/doxygen/html/bdwn.png
Binary files differ
diff --git a/docs/doxygen/html/checkndx_8cpp.html b/docs/doxygen/html/checkndx_8cpp.html
new file mode 100644
index 0000000..e24b4ce
--- /dev/null
+++ b/docs/doxygen/html/checkndx_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/checkndx.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">checkndx.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;xbase64/xbase64.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="checkndx_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/classes.html b/docs/doxygen/html/classes.html
new file mode 100644
index 0000000..4c2c9d8
--- /dev/null
+++ b/docs/doxygen/html/classes.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Structure Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle"><div class="title">Data Structure Index</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_X">X</a></div>
+<div class="classindex">
+<dl class="classindex even">
+<dt class="alphachar"><a id="letter_X" name="letter_X">X</a></dt>
+<dd><a class="el" href="classxb_1_1xbDate.html">xbDate</a> (<a class="el" href="namespacexb.html">xb</a>)</dd><dd><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> (<a class="el" href="namespacexb.html">xb</a>)</dd><dd><a class="el" href="classxb_1_1xbFile.html">xbFile</a> (<a class="el" href="namespacexb.html">xb</a>)</dd><dd><a class="el" href="structxb_1_1xbSchema.html">xbSchema</a> (<a class="el" href="namespacexb.html">xb</a>)</dd><dd><a class="el" href="classxb_1_1xbSsv.html">xbSsv</a> (<a class="el" href="namespacexb.html">xb</a>)</dd><dd><a class="el" href="classxb_1_1xbString.html">xbString</a> (<a class="el" href="namespacexb.html">xb</a>)</dd><dd><a class="el" href="structxb_1_1xbTblList.html">xbTblList</a> (<a class="el" href="namespacexb.html">xb</a>)</dd><dd><a class="el" href="classxb_1_1xbTblMgr.html">xbTblMgr</a> (<a class="el" href="namespacexb.html">xb</a>)</dd><dd><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> (<a class="el" href="namespacexb.html">xb</a>)</dd></dl>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/classxb_1_1xbDate.html b/docs/doxygen/html/classxb_1_1xbDate.html
new file mode 100644
index 0000000..5e193da
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbDate.html
@@ -0,0 +1,1820 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: xb::xbDate Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacexb.html">xb</a></li><li class="navelem"><a class="el" href="classxb_1_1xbDate.html">xbDate</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pro-static-attribs">Static Protected Attributes</a> </div>
+ <div class="headertitle"><div class="title">xb::xbDate Class Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a class="el" href="classxb_1_1xbDate.html" title="xbDate class.">xbDate</a> class.
+ <a href="classxb_1_1xbDate.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="xbdate_8h_source.html">xbdate.h</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for xb::xbDate:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classxb_1_1xbDate.png" usemap="#xb::xbDate_map" alt=""/>
+ <map id="xb::xbDate_map" name="xb::xbDate_map">
+<area href="classxb_1_1xbSsv.html" title="Class for handling shared system variables." alt="xb::xbSsv" shape="rect" coords="0,0,70,24"/>
+ </map>
+</div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ab3150e7db0ab5db10a07d748b55465eb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#ab3150e7db0ab5db10a07d748b55465eb">xbDate</a> ()</td></tr>
+<tr class="memdesc:ab3150e7db0ab5db10a07d748b55465eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbDate.html#ab3150e7db0ab5db10a07d748b55465eb">More...</a><br /></td></tr>
+<tr class="separator:ab3150e7db0ab5db10a07d748b55465eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac8a4d9330221a3daee21b3c28c1d9719"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#ac8a4d9330221a3daee21b3c28c1d9719">xbDate</a> (const char *Date8)</td></tr>
+<tr class="memdesc:ac8a4d9330221a3daee21b3c28c1d9719"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbDate.html#ac8a4d9330221a3daee21b3c28c1d9719">More...</a><br /></td></tr>
+<tr class="separator:ac8a4d9330221a3daee21b3c28c1d9719"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf4546f5681735ede18210f60bab68d4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#acf4546f5681735ede18210f60bab68d4">xbDate</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;Date8)</td></tr>
+<tr class="memdesc:acf4546f5681735ede18210f60bab68d4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbDate.html#acf4546f5681735ede18210f60bab68d4">More...</a><br /></td></tr>
+<tr class="separator:acf4546f5681735ede18210f60bab68d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7ab727a7ec184a086ad36ef83b948170"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a7ab727a7ec184a086ad36ef83b948170">xbDate</a> (xbInt32 lJulDate)</td></tr>
+<tr class="memdesc:a7ab727a7ec184a086ad36ef83b948170"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbDate.html#a7ab727a7ec184a086ad36ef83b948170">More...</a><br /></td></tr>
+<tr class="separator:a7ab727a7ec184a086ad36ef83b948170"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05c9680c6eb9fe07ecf13a189b596c37"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a05c9680c6eb9fe07ecf13a189b596c37">~xbDate</a> ()</td></tr>
+<tr class="memdesc:a05c9680c6eb9fe07ecf13a189b596c37"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destructor. <a href="classxb_1_1xbDate.html#a05c9680c6eb9fe07ecf13a189b596c37">More...</a><br /></td></tr>
+<tr class="separator:a05c9680c6eb9fe07ecf13a189b596c37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e33ad9415c32e820e08fd8084198690"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a2e33ad9415c32e820e08fd8084198690">operator=</a> (const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;d)</td></tr>
+<tr class="memdesc:a2e33ad9415c32e820e08fd8084198690"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set operator=. <a href="classxb_1_1xbDate.html#a2e33ad9415c32e820e08fd8084198690">More...</a><br /></td></tr>
+<tr class="separator:a2e33ad9415c32e820e08fd8084198690"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a947ba156d04fe063aaa4c9964ae5d163"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a947ba156d04fe063aaa4c9964ae5d163">operator+=</a> (xbInt32 i)</td></tr>
+<tr class="memdesc:a947ba156d04fe063aaa4c9964ae5d163"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator += <a href="classxb_1_1xbDate.html#a947ba156d04fe063aaa4c9964ae5d163">More...</a><br /></td></tr>
+<tr class="separator:a947ba156d04fe063aaa4c9964ae5d163"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a8f207d759540114373f5e9d6d375f7"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a4a8f207d759540114373f5e9d6d375f7">operator-=</a> (xbInt32 i)</td></tr>
+<tr class="memdesc:a4a8f207d759540114373f5e9d6d375f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator -= <a href="classxb_1_1xbDate.html#a4a8f207d759540114373f5e9d6d375f7">More...</a><br /></td></tr>
+<tr class="separator:a4a8f207d759540114373f5e9d6d375f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c7d9e3718c43df18b21646072c8605e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a1c7d9e3718c43df18b21646072c8605e">operator++</a> (xbInt32 i)</td></tr>
+<tr class="memdesc:a1c7d9e3718c43df18b21646072c8605e"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator ++ <a href="classxb_1_1xbDate.html#a1c7d9e3718c43df18b21646072c8605e">More...</a><br /></td></tr>
+<tr class="separator:a1c7d9e3718c43df18b21646072c8605e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2b33dfee60d324916d833b2098b5a6b"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#ae2b33dfee60d324916d833b2098b5a6b">operator--</a> (xbInt32 i)</td></tr>
+<tr class="memdesc:ae2b33dfee60d324916d833b2098b5a6b"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator &ndash; <a href="classxb_1_1xbDate.html#ae2b33dfee60d324916d833b2098b5a6b">More...</a><br /></td></tr>
+<tr class="separator:ae2b33dfee60d324916d833b2098b5a6b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3f3a8802c96098c85aa8d0e19717a979"><td class="memItemLeft" align="right" valign="top">xbInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a3f3a8802c96098c85aa8d0e19717a979">operator-</a> (const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;) const</td></tr>
+<tr class="memdesc:a3f3a8802c96098c85aa8d0e19717a979"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator - <a href="classxb_1_1xbDate.html#a3f3a8802c96098c85aa8d0e19717a979">More...</a><br /></td></tr>
+<tr class="separator:a3f3a8802c96098c85aa8d0e19717a979"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a73ff5c037046ac0a0bb7d73f74e25cbb"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a73ff5c037046ac0a0bb7d73f74e25cbb">operator-</a> (xbInt32 i)</td></tr>
+<tr class="memdesc:a73ff5c037046ac0a0bb7d73f74e25cbb"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator - <a href="classxb_1_1xbDate.html#a73ff5c037046ac0a0bb7d73f74e25cbb">More...</a><br /></td></tr>
+<tr class="separator:a73ff5c037046ac0a0bb7d73f74e25cbb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad09609bf78cf038886a4f9cd19423f9c"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#ad09609bf78cf038886a4f9cd19423f9c">operator+</a> (xbInt32 i)</td></tr>
+<tr class="memdesc:ad09609bf78cf038886a4f9cd19423f9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator + <a href="classxb_1_1xbDate.html#ad09609bf78cf038886a4f9cd19423f9c">More...</a><br /></td></tr>
+<tr class="separator:ad09609bf78cf038886a4f9cd19423f9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaaf98c1a672066021895f0953b6e94d0"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#aaaf98c1a672066021895f0953b6e94d0">operator==</a> (const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;) const</td></tr>
+<tr class="memdesc:aaaf98c1a672066021895f0953b6e94d0"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator == <a href="classxb_1_1xbDate.html#aaaf98c1a672066021895f0953b6e94d0">More...</a><br /></td></tr>
+<tr class="separator:aaaf98c1a672066021895f0953b6e94d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac3aaf8997fc0c36676085e7741f33a8a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#ac3aaf8997fc0c36676085e7741f33a8a">operator!=</a> (const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;) const</td></tr>
+<tr class="memdesc:ac3aaf8997fc0c36676085e7741f33a8a"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator != <a href="classxb_1_1xbDate.html#ac3aaf8997fc0c36676085e7741f33a8a">More...</a><br /></td></tr>
+<tr class="separator:ac3aaf8997fc0c36676085e7741f33a8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11f09d97ed527e7ef00ba6f17b9fb02c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a11f09d97ed527e7ef00ba6f17b9fb02c">operator&lt;</a> (const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;) const</td></tr>
+<tr class="memdesc:a11f09d97ed527e7ef00ba6f17b9fb02c"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator &lt; <a href="classxb_1_1xbDate.html#a11f09d97ed527e7ef00ba6f17b9fb02c">More...</a><br /></td></tr>
+<tr class="separator:a11f09d97ed527e7ef00ba6f17b9fb02c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a744031c4031d6ec4595d34acbd1c5860"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a744031c4031d6ec4595d34acbd1c5860">operator&gt;</a> (const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;) const</td></tr>
+<tr class="memdesc:a744031c4031d6ec4595d34acbd1c5860"><td class="mdescLeft">&#160;</td><td class="mdescRight">&gt; <a href="classxb_1_1xbDate.html#a744031c4031d6ec4595d34acbd1c5860">More...</a><br /></td></tr>
+<tr class="separator:a744031c4031d6ec4595d34acbd1c5860"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d8fa4df4664f3fd8d4cc15e77f6d046"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a6d8fa4df4664f3fd8d4cc15e77f6d046">operator&lt;=</a> (const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;) const</td></tr>
+<tr class="memdesc:a6d8fa4df4664f3fd8d4cc15e77f6d046"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator &lt;= <a href="classxb_1_1xbDate.html#a6d8fa4df4664f3fd8d4cc15e77f6d046">More...</a><br /></td></tr>
+<tr class="separator:a6d8fa4df4664f3fd8d4cc15e77f6d046"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d81959ea55440588068ea7f82617c99"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a1d81959ea55440588068ea7f82617c99">operator&gt;=</a> (const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;) const</td></tr>
+<tr class="memdesc:a1d81959ea55440588068ea7f82617c99"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator &gt;= <a href="classxb_1_1xbDate.html#a1d81959ea55440588068ea7f82617c99">More...</a><br /></td></tr>
+<tr class="separator:a1d81959ea55440588068ea7f82617c99"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9df58caa54105c489c314785c457e8cb"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a9df58caa54105c489c314785c457e8cb">CalcRollingCenturyForYear</a> (xbInt16 year) const</td></tr>
+<tr class="memdesc:a9df58caa54105c489c314785c457e8cb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculate century for a given year. <a href="classxb_1_1xbDate.html#a9df58caa54105c489c314785c457e8cb">More...</a><br /></td></tr>
+<tr class="separator:a9df58caa54105c489c314785c457e8cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38b2c5285c69ed65e94ece6c22dafde0"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a38b2c5285c69ed65e94ece6c22dafde0">CenturyOf</a> () const</td></tr>
+<tr class="memdesc:a38b2c5285c69ed65e94ece6c22dafde0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get century for date. <a href="classxb_1_1xbDate.html#a38b2c5285c69ed65e94ece6c22dafde0">More...</a><br /></td></tr>
+<tr class="separator:a38b2c5285c69ed65e94ece6c22dafde0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9fc29730b66cddfbb58c69992a99cc7c"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a9fc29730b66cddfbb58c69992a99cc7c">CharDayOf</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOutCharDay)</td></tr>
+<tr class="memdesc:a9fc29730b66cddfbb58c69992a99cc7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the day of the week. <a href="classxb_1_1xbDate.html#a9fc29730b66cddfbb58c69992a99cc7c">More...</a><br /></td></tr>
+<tr class="separator:a9fc29730b66cddfbb58c69992a99cc7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afffc84f02bd421335ff8ebe9fb3db0ac"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#afffc84f02bd421335ff8ebe9fb3db0ac">CharMonthOf</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOutCharMonth)</td></tr>
+<tr class="memdesc:afffc84f02bd421335ff8ebe9fb3db0ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the month from the date. <a href="classxb_1_1xbDate.html#afffc84f02bd421335ff8ebe9fb3db0ac">More...</a><br /></td></tr>
+<tr class="separator:afffc84f02bd421335ff8ebe9fb3db0ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a367f66ef0c03c1747c12a18784554ccb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a367f66ef0c03c1747c12a18784554ccb">DateIsValid</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDate8) const</td></tr>
+<tr class="memdesc:a367f66ef0c03c1747c12a18784554ccb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check a date for valid data. <a href="classxb_1_1xbDate.html#a367f66ef0c03c1747c12a18784554ccb">More...</a><br /></td></tr>
+<tr class="separator:a367f66ef0c03c1747c12a18784554ccb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6417a900ce64a46f8909c0c7a2ddea2"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#ad6417a900ce64a46f8909c0c7a2ddea2">DayOf</a> (xbInt16 iFormat) const</td></tr>
+<tr class="separator:ad6417a900ce64a46f8909c0c7a2ddea2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb1eb4b0394e4a67aadab15779b1b8c5"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#abb1eb4b0394e4a67aadab15779b1b8c5">CTOD</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sCtodInDate)</td></tr>
+<tr class="memdesc:abb1eb4b0394e4a67aadab15779b1b8c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Format MM/DD/YY date. <a href="classxb_1_1xbDate.html#abb1eb4b0394e4a67aadab15779b1b8c5">More...</a><br /></td></tr>
+<tr class="separator:abb1eb4b0394e4a67aadab15779b1b8c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01de44dc869f7db99f33046fc91f2c6a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a01de44dc869f7db99f33046fc91f2c6a">FormatDate</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFmtIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFmtOut)</td></tr>
+<tr class="separator:a01de44dc869f7db99f33046fc91f2c6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab43a5d8d929767c0ffdd722972bb8cc0"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#ab43a5d8d929767c0ffdd722972bb8cc0">Str</a> () const</td></tr>
+<tr class="memdesc:ab43a5d8d929767c0ffdd722972bb8cc0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return the date value. <a href="classxb_1_1xbDate.html#ab43a5d8d929767c0ffdd722972bb8cc0">More...</a><br /></td></tr>
+<tr class="separator:ab43a5d8d929767c0ffdd722972bb8cc0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2bd33a72448e2c5ee00d8b711dc5d95"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#af2bd33a72448e2c5ee00d8b711dc5d95">IsLeapYear</a> (xbInt16 iYear) const</td></tr>
+<tr class="memdesc:af2bd33a72448e2c5ee00d8b711dc5d95"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine if date is a leap year. <a href="classxb_1_1xbDate.html#af2bd33a72448e2c5ee00d8b711dc5d95">More...</a><br /></td></tr>
+<tr class="separator:af2bd33a72448e2c5ee00d8b711dc5d95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f8051c31b29244265e8f26ac3547b9b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a5f8051c31b29244265e8f26ac3547b9b">IsLeapYear</a> () const</td></tr>
+<tr class="memdesc:a5f8051c31b29244265e8f26ac3547b9b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine if date is a leap year. <a href="classxb_1_1xbDate.html#a5f8051c31b29244265e8f26ac3547b9b">More...</a><br /></td></tr>
+<tr class="separator:a5f8051c31b29244265e8f26ac3547b9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ee3377d4ead9d31099eee539d9b13a7"><td class="memItemLeft" align="right" valign="top">xbInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a1ee3377d4ead9d31099eee539d9b13a7">JulianDays</a> () const</td></tr>
+<tr class="memdesc:a1ee3377d4ead9d31099eee539d9b13a7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Calculate julian days for a given date. <a href="classxb_1_1xbDate.html#a1ee3377d4ead9d31099eee539d9b13a7">More...</a><br /></td></tr>
+<tr class="separator:a1ee3377d4ead9d31099eee539d9b13a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d28b2a46d8aaa284b92f44eeb96b2ff"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a9d28b2a46d8aaa284b92f44eeb96b2ff">JulToDate8</a> (xbInt32 lJulDate)</td></tr>
+<tr class="memdesc:a9d28b2a46d8aaa284b92f44eeb96b2ff"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert the number of julian days to gregorian date. <a href="classxb_1_1xbDate.html#a9d28b2a46d8aaa284b92f44eeb96b2ff">More...</a><br /></td></tr>
+<tr class="separator:a9d28b2a46d8aaa284b92f44eeb96b2ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15847866bb7642aa42bc254e0cf2038a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a15847866bb7642aa42bc254e0cf2038a">LastDayOfMonth</a> ()</td></tr>
+<tr class="memdesc:a15847866bb7642aa42bc254e0cf2038a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the date to the last day of month for a given date. <a href="classxb_1_1xbDate.html#a15847866bb7642aa42bc254e0cf2038a">More...</a><br /></td></tr>
+<tr class="separator:a15847866bb7642aa42bc254e0cf2038a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08bd84c67e1119d8c5c1748cd89d092e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a08bd84c67e1119d8c5c1748cd89d092e">MonthOf</a> () const</td></tr>
+<tr class="memdesc:a08bd84c67e1119d8c5c1748cd89d092e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return the month for the date. <a href="classxb_1_1xbDate.html#a08bd84c67e1119d8c5c1748cd89d092e">More...</a><br /></td></tr>
+<tr class="separator:a08bd84c67e1119d8c5c1748cd89d092e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b0cde152b5de0f7d26608d1445110b6"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a4b0cde152b5de0f7d26608d1445110b6">Set</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;Date8)</td></tr>
+<tr class="memdesc:a4b0cde152b5de0f7d26608d1445110b6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the date. <a href="classxb_1_1xbDate.html#a4b0cde152b5de0f7d26608d1445110b6">More...</a><br /></td></tr>
+<tr class="separator:a4b0cde152b5de0f7d26608d1445110b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40ba54a58d64cf56266f020f91584192"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a40ba54a58d64cf56266f020f91584192">Sysdate</a> ()</td></tr>
+<tr class="memdesc:a40ba54a58d64cf56266f020f91584192"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the date equal to the system date. <a href="classxb_1_1xbDate.html#a40ba54a58d64cf56266f020f91584192">More...</a><br /></td></tr>
+<tr class="separator:a40ba54a58d64cf56266f020f91584192"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31057dfaa36389a16e40e3db82c46262"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html#a31057dfaa36389a16e40e3db82c46262">YearOf</a> () const</td></tr>
+<tr class="memdesc:a31057dfaa36389a16e40e3db82c46262"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the year of the date. <a href="classxb_1_1xbDate.html#a31057dfaa36389a16e40e3db82c46262">More...</a><br /></td></tr>
+<tr class="separator:a31057dfaa36389a16e40e3db82c46262"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">DisplayError</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a97dfa59ab9a8e9f17454da0faceb023d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Display error message on console for a given error number. <a href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">More...</a><br /></td></tr>
+<tr class="separator:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">GetDefaultDateFormat</a> () const</td></tr>
+<tr class="memdesc:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default date format. <a href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">More...</a><br /></td></tr>
+<tr class="separator:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">GetDataDirectory</a> () const</td></tr>
+<tr class="memdesc:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the current data directory. <a href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">More...</a><br /></td></tr>
+<tr class="separator:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49cd162f066eef2b829ba7c9f6620243"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">GetEndianType</a> () const</td></tr>
+<tr class="memdesc:a49cd162f066eef2b829ba7c9f6620243"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the Endian type. <a href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">More...</a><br /></td></tr>
+<tr class="separator:a49cd162f066eef2b829ba7c9f6620243"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56961d2a67b8e7470098626ac4dac7e4"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">GetErrorMessage</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a56961d2a67b8e7470098626ac4dac7e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get an error message. <a href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">More...</a><br /></td></tr>
+<tr class="separator:a56961d2a67b8e7470098626ac4dac7e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">SetDataDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDataDirectory)</td></tr>
+<tr class="memdesc:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data directory. <a href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">More...</a><br /></td></tr>
+<tr class="separator:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f74db23f8902846d581935c7db73f9c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">SetDefaultDateFormat</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultDateFormat)</td></tr>
+<tr class="memdesc:a5f74db23f8902846d581935c7db73f9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default date format. <a href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">More...</a><br /></td></tr>
+<tr class="separator:a5f74db23f8902846d581935c7db73f9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62e4fd0a5888665c76bbbad962794e72"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">BitSet</a> (unsigned char c, xbInt16 iBitNo) const</td></tr>
+<tr class="memdesc:a62e4fd0a5888665c76bbbad962794e72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check a bit in a one byte field and see if it is set. <a href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">More...</a><br /></td></tr>
+<tr class="separator:a62e4fd0a5888665c76bbbad962794e72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6982f973e81587b04916f4509746aaf5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">GetDefaultAutoCommit</a> () const</td></tr>
+<tr class="memdesc:a6982f973e81587b04916f4509746aaf5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default auto commit setting. <a href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">More...</a><br /></td></tr>
+<tr class="separator:a6982f973e81587b04916f4509746aaf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">SetDefaultAutoCommit</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bDefaultAutoCommit)</td></tr>
+<tr class="memdesc:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default auto commit. <a href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">More...</a><br /></td></tr>
+<tr class="separator:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf3763faf6a8917a963213cd53af529c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abf3763faf6a8917a963213cd53af529c">GetDefaultLogDirectory</a> () const</td></tr>
+<tr class="separator:abf3763faf6a8917a963213cd53af529c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a43878d4dc041f2a5e2398a118ccfaf79">GetDefaultLogFileName</a> () const</td></tr>
+<tr class="separator:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84343b8645790791512d6bc22ee6c8eb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a84343b8645790791512d6bc22ee6c8eb">SetDefaultLogDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultLogDirectory)</td></tr>
+<tr class="separator:a84343b8645790791512d6bc22ee6c8eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">GetMultiUser</a> () const</td></tr>
+<tr class="memdesc:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">More...</a><br /></td></tr>
+<tr class="separator:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba6e59512f7172dd55dcf92059e5928c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">SetMultiUser</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bMultiUser)</td></tr>
+<tr class="memdesc:aba6e59512f7172dd55dcf92059e5928c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">More...</a><br /></td></tr>
+<tr class="separator:aba6e59512f7172dd55dcf92059e5928c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-static-attribs" name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memItemLeft" align="right" valign="top">static const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e">ErrorCodeText</a> []</td></tr>
+<tr class="separator:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-methods" name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a904ec348fd029d4a76e72b8fde636108"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">SetEndianType</a> ()</td></tr>
+<tr class="memdesc:a904ec348fd029d4a76e72b8fde636108"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the endian type. <a href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">More...</a><br /></td></tr>
+<tr class="separator:a904ec348fd029d4a76e72b8fde636108"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-static-attribs" name="pro-static-attribs"></a>
+Static Protected Attributes</h2></td></tr>
+<tr class="memitem:a5849e813f5e8e1cd180f0366637adbf3"><td class="memItemLeft" align="right" valign="top">static xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3">iEndianType</a> = 0</td></tr>
+<tr class="separator:a5849e813f5e8e1cd180f0366637adbf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9dec3164c3b264882df634915ecf21da"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da">sNullString</a> = &quot;&quot;</td></tr>
+<tr class="separator:a9dec3164c3b264882df634915ecf21da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p ><a class="el" href="classxb_1_1xbDate.html" title="xbDate class.">xbDate</a> class. </p>
+<p >This <a class="el" href="classxb_1_1xbDate.html" title="xbDate class.">xbDate</a> class handles two type of date values:<br />
+</p>
+<p >1) Gregorian dates with a format of CCYYMMDD. This is how dates are stored in dbf files.<br />
+ 2) Julian dates calculated as the number of days since 1901-01-01 + 1721425.<br />
+</p>
+<p >Leap Years: The routines in the class support both leap years (one every four years) and leap centuries (one every four hundred years.)</p>
+<p >A leap year is a year having 366 days, which can be evenly divisible by 4 and not by 100.<br />
+ Leap centuries are years which are evenly divisible by 400.<br />
+</p>
+<p >From a programming perspective, Julian dates are useful for date arithmetic, determining the difference between two dates or calculating a future or past date.<br />
+</p>
+<p >To determine the difference between two dates, convert both dates to a Julian date and subtract one from the other.<br />
+</p>
+<p >To calculate a future or past date, convert the base date to a Julian date, add (or subtract) the number of days necessary to (from) it and convert the julian date back to a Gregorian date. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="ab3150e7db0ab5db10a07d748b55465eb" name="ab3150e7db0ab5db10a07d748b55465eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3150e7db0ab5db10a07d748b55465eb">&#9670;&nbsp;</a></span>xbDate() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbDate::xbDate </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+
+</div>
+</div>
+<a id="ac8a4d9330221a3daee21b3c28c1d9719" name="ac8a4d9330221a3daee21b3c28c1d9719"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac8a4d9330221a3daee21b3c28c1d9719">&#9670;&nbsp;</a></span>xbDate() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbDate::xbDate </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>sDate8In</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDate8In</td><td>- Input date. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="acf4546f5681735ede18210f60bab68d4" name="acf4546f5681735ede18210f60bab68d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acf4546f5681735ede18210f60bab68d4">&#9670;&nbsp;</a></span>xbDate() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbDate::xbDate </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDate8In</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDate8In</td><td>- Input date. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7ab727a7ec184a086ad36ef83b948170" name="a7ab727a7ec184a086ad36ef83b948170"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7ab727a7ec184a086ad36ef83b948170">&#9670;&nbsp;</a></span>xbDate() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbDate::xbDate </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>lJulDate</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lJulDate</td><td>- Input julian date. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a05c9680c6eb9fe07ecf13a189b596c37" name="a05c9680c6eb9fe07ecf13a189b596c37"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a05c9680c6eb9fe07ecf13a189b596c37">&#9670;&nbsp;</a></span>~xbDate()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbDate::~xbDate </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a62e4fd0a5888665c76bbbad962794e72" name="a62e4fd0a5888665c76bbbad962794e72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62e4fd0a5888665c76bbbad962794e72">&#9670;&nbsp;</a></span>BitSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::BitSet </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iBitNo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Check a bit in a one byte field and see if it is set. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>One byte char field to examine. </td></tr>
+ <tr><td class="paramname">iBitNo</td><td>which bit to examine. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue Bit is set<br />
+ xbFalse Bit is not set </dd></dl>
+
+</div>
+</div>
+<a id="a9df58caa54105c489c314785c457e8cb" name="a9df58caa54105c489c314785c457e8cb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9df58caa54105c489c314785c457e8cb">&#9670;&nbsp;</a></span>CalcRollingCenturyForYear()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::CalcRollingCenturyForYear </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iCalcYear</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Calculate century for a given year. </p>
+<p >This routine calculates a century for a given year. It uses an 80/20 rolling date window to calculate the century.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iCalcYear</td><td>- Two digit year to calculate a century for. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Century calculated for the two digit year. </dd></dl>
+
+</div>
+</div>
+<a id="a38b2c5285c69ed65e94ece6c22dafde0" name="a38b2c5285c69ed65e94ece6c22dafde0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a38b2c5285c69ed65e94ece6c22dafde0">&#9670;&nbsp;</a></span>CenturyOf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::CenturyOf </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get century for date. </p>
+<dl class="section return"><dt>Returns</dt><dd>This routine returns the century from the date. </dd></dl>
+
+</div>
+</div>
+<a id="a9fc29730b66cddfbb58c69992a99cc7c" name="a9fc29730b66cddfbb58c69992a99cc7c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9fc29730b66cddfbb58c69992a99cc7c">&#9670;&nbsp;</a></span>CharDayOf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::CharDayOf </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOutCharDay</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the day of the week. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOutCharDay</td><td>- Output character day of week (Sun-Sat). </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_INVALID_DATE<br />
+XB_NO_ERROR </dd></dl>
+
+</div>
+</div>
+<a id="afffc84f02bd421335ff8ebe9fb3db0ac" name="afffc84f02bd421335ff8ebe9fb3db0ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afffc84f02bd421335ff8ebe9fb3db0ac">&#9670;&nbsp;</a></span>CharMonthOf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::CharMonthOf </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOutCharMonth</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the month from the date. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOutCharMonth</td><td>- Output character month. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_INVALID_DATE<br />
+XB_NO_ERROR </dd></dl>
+
+</div>
+</div>
+<a id="abb1eb4b0394e4a67aadab15779b1b8c5" name="abb1eb4b0394e4a67aadab15779b1b8c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abb1eb4b0394e4a67aadab15779b1b8c5">&#9670;&nbsp;</a></span>CTOD()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::CTOD </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sCtodInDate</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Format MM/DD/YY date. </p>
+<p >This routine takes an MM/DD/YY format date as input and populates a date class with the appropriate YYYYMMDD data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sCtodInDate</td><td>- MM/DD/YY formatted date as input. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_INVALID_OPTION<br />
+XB_NO_ERROR </dd></dl>
+
+</div>
+</div>
+<a id="a367f66ef0c03c1747c12a18784554ccb" name="a367f66ef0c03c1747c12a18784554ccb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a367f66ef0c03c1747c12a18784554ccb">&#9670;&nbsp;</a></span>DateIsValid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbDate::DateIsValid </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDateIn</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check a date for valid data. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDateIn</td><td>- Date to check for valid formaat of CCYYMMDD. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Valid date.<br />
+xbFalse - Not a valid date. </dd></dl>
+
+</div>
+</div>
+<a id="ad6417a900ce64a46f8909c0c7a2ddea2" name="ad6417a900ce64a46f8909c0c7a2ddea2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad6417a900ce64a46f8909c0c7a2ddea2">&#9670;&nbsp;</a></span>DayOf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::DayOf </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFormat</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p >This routine returns the numeric day. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFormat</td><td>XB_FMT_WEEK Number of day in WEEK 0-6 ( Sat - Fri )<br />
+ XB_FMT_MONTH Number of day in MONTH 1-31<br />
+ XB_FMT_YEAR Number of day in YEAR 1-366 </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_INVALID_OPTION<br />
+XB_NO_ERROR </dd></dl>
+
+</div>
+</div>
+<a id="a97dfa59ab9a8e9f17454da0faceb023d" name="a97dfa59ab9a8e9f17454da0faceb023d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97dfa59ab9a8e9f17454da0faceb023d">&#9670;&nbsp;</a></span>DisplayError()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::DisplayError </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Display error message on console for a given error number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>Error number to reference </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a01de44dc869f7db99f33046fc91f2c6a" name="a01de44dc869f7db99f33046fc91f2c6a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01de44dc869f7db99f33046fc91f2c6a">&#9670;&nbsp;</a></span>FormatDate()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::FormatDate </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFmtIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOutFmtDate</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p >This routine will reformat a date based on the format specifiers entered in sFmtIn. If no input format is specified, the routine will use the system default date format.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFmtIn</td><td>- A format specifier with the following paramaters:<br />
+ <pre class="fragment"> 1) YYDDD - A julian date format
+ 2) YY or YYYY will print a 2 or 4 digit year
+ 3) M,MM,MMM or MMMM
+ M - one digit month if no leading zero
+ MM - two digit month, contains leading zero
+ MMM - Jan through Dec
+ MMMM - January through December
+ 4) D,DD,DDD or DDDD
+ D - one digit dayif no leading zero
+ DD - two digit day, contains leading zero
+ DDD - Sun through Sat (or julian if YYDDD)
+ DDDD - Sunday through Saturday
+</pre> </td></tr>
+ <tr><td class="paramname">sOutFmtDate</td><td>- Reformatted output date. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_NO_ERROR <br />
+<br />
+ Format Examples:<br />
+ MM/DD/YY<br />
+ YYYY-MM-DD<br />
+ DDDDDDDDDDD MMMMMMMMMMM DD,YYYY </dd></dl>
+
+</div>
+</div>
+<a id="a1d803a4bfc8ba0561267a0bf9e51f7d9" name="a1d803a4bfc8ba0561267a0bf9e51f7d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d803a4bfc8ba0561267a0bf9e51f7d9">&#9670;&nbsp;</a></span>GetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDataDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the current data directory. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the current data directory where the database files are stored. </dd></dl>
+
+</div>
+</div>
+<a id="a6982f973e81587b04916f4509746aaf5" name="a6982f973e81587b04916f4509746aaf5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6982f973e81587b04916f4509746aaf5">&#9670;&nbsp;</a></span>GetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the default auto commit setting. </p>
+<p >When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-&gt;Put() and dbf-&gt;AppendRecord().</p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if auto commit is turned on<br />
+ xbFalse is auto commit is turned off </dd></dl>
+
+</div>
+</div>
+<a id="a6fbb9c3a550ab0b3378f9586a57791d2" name="a6fbb9c3a550ab0b3378f9586a57791d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6fbb9c3a550ab0b3378f9586a57791d2">&#9670;&nbsp;</a></span>GetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the default date format. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the default date format. </dd></dl>
+
+</div>
+</div>
+<a id="abf3763faf6a8917a963213cd53af529c" name="abf3763faf6a8917a963213cd53af529c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf3763faf6a8917a963213cd53af529c">&#9670;&nbsp;</a></span>GetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a43878d4dc041f2a5e2398a118ccfaf79" name="a43878d4dc041f2a5e2398a118ccfaf79"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a43878d4dc041f2a5e2398a118ccfaf79">&#9670;&nbsp;</a></span>GetDefaultLogFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a49cd162f066eef2b829ba7c9f6620243" name="a49cd162f066eef2b829ba7c9f6620243"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49cd162f066eef2b829ba7c9f6620243">&#9670;&nbsp;</a></span>GetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::GetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the Endian type. </p>
+<dl class="section return"><dt>Returns</dt><dd>B - Big endian<br />
+ L - Little endian<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a56961d2a67b8e7470098626ac4dac7e4" name="a56961d2a67b8e7470098626ac4dac7e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a56961d2a67b8e7470098626ac4dac7e4">&#9670;&nbsp;</a></span>GetErrorMessage()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char * xb::xbSsv::GetErrorMessage </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get an error message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>ErrorCode is the error number of description to be returned. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Returns a pointer to a string containing a text description for the error code. </dd></dl>
+
+</div>
+</div>
+<a id="abd58031c5f1c3766c24d47a82e6fd9c5" name="abd58031c5f1c3766c24d47a82e6fd9c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd58031c5f1c3766c24d47a82e6fd9c5">&#9670;&nbsp;</a></span>GetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetMultiUser </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Multi user mode turned on.<br />
+ xbFalse - Multi user mode turned off.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a5f8051c31b29244265e8f26ac3547b9b" name="a5f8051c31b29244265e8f26ac3547b9b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5f8051c31b29244265e8f26ac3547b9b">&#9670;&nbsp;</a></span>IsLeapYear() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbDate::IsLeapYear </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determine if date is a leap year. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Is leapyear.<br />
+ xbFalse - Not a leap year. </dd></dl>
+
+</div>
+</div>
+<a id="af2bd33a72448e2c5ee00d8b711dc5d95" name="af2bd33a72448e2c5ee00d8b711dc5d95"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2bd33a72448e2c5ee00d8b711dc5d95">&#9670;&nbsp;</a></span>IsLeapYear() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbDate::IsLeapYear </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iYear</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determine if date is a leap year. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iYear</td><td>- Year to check for leap year status. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Is leapyear.<br />
+ xbFalse - Not a leap year. </dd></dl>
+
+</div>
+</div>
+<a id="a1ee3377d4ead9d31099eee539d9b13a7" name="a1ee3377d4ead9d31099eee539d9b13a7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1ee3377d4ead9d31099eee539d9b13a7">&#9670;&nbsp;</a></span>JulianDays()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt32 xb::xbDate::JulianDays </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Calculate julian days for a given date. </p>
+<dl class="section return"><dt>Returns</dt><dd>The number of days since 01/01/0001 + JUL_OFFSET. </dd></dl>
+
+</div>
+</div>
+<a id="a9d28b2a46d8aaa284b92f44eeb96b2ff" name="a9d28b2a46d8aaa284b92f44eeb96b2ff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9d28b2a46d8aaa284b92f44eeb96b2ff">&#9670;&nbsp;</a></span>JulToDate8()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::JulToDate8 </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>lJulDays</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Convert the number of julian days to gregorian date. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lJulDays</td><td>- Julian days. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_NO_ERROR </dd></dl>
+
+</div>
+</div>
+<a id="a15847866bb7642aa42bc254e0cf2038a" name="a15847866bb7642aa42bc254e0cf2038a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a15847866bb7642aa42bc254e0cf2038a">&#9670;&nbsp;</a></span>LastDayOfMonth()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::LastDayOfMonth </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the date to the last day of month for a given date. </p>
+<p >This routine sets the last date of the month. </p><dl class="section return"><dt>Returns</dt><dd>XB_NO_ERROR </dd></dl>
+
+</div>
+</div>
+<a id="a08bd84c67e1119d8c5c1748cd89d092e" name="a08bd84c67e1119d8c5c1748cd89d092e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a08bd84c67e1119d8c5c1748cd89d092e">&#9670;&nbsp;</a></span>MonthOf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::MonthOf </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Return the month for the date. </p>
+<dl class="section return"><dt>Returns</dt><dd>The month of the date. </dd></dl>
+
+</div>
+</div>
+<a id="ac3aaf8997fc0c36676085e7741f33a8a" name="ac3aaf8997fc0c36676085e7741f33a8a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac3aaf8997fc0c36676085e7741f33a8a">&#9670;&nbsp;</a></span>operator!=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbDate::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dt</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator != </p>
+<p >This routine compares two dates for inequality. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">dt</td><td>- Date to compare. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Dates don't match.<br />
+xbFalse - Dates match. </dd></dl>
+
+</div>
+</div>
+<a id="ad09609bf78cf038886a4f9cd19423f9c" name="ad09609bf78cf038886a4f9cd19423f9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad09609bf78cf038886a4f9cd19423f9c">&#9670;&nbsp;</a></span>operator+()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char * xb::xbDate::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>lCount</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator + </p>
+<p >This routine adds additional days to a date field. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lCount</td><td>- Number of days to add. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>New date in CCYYMMDD format. </dd></dl>
+
+</div>
+</div>
+<a id="a1c7d9e3718c43df18b21646072c8605e" name="a1c7d9e3718c43df18b21646072c8605e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c7d9e3718c43df18b21646072c8605e">&#9670;&nbsp;</a></span>operator++()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbDate::operator++ </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator ++ </p>
+<p >This routine adds one day to the date field. </p>
+
+</div>
+</div>
+<a id="a947ba156d04fe063aaa4c9964ae5d163" name="a947ba156d04fe063aaa4c9964ae5d163"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a947ba156d04fe063aaa4c9964ae5d163">&#9670;&nbsp;</a></span>operator+=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbDate::operator+= </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>lDays</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator += </p>
+<p >This routine adds lDays to the date </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lDays</td><td>- Number of days to add to the date. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a3f3a8802c96098c85aa8d0e19717a979" name="a3f3a8802c96098c85aa8d0e19717a979"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3f3a8802c96098c85aa8d0e19717a979">&#9670;&nbsp;</a></span>operator-() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt32 xb::xbDate::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dt</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator - </p>
+<p >This routine subtracts one date from another date returning the difference. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">dt</td><td>- Date to subtract. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Number of days </dd></dl>
+
+</div>
+</div>
+<a id="a73ff5c037046ac0a0bb7d73f74e25cbb" name="a73ff5c037046ac0a0bb7d73f74e25cbb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a73ff5c037046ac0a0bb7d73f74e25cbb">&#9670;&nbsp;</a></span>operator-() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char * xb::xbDate::operator- </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>lCount</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator - </p>
+<p >This routine subtracts days from a date field. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lCount</td><td>- Number of days to subtract. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>New date in CCYYMMDD format. </dd></dl>
+
+</div>
+</div>
+<a id="ae2b33dfee60d324916d833b2098b5a6b" name="ae2b33dfee60d324916d833b2098b5a6b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae2b33dfee60d324916d833b2098b5a6b">&#9670;&nbsp;</a></span>operator--()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbDate::operator-- </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>i</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator &ndash; </p>
+<p >This routine subtracts one day from the date field. </p>
+
+</div>
+</div>
+<a id="a4a8f207d759540114373f5e9d6d375f7" name="a4a8f207d759540114373f5e9d6d375f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a8f207d759540114373f5e9d6d375f7">&#9670;&nbsp;</a></span>operator-=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbDate::operator-= </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>lDays</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator -= </p>
+<p >This routine subtracts lDays from the date. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lDays</td><td>- Number of days to subtract from the date. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a11f09d97ed527e7ef00ba6f17b9fb02c" name="a11f09d97ed527e7ef00ba6f17b9fb02c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a11f09d97ed527e7ef00ba6f17b9fb02c">&#9670;&nbsp;</a></span>operator&lt;()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbDate::operator&lt; </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dt</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator &lt; </p>
+<p >This routine compares two dates </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">dt</td><td>- Date to compare. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Left date is less than right date.<br />
+ xbFalse - Left date is not less than right date. </dd></dl>
+
+</div>
+</div>
+<a id="a6d8fa4df4664f3fd8d4cc15e77f6d046" name="a6d8fa4df4664f3fd8d4cc15e77f6d046"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d8fa4df4664f3fd8d4cc15e77f6d046">&#9670;&nbsp;</a></span>operator&lt;=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbDate::operator&lt;= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dt</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator &lt;= </p>
+<p >This routine compares two dates </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">dt</td><td>- Date to compare. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Left date is less than or equal to right date.<br />
+ xbFalse - Left date is not less than or equal to right date. </dd></dl>
+
+</div>
+</div>
+<a id="a2e33ad9415c32e820e08fd8084198690" name="a2e33ad9415c32e820e08fd8084198690"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2e33ad9415c32e820e08fd8084198690">&#9670;&nbsp;</a></span>operator=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbDate::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dt</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set operator=. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">dt</td><td>- Date value for set operation. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aaaf98c1a672066021895f0953b6e94d0" name="aaaf98c1a672066021895f0953b6e94d0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaaf98c1a672066021895f0953b6e94d0">&#9670;&nbsp;</a></span>operator==()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbDate::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dt</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator == </p>
+<p >This routine compares two dates for equality. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">dt</td><td>- Date to compare. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Dates match.<br />
+xbFalse - Dates don't match. </dd></dl>
+
+</div>
+</div>
+<a id="a744031c4031d6ec4595d34acbd1c5860" name="a744031c4031d6ec4595d34acbd1c5860"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a744031c4031d6ec4595d34acbd1c5860">&#9670;&nbsp;</a></span>operator&gt;()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbDate::operator&gt; </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dt</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>&gt; </p>
+<p >This routine compares two dates </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">dt</td><td>- Date to compare. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Left date is greater than right date.<br />
+ xbFalse - Left date is not greater than right date. </dd></dl>
+
+</div>
+</div>
+<a id="a1d81959ea55440588068ea7f82617c99" name="a1d81959ea55440588068ea7f82617c99"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d81959ea55440588068ea7f82617c99">&#9670;&nbsp;</a></span>operator&gt;=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbDate::operator&gt;= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dt</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator &gt;= </p>
+<p >This routine compares two dates </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">dt</td><td>- Date to compare. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Left date is greater than or equal to right date.<br />
+ xbFalse - Left date is not greater than or equal to right date. </dd></dl>
+
+</div>
+</div>
+<a id="a4b0cde152b5de0f7d26608d1445110b6" name="a4b0cde152b5de0f7d26608d1445110b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4b0cde152b5de0f7d26608d1445110b6">&#9670;&nbsp;</a></span>Set()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::Set </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDateIn</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the date. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDateIn</td><td>- Input date. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_NO_ERROR<br />
+XB_INVALID_DATE </dd></dl>
+
+</div>
+</div>
+<a id="a57caaaadfbd089d9a58ecfcb50c88a6c" name="a57caaaadfbd089d9a58ecfcb50c88a6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57caaaadfbd089d9a58ecfcb50c88a6c">&#9670;&nbsp;</a></span>SetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDataDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDataDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the data directory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDataDirectory</td><td>Set the data direcroty. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a25542afadaaf39b4fb5a1772a29cc0bd" name="a25542afadaaf39b4fb5a1772a29cc0bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25542afadaaf39b4fb5a1772a29cc0bd">&#9670;&nbsp;</a></span>SetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bDefaultAutoCommit</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the default auto commit. </p>
+<p >Disabling auto commit requires the application execute explicit updates using dbf-&gt;Put() and dbf-&gt;AppendRecord(). With auto commit on, the library posts updates automatically when moving off the current record or closing a file.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bDefaultAutoCommit</td><td>xbTrue - Enable default auto commit.<br />
+ xbFalse - Disable default auto commit.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5f74db23f8902846d581935c7db73f9c" name="a5f74db23f8902846d581935c7db73f9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5f74db23f8902846d581935c7db73f9c">&#9670;&nbsp;</a></span>SetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultDateFormat</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the default date format. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDefaultDateFormat</td><td>Set the default date format. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a84343b8645790791512d6bc22ee6c8eb" name="a84343b8645790791512d6bc22ee6c8eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84343b8645790791512d6bc22ee6c8eb">&#9670;&nbsp;</a></span>SetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultLogDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a904ec348fd029d4a76e72b8fde636108" name="a904ec348fd029d4a76e72b8fde636108"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a904ec348fd029d4a76e72b8fde636108">&#9670;&nbsp;</a></span>SetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the endian type. </p>
+<p >This routine determines the Endian-ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. </p>
+
+</div>
+</div>
+<a id="aba6e59512f7172dd55dcf92059e5928c" name="aba6e59512f7172dd55dcf92059e5928c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba6e59512f7172dd55dcf92059e5928c">&#9670;&nbsp;</a></span>SetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetMultiUser </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bMultiUser</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bMultiUser</td><td>xbTrue - Turn on Multi user mode.<br />
+ xbFalse - Turn off Multi user mode.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab43a5d8d929767c0ffdd722972bb8cc0" name="ab43a5d8d929767c0ffdd722972bb8cc0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab43a5d8d929767c0ffdd722972bb8cc0">&#9670;&nbsp;</a></span>Str()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char * xb::xbDate::Str </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Return the date value. </p>
+<dl class="section return"><dt>Returns</dt><dd>char ptr to date value. </dd></dl>
+
+</div>
+</div>
+<a id="a40ba54a58d64cf56266f020f91584192" name="a40ba54a58d64cf56266f020f91584192"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a40ba54a58d64cf56266f020f91584192">&#9670;&nbsp;</a></span>Sysdate()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::Sysdate </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the date equal to the system date. </p>
+<dl class="section return"><dt>Returns</dt><dd>XB_NO_ERROR </dd></dl>
+
+</div>
+</div>
+<a id="a31057dfaa36389a16e40e3db82c46262" name="a31057dfaa36389a16e40e3db82c46262"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a31057dfaa36389a16e40e3db82c46262">&#9670;&nbsp;</a></span>YearOf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDate::YearOf </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the year of the date. </p>
+<dl class="section return"><dt>Returns</dt><dd>The year of the date. </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Field Documentation</h2>
+<a id="a6219f1b5e24ea12fe158cd5aea56988e" name="a6219f1b5e24ea12fe158cd5aea56988e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6219f1b5e24ea12fe158cd5aea56988e">&#9670;&nbsp;</a></span>ErrorCodeText</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* xb::xbSsv::ErrorCodeText[]</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5849e813f5e8e1cd180f0366637adbf3" name="a5849e813f5e8e1cd180f0366637adbf3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5849e813f5e8e1cd180f0366637adbf3">&#9670;&nbsp;</a></span>iEndianType</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::iEndianType = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9dec3164c3b264882df634915ecf21da" name="a9dec3164c3b264882df634915ecf21da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9dec3164c3b264882df634915ecf21da">&#9670;&nbsp;</a></span>sNullString</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbSsv::sNullString = &quot;&quot;</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following files:<ul>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/include/<a class="el" href="xbdate_8h_source.html">xbdate.h</a></li>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/core/<a class="el" href="xbdate_8cpp.html">xbdate.cpp</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/classxb_1_1xbDate.png b/docs/doxygen/html/classxb_1_1xbDate.png
new file mode 100644
index 0000000..350c1be
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbDate.png
Binary files differ
diff --git a/docs/doxygen/html/classxb_1_1xbDbf.html b/docs/doxygen/html/classxb_1_1xbDbf.html
new file mode 100644
index 0000000..14e02ca
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbDbf.html
@@ -0,0 +1,8836 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: xb::xbDbf Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacexb.html">xb</a></li><li class="navelem"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pro-attribs">Protected Attributes</a> &#124;
+<a href="#pro-static-attribs">Static Protected Attributes</a> </div>
+ <div class="headertitle"><div class="title">xb::xbDbf Class Reference<span class="mlabels"><span class="mlabel">abstract</span></span></div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>Base class for handling dbf files/tables.
+ <a href="classxb_1_1xbDbf.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="xbdbf_8h_source.html">xbdbf.h</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for xb::xbDbf:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classxb_1_1xbDbf.png" usemap="#xb::xbDbf_map" alt=""/>
+ <map id="xb::xbDbf_map" name="xb::xbDbf_map">
+<area href="classxb_1_1xbFile.html" title="Class for handling low level file I/O." alt="xb::xbFile" shape="rect" coords="0,56,65,80"/>
+<area href="classxb_1_1xbSsv.html" title="Class for handling shared system variables." alt="xb::xbSsv" shape="rect" coords="0,0,65,24"/>
+ </map>
+</div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a84a75f80bc0e9b8a22b728767949c204"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a84a75f80bc0e9b8a22b728767949c204">xbDbf</a> (<a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *x)</td></tr>
+<tr class="memdesc:a84a75f80bc0e9b8a22b728767949c204"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbDbf.html#a84a75f80bc0e9b8a22b728767949c204">More...</a><br /></td></tr>
+<tr class="separator:a84a75f80bc0e9b8a22b728767949c204"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7eb87521fba8a939c613056d9918d880"><td class="memItemLeft" align="right" valign="top">virtual&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a7eb87521fba8a939c613056d9918d880">~xbDbf</a> ()</td></tr>
+<tr class="memdesc:a7eb87521fba8a939c613056d9918d880"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destructor. <a href="classxb_1_1xbDbf.html#a7eb87521fba8a939c613056d9918d880">More...</a><br /></td></tr>
+<tr class="separator:a7eb87521fba8a939c613056d9918d880"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4edcf31390fbdc8c3558004770fd9f2f"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a4edcf31390fbdc8c3558004770fd9f2f">Abort</a> ()</td></tr>
+<tr class="memdesc:a4edcf31390fbdc8c3558004770fd9f2f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Abort any uncommited changes for the current record buffer. <a href="classxb_1_1xbDbf.html#a4edcf31390fbdc8c3558004770fd9f2f">More...</a><br /></td></tr>
+<tr class="separator:a4edcf31390fbdc8c3558004770fd9f2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b412dd796241673eb1aa2c93513d69b"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a5b412dd796241673eb1aa2c93513d69b">AppendRecord</a> ()</td></tr>
+<tr class="memdesc:a5b412dd796241673eb1aa2c93513d69b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append the current record to the data file. <a href="classxb_1_1xbDbf.html#a5b412dd796241673eb1aa2c93513d69b">More...</a><br /></td></tr>
+<tr class="separator:a5b412dd796241673eb1aa2c93513d69b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78da5a3d2011a3f2e7618cbdd3ba02d6"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a78da5a3d2011a3f2e7618cbdd3ba02d6">BlankRecord</a> ()</td></tr>
+<tr class="memdesc:a78da5a3d2011a3f2e7618cbdd3ba02d6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Blank the record buffer. <a href="classxb_1_1xbDbf.html#a78da5a3d2011a3f2e7618cbdd3ba02d6">More...</a><br /></td></tr>
+<tr class="separator:a78da5a3d2011a3f2e7618cbdd3ba02d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd69532c885ab72bcf3fb5066b318f4f"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#abd69532c885ab72bcf3fb5066b318f4f">Commit</a> ()</td></tr>
+<tr class="memdesc:abd69532c885ab72bcf3fb5066b318f4f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Commit updates to disk. <a href="classxb_1_1xbDbf.html#abd69532c885ab72bcf3fb5066b318f4f">More...</a><br /></td></tr>
+<tr class="separator:abd69532c885ab72bcf3fb5066b318f4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad68d73113e54e1b5f326e90f45e9989d"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ad68d73113e54e1b5f326e90f45e9989d">Close</a> ()</td></tr>
+<tr class="memdesc:ad68d73113e54e1b5f326e90f45e9989d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Close DBF file/table. <a href="classxb_1_1xbDbf.html#ad68d73113e54e1b5f326e90f45e9989d">More...</a><br /></td></tr>
+<tr class="separator:ad68d73113e54e1b5f326e90f45e9989d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a829c615a130a1fdf609d93438d8a6264"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a829c615a130a1fdf609d93438d8a6264">CopyDbfStructure</a> (<a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *dNewTable, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTableAlias, xbInt16 iOverlay, xbInt16 iShareMode)</td></tr>
+<tr class="memdesc:a829c615a130a1fdf609d93438d8a6264"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy table (dbf) file structure. <a href="classxb_1_1xbDbf.html#a829c615a130a1fdf609d93438d8a6264">More...</a><br /></td></tr>
+<tr class="separator:a829c615a130a1fdf609d93438d8a6264"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a73e41bfe679dd06ab16c436652df93f1"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a73e41bfe679dd06ab16c436652df93f1">CreateTable</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;<a class="el" href="classxb_1_1xbDbf.html#a73f9c792d0a769e2e604c1855245a276">sAlias</a>, <a class="el" href="structxb_1_1xbSchema.html">xbSchema</a> *pSchema, xbInt16 iOverlay, xbInt16 iShareMode)=0</td></tr>
+<tr class="separator:a73e41bfe679dd06ab16c436652df93f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4085ed4f049d976124d8edc3d3c56397"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a4085ed4f049d976124d8edc3d3c56397">DeleteTable</a> ()</td></tr>
+<tr class="memdesc:a4085ed4f049d976124d8edc3d3c56397"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete a table. <a href="classxb_1_1xbDbf.html#a4085ed4f049d976124d8edc3d3c56397">More...</a><br /></td></tr>
+<tr class="separator:a4085ed4f049d976124d8edc3d3c56397"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01c26b67e312be1e674b3da710e031b9"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a01c26b67e312be1e674b3da710e031b9">DeleteAll</a> (xbInt16 iOption)</td></tr>
+<tr class="memdesc:a01c26b67e312be1e674b3da710e031b9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete or undelete all records in a dbf file (table). <a href="classxb_1_1xbDbf.html#a01c26b67e312be1e674b3da710e031b9">More...</a><br /></td></tr>
+<tr class="separator:a01c26b67e312be1e674b3da710e031b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3067fdfa3a7a5c15651f6e89d1102176"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a3067fdfa3a7a5c15651f6e89d1102176">DeleteAllRecords</a> ()</td></tr>
+<tr class="memdesc:a3067fdfa3a7a5c15651f6e89d1102176"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete all records. <a href="classxb_1_1xbDbf.html#a3067fdfa3a7a5c15651f6e89d1102176">More...</a><br /></td></tr>
+<tr class="separator:a3067fdfa3a7a5c15651f6e89d1102176"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd8c10579229f3a2e2c5fdb7fcef90db"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#acd8c10579229f3a2e2c5fdb7fcef90db">DeleteRecord</a> ()</td></tr>
+<tr class="memdesc:acd8c10579229f3a2e2c5fdb7fcef90db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete the current record. <a href="classxb_1_1xbDbf.html#acd8c10579229f3a2e2c5fdb7fcef90db">More...</a><br /></td></tr>
+<tr class="separator:acd8c10579229f3a2e2c5fdb7fcef90db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1f4a515533402f872cedcd0322aabd4"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ab1f4a515533402f872cedcd0322aabd4">DumpHeader</a> (xbInt16 iOption) const</td></tr>
+<tr class="separator:ab1f4a515533402f872cedcd0322aabd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a6a068addffd06fc9a996639d6ca69e"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a3a6a068addffd06fc9a996639d6ca69e">DumpRecord</a> (xbUInt32 ulRecNo, xbInt16 iOutputDest=0, xbInt16 iOutputFmt=0)</td></tr>
+<tr class="separator:a3a6a068addffd06fc9a996639d6ca69e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb9e20c5efacd4fea80f1515abbc6b55"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#abb9e20c5efacd4fea80f1515abbc6b55">GetAutoCommit</a> () const</td></tr>
+<tr class="memdesc:abb9e20c5efacd4fea80f1515abbc6b55"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get auto commit setting. <a href="classxb_1_1xbDbf.html#abb9e20c5efacd4fea80f1515abbc6b55">More...</a><br /></td></tr>
+<tr class="separator:abb9e20c5efacd4fea80f1515abbc6b55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae0c00226fd2ea7a67f101e795467ed68"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ae0c00226fd2ea7a67f101e795467ed68">GetAutoCommit</a> (xbInt16 iOption) const</td></tr>
+<tr class="memdesc:ae0c00226fd2ea7a67f101e795467ed68"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get auto commit setting. <a href="classxb_1_1xbDbf.html#ae0c00226fd2ea7a67f101e795467ed68">More...</a><br /></td></tr>
+<tr class="separator:ae0c00226fd2ea7a67f101e795467ed68"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a643a80a3792a52760c8e09ba18719503"><td class="memItemLeft" align="right" valign="top">virtual xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a643a80a3792a52760c8e09ba18719503">GetCurRecNo</a> () const</td></tr>
+<tr class="memdesc:a643a80a3792a52760c8e09ba18719503"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get Auto Lock setting. <a href="classxb_1_1xbDbf.html#a643a80a3792a52760c8e09ba18719503">More...</a><br /></td></tr>
+<tr class="separator:a643a80a3792a52760c8e09ba18719503"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1110d867ba297a52c8b0e83e88f05e6"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ac1110d867ba297a52c8b0e83e88f05e6">GetDbfStatus</a> () const</td></tr>
+<tr class="memdesc:ac1110d867ba297a52c8b0e83e88f05e6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return the current dbf status. <a href="classxb_1_1xbDbf.html#ac1110d867ba297a52c8b0e83e88f05e6">More...</a><br /></td></tr>
+<tr class="separator:ac1110d867ba297a52c8b0e83e88f05e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add27d8ef555a13b336b8c804165dc15e"><td class="memItemLeft" align="right" valign="top">virtual xbInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#add27d8ef555a13b336b8c804165dc15e">GetFieldCnt</a> () const</td></tr>
+<tr class="memdesc:add27d8ef555a13b336b8c804165dc15e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return the number of fields in the table. <a href="classxb_1_1xbDbf.html#add27d8ef555a13b336b8c804165dc15e">More...</a><br /></td></tr>
+<tr class="separator:add27d8ef555a13b336b8c804165dc15e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fc5b8a3e2f177d5ceaf9d975cbb5226"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a6fc5b8a3e2f177d5ceaf9d975cbb5226">GetFirstRecord</a> ()</td></tr>
+<tr class="memdesc:a6fc5b8a3e2f177d5ceaf9d975cbb5226"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the first record. <a href="classxb_1_1xbDbf.html#a6fc5b8a3e2f177d5ceaf9d975cbb5226">More...</a><br /></td></tr>
+<tr class="separator:a6fc5b8a3e2f177d5ceaf9d975cbb5226"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb78991e8435edd36318c653cb977c1a"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#acb78991e8435edd36318c653cb977c1a">GetFirstRecord</a> (xbInt16 iOption)</td></tr>
+<tr class="memdesc:acb78991e8435edd36318c653cb977c1a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the first record. <a href="classxb_1_1xbDbf.html#acb78991e8435edd36318c653cb977c1a">More...</a><br /></td></tr>
+<tr class="separator:acb78991e8435edd36318c653cb977c1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49e667f9c8ee55c36444702663fc5964"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a49e667f9c8ee55c36444702663fc5964">GetLastRecord</a> ()</td></tr>
+<tr class="memdesc:a49e667f9c8ee55c36444702663fc5964"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the last record. <a href="classxb_1_1xbDbf.html#a49e667f9c8ee55c36444702663fc5964">More...</a><br /></td></tr>
+<tr class="separator:a49e667f9c8ee55c36444702663fc5964"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ccfa2291417412b6894940d1b92f9a6"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a8ccfa2291417412b6894940d1b92f9a6">GetLastRecord</a> (xbInt16 iOption)</td></tr>
+<tr class="memdesc:a8ccfa2291417412b6894940d1b92f9a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the last record. <a href="classxb_1_1xbDbf.html#a8ccfa2291417412b6894940d1b92f9a6">More...</a><br /></td></tr>
+<tr class="separator:a8ccfa2291417412b6894940d1b92f9a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab896fe3b734f556de578d30f92b18fe2"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ab896fe3b734f556de578d30f92b18fe2">GetNextRecord</a> ()</td></tr>
+<tr class="memdesc:ab896fe3b734f556de578d30f92b18fe2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the next record. <a href="classxb_1_1xbDbf.html#ab896fe3b734f556de578d30f92b18fe2">More...</a><br /></td></tr>
+<tr class="separator:ab896fe3b734f556de578d30f92b18fe2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3191428a7a92d9107d8d42448884f2ac"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a3191428a7a92d9107d8d42448884f2ac">GetNextRecord</a> (xbInt16 iOption)</td></tr>
+<tr class="memdesc:a3191428a7a92d9107d8d42448884f2ac"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the next record. <a href="classxb_1_1xbDbf.html#a3191428a7a92d9107d8d42448884f2ac">More...</a><br /></td></tr>
+<tr class="separator:a3191428a7a92d9107d8d42448884f2ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18fdcb4ab15b36cd47fa6f6f7a540d1a"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a18fdcb4ab15b36cd47fa6f6f7a540d1a">GetNextRecord</a> (xbInt16 iOption, xbUInt32 ulStartRec)</td></tr>
+<tr class="memdesc:a18fdcb4ab15b36cd47fa6f6f7a540d1a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the next record. <a href="classxb_1_1xbDbf.html#a18fdcb4ab15b36cd47fa6f6f7a540d1a">More...</a><br /></td></tr>
+<tr class="separator:a18fdcb4ab15b36cd47fa6f6f7a540d1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13393704a8a191d4d6555ae31d3c3e92"><td class="memItemLeft" align="right" valign="top">virtual xbInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a13393704a8a191d4d6555ae31d3c3e92">GetPhysicalIxCnt</a> () const</td></tr>
+<tr class="separator:a13393704a8a191d4d6555ae31d3c3e92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3d248e5221b4f0809897cd43af17a1e"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ab3d248e5221b4f0809897cd43af17a1e">GetPrevRecord</a> ()</td></tr>
+<tr class="memdesc:ab3d248e5221b4f0809897cd43af17a1e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the previous record. <a href="classxb_1_1xbDbf.html#ab3d248e5221b4f0809897cd43af17a1e">More...</a><br /></td></tr>
+<tr class="separator:ab3d248e5221b4f0809897cd43af17a1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7eadc7b08d73003802b90584f7b33387"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a7eadc7b08d73003802b90584f7b33387">GetPrevRecord</a> (xbInt16 iOption)</td></tr>
+<tr class="memdesc:a7eadc7b08d73003802b90584f7b33387"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the previous record. <a href="classxb_1_1xbDbf.html#a7eadc7b08d73003802b90584f7b33387">More...</a><br /></td></tr>
+<tr class="separator:a7eadc7b08d73003802b90584f7b33387"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26fba086b07caeab95066bf1c8d25161"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a26fba086b07caeab95066bf1c8d25161">GetRecord</a> (xbUInt32 ulRecNo)</td></tr>
+<tr class="memdesc:a26fba086b07caeab95066bf1c8d25161"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get record for specified record number. <a href="classxb_1_1xbDbf.html#a26fba086b07caeab95066bf1c8d25161">More...</a><br /></td></tr>
+<tr class="separator:a26fba086b07caeab95066bf1c8d25161"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac196ad55335e1f4789d698748434dc89"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ac196ad55335e1f4789d698748434dc89">GetRecordCnt</a> (xbUInt32 &amp;ulRecCnt)</td></tr>
+<tr class="memdesc:ac196ad55335e1f4789d698748434dc89"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the current number of records in the dbf data file. <a href="classxb_1_1xbDbf.html#ac196ad55335e1f4789d698748434dc89">More...</a><br /></td></tr>
+<tr class="separator:ac196ad55335e1f4789d698748434dc89"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3e38c4057d726a28a27d07a1610d124"><td class="memItemLeft" align="right" valign="top">virtual char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#aa3e38c4057d726a28a27d07a1610d124">GetRecordBuf</a> (xbInt16 iOpt=0) const</td></tr>
+<tr class="memdesc:aa3e38c4057d726a28a27d07a1610d124"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get pointer to record buffer. <a href="classxb_1_1xbDbf.html#aa3e38c4057d726a28a27d07a1610d124">More...</a><br /></td></tr>
+<tr class="separator:aa3e38c4057d726a28a27d07a1610d124"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab50d76c6e29e81e347a6feb04c2f62bb"><td class="memItemLeft" align="right" valign="top">virtual xbUInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ab50d76c6e29e81e347a6feb04c2f62bb">GetRecordLen</a> () const</td></tr>
+<tr class="memdesc:ab50d76c6e29e81e347a6feb04c2f62bb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the dbf record length. <a href="classxb_1_1xbDbf.html#ab50d76c6e29e81e347a6feb04c2f62bb">More...</a><br /></td></tr>
+<tr class="separator:ab50d76c6e29e81e347a6feb04c2f62bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27758a325c097f204247908b65ba7fbd"><td class="memItemLeft" align="right" valign="top">virtual const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a27758a325c097f204247908b65ba7fbd">GetTblAlias</a> () const</td></tr>
+<tr class="memdesc:a27758a325c097f204247908b65ba7fbd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the table alias. <a href="classxb_1_1xbDbf.html#a27758a325c097f204247908b65ba7fbd">More...</a><br /></td></tr>
+<tr class="separator:a27758a325c097f204247908b65ba7fbd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49212a9eb17f7fa9f303e08d5fc50fc6"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a49212a9eb17f7fa9f303e08d5fc50fc6">GetVersion</a> () const =0</td></tr>
+<tr class="separator:a49212a9eb17f7fa9f303e08d5fc50fc6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab21ec23c076b0c9affdc0f6672bd133f"><td class="memItemLeft" align="right" valign="top">virtual <a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ab21ec23c076b0c9affdc0f6672bd133f">GetXbasePtr</a> () const</td></tr>
+<tr class="memdesc:ab21ec23c076b0c9affdc0f6672bd133f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the pointer to the xbXbase structure,. <a href="classxb_1_1xbDbf.html#ab21ec23c076b0c9affdc0f6672bd133f">More...</a><br /></td></tr>
+<tr class="separator:ab21ec23c076b0c9affdc0f6672bd133f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac856fc1b110b46aefa1b2f5c0f530aa2"><td class="memItemLeft" align="right" valign="top">virtual <a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ac856fc1b110b46aefa1b2f5c0f530aa2">MemoFieldsExist</a> () const</td></tr>
+<tr class="separator:ac856fc1b110b46aefa1b2f5c0f530aa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97366c7362e409d7f09973a6aef8dad0"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a97366c7362e409d7f09973a6aef8dad0">Open</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName)</td></tr>
+<tr class="separator:a97366c7362e409d7f09973a6aef8dad0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac658818bf9b8f8ff7467d8d80495b324"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ac658818bf9b8f8ff7467d8d80495b324">Open</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;<a class="el" href="classxb_1_1xbDbf.html#a73f9c792d0a769e2e604c1855245a276">sAlias</a>)</td></tr>
+<tr class="separator:ac658818bf9b8f8ff7467d8d80495b324"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4d018cbf44d8d8b2145c9acab02c8adf"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a4d018cbf44d8d8b2145c9acab02c8adf">Open</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;<a class="el" href="classxb_1_1xbDbf.html#a73f9c792d0a769e2e604c1855245a276">sAlias</a>, xbInt16 iOpenMode, xbInt16 iShareMode)=0</td></tr>
+<tr class="separator:a4d018cbf44d8d8b2145c9acab02c8adf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a52bf3ef2123c0d17e6b1f67bf0dc55"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a8a52bf3ef2123c0d17e6b1f67bf0dc55">Pack</a> ()</td></tr>
+<tr class="memdesc:a8a52bf3ef2123c0d17e6b1f67bf0dc55"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pack dbf file. <a href="classxb_1_1xbDbf.html#a8a52bf3ef2123c0d17e6b1f67bf0dc55">More...</a><br /></td></tr>
+<tr class="separator:a8a52bf3ef2123c0d17e6b1f67bf0dc55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a93bb14ad0451355bfa3379128120988a"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a93bb14ad0451355bfa3379128120988a">Pack</a> (xbUInt32 &amp;ulDeletedRecCnt)</td></tr>
+<tr class="memdesc:a93bb14ad0451355bfa3379128120988a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Pack dbf file. <a href="classxb_1_1xbDbf.html#a93bb14ad0451355bfa3379128120988a">More...</a><br /></td></tr>
+<tr class="separator:a93bb14ad0451355bfa3379128120988a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c36a5ffbc7067a1abbcb526dd3b981d"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a3c36a5ffbc7067a1abbcb526dd3b981d">PutRecord</a> ()</td></tr>
+<tr class="memdesc:a3c36a5ffbc7067a1abbcb526dd3b981d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write the current record to disk. <a href="classxb_1_1xbDbf.html#a3c36a5ffbc7067a1abbcb526dd3b981d">More...</a><br /></td></tr>
+<tr class="separator:a3c36a5ffbc7067a1abbcb526dd3b981d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aacbc7bac3ea0c502ee75b838f4f0fcbf"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#aacbc7bac3ea0c502ee75b838f4f0fcbf">PutRecord</a> (xbUInt32 ulRecNo)</td></tr>
+<tr class="memdesc:aacbc7bac3ea0c502ee75b838f4f0fcbf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write record to disk. <a href="classxb_1_1xbDbf.html#aacbc7bac3ea0c502ee75b838f4f0fcbf">More...</a><br /></td></tr>
+<tr class="separator:aacbc7bac3ea0c502ee75b838f4f0fcbf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a060541addb5bb1f0fe12959ed6f66fb9"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a060541addb5bb1f0fe12959ed6f66fb9">ReadHeader</a> (xbInt16 iFilePositionOption, xbInt16 iReadOption)</td></tr>
+<tr class="memdesc:a060541addb5bb1f0fe12959ed6f66fb9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read dbf file header information. <a href="classxb_1_1xbDbf.html#a060541addb5bb1f0fe12959ed6f66fb9">More...</a><br /></td></tr>
+<tr class="separator:a060541addb5bb1f0fe12959ed6f66fb9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94d7d626ba691fd4b740c034673e6fc6"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a94d7d626ba691fd4b740c034673e6fc6">RecordDeleted</a> (xbInt16 iOpt=0) const</td></tr>
+<tr class="memdesc:a94d7d626ba691fd4b740c034673e6fc6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return record deletion status. <a href="classxb_1_1xbDbf.html#a94d7d626ba691fd4b740c034673e6fc6">More...</a><br /></td></tr>
+<tr class="separator:a94d7d626ba691fd4b740c034673e6fc6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4cf7f0d423164f3cf074ae41f96f4e90"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a4cf7f0d423164f3cf074ae41f96f4e90">SetAutoCommit</a> (xbInt16 <a class="el" href="classxb_1_1xbDbf.html#ab506450954bc86e7bf1d7c4efe681f43">iAutoCommit</a>)</td></tr>
+<tr class="memdesc:a4cf7f0d423164f3cf074ae41f96f4e90"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set auto commit. <a href="classxb_1_1xbDbf.html#a4cf7f0d423164f3cf074ae41f96f4e90">More...</a><br /></td></tr>
+<tr class="separator:a4cf7f0d423164f3cf074ae41f96f4e90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae94cb1bf9f75184f39d9e1a80ab49d4a"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ae94cb1bf9f75184f39d9e1a80ab49d4a">UndeleteAllRecords</a> ()</td></tr>
+<tr class="memdesc:ae94cb1bf9f75184f39d9e1a80ab49d4a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Undelete all records. <a href="classxb_1_1xbDbf.html#ae94cb1bf9f75184f39d9e1a80ab49d4a">More...</a><br /></td></tr>
+<tr class="separator:ae94cb1bf9f75184f39d9e1a80ab49d4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a255681976a04fc722538bb630507b3a0"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a255681976a04fc722538bb630507b3a0">UndeleteRecord</a> ()</td></tr>
+<tr class="memdesc:a255681976a04fc722538bb630507b3a0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Undelete one record. <a href="classxb_1_1xbDbf.html#a255681976a04fc722538bb630507b3a0">More...</a><br /></td></tr>
+<tr class="separator:a255681976a04fc722538bb630507b3a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ed0693b10b95aaa4e46037758d160ed"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a8ed0693b10b95aaa4e46037758d160ed">Zap</a> ()</td></tr>
+<tr class="memdesc:a8ed0693b10b95aaa4e46037758d160ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Zap (remove) everything from the file,. <a href="classxb_1_1xbDbf.html#a8ed0693b10b95aaa4e46037758d160ed">More...</a><br /></td></tr>
+<tr class="separator:a8ed0693b10b95aaa4e46037758d160ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad245a26eb8b79610c9ae7bab19e05513"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ad245a26eb8b79610c9ae7bab19e05513">GetField</a> (xbInt16 iFieldNo, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldValue, xbInt16 iRecBufSw) const</td></tr>
+<tr class="memdesc:ad245a26eb8b79610c9ae7bab19e05513"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get field data for field number. <a href="classxb_1_1xbDbf.html#ad245a26eb8b79610c9ae7bab19e05513">More...</a><br /></td></tr>
+<tr class="separator:ad245a26eb8b79610c9ae7bab19e05513"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac81f078f3c932f0da60ad1fbdd848d3e"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ac81f078f3c932f0da60ad1fbdd848d3e">GetField</a> (xbInt16 iFieldNo, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldValue) const</td></tr>
+<tr class="memdesc:ac81f078f3c932f0da60ad1fbdd848d3e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get field data for field number. <a href="classxb_1_1xbDbf.html#ac81f078f3c932f0da60ad1fbdd848d3e">More...</a><br /></td></tr>
+<tr class="separator:ac81f078f3c932f0da60ad1fbdd848d3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a0fcf7e2040ab483e3807927833cb26"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a9a0fcf7e2040ab483e3807927833cb26">GetField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldValue) const</td></tr>
+<tr class="memdesc:a9a0fcf7e2040ab483e3807927833cb26"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get <a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> field for field name. <a href="classxb_1_1xbDbf.html#a9a0fcf7e2040ab483e3807927833cb26">More...</a><br /></td></tr>
+<tr class="separator:a9a0fcf7e2040ab483e3807927833cb26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abcb4defad2e1b6e67f63cc60737ad840"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#abcb4defad2e1b6e67f63cc60737ad840">GetFieldDecimal</a> (xbInt16 iFieldNo, xbInt16 &amp;iFieldDecimal) const</td></tr>
+<tr class="memdesc:abcb4defad2e1b6e67f63cc60737ad840"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get decimal for field number. <a href="classxb_1_1xbDbf.html#abcb4defad2e1b6e67f63cc60737ad840">More...</a><br /></td></tr>
+<tr class="separator:abcb4defad2e1b6e67f63cc60737ad840"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a607f774fcd6dc0b9913d7a7801b60db2"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a607f774fcd6dc0b9913d7a7801b60db2">GetFieldDecimal</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, xbInt16 &amp;iFieldDecimal) const</td></tr>
+<tr class="memdesc:a607f774fcd6dc0b9913d7a7801b60db2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get decimal for field name. <a href="classxb_1_1xbDbf.html#a607f774fcd6dc0b9913d7a7801b60db2">More...</a><br /></td></tr>
+<tr class="separator:a607f774fcd6dc0b9913d7a7801b60db2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adda4302b58cc6109b048f19d9b68bbd4"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#adda4302b58cc6109b048f19d9b68bbd4">GetFieldLen</a> (xbInt16 iFieldNo, xbInt16 &amp;iFieldLen) const</td></tr>
+<tr class="memdesc:adda4302b58cc6109b048f19d9b68bbd4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get field length for field number. <a href="classxb_1_1xbDbf.html#adda4302b58cc6109b048f19d9b68bbd4">More...</a><br /></td></tr>
+<tr class="separator:adda4302b58cc6109b048f19d9b68bbd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf06dbccdba1a4bcd90fa0bea6cca59b"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#acf06dbccdba1a4bcd90fa0bea6cca59b">GetFieldLen</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, xbInt16 &amp;iFieldLen) const</td></tr>
+<tr class="memdesc:acf06dbccdba1a4bcd90fa0bea6cca59b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get field length for field name. <a href="classxb_1_1xbDbf.html#acf06dbccdba1a4bcd90fa0bea6cca59b">More...</a><br /></td></tr>
+<tr class="separator:acf06dbccdba1a4bcd90fa0bea6cca59b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e3e4368bfba1724c016b8859023e34c"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a5e3e4368bfba1724c016b8859023e34c">GetFieldName</a> (xbInt16 iFieldNo, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName) const</td></tr>
+<tr class="memdesc:a5e3e4368bfba1724c016b8859023e34c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the name of the specified field. <a href="classxb_1_1xbDbf.html#a5e3e4368bfba1724c016b8859023e34c">More...</a><br /></td></tr>
+<tr class="separator:a5e3e4368bfba1724c016b8859023e34c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aed9113b5095c6df1b9c854cbd0d8047b"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#aed9113b5095c6df1b9c854cbd0d8047b">GetFieldNo</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, xbInt16 &amp;iFieldNo) const</td></tr>
+<tr class="memdesc:aed9113b5095c6df1b9c854cbd0d8047b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the field number for name. <a href="classxb_1_1xbDbf.html#aed9113b5095c6df1b9c854cbd0d8047b">More...</a><br /></td></tr>
+<tr class="separator:aed9113b5095c6df1b9c854cbd0d8047b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aad9029e63909aeb77d8473256d88bea8"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#aad9029e63909aeb77d8473256d88bea8">GetFieldNo</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName) const</td></tr>
+<tr class="memdesc:aad9029e63909aeb77d8473256d88bea8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get field ID number for a given field name. <a href="classxb_1_1xbDbf.html#aad9029e63909aeb77d8473256d88bea8">More...</a><br /></td></tr>
+<tr class="separator:aad9029e63909aeb77d8473256d88bea8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5143973e4f165651152aa13c8fd45f84"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a5143973e4f165651152aa13c8fd45f84">GetFieldType</a> (xbInt16 iFieldNo, char &amp;cFieldType) const</td></tr>
+<tr class="memdesc:a5143973e4f165651152aa13c8fd45f84"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get field type for field number. <a href="classxb_1_1xbDbf.html#a5143973e4f165651152aa13c8fd45f84">More...</a><br /></td></tr>
+<tr class="separator:a5143973e4f165651152aa13c8fd45f84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a181db879f1a75f93a34c03513a0b2fea"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a181db879f1a75f93a34c03513a0b2fea">GetFieldType</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, char &amp;cFieldType) const</td></tr>
+<tr class="memdesc:a181db879f1a75f93a34c03513a0b2fea"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get field type for field name. <a href="classxb_1_1xbDbf.html#a181db879f1a75f93a34c03513a0b2fea">More...</a><br /></td></tr>
+<tr class="separator:a181db879f1a75f93a34c03513a0b2fea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7862215dd2f83a1c488e539cd1f9aec0"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a7862215dd2f83a1c488e539cd1f9aec0">PutField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData)</td></tr>
+<tr class="memdesc:a7862215dd2f83a1c488e539cd1f9aec0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put field for field name. <a href="classxb_1_1xbDbf.html#a7862215dd2f83a1c488e539cd1f9aec0">More...</a><br /></td></tr>
+<tr class="separator:a7862215dd2f83a1c488e539cd1f9aec0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a142b0c0dc904917f3c68c5572c1237b5"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a142b0c0dc904917f3c68c5572c1237b5">PutField</a> (xbInt16 iFieldNo, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData)</td></tr>
+<tr class="memdesc:a142b0c0dc904917f3c68c5572c1237b5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put field for field number. <a href="classxb_1_1xbDbf.html#a142b0c0dc904917f3c68c5572c1237b5">More...</a><br /></td></tr>
+<tr class="separator:a142b0c0dc904917f3c68c5572c1237b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab39ac4269ac63bc7ea4f638733bb17f0"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ab39ac4269ac63bc7ea4f638733bb17f0">PutLogicalField</a> (xbInt16 iFieldNo, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData)</td></tr>
+<tr class="memdesc:ab39ac4269ac63bc7ea4f638733bb17f0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put logical field for field number. <a href="classxb_1_1xbDbf.html#ab39ac4269ac63bc7ea4f638733bb17f0">More...</a><br /></td></tr>
+<tr class="separator:ab39ac4269ac63bc7ea4f638733bb17f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a507e400ca6526a9e0391cf06dd6a014e"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a507e400ca6526a9e0391cf06dd6a014e">PutLogicalField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData)</td></tr>
+<tr class="memdesc:a507e400ca6526a9e0391cf06dd6a014e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put logical field for field name. <a href="classxb_1_1xbDbf.html#a507e400ca6526a9e0391cf06dd6a014e">More...</a><br /></td></tr>
+<tr class="separator:a507e400ca6526a9e0391cf06dd6a014e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3254f091fc4a1404abed3dd2bcdd6ce6"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a3254f091fc4a1404abed3dd2bcdd6ce6">GetLogicalField</a> (xbInt16 iFieldNo, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData) const</td></tr>
+<tr class="memdesc:a3254f091fc4a1404abed3dd2bcdd6ce6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get logical field for field number. <a href="classxb_1_1xbDbf.html#a3254f091fc4a1404abed3dd2bcdd6ce6">More...</a><br /></td></tr>
+<tr class="separator:a3254f091fc4a1404abed3dd2bcdd6ce6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cd6819bfd932ff8507e54d9cb9a624e"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a9cd6819bfd932ff8507e54d9cb9a624e">GetLogicalField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData) const</td></tr>
+<tr class="memdesc:a9cd6819bfd932ff8507e54d9cb9a624e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get logical field for field name. <a href="classxb_1_1xbDbf.html#a9cd6819bfd932ff8507e54d9cb9a624e">More...</a><br /></td></tr>
+<tr class="separator:a9cd6819bfd932ff8507e54d9cb9a624e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a423a0cb7bd252cedf956ace4954f275d"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a423a0cb7bd252cedf956ace4954f275d">PutLogicalField</a> (xbInt16 iFieldNo, <a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bFieldData)</td></tr>
+<tr class="memdesc:a423a0cb7bd252cedf956ace4954f275d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put logical field for field number. <a href="classxb_1_1xbDbf.html#a423a0cb7bd252cedf956ace4954f275d">More...</a><br /></td></tr>
+<tr class="separator:a423a0cb7bd252cedf956ace4954f275d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a623ca3ef5520c42308c1a16b518e7ff3"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a623ca3ef5520c42308c1a16b518e7ff3">PutLogicalField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bFieldData)</td></tr>
+<tr class="memdesc:a623ca3ef5520c42308c1a16b518e7ff3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put logical field for field name. <a href="classxb_1_1xbDbf.html#a623ca3ef5520c42308c1a16b518e7ff3">More...</a><br /></td></tr>
+<tr class="separator:a623ca3ef5520c42308c1a16b518e7ff3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf615ddcf08f8cd14efc713c2a8d7ae1"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#aaf615ddcf08f8cd14efc713c2a8d7ae1">GetLogicalField</a> (xbInt16 iFieldNo, <a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bFieldData) const</td></tr>
+<tr class="memdesc:aaf615ddcf08f8cd14efc713c2a8d7ae1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get logical field for field number. <a href="classxb_1_1xbDbf.html#aaf615ddcf08f8cd14efc713c2a8d7ae1">More...</a><br /></td></tr>
+<tr class="separator:aaf615ddcf08f8cd14efc713c2a8d7ae1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab28feef20c988b0a6f1c1911a45377b0"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ab28feef20c988b0a6f1c1911a45377b0">GetLogicalField</a> (xbInt16 iFieldNo, <a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bFieldData, xbInt16 iRecBufSw) const</td></tr>
+<tr class="memdesc:ab28feef20c988b0a6f1c1911a45377b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get logical field for field number. <a href="classxb_1_1xbDbf.html#ab28feef20c988b0a6f1c1911a45377b0">More...</a><br /></td></tr>
+<tr class="separator:ab28feef20c988b0a6f1c1911a45377b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a943cea7fde1b06c1a05184193eff8d2d"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a943cea7fde1b06c1a05184193eff8d2d">GetLogicalField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bFieldData) const</td></tr>
+<tr class="memdesc:a943cea7fde1b06c1a05184193eff8d2d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get logical field for field name. <a href="classxb_1_1xbDbf.html#a943cea7fde1b06c1a05184193eff8d2d">More...</a><br /></td></tr>
+<tr class="separator:a943cea7fde1b06c1a05184193eff8d2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe525c0820640e0a9e169d0b7913cfa1"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#abe525c0820640e0a9e169d0b7913cfa1">GetLongField</a> (xbInt16 iFieldNo, xbInt32 &amp;lFieldValue) const</td></tr>
+<tr class="memdesc:abe525c0820640e0a9e169d0b7913cfa1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get long field for field number. <a href="classxb_1_1xbDbf.html#abe525c0820640e0a9e169d0b7913cfa1">More...</a><br /></td></tr>
+<tr class="separator:abe525c0820640e0a9e169d0b7913cfa1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b8ef75b17941beac17e50e969b2d3db"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a7b8ef75b17941beac17e50e969b2d3db">GetLongField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, xbInt32 &amp;lFieldValue) const</td></tr>
+<tr class="memdesc:a7b8ef75b17941beac17e50e969b2d3db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get long field for field name. <a href="classxb_1_1xbDbf.html#a7b8ef75b17941beac17e50e969b2d3db">More...</a><br /></td></tr>
+<tr class="separator:a7b8ef75b17941beac17e50e969b2d3db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56c8f924284bf88aabf90b7930b4eb47"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a56c8f924284bf88aabf90b7930b4eb47">PutLongField</a> (xbInt16 iFieldNo, xbInt32 lFieldValue)</td></tr>
+<tr class="memdesc:a56c8f924284bf88aabf90b7930b4eb47"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put long field for field number. <a href="classxb_1_1xbDbf.html#a56c8f924284bf88aabf90b7930b4eb47">More...</a><br /></td></tr>
+<tr class="separator:a56c8f924284bf88aabf90b7930b4eb47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7aad223119edb3d541e9f65e88c9f2f"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ae7aad223119edb3d541e9f65e88c9f2f">PutLongField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldNo, xbInt32 lFieldValue)</td></tr>
+<tr class="memdesc:ae7aad223119edb3d541e9f65e88c9f2f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put long field for field name. <a href="classxb_1_1xbDbf.html#ae7aad223119edb3d541e9f65e88c9f2f">More...</a><br /></td></tr>
+<tr class="separator:ae7aad223119edb3d541e9f65e88c9f2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a67e3a050f9090edf69eee75aef7f5d83"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a67e3a050f9090edf69eee75aef7f5d83">GetULongField</a> (xbInt16 iFieldNo, xbUInt32 &amp;lFieldValue) const</td></tr>
+<tr class="memdesc:a67e3a050f9090edf69eee75aef7f5d83"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get unsigned long field for field number. <a href="classxb_1_1xbDbf.html#a67e3a050f9090edf69eee75aef7f5d83">More...</a><br /></td></tr>
+<tr class="separator:a67e3a050f9090edf69eee75aef7f5d83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a039eb02418ec4ca862adbc0f95b9cbec"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a039eb02418ec4ca862adbc0f95b9cbec">GetULongField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, xbUInt32 &amp;lFieldValue) const</td></tr>
+<tr class="memdesc:a039eb02418ec4ca862adbc0f95b9cbec"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get unsigned long field for field name. <a href="classxb_1_1xbDbf.html#a039eb02418ec4ca862adbc0f95b9cbec">More...</a><br /></td></tr>
+<tr class="separator:a039eb02418ec4ca862adbc0f95b9cbec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5dec5c9ff903efffdb0490a44d296d2"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#af5dec5c9ff903efffdb0490a44d296d2">PutULongField</a> (xbInt16 iFieldNo, xbUInt32 lFieldValue)</td></tr>
+<tr class="memdesc:af5dec5c9ff903efffdb0490a44d296d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put unsigned long field for field number. <a href="classxb_1_1xbDbf.html#af5dec5c9ff903efffdb0490a44d296d2">More...</a><br /></td></tr>
+<tr class="separator:af5dec5c9ff903efffdb0490a44d296d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac62cb97c4e678c83f41788b1ae4d0381"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ac62cb97c4e678c83f41788b1ae4d0381">PutULongField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldNo, xbUInt32 lFieldValue)</td></tr>
+<tr class="memdesc:ac62cb97c4e678c83f41788b1ae4d0381"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put unsigned long field for field name. <a href="classxb_1_1xbDbf.html#ac62cb97c4e678c83f41788b1ae4d0381">More...</a><br /></td></tr>
+<tr class="separator:ac62cb97c4e678c83f41788b1ae4d0381"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4556041a7ff2f6b6f986729901c11f08"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a4556041a7ff2f6b6f986729901c11f08">GetDoubleField</a> (xbInt16 FieldNo, <a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dFieldValue) const</td></tr>
+<tr class="memdesc:a4556041a7ff2f6b6f986729901c11f08"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get xbDouble field for field number. <a href="classxb_1_1xbDbf.html#a4556041a7ff2f6b6f986729901c11f08">More...</a><br /></td></tr>
+<tr class="separator:a4556041a7ff2f6b6f986729901c11f08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2370b5e736931441a5968649291b9ef4"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a2370b5e736931441a5968649291b9ef4">GetDoubleField</a> (xbInt16 FieldNo, <a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dFieldValue, xbInt16 iRecBufSw) const</td></tr>
+<tr class="memdesc:a2370b5e736931441a5968649291b9ef4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get xbDouble field for field number. <a href="classxb_1_1xbDbf.html#a2370b5e736931441a5968649291b9ef4">More...</a><br /></td></tr>
+<tr class="separator:a2370b5e736931441a5968649291b9ef4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e6774df0f2d7733f4b25a9989596d95"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a6e6774df0f2d7733f4b25a9989596d95">GetDoubleField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dFieldValue) const</td></tr>
+<tr class="memdesc:a6e6774df0f2d7733f4b25a9989596d95"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get xbDouble field for field name. <a href="classxb_1_1xbDbf.html#a6e6774df0f2d7733f4b25a9989596d95">More...</a><br /></td></tr>
+<tr class="separator:a6e6774df0f2d7733f4b25a9989596d95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4f34842d7e8ff1f16992c2ece2fc38a5"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a4f34842d7e8ff1f16992c2ece2fc38a5">PutDoubleField</a> (xbInt16 FieldNo, <a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dFieldValue)</td></tr>
+<tr class="memdesc:a4f34842d7e8ff1f16992c2ece2fc38a5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put double field for field number. <a href="classxb_1_1xbDbf.html#a4f34842d7e8ff1f16992c2ece2fc38a5">More...</a><br /></td></tr>
+<tr class="separator:a4f34842d7e8ff1f16992c2ece2fc38a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae695bbc71c19abc71c0c5f2ff2e1f971"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ae695bbc71c19abc71c0c5f2ff2e1f971">PutDoubleField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;FieldName, <a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dFieldValue)</td></tr>
+<tr class="memdesc:ae695bbc71c19abc71c0c5f2ff2e1f971"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put double field for field name. <a href="classxb_1_1xbDbf.html#ae695bbc71c19abc71c0c5f2ff2e1f971">More...</a><br /></td></tr>
+<tr class="separator:ae695bbc71c19abc71c0c5f2ff2e1f971"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3443f646038ced14425f067a59c0f2da"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a3443f646038ced14425f067a59c0f2da">GetFloatField</a> (xbInt16 iFieldNo, <a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a> &amp;fFieldValue) const</td></tr>
+<tr class="memdesc:a3443f646038ced14425f067a59c0f2da"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get xbFloat field for field number. <a href="classxb_1_1xbDbf.html#a3443f646038ced14425f067a59c0f2da">More...</a><br /></td></tr>
+<tr class="separator:a3443f646038ced14425f067a59c0f2da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81ef2f36f921d7ece066a592eb6393eb"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a81ef2f36f921d7ece066a592eb6393eb">GetFloatField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a> &amp;fFieldValue) const</td></tr>
+<tr class="memdesc:a81ef2f36f921d7ece066a592eb6393eb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get xbFloat field for field name. <a href="classxb_1_1xbDbf.html#a81ef2f36f921d7ece066a592eb6393eb">More...</a><br /></td></tr>
+<tr class="separator:a81ef2f36f921d7ece066a592eb6393eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a64161eb50d72e424b11bf3732657ebd8"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a64161eb50d72e424b11bf3732657ebd8">PutFloatField</a> (xbInt16 iFieldNo, <a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a> fFieldValue)</td></tr>
+<tr class="memdesc:a64161eb50d72e424b11bf3732657ebd8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put float field for field number. <a href="classxb_1_1xbDbf.html#a64161eb50d72e424b11bf3732657ebd8">More...</a><br /></td></tr>
+<tr class="separator:a64161eb50d72e424b11bf3732657ebd8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ea3241bc710d57e5f755efda62288ad"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a4ea3241bc710d57e5f755efda62288ad">PutFloatField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a> fFieldValue)</td></tr>
+<tr class="memdesc:a4ea3241bc710d57e5f755efda62288ad"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put float field for field name. <a href="classxb_1_1xbDbf.html#a4ea3241bc710d57e5f755efda62288ad">More...</a><br /></td></tr>
+<tr class="separator:a4ea3241bc710d57e5f755efda62288ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af78ef1fba949463ff7f829d3cffc4555"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#af78ef1fba949463ff7f829d3cffc4555">GetDateField</a> (xbInt16 iFieldNo, <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;dt) const</td></tr>
+<tr class="memdesc:af78ef1fba949463ff7f829d3cffc4555"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get <a class="el" href="classxb_1_1xbDate.html" title="xbDate class.">xbDate</a> field for field number. <a href="classxb_1_1xbDbf.html#af78ef1fba949463ff7f829d3cffc4555">More...</a><br /></td></tr>
+<tr class="separator:af78ef1fba949463ff7f829d3cffc4555"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac624e06a97666bfd64b4f252b4548b36"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ac624e06a97666bfd64b4f252b4548b36">GetDateField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;dt) const</td></tr>
+<tr class="memdesc:ac624e06a97666bfd64b4f252b4548b36"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get <a class="el" href="classxb_1_1xbDate.html" title="xbDate class.">xbDate</a> field for field name. <a href="classxb_1_1xbDbf.html#ac624e06a97666bfd64b4f252b4548b36">More...</a><br /></td></tr>
+<tr class="separator:ac624e06a97666bfd64b4f252b4548b36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a873f04af528a9d81e6a367a59d998ec5"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a873f04af528a9d81e6a367a59d998ec5">PutDateField</a> (xbInt16 iFieldNo, const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;dt)</td></tr>
+<tr class="memdesc:a873f04af528a9d81e6a367a59d998ec5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put date field for field number. <a href="classxb_1_1xbDbf.html#a873f04af528a9d81e6a367a59d998ec5">More...</a><br /></td></tr>
+<tr class="separator:a873f04af528a9d81e6a367a59d998ec5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a571b36b3a940b1a16d5e834f329b33b9"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a571b36b3a940b1a16d5e834f329b33b9">PutDateField</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;dt)</td></tr>
+<tr class="memdesc:a571b36b3a940b1a16d5e834f329b33b9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Put date field for field name. <a href="classxb_1_1xbDbf.html#a571b36b3a940b1a16d5e834f329b33b9">More...</a><br /></td></tr>
+<tr class="separator:a571b36b3a940b1a16d5e834f329b33b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae9a2ddb0adb8165b4ac2b6a28a932f7"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aae9a2ddb0adb8165b4ac2b6a28a932f7">CreateUniqueFileName</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDirIn, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sExtIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFqnOut)</td></tr>
+<tr class="memdesc:aae9a2ddb0adb8165b4ac2b6a28a932f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a unique file name. <a href="classxb_1_1xbFile.html#aae9a2ddb0adb8165b4ac2b6a28a932f7">More...</a><br /></td></tr>
+<tr class="separator:aae9a2ddb0adb8165b4ac2b6a28a932f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5ffabde2c88ea58324f27e471f6bfc0"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ae5ffabde2c88ea58324f27e471f6bfc0">CreateUniqueFileName</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDirIn, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sExtIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFqnOut, xbInt16 iOption)</td></tr>
+<tr class="memdesc:ae5ffabde2c88ea58324f27e471f6bfc0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a unique file name. <a href="classxb_1_1xbFile.html#ae5ffabde2c88ea58324f27e471f6bfc0">More...</a><br /></td></tr>
+<tr class="separator:ae5ffabde2c88ea58324f27e471f6bfc0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd0fb2166b2bff7e8a1cf65a7bc8be1e"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#acd0fb2166b2bff7e8a1cf65a7bc8be1e">GetDirectory</a> () const</td></tr>
+<tr class="memdesc:acd0fb2166b2bff7e8a1cf65a7bc8be1e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the directory name. <a href="classxb_1_1xbFile.html#acd0fb2166b2bff7e8a1cf65a7bc8be1e">More...</a><br /></td></tr>
+<tr class="separator:acd0fb2166b2bff7e8a1cf65a7bc8be1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac95cb882ccbcdedc9a233c6ad9fed07a"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ac95cb882ccbcdedc9a233c6ad9fed07a">GetFileName</a> () const</td></tr>
+<tr class="memdesc:ac95cb882ccbcdedc9a233c6ad9fed07a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the file name. <a href="classxb_1_1xbFile.html#ac95cb882ccbcdedc9a233c6ad9fed07a">More...</a><br /></td></tr>
+<tr class="separator:ac95cb882ccbcdedc9a233c6ad9fed07a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31b4e641f93206ba23e2a5a27491dcd4"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a31b4e641f93206ba23e2a5a27491dcd4">GetFqFileName</a> () const</td></tr>
+<tr class="memdesc:a31b4e641f93206ba23e2a5a27491dcd4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the fully qualified file name. <a href="classxb_1_1xbFile.html#a31b4e641f93206ba23e2a5a27491dcd4">More...</a><br /></td></tr>
+<tr class="separator:a31b4e641f93206ba23e2a5a27491dcd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae78a85255488bc78964c16946dbaead3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ae78a85255488bc78964c16946dbaead3">SetDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDirectory)</td></tr>
+<tr class="memdesc:ae78a85255488bc78964c16946dbaead3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the directory. <a href="classxb_1_1xbFile.html#ae78a85255488bc78964c16946dbaead3">More...</a><br /></td></tr>
+<tr class="separator:ae78a85255488bc78964c16946dbaead3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5419eb27e56822f828b2b88a9502a636"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5419eb27e56822f828b2b88a9502a636">SetFileName</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName)</td></tr>
+<tr class="memdesc:a5419eb27e56822f828b2b88a9502a636"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the filename. <a href="classxb_1_1xbFile.html#a5419eb27e56822f828b2b88a9502a636">More...</a><br /></td></tr>
+<tr class="separator:a5419eb27e56822f828b2b88a9502a636"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee832fa11db2077a532f49e1329bd05a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aee832fa11db2077a532f49e1329bd05a">SetFqFileName</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFqName)</td></tr>
+<tr class="memdesc:aee832fa11db2077a532f49e1329bd05a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the fully qualifed filename. <a href="classxb_1_1xbFile.html#aee832fa11db2077a532f49e1329bd05a">More...</a><br /></td></tr>
+<tr class="separator:aee832fa11db2077a532f49e1329bd05a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a638e14262410a1627819f016a16cdce2"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a638e14262410a1627819f016a16cdce2">GetBlockSize</a> () const</td></tr>
+<tr class="memdesc:a638e14262410a1627819f016a16cdce2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the block size. <a href="classxb_1_1xbFile.html#a638e14262410a1627819f016a16cdce2">More...</a><br /></td></tr>
+<tr class="separator:a638e14262410a1627819f016a16cdce2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a991c5676a6f38fa752435390989f413e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a991c5676a6f38fa752435390989f413e">SetBlockSize</a> (xbUInt32 ulBlockSize)</td></tr>
+<tr class="memdesc:a991c5676a6f38fa752435390989f413e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the block size. <a href="classxb_1_1xbFile.html#a991c5676a6f38fa752435390989f413e">More...</a><br /></td></tr>
+<tr class="separator:a991c5676a6f38fa752435390989f413e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c500dc9dac22c49496e4b29386b2dd3"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a3c500dc9dac22c49496e4b29386b2dd3">GetOpenMode</a> () const</td></tr>
+<tr class="memdesc:a3c500dc9dac22c49496e4b29386b2dd3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the open mode of the file. <a href="classxb_1_1xbFile.html#a3c500dc9dac22c49496e4b29386b2dd3">More...</a><br /></td></tr>
+<tr class="separator:a3c500dc9dac22c49496e4b29386b2dd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9b63e05b77f477ff6109ff7b9432c1b6"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a9b63e05b77f477ff6109ff7b9432c1b6">GetShareMode</a> () const</td></tr>
+<tr class="memdesc:a9b63e05b77f477ff6109ff7b9432c1b6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the share mode of the file. <a href="classxb_1_1xbFile.html#a9b63e05b77f477ff6109ff7b9432c1b6">More...</a><br /></td></tr>
+<tr class="separator:a9b63e05b77f477ff6109ff7b9432c1b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60c53998e3d1b694134b20a87bc9bf5a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a60c53998e3d1b694134b20a87bc9bf5a">GetFileDirPart</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileDirPartOut) const</td></tr>
+<tr class="memdesc:a60c53998e3d1b694134b20a87bc9bf5a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the directory part of the file name. <a href="classxb_1_1xbFile.html#a60c53998e3d1b694134b20a87bc9bf5a">More...</a><br /></td></tr>
+<tr class="separator:a60c53998e3d1b694134b20a87bc9bf5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5127c92892816e9bbc5c19653c4147a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#af5127c92892816e9bbc5c19653c4147a">GetFileDirPart</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sCompleteFileNameIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileDirPartOut) const</td></tr>
+<tr class="memdesc:af5127c92892816e9bbc5c19653c4147a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the directory part of the file name. <a href="classxb_1_1xbFile.html#af5127c92892816e9bbc5c19653c4147a">More...</a><br /></td></tr>
+<tr class="separator:af5127c92892816e9bbc5c19653c4147a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57a9222e5cbb51019d4eeb2c3ac89fa2"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a57a9222e5cbb51019d4eeb2c3ac89fa2">GetFileExtPart</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileExtPartOut) const</td></tr>
+<tr class="memdesc:a57a9222e5cbb51019d4eeb2c3ac89fa2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the extension part of the file name. <a href="classxb_1_1xbFile.html#a57a9222e5cbb51019d4eeb2c3ac89fa2">More...</a><br /></td></tr>
+<tr class="separator:a57a9222e5cbb51019d4eeb2c3ac89fa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab289b6ffe955321160c1f90220c22e25"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab289b6ffe955321160c1f90220c22e25">GetFileExtPart</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sCompleteFileNameIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileExtPartOut) const</td></tr>
+<tr class="memdesc:ab289b6ffe955321160c1f90220c22e25"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the extension part of the file name. <a href="classxb_1_1xbFile.html#ab289b6ffe955321160c1f90220c22e25">More...</a><br /></td></tr>
+<tr class="separator:ab289b6ffe955321160c1f90220c22e25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81422b3dd52763d2cc6c77237ec9af0a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a81422b3dd52763d2cc6c77237ec9af0a">GetFileNamePart</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileNamePartOut) const</td></tr>
+<tr class="memdesc:a81422b3dd52763d2cc6c77237ec9af0a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the name part of the file name. <a href="classxb_1_1xbFile.html#a81422b3dd52763d2cc6c77237ec9af0a">More...</a><br /></td></tr>
+<tr class="separator:a81422b3dd52763d2cc6c77237ec9af0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6110763c5ae996b72c7a62c15bdecc73"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a6110763c5ae996b72c7a62c15bdecc73">GetFileNamePart</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sCompleteFileNameIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileNamePartOut) const</td></tr>
+<tr class="memdesc:a6110763c5ae996b72c7a62c15bdecc73"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the name part of the file name. <a href="classxb_1_1xbFile.html#a6110763c5ae996b72c7a62c15bdecc73">More...</a><br /></td></tr>
+<tr class="separator:a6110763c5ae996b72c7a62c15bdecc73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5548236d38d43b89ae29b9a015b1f678"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5548236d38d43b89ae29b9a015b1f678">GetFileType</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileType) const</td></tr>
+<tr class="memdesc:a5548236d38d43b89ae29b9a015b1f678"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the file type aka Capitalized file extension. <a href="classxb_1_1xbFile.html#a5548236d38d43b89ae29b9a015b1f678">More...</a><br /></td></tr>
+<tr class="separator:a5548236d38d43b89ae29b9a015b1f678"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf2e697751a0beff41432a66bb83fb5e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aaf2e697751a0beff41432a66bb83fb5e">GetXbaseFileTypeByte</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 &amp;iVersion)</td></tr>
+<tr class="memdesc:aaf2e697751a0beff41432a66bb83fb5e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the file type byte and version of the dbf file. <a href="classxb_1_1xbFile.html#aaf2e697751a0beff41432a66bb83fb5e">More...</a><br /></td></tr>
+<tr class="separator:aaf2e697751a0beff41432a66bb83fb5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7af337808919680b90710ad5e8a99232"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a7af337808919680b90710ad5e8a99232">GetXbaseFileTypeByte</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, unsigned char &amp;cFileTypeByte)</td></tr>
+<tr class="memdesc:a7af337808919680b90710ad5e8a99232"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the file type byte and version of the dbf file. <a href="classxb_1_1xbFile.html#a7af337808919680b90710ad5e8a99232">More...</a><br /></td></tr>
+<tr class="separator:a7af337808919680b90710ad5e8a99232"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78aebdd21d3de46a450d5f835e3027f6"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a78aebdd21d3de46a450d5f835e3027f6">GetXbaseFileTypeByte</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, unsigned char &amp;cFileTypeByte, xbInt16 &amp;iVersion)</td></tr>
+<tr class="memdesc:a78aebdd21d3de46a450d5f835e3027f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the file type byte and version of the dbf file. <a href="classxb_1_1xbFile.html#a78aebdd21d3de46a450d5f835e3027f6">More...</a><br /></td></tr>
+<tr class="separator:a78aebdd21d3de46a450d5f835e3027f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2b6ac26018dc28f77afbb3f008c3f66"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ae2b6ac26018dc28f77afbb3f008c3f66">DetermineXbaseTableVersion</a> (unsigned char cFileTypeByte) const</td></tr>
+<tr class="memdesc:ae2b6ac26018dc28f77afbb3f008c3f66"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine xbase dbf version. <a href="classxb_1_1xbFile.html#ae2b6ac26018dc28f77afbb3f008c3f66">More...</a><br /></td></tr>
+<tr class="separator:ae2b6ac26018dc28f77afbb3f008c3f66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a740033664c9ad2611c90e2a6d0c2d3"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5a740033664c9ad2611c90e2a6d0c2d3">DetermineXbaseMemoVersion</a> (unsigned char cFileTypeByte) const</td></tr>
+<tr class="memdesc:a5a740033664c9ad2611c90e2a6d0c2d3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine which version the memo (dbt) file is. <a href="classxb_1_1xbFile.html#a5a740033664c9ad2611c90e2a6d0c2d3">More...</a><br /></td></tr>
+<tr class="separator:a5a740033664c9ad2611c90e2a6d0c2d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78bd8a11dce102647095baf3aff2b006"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a78bd8a11dce102647095baf3aff2b006">FileExists</a> () const</td></tr>
+<tr class="memdesc:a78bd8a11dce102647095baf3aff2b006"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if a file exists. <a href="classxb_1_1xbFile.html#a78bd8a11dce102647095baf3aff2b006">More...</a><br /></td></tr>
+<tr class="separator:a78bd8a11dce102647095baf3aff2b006"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a174d8a6aabc9cfcd32fedbd1e5b13ddd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a174d8a6aabc9cfcd32fedbd1e5b13ddd">FileExists</a> (xbInt16 iOption) const</td></tr>
+<tr class="memdesc:a174d8a6aabc9cfcd32fedbd1e5b13ddd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if a file exists. <a href="classxb_1_1xbFile.html#a174d8a6aabc9cfcd32fedbd1e5b13ddd">More...</a><br /></td></tr>
+<tr class="separator:a174d8a6aabc9cfcd32fedbd1e5b13ddd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61130b4fbf4cf9d5972dcb4993de2f94"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a61130b4fbf4cf9d5972dcb4993de2f94">FileExists</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName) const</td></tr>
+<tr class="memdesc:a61130b4fbf4cf9d5972dcb4993de2f94"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if a file exists. <a href="classxb_1_1xbFile.html#a61130b4fbf4cf9d5972dcb4993de2f94">More...</a><br /></td></tr>
+<tr class="separator:a61130b4fbf4cf9d5972dcb4993de2f94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0592168f39a10f2a401a88ef781f6148"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a0592168f39a10f2a401a88ef781f6148">FileExists</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iOption) const</td></tr>
+<tr class="memdesc:a0592168f39a10f2a401a88ef781f6148"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if a file exists. <a href="classxb_1_1xbFile.html#a0592168f39a10f2a401a88ef781f6148">More...</a><br /></td></tr>
+<tr class="separator:a0592168f39a10f2a401a88ef781f6148"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7fa837938a32dc9ca3fbc81cbaf50f59"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a7fa837938a32dc9ca3fbc81cbaf50f59">FileIsOpen</a> () const</td></tr>
+<tr class="memdesc:a7fa837938a32dc9ca3fbc81cbaf50f59"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if file is open. <a href="classxb_1_1xbFile.html#a7fa837938a32dc9ca3fbc81cbaf50f59">More...</a><br /></td></tr>
+<tr class="separator:a7fa837938a32dc9ca3fbc81cbaf50f59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1bb80340abc7a5c22f87f878e9dc825"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aa1bb80340abc7a5c22f87f878e9dc825">ReadBlock</a> (xbUInt32 ulBlockNo, size_t readSize, void *buf)</td></tr>
+<tr class="memdesc:aa1bb80340abc7a5c22f87f878e9dc825"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read a block of data from file. <a href="classxb_1_1xbFile.html#aa1bb80340abc7a5c22f87f878e9dc825">More...</a><br /></td></tr>
+<tr class="separator:aa1bb80340abc7a5c22f87f878e9dc825"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef696b1c4c0ef5338e818599f695d485"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aef696b1c4c0ef5338e818599f695d485">ReadBlock</a> (xbUInt32 ulBlockNo, xbUInt32 ulBlockSize, size_t readSize, void *buf)</td></tr>
+<tr class="memdesc:aef696b1c4c0ef5338e818599f695d485"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read a block of data from file. <a href="classxb_1_1xbFile.html#aef696b1c4c0ef5338e818599f695d485">More...</a><br /></td></tr>
+<tr class="separator:aef696b1c4c0ef5338e818599f695d485"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5d871dcfecc2b4338f7a13722aab766c"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5d871dcfecc2b4338f7a13722aab766c">WriteBlock</a> (xbUInt32 ulBlockNo, size_t writeSize, void *buf)</td></tr>
+<tr class="memdesc:a5d871dcfecc2b4338f7a13722aab766c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a block of data to file. <a href="classxb_1_1xbFile.html#a5d871dcfecc2b4338f7a13722aab766c">More...</a><br /></td></tr>
+<tr class="separator:a5d871dcfecc2b4338f7a13722aab766c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a50b63c39e49d44e52078038027b24cc5"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a50b63c39e49d44e52078038027b24cc5">GetFileSize</a> (xbUInt64 &amp;ullFileSize)</td></tr>
+<tr class="memdesc:a50b63c39e49d44e52078038027b24cc5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the size of the file as reported by the OS. <a href="classxb_1_1xbFile.html#a50b63c39e49d44e52078038027b24cc5">More...</a><br /></td></tr>
+<tr class="separator:a50b63c39e49d44e52078038027b24cc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02df78f4c90313243f508fc56b95aba8"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a02df78f4c90313243f508fc56b95aba8">GetFileMtime</a> (time_t &amp;mtime)</td></tr>
+<tr class="memdesc:a02df78f4c90313243f508fc56b95aba8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the time of last file modification timestamp as reported by the OS. <a href="classxb_1_1xbFile.html#a02df78f4c90313243f508fc56b95aba8">More...</a><br /></td></tr>
+<tr class="separator:a02df78f4c90313243f508fc56b95aba8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab14e4a11427f5efb81cba1dd32bd1aa1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab14e4a11427f5efb81cba1dd32bd1aa1">eGetDouble</a> (const char *p) const</td></tr>
+<tr class="memdesc:ab14e4a11427f5efb81cba1dd32bd1aa1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a portable double value. <a href="classxb_1_1xbFile.html#ab14e4a11427f5efb81cba1dd32bd1aa1">More...</a><br /></td></tr>
+<tr class="separator:ab14e4a11427f5efb81cba1dd32bd1aa1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60b24a5afc984c586bf384c7e915ba0d"><td class="memItemLeft" align="right" valign="top">xbInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a60b24a5afc984c586bf384c7e915ba0d">eGetInt32</a> (const char *p) const</td></tr>
+<tr class="memdesc:a60b24a5afc984c586bf384c7e915ba0d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a portable long value. <a href="classxb_1_1xbFile.html#a60b24a5afc984c586bf384c7e915ba0d">More...</a><br /></td></tr>
+<tr class="separator:a60b24a5afc984c586bf384c7e915ba0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78f052529d39a18deaface5a0d47d0b0"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a78f052529d39a18deaface5a0d47d0b0">eGetUInt32</a> (const char *p) const</td></tr>
+<tr class="memdesc:a78f052529d39a18deaface5a0d47d0b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a portable unsigned long value. <a href="classxb_1_1xbFile.html#a78f052529d39a18deaface5a0d47d0b0">More...</a><br /></td></tr>
+<tr class="separator:a78f052529d39a18deaface5a0d47d0b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac40c991110ddc6fb30a72d90f4652762"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ac40c991110ddc6fb30a72d90f4652762">eGetInt16</a> (const char *p) const</td></tr>
+<tr class="memdesc:ac40c991110ddc6fb30a72d90f4652762"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a portable short value. <a href="classxb_1_1xbFile.html#ac40c991110ddc6fb30a72d90f4652762">More...</a><br /></td></tr>
+<tr class="separator:ac40c991110ddc6fb30a72d90f4652762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a936ade458e6d5e6d29f9b5031888d189"><td class="memItemLeft" align="right" valign="top">xbUInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a936ade458e6d5e6d29f9b5031888d189">eGetUInt16</a> (const char *p) const</td></tr>
+<tr class="memdesc:a936ade458e6d5e6d29f9b5031888d189"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a portable unsigned short value. <a href="classxb_1_1xbFile.html#a936ade458e6d5e6d29f9b5031888d189">More...</a><br /></td></tr>
+<tr class="separator:a936ade458e6d5e6d29f9b5031888d189"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98b6ff533ae93f90c977a2ba23eeb105"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a98b6ff533ae93f90c977a2ba23eeb105">ePutDouble</a> (char *p, <a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> d)</td></tr>
+<tr class="memdesc:a98b6ff533ae93f90c977a2ba23eeb105"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a portable double value to memory location. <a href="classxb_1_1xbFile.html#a98b6ff533ae93f90c977a2ba23eeb105">More...</a><br /></td></tr>
+<tr class="separator:a98b6ff533ae93f90c977a2ba23eeb105"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a19c37f76a2ccbb45019cb0fc373d3f46"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a19c37f76a2ccbb45019cb0fc373d3f46">ePutInt32</a> (char *p, xbInt32 l)</td></tr>
+<tr class="memdesc:a19c37f76a2ccbb45019cb0fc373d3f46"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a portable long value to memory location. <a href="classxb_1_1xbFile.html#a19c37f76a2ccbb45019cb0fc373d3f46">More...</a><br /></td></tr>
+<tr class="separator:a19c37f76a2ccbb45019cb0fc373d3f46"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3f6ceae4b96f24875d86848bf13a173"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aa3f6ceae4b96f24875d86848bf13a173">ePutUInt32</a> (char *p, xbUInt32 ul)</td></tr>
+<tr class="memdesc:aa3f6ceae4b96f24875d86848bf13a173"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a portable unsigned long value to memory location. <a href="classxb_1_1xbFile.html#aa3f6ceae4b96f24875d86848bf13a173">More...</a><br /></td></tr>
+<tr class="separator:aa3f6ceae4b96f24875d86848bf13a173"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29130f12739ac8fa837f4eaedf1338b2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a29130f12739ac8fa837f4eaedf1338b2">ePutInt16</a> (char *p, xbInt16 s)</td></tr>
+<tr class="memdesc:a29130f12739ac8fa837f4eaedf1338b2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a portable short value to memory location. <a href="classxb_1_1xbFile.html#a29130f12739ac8fa837f4eaedf1338b2">More...</a><br /></td></tr>
+<tr class="separator:a29130f12739ac8fa837f4eaedf1338b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65e9839f92b96eac7b0d071fac3bbe40"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a65e9839f92b96eac7b0d071fac3bbe40">ePutUInt16</a> (char *p, xbUInt16 s)</td></tr>
+<tr class="memdesc:a65e9839f92b96eac7b0d071fac3bbe40"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a portable unsigned short value to memory location. <a href="classxb_1_1xbFile.html#a65e9839f92b96eac7b0d071fac3bbe40">More...</a><br /></td></tr>
+<tr class="separator:a65e9839f92b96eac7b0d071fac3bbe40"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18830b5755d74818f60d9c7ce38ddf2d"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a18830b5755d74818f60d9c7ce38ddf2d">xbFclose</a> ()</td></tr>
+<tr class="memdesc:a18830b5755d74818f60d9c7ce38ddf2d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fclose. <a href="classxb_1_1xbFile.html#a18830b5755d74818f60d9c7ce38ddf2d">More...</a><br /></td></tr>
+<tr class="separator:a18830b5755d74818f60d9c7ce38ddf2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5b6356832d2a67212070a1aa605f170"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#af5b6356832d2a67212070a1aa605f170">xbFeof</a> ()</td></tr>
+<tr class="memdesc:af5b6356832d2a67212070a1aa605f170"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary feof. <a href="classxb_1_1xbFile.html#af5b6356832d2a67212070a1aa605f170">More...</a><br /></td></tr>
+<tr class="separator:af5b6356832d2a67212070a1aa605f170"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad205184d43409f04216540ae22f15009"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ad205184d43409f04216540ae22f15009">xbFflush</a> ()</td></tr>
+<tr class="memdesc:ad205184d43409f04216540ae22f15009"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fflush. <a href="classxb_1_1xbFile.html#ad205184d43409f04216540ae22f15009">More...</a><br /></td></tr>
+<tr class="separator:ad205184d43409f04216540ae22f15009"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb1c584d2895ffb7834df80aea7eb1e4"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#afb1c584d2895ffb7834df80aea7eb1e4">xbFgetc</a> (xbInt32 &amp;c)</td></tr>
+<tr class="memdesc:afb1c584d2895ffb7834df80aea7eb1e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fgetc. <a href="classxb_1_1xbFile.html#afb1c584d2895ffb7834df80aea7eb1e4">More...</a><br /></td></tr>
+<tr class="separator:afb1c584d2895ffb7834df80aea7eb1e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ee229bda4d7d6695e122200e581e7a6"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5ee229bda4d7d6695e122200e581e7a6">xbFgetc</a> (char &amp;c)</td></tr>
+<tr class="memdesc:a5ee229bda4d7d6695e122200e581e7a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fgetc. <a href="classxb_1_1xbFile.html#a5ee229bda4d7d6695e122200e581e7a6">More...</a><br /></td></tr>
+<tr class="separator:a5ee229bda4d7d6695e122200e581e7a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7cdfef5ede9ac98d44a28a6b7a70972c"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a7cdfef5ede9ac98d44a28a6b7a70972c">xbFopen</a> (xbInt16 iOpenMode)</td></tr>
+<tr class="separator:a7cdfef5ede9ac98d44a28a6b7a70972c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0548cedf0f26b7d8ac221f75b0cd048c"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a0548cedf0f26b7d8ac221f75b0cd048c">xbFopen</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOpenMode, xbInt16 iShareMode)</td></tr>
+<tr class="memdesc:a0548cedf0f26b7d8ac221f75b0cd048c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fopen. <a href="classxb_1_1xbFile.html#a0548cedf0f26b7d8ac221f75b0cd048c">More...</a><br /></td></tr>
+<tr class="separator:a0548cedf0f26b7d8ac221f75b0cd048c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aabd113333b49c36cad23244b392baab4"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aabd113333b49c36cad23244b392baab4">xbFopen</a> (xbInt16 iOpenMode, xbInt16 iShareMode)</td></tr>
+<tr class="memdesc:aabd113333b49c36cad23244b392baab4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fopen. <a href="classxb_1_1xbFile.html#aabd113333b49c36cad23244b392baab4">More...</a><br /></td></tr>
+<tr class="separator:aabd113333b49c36cad23244b392baab4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0fa19686ca8953ff4b556fb5b249135"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab0fa19686ca8953ff4b556fb5b249135">xbFopen</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sMode, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iShareMode)</td></tr>
+<tr class="memdesc:ab0fa19686ca8953ff4b556fb5b249135"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fopen. <a href="classxb_1_1xbFile.html#ab0fa19686ca8953ff4b556fb5b249135">More...</a><br /></td></tr>
+<tr class="separator:ab0fa19686ca8953ff4b556fb5b249135"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2e940c78956e5cb6824f9a1bc404896"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#af2e940c78956e5cb6824f9a1bc404896">xbFputc</a> (xbInt32 c)</td></tr>
+<tr class="memdesc:af2e940c78956e5cb6824f9a1bc404896"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fputc. <a href="classxb_1_1xbFile.html#af2e940c78956e5cb6824f9a1bc404896">More...</a><br /></td></tr>
+<tr class="separator:af2e940c78956e5cb6824f9a1bc404896"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a863f74cf17df8186d88586b4d2a6441a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a863f74cf17df8186d88586b4d2a6441a">xbFputc</a> (xbInt32 c, xbInt32 iNoTimes)</td></tr>
+<tr class="memdesc:a863f74cf17df8186d88586b4d2a6441a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fputc. <a href="classxb_1_1xbFile.html#a863f74cf17df8186d88586b4d2a6441a">More...</a><br /></td></tr>
+<tr class="separator:a863f74cf17df8186d88586b4d2a6441a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a698f3b40216778562e639e6ca1a47573"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a698f3b40216778562e639e6ca1a47573">xbFputs</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:a698f3b40216778562e639e6ca1a47573"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fputs. <a href="classxb_1_1xbFile.html#a698f3b40216778562e639e6ca1a47573">More...</a><br /></td></tr>
+<tr class="separator:a698f3b40216778562e639e6ca1a47573"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4f6afaa1f77539f27a4f05c26e54e2f"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab4f6afaa1f77539f27a4f05c26e54e2f">xbFread</a> (void *ptr, size_t size, size_t nmemb)</td></tr>
+<tr class="memdesc:ab4f6afaa1f77539f27a4f05c26e54e2f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fread. <a href="classxb_1_1xbFile.html#ab4f6afaa1f77539f27a4f05c26e54e2f">More...</a><br /></td></tr>
+<tr class="separator:ab4f6afaa1f77539f27a4f05c26e54e2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad245955ace26e5dde85fd4373b30d026"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ad245955ace26e5dde85fd4373b30d026">xbFgets</a> (size_t lSize, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sLine)</td></tr>
+<tr class="memdesc:ad245955ace26e5dde85fd4373b30d026"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fgets. <a href="classxb_1_1xbFile.html#ad245955ace26e5dde85fd4373b30d026">More...</a><br /></td></tr>
+<tr class="separator:ad245955ace26e5dde85fd4373b30d026"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e1c06aedfa7fbcb92e117f891edd13b"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a0e1c06aedfa7fbcb92e117f891edd13b">xbFtell</a> ()</td></tr>
+<tr class="memdesc:a0e1c06aedfa7fbcb92e117f891edd13b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary ftell. <a href="classxb_1_1xbFile.html#a0e1c06aedfa7fbcb92e117f891edd13b">More...</a><br /></td></tr>
+<tr class="separator:a0e1c06aedfa7fbcb92e117f891edd13b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5337ab8918df240910c0d19b4f298e3d"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5337ab8918df240910c0d19b4f298e3d">xbFseek</a> (xbInt64 llOffset, xbInt32 whence)</td></tr>
+<tr class="memdesc:a5337ab8918df240910c0d19b4f298e3d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fseek. <a href="classxb_1_1xbFile.html#a5337ab8918df240910c0d19b4f298e3d">More...</a><br /></td></tr>
+<tr class="separator:a5337ab8918df240910c0d19b4f298e3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9891b792f585a696f38a5cf959e30918"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a9891b792f585a696f38a5cf959e30918">xbFTurnOffFileBuffering</a> ()</td></tr>
+<tr class="memdesc:a9891b792f585a696f38a5cf959e30918"><td class="mdescLeft">&#160;</td><td class="mdescRight">Turn off file buffering. <a href="classxb_1_1xbFile.html#a9891b792f585a696f38a5cf959e30918">More...</a><br /></td></tr>
+<tr class="separator:a9891b792f585a696f38a5cf959e30918"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6aadd871d1782944703fed773d44b85f"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a6aadd871d1782944703fed773d44b85f">xbFwrite</a> (const void *ptr, size_t lSize, size_t lNmemb)</td></tr>
+<tr class="memdesc:a6aadd871d1782944703fed773d44b85f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fwrite. <a href="classxb_1_1xbFile.html#a6aadd871d1782944703fed773d44b85f">More...</a><br /></td></tr>
+<tr class="separator:a6aadd871d1782944703fed773d44b85f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08463f506f425c2385acbe1a561506e9"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a08463f506f425c2385acbe1a561506e9">xbReadUntil</a> (const char cDelim, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOut)</td></tr>
+<tr class="memdesc:a08463f506f425c2385acbe1a561506e9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read file until a particular character is encountered on input stream. <a href="classxb_1_1xbFile.html#a08463f506f425c2385acbe1a561506e9">More...</a><br /></td></tr>
+<tr class="separator:a08463f506f425c2385acbe1a561506e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d919366c2ec95e529906bf8842cbf07"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a6d919366c2ec95e529906bf8842cbf07">xbRemove</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iOption)</td></tr>
+<tr class="memdesc:a6d919366c2ec95e529906bf8842cbf07"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete file. <a href="classxb_1_1xbFile.html#a6d919366c2ec95e529906bf8842cbf07">More...</a><br /></td></tr>
+<tr class="separator:a6d919366c2ec95e529906bf8842cbf07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58f6a6751fdf7e9549c273bb75d93eb5"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a58f6a6751fdf7e9549c273bb75d93eb5">xbRemove</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName)</td></tr>
+<tr class="memdesc:a58f6a6751fdf7e9549c273bb75d93eb5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete file. <a href="classxb_1_1xbFile.html#a58f6a6751fdf7e9549c273bb75d93eb5">More...</a><br /></td></tr>
+<tr class="separator:a58f6a6751fdf7e9549c273bb75d93eb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3c668a8570433188382d31d7c60bd48"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab3c668a8570433188382d31d7c60bd48">xbRemove</a> ()</td></tr>
+<tr class="memdesc:ab3c668a8570433188382d31d7c60bd48"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete file. <a href="classxb_1_1xbFile.html#ab3c668a8570433188382d31d7c60bd48">More...</a><br /></td></tr>
+<tr class="separator:ab3c668a8570433188382d31d7c60bd48"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc8ce113aa72611a278233f9bb170012"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#afc8ce113aa72611a278233f9bb170012">xbRename</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOldName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sNewName)</td></tr>
+<tr class="memdesc:afc8ce113aa72611a278233f9bb170012"><td class="mdescLeft">&#160;</td><td class="mdescRight">Rename file. <a href="classxb_1_1xbFile.html#afc8ce113aa72611a278233f9bb170012">More...</a><br /></td></tr>
+<tr class="separator:afc8ce113aa72611a278233f9bb170012"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0b2a2c88947921d98ebcb5b5ec34ed9"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab0b2a2c88947921d98ebcb5b5ec34ed9">xbRename</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOldName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sNewName, xbInt16 iOption)</td></tr>
+<tr class="memdesc:ab0b2a2c88947921d98ebcb5b5ec34ed9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Rename file. <a href="classxb_1_1xbFile.html#ab0b2a2c88947921d98ebcb5b5ec34ed9">More...</a><br /></td></tr>
+<tr class="separator:ab0b2a2c88947921d98ebcb5b5ec34ed9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7996b6e084665c37c3892faea64b3505"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a7996b6e084665c37c3892faea64b3505">xbRewind</a> ()</td></tr>
+<tr class="memdesc:a7996b6e084665c37c3892faea64b3505"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for rewind. <a href="classxb_1_1xbFile.html#a7996b6e084665c37c3892faea64b3505">More...</a><br /></td></tr>
+<tr class="separator:a7996b6e084665c37c3892faea64b3505"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a518bfcbfa3699d883cf89affee383296"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a518bfcbfa3699d883cf89affee383296">xbTruncate</a> (xbInt64 llSize)</td></tr>
+<tr class="memdesc:a518bfcbfa3699d883cf89affee383296"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for ftruncate. <a href="classxb_1_1xbFile.html#a518bfcbfa3699d883cf89affee383296">More...</a><br /></td></tr>
+<tr class="separator:a518bfcbfa3699d883cf89affee383296"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a361e3cc318bbf1c4d10f069e0800a24e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a361e3cc318bbf1c4d10f069e0800a24e">NameSuffixMissing</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iOption) const</td></tr>
+<tr class="memdesc:a361e3cc318bbf1c4d10f069e0800a24e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines status of file extension. <a href="classxb_1_1xbFile.html#a361e3cc318bbf1c4d10f069e0800a24e">More...</a><br /></td></tr>
+<tr class="separator:a361e3cc318bbf1c4d10f069e0800a24e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">DisplayError</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a97dfa59ab9a8e9f17454da0faceb023d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Display error message on console for a given error number. <a href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">More...</a><br /></td></tr>
+<tr class="separator:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">GetDefaultDateFormat</a> () const</td></tr>
+<tr class="memdesc:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default date format. <a href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">More...</a><br /></td></tr>
+<tr class="separator:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">GetDataDirectory</a> () const</td></tr>
+<tr class="memdesc:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the current data directory. <a href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">More...</a><br /></td></tr>
+<tr class="separator:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49cd162f066eef2b829ba7c9f6620243"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">GetEndianType</a> () const</td></tr>
+<tr class="memdesc:a49cd162f066eef2b829ba7c9f6620243"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the Endian type. <a href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">More...</a><br /></td></tr>
+<tr class="separator:a49cd162f066eef2b829ba7c9f6620243"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56961d2a67b8e7470098626ac4dac7e4"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">GetErrorMessage</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a56961d2a67b8e7470098626ac4dac7e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get an error message. <a href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">More...</a><br /></td></tr>
+<tr class="separator:a56961d2a67b8e7470098626ac4dac7e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">SetDataDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDataDirectory)</td></tr>
+<tr class="memdesc:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data directory. <a href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">More...</a><br /></td></tr>
+<tr class="separator:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f74db23f8902846d581935c7db73f9c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">SetDefaultDateFormat</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultDateFormat)</td></tr>
+<tr class="memdesc:a5f74db23f8902846d581935c7db73f9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default date format. <a href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">More...</a><br /></td></tr>
+<tr class="separator:a5f74db23f8902846d581935c7db73f9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62e4fd0a5888665c76bbbad962794e72"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">BitSet</a> (unsigned char c, xbInt16 iBitNo) const</td></tr>
+<tr class="memdesc:a62e4fd0a5888665c76bbbad962794e72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check a bit in a one byte field and see if it is set. <a href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">More...</a><br /></td></tr>
+<tr class="separator:a62e4fd0a5888665c76bbbad962794e72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6982f973e81587b04916f4509746aaf5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">GetDefaultAutoCommit</a> () const</td></tr>
+<tr class="memdesc:a6982f973e81587b04916f4509746aaf5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default auto commit setting. <a href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">More...</a><br /></td></tr>
+<tr class="separator:a6982f973e81587b04916f4509746aaf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">SetDefaultAutoCommit</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bDefaultAutoCommit)</td></tr>
+<tr class="memdesc:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default auto commit. <a href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">More...</a><br /></td></tr>
+<tr class="separator:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf3763faf6a8917a963213cd53af529c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abf3763faf6a8917a963213cd53af529c">GetDefaultLogDirectory</a> () const</td></tr>
+<tr class="separator:abf3763faf6a8917a963213cd53af529c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a43878d4dc041f2a5e2398a118ccfaf79">GetDefaultLogFileName</a> () const</td></tr>
+<tr class="separator:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84343b8645790791512d6bc22ee6c8eb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a84343b8645790791512d6bc22ee6c8eb">SetDefaultLogDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultLogDirectory)</td></tr>
+<tr class="separator:a84343b8645790791512d6bc22ee6c8eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">GetMultiUser</a> () const</td></tr>
+<tr class="memdesc:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">More...</a><br /></td></tr>
+<tr class="separator:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba6e59512f7172dd55dcf92059e5928c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">SetMultiUser</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bMultiUser)</td></tr>
+<tr class="memdesc:aba6e59512f7172dd55dcf92059e5928c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">More...</a><br /></td></tr>
+<tr class="separator:aba6e59512f7172dd55dcf92059e5928c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-static-attribs" name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memItemLeft" align="right" valign="top">static const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e">ErrorCodeText</a> []</td></tr>
+<tr class="separator:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-methods" name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:aabd146c0e1054ab905ec96aedd84b02e"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#aabd146c0e1054ab905ec96aedd84b02e">GetRawField</a> (xbInt16 iFieldNo, char *Buf, xbUInt32 BufSize, xbInt16 iRecBufSw) const</td></tr>
+<tr class="memdesc:aabd146c0e1054ab905ec96aedd84b02e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get raw field data for field number. <a href="classxb_1_1xbDbf.html#aabd146c0e1054ab905ec96aedd84b02e">More...</a><br /></td></tr>
+<tr class="separator:aabd146c0e1054ab905ec96aedd84b02e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad06fe0f7975fb81125d27d82504e6829"><td class="memItemLeft" align="right" valign="top">virtual void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ad06fe0f7975fb81125d27d82504e6829">InitVars</a> ()</td></tr>
+<tr class="separator:ad06fe0f7975fb81125d27d82504e6829"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e63e852418f337eb7c44de5dcd50323"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a7e63e852418f337eb7c44de5dcd50323">SetVersion</a> ()=0</td></tr>
+<tr class="separator:a7e63e852418f337eb7c44de5dcd50323"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba5dcac3b4092261bc1669740cdd669d"><td class="memItemLeft" align="right" valign="top">virtual xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#aba5dcac3b4092261bc1669740cdd669d">ValidateSchema</a> (<a class="el" href="structxb_1_1xbSchema.html">xbSchema</a> *s)=0</td></tr>
+<tr class="separator:aba5dcac3b4092261bc1669740cdd669d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44e1410109ef7b3d11a6af4b704b62b2"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a44e1410109ef7b3d11a6af4b704b62b2">WriteHeader</a> (xbInt16 iPositionOption, xbInt16 iWriteOption)</td></tr>
+<tr class="separator:a44e1410109ef7b3d11a6af4b704b62b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a904ec348fd029d4a76e72b8fde636108"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">SetEndianType</a> ()</td></tr>
+<tr class="memdesc:a904ec348fd029d4a76e72b8fde636108"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the endian type. <a href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">More...</a><br /></td></tr>
+<tr class="separator:a904ec348fd029d4a76e72b8fde636108"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-attribs" name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr class="memitem:afcd99924606be0a9e1e25180bcd1abf8"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#afcd99924606be0a9e1e25180bcd1abf8">ulCurRec</a></td></tr>
+<tr class="separator:afcd99924606be0a9e1e25180bcd1abf8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab506450954bc86e7bf1d7c4efe681f43"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ab506450954bc86e7bf1d7c4efe681f43">iAutoCommit</a></td></tr>
+<tr class="separator:ab506450954bc86e7bf1d7c4efe681f43"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15f495446f0d75bcf2fa89e3b699d388"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a15f495446f0d75bcf2fa89e3b699d388">iFileVersion</a></td></tr>
+<tr class="separator:a15f495446f0d75bcf2fa89e3b699d388"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a73f9c792d0a769e2e604c1855245a276"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a73f9c792d0a769e2e604c1855245a276">sAlias</a></td></tr>
+<tr class="separator:a73f9c792d0a769e2e604c1855245a276"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5056757614c39f725cc775332494966a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a5056757614c39f725cc775332494966a">iNoOfFields</a></td></tr>
+<tr class="separator:a5056757614c39f725cc775332494966a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d8e193da3ca414eef1e8866ec5ca81b"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a6d8e193da3ca414eef1e8866ec5ca81b">iDbfStatus</a></td></tr>
+<tr class="separator:a6d8e193da3ca414eef1e8866ec5ca81b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad8c8b5eb12063bb898da1b2cc02cfce7"><td class="memItemLeft" align="right" valign="top">xbSchemaRec *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ad8c8b5eb12063bb898da1b2cc02cfce7">SchemaPtr</a></td></tr>
+<tr class="separator:ad8c8b5eb12063bb898da1b2cc02cfce7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a9b3bce0b741e73473d3ebbd6e6f1cd"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a8a9b3bce0b741e73473d3ebbd6e6f1cd">RecBuf</a></td></tr>
+<tr class="separator:a8a9b3bce0b741e73473d3ebbd6e6f1cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a353ebfc8a2960ef827f429ec74025606"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a353ebfc8a2960ef827f429ec74025606">RecBuf2</a></td></tr>
+<tr class="separator:a353ebfc8a2960ef827f429ec74025606"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a262abf658e5fa968b57ef457a69470"><td class="memItemLeft" align="right" valign="top">unsigned char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a3a262abf658e5fa968b57ef457a69470">cVersion</a></td></tr>
+<tr class="separator:a3a262abf658e5fa968b57ef457a69470"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4fcd6a86ddd32d4a9d76a4074573440a"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a4fcd6a86ddd32d4a9d76a4074573440a">cUpdateYY</a></td></tr>
+<tr class="separator:a4fcd6a86ddd32d4a9d76a4074573440a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9340a5e8ee53eb0f3b6601eec2d71e1b"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a9340a5e8ee53eb0f3b6601eec2d71e1b">cUpdateMM</a></td></tr>
+<tr class="separator:a9340a5e8ee53eb0f3b6601eec2d71e1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6021789d314cd41488991e708fcd0df2"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a6021789d314cd41488991e708fcd0df2">cUpdateDD</a></td></tr>
+<tr class="separator:a6021789d314cd41488991e708fcd0df2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb594ab61dd35b17bdf28394083f8e87"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#acb594ab61dd35b17bdf28394083f8e87">ulNoOfRecs</a></td></tr>
+<tr class="separator:acb594ab61dd35b17bdf28394083f8e87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62f5fa9149ae0f6dc75642823de66918"><td class="memItemLeft" align="right" valign="top">xbUInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a62f5fa9149ae0f6dc75642823de66918">uiHeaderLen</a></td></tr>
+<tr class="separator:a62f5fa9149ae0f6dc75642823de66918"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1760e222567e2c849f9c799b9d896e91"><td class="memItemLeft" align="right" valign="top">xbUInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a1760e222567e2c849f9c799b9d896e91">uiRecordLen</a></td></tr>
+<tr class="separator:a1760e222567e2c849f9c799b9d896e91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac3c89fc3bc6a6abf385478a8adbed970"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ac3c89fc3bc6a6abf385478a8adbed970">cTransactionFlag</a></td></tr>
+<tr class="separator:ac3c89fc3bc6a6abf385478a8adbed970"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8734e799707582f022fc341d515650f4"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#a8734e799707582f022fc341d515650f4">cEncryptionFlag</a></td></tr>
+<tr class="separator:a8734e799707582f022fc341d515650f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad59074633641e03647e54d2b66c9102b"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#ad59074633641e03647e54d2b66c9102b">cIndexFlag</a></td></tr>
+<tr class="separator:ad59074633641e03647e54d2b66c9102b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html#aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1">cLangDriver</a></td></tr>
+<tr class="separator:aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae39a67ea391b46055d4ca299cb222004"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ae39a67ea391b46055d4ca299cb222004">xbase</a></td></tr>
+<tr class="separator:ae39a67ea391b46055d4ca299cb222004"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-static-attribs" name="pro-static-attribs"></a>
+Static Protected Attributes</h2></td></tr>
+<tr class="memitem:a5849e813f5e8e1cd180f0366637adbf3"><td class="memItemLeft" align="right" valign="top">static xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3">iEndianType</a> = 0</td></tr>
+<tr class="separator:a5849e813f5e8e1cd180f0366637adbf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9dec3164c3b264882df634915ecf21da"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da">sNullString</a> = &quot;&quot;</td></tr>
+<tr class="separator:a9dec3164c3b264882df634915ecf21da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p >Base class for handling dbf files/tables. </p>
+<p >The <a class="el" href="classxb_1_1xbDbf.html" title="Base class for handling dbf files/tables.">xbDbf</a> class is used as a base class for accessing dbf files. <br />
+ In line with relational theory, a each dbf file can be considered as a table. The documentation uses the terms dbf and table interchangeably.<br />
+</p>
+<p >This module handles methods for accessing and updating dbf files.</p>
+<p ><br />
+ The class is designed to support additional file layouts with a minimal amount of effort. If you are wanting to update the library to support a new dbf file type not currently supported by the library, create a derived class using <a class="el" href="classxb_1_1xbDbf.html" title="Base class for handling dbf files/tables.">xbDbf</a> as a base class and modify methods needed to support the new dbf file version.<br />
+ See the following for examples on how to start on this:<br />
+ xbDbf3 is a derived class from <a class="el" href="classxb_1_1xbDbf.html" title="Base class for handling dbf files/tables.">xbDbf</a> and supports the original Dbase III+ file version.<br />
+ xbDbf4 is a derived class from <a class="el" href="classxb_1_1xbDbf.html" title="Base class for handling dbf files/tables.">xbDbf</a> and supports the original Dbase IV file version.<br />
+ </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a84a75f80bc0e9b8a22b728767949c204" name="a84a75f80bc0e9b8a22b728767949c204"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84a75f80bc0e9b8a22b728767949c204">&#9670;&nbsp;</a></span>xbDbf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbDbf::xbDbf </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td>
+ <td class="paramname"><em>x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">x</td><td>Pointer to xbXbase </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7eb87521fba8a939c613056d9918d880" name="a7eb87521fba8a939c613056d9918d880"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7eb87521fba8a939c613056d9918d880">&#9670;&nbsp;</a></span>~xbDbf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbDbf::~xbDbf </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a4edcf31390fbdc8c3558004770fd9f2f" name="a4edcf31390fbdc8c3558004770fd9f2f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4edcf31390fbdc8c3558004770fd9f2f">&#9670;&nbsp;</a></span>Abort()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::Abort </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Abort any uncommited changes for the current record buffer. </p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5b412dd796241673eb1aa2c93513d69b" name="a5b412dd796241673eb1aa2c93513d69b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5b412dd796241673eb1aa2c93513d69b">&#9670;&nbsp;</a></span>AppendRecord()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::AppendRecord </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Append the current record to the data file. </p>
+<p >This method attempts to append the contents of the current record buffer to the end of the DBF file, updates the file date, number of records in the file and updates any open indices associated with this data file.<br />
+</p>
+<p >To add a record, an application would typically blank the record buffer, update various fields in the record buffer, then append the record.<br />
+</p>
+<p >The append method performs the following tasks:<br />
+ 1) Create new index key values<br />
+ 2) Lock the table<br />
+ 3) Lock append bytes<br />
+ 4) Lock indices<br />
+ 5) Read the dbf header<br />
+ 6) Check for dup keys<br />
+ 7) Calc last update date, no of recs<br />
+ 8) Add keys<br />
+ 9) Unlock indices<br />
+ 10) Update file header<br />
+ 11) Unlock file header<br />
+ 12) Append record<br />
+ 13) Unlock append bytes<br />
+</p>
+<p >Note: Locking memo files is not needed as the memo file updates are handled outside of the append method.<br />
+</p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a62e4fd0a5888665c76bbbad962794e72" name="a62e4fd0a5888665c76bbbad962794e72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62e4fd0a5888665c76bbbad962794e72">&#9670;&nbsp;</a></span>BitSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::BitSet </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iBitNo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Check a bit in a one byte field and see if it is set. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>One byte char field to examine. </td></tr>
+ <tr><td class="paramname">iBitNo</td><td>which bit to examine. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue Bit is set<br />
+ xbFalse Bit is not set </dd></dl>
+
+</div>
+</div>
+<a id="a78da5a3d2011a3f2e7618cbdd3ba02d6" name="a78da5a3d2011a3f2e7618cbdd3ba02d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78da5a3d2011a3f2e7618cbdd3ba02d6">&#9670;&nbsp;</a></span>BlankRecord()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::BlankRecord </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Blank the record buffer. </p>
+<p >This method would typically be called to initialize the record buffer before updates are applied to append a new record.</p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ad68d73113e54e1b5f326e90f45e9989d" name="ad68d73113e54e1b5f326e90f45e9989d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad68d73113e54e1b5f326e90f45e9989d">&#9670;&nbsp;</a></span>Close()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::Close </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Close DBF file/table. </p>
+<p >This routine flushes any remaining updates to disk, closes the DBF file and any associated memo and index files.</p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="abd69532c885ab72bcf3fb5066b318f4f" name="abd69532c885ab72bcf3fb5066b318f4f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd69532c885ab72bcf3fb5066b318f4f">&#9670;&nbsp;</a></span>Commit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::Commit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Commit updates to disk. </p>
+<p >This routine commits any pending updates to disk.</p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a829c615a130a1fdf609d93438d8a6264" name="a829c615a130a1fdf609d93438d8a6264"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a829c615a130a1fdf609d93438d8a6264">&#9670;&nbsp;</a></span>CopyDbfStructure()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::CopyDbfStructure </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>dNewTable</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sNewTableName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sNewTableAlias</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOverlay</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iShareMode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Copy table (dbf) file structure. </p>
+<p >This routine will copy the structure of a dbf file and if successful return a pointer to the new table in an open state.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">dNewTable</td><td>Reference to new table object. </td></tr>
+ <tr><td class="paramname">sNewTableName</td><td>New table (dbf) name. </td></tr>
+ <tr><td class="paramname">sNewTableAlias</td><td>Alias name of new table. </td></tr>
+ <tr><td class="paramname">iOverlay</td><td>xbTrue - Overlay existing file.<br />
+ xbFalse - Don't overlay existing file. </td></tr>
+ <tr><td class="paramname">iShareMode</td><td>XB_SINGLE_USER<br />
+ XB_MULTI_USER </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> Copy DBF structure </dd></dl>
+
+</div>
+</div>
+<a id="a73e41bfe679dd06ab16c436652df93f1" name="a73e41bfe679dd06ab16c436652df93f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a73e41bfe679dd06ab16c436652df93f1">&#9670;&nbsp;</a></span>CreateTable()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual xbInt16 xb::xbDbf::CreateTable </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTableName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sAlias</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="structxb_1_1xbSchema.html">xbSchema</a> *&#160;</td>
+ <td class="paramname"><em>pSchema</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOverlay</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iShareMode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aae9a2ddb0adb8165b4ac2b6a28a932f7" name="aae9a2ddb0adb8165b4ac2b6a28a932f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aae9a2ddb0adb8165b4ac2b6a28a932f7">&#9670;&nbsp;</a></span>CreateUniqueFileName() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::CreateUniqueFileName </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDirIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sExtIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFqnOut</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Create a unique file name. </p>
+<p >Given a directory and file extension as inputs, create a unique file name.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDirIn</td><td>Directory </td></tr>
+ <tr><td class="paramname">sExtIn</td><td>File Extension </td></tr>
+ <tr><td class="paramname">sFqnOut</td><td>A fully qualifed unique file name as output </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae5ffabde2c88ea58324f27e471f6bfc0" name="ae5ffabde2c88ea58324f27e471f6bfc0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae5ffabde2c88ea58324f27e471f6bfc0">&#9670;&nbsp;</a></span>CreateUniqueFileName() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::CreateUniqueFileName </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDirIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sExtIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFqnOut</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Create a unique file name. </p>
+<p >Given a directory and file extension as inputs, create a unique file name.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDirIn</td><td>Directory </td></tr>
+ <tr><td class="paramname">sExtIn</td><td>File Extension </td></tr>
+ <tr><td class="paramname">iOption</td><td>0 - look only for one file for a given directory and extension<br />
+ 1 - if file name extension is "dbf" or "DBF", verify unique dbt or DBT (memo) file is also available<br />
+ </td></tr>
+ <tr><td class="paramname">sFqnOut</td><td>A fully qualifed unique file name as output </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a01c26b67e312be1e674b3da710e031b9" name="a01c26b67e312be1e674b3da710e031b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01c26b67e312be1e674b3da710e031b9">&#9670;&nbsp;</a></span>DeleteAll()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::DeleteAll </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Delete or undelete all records in a dbf file (table). </p>
+<p >This routine deletes or un-deletes all records. The xbase file format contains a leading one byte character used for flagging a record as deleted. When a record is deleted, it's not physically removed from the file, the first byte is flagged as deleted.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOption</td><td>0 - Delete all records.<br />
+ 1 - Un-delete all deleted records. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a3067fdfa3a7a5c15651f6e89d1102176" name="a3067fdfa3a7a5c15651f6e89d1102176"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3067fdfa3a7a5c15651f6e89d1102176">&#9670;&nbsp;</a></span>DeleteAllRecords()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::DeleteAllRecords </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Delete all records. </p>
+<p >This routine deletes all the records in a table / dbf file.</p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="acd8c10579229f3a2e2c5fdb7fcef90db" name="acd8c10579229f3a2e2c5fdb7fcef90db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd8c10579229f3a2e2c5fdb7fcef90db">&#9670;&nbsp;</a></span>DeleteRecord()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::DeleteRecord </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Delete the current record. </p>
+<p >This routine flags the current record for deletion if it's not already flagged.</p>
+<dl class="section return"><dt>Returns</dt><dd>XB_NO_ERROR<br />
+ XB_INVALID_RECORD </dd></dl>
+
+</div>
+</div>
+<a id="a4085ed4f049d976124d8edc3d3c56397" name="a4085ed4f049d976124d8edc3d3c56397"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4085ed4f049d976124d8edc3d3c56397">&#9670;&nbsp;</a></span>DeleteTable()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::DeleteTable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Delete a table. </p>
+<p >This routine deletes a given table, associated index files if any, the memo file if any and the .INF file if any. </p><dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5a740033664c9ad2611c90e2a6d0c2d3" name="a5a740033664c9ad2611c90e2a6d0c2d3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a740033664c9ad2611c90e2a6d0c2d3">&#9670;&nbsp;</a></span>DetermineXbaseMemoVersion()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::DetermineXbaseMemoVersion </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char&#160;</td>
+ <td class="paramname"><em>cFileTypeByte</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Determine which version the memo (dbt) file is. </p>
+<p >This routine uses the first byte in the dbf file to determine which memo file version is in use. The main difference between version 3 and 4 is that version 4 will reuse blocks if they become available. Version 3 does not.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">cFileTypeByte</td><td>is an output field and is one of:<br />
+ <br />
+ 0 - none<br />
+ 3 - Dbase III+<br />
+ 4 - Dbase IV<br />
+</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae2b6ac26018dc28f77afbb3f008c3f66" name="ae2b6ac26018dc28f77afbb3f008c3f66"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae2b6ac26018dc28f77afbb3f008c3f66">&#9670;&nbsp;</a></span>DetermineXbaseTableVersion()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::DetermineXbaseTableVersion </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char&#160;</td>
+ <td class="paramname"><em>cFileTypeByte</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Determine xbase dbf version. </p>
+<p >This routine is used to determine which version of the Xbase classes can be used for a given DBF file.<br />
+</p>
+<p >It attempts to use the highest version compiled into the library.<br />
+</p>
+<p >References:<br />
+ This routine uses the first byte from the dbf file.<br />
+ Per DBase documentation:<br />
+ Valid dBASE for Windows table file, bits 0-2 indicate version number: 3 for dBASE Level 5, 4 for dBASE Level 7.<br />
+ Bit 3 and bit 7 indicate presence of a dBASE IV or dBASE for Windows memo file;<br />
+ Bits 4-6 indicate the presence of a dBASE IV SQL table;<br />
+ Bit 7 indicates the presence of any .DBT memo file (either a dBASE III PLUS type or a dBASE IV or dBASE for Windows memo file).<br />
+ <br />
+ Bachmann spec (used extensively in library build), page 7 - does not match DBase documentation<br />
+ <br />
+ returns<br />
+ 0 - unknown<br />
+ 3 - Dbase level 3<br />
+ 4 - Dbase level 4<br />
+ 5 - Dbase Level 5 (future)<br />
+ 7 - Dbase Level 7 (future)<br />
+ <br />
+ 1x - Clipper files (future)<br />
+ 2x - Foxbase files (future)<br />
+ <br />
+ </p>
+
+</div>
+</div>
+<a id="a97dfa59ab9a8e9f17454da0faceb023d" name="a97dfa59ab9a8e9f17454da0faceb023d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97dfa59ab9a8e9f17454da0faceb023d">&#9670;&nbsp;</a></span>DisplayError()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::DisplayError </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Display error message on console for a given error number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>Error number to reference </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab1f4a515533402f872cedcd0322aabd4" name="ab1f4a515533402f872cedcd0322aabd4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab1f4a515533402f872cedcd0322aabd4">&#9670;&nbsp;</a></span>DumpHeader()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual xbInt16 xb::xbDbf::DumpHeader </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a3a6a068addffd06fc9a996639d6ca69e" name="a3a6a068addffd06fc9a996639d6ca69e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3a6a068addffd06fc9a996639d6ca69e">&#9670;&nbsp;</a></span>DumpRecord()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual xbInt16 xb::xbDbf::DumpRecord </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulRecNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOutputDest</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOutputFmt</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab14e4a11427f5efb81cba1dd32bd1aa1" name="ab14e4a11427f5efb81cba1dd32bd1aa1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab14e4a11427f5efb81cba1dd32bd1aa1">&#9670;&nbsp;</a></span>eGetDouble()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> xb::xbFile::eGetDouble </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get a portable double value. </p>
+<p >This routine returns a double value from an 8 byte character stream, accounting for endian type.</p>
+<p >Converts a double (64 bit floating point) value stored at p from a portable format to the machine format.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>pointer to memory containing the portable double value</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the double value. </dd></dl>
+
+</div>
+</div>
+<a id="ac40c991110ddc6fb30a72d90f4652762" name="ac40c991110ddc6fb30a72d90f4652762"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac40c991110ddc6fb30a72d90f4652762">&#9670;&nbsp;</a></span>eGetInt16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::eGetInt16 </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get a portable short value. </p>
+<p >This routine returns a short int value from a 2 byte character stream, accounting for endian type.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>pointer to memory containing the portable long value</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the short value. </dd></dl>
+
+</div>
+</div>
+<a id="a60b24a5afc984c586bf384c7e915ba0d" name="a60b24a5afc984c586bf384c7e915ba0d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a60b24a5afc984c586bf384c7e915ba0d">&#9670;&nbsp;</a></span>eGetInt32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt32 xb::xbFile::eGetInt32 </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get a portable long value. </p>
+<p >This routine returns a long int value from a 4 byte character stream, accounting for endian type.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>pointer to memory containing the portable long value</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the long value. </dd></dl>
+
+</div>
+</div>
+<a id="a936ade458e6d5e6d29f9b5031888d189" name="a936ade458e6d5e6d29f9b5031888d189"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a936ade458e6d5e6d29f9b5031888d189">&#9670;&nbsp;</a></span>eGetUInt16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt16 xb::xbFile::eGetUInt16 </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get a portable unsigned short value. </p>
+<p >This routine returns a short unsigned int value from a 2 byte character stream, accounting for endian type.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>pointer to memory containing the portable long value</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the short value. </dd></dl>
+
+</div>
+</div>
+<a id="a78f052529d39a18deaface5a0d47d0b0" name="a78f052529d39a18deaface5a0d47d0b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78f052529d39a18deaface5a0d47d0b0">&#9670;&nbsp;</a></span>eGetUInt32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbFile::eGetUInt32 </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get a portable unsigned long value. </p>
+<p >This routine returns an unsigned long int value from a 4 byte character stream, accounting for endian type.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>pointer to memory containing the portable long value</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the unsigned long value. </dd></dl>
+
+</div>
+</div>
+<a id="a98b6ff533ae93f90c977a2ba23eeb105" name="a98b6ff533ae93f90c977a2ba23eeb105"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a98b6ff533ae93f90c977a2ba23eeb105">&#9670;&nbsp;</a></span>ePutDouble()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::ePutDouble </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a>&#160;</td>
+ <td class="paramname"><em>d</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Write a portable double value to memory location. </p>
+<p >Converts a double (64 bit floating point) value from machine format to a portable format and stores the converted value in the memory referenced by c.</p>
+<p >This routine puts a double value to an 8 byte character stream</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Pointer to memory to hold converted value </td></tr>
+ <tr><td class="paramname">d</td><td>Input value to be converted </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a29130f12739ac8fa837f4eaedf1338b2" name="a29130f12739ac8fa837f4eaedf1338b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a29130f12739ac8fa837f4eaedf1338b2">&#9670;&nbsp;</a></span>ePutInt16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::ePutInt16 </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Write a portable short value to memory location. </p>
+<p >Converts a short (16 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.</p>
+<p >This routine puts a short value to a 2 byte character stream</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Pointer to memory to hold converted value </td></tr>
+ <tr><td class="paramname">s</td><td>Input value to be converted </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a19c37f76a2ccbb45019cb0fc373d3f46" name="a19c37f76a2ccbb45019cb0fc373d3f46"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a19c37f76a2ccbb45019cb0fc373d3f46">&#9670;&nbsp;</a></span>ePutInt32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::ePutInt32 </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>l</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Write a portable long value to memory location. </p>
+<p >Converts a long (32 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.</p>
+<p >This routine puts a long value to a 4 byte character stream.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Pointer to memory to hold converted value </td></tr>
+ <tr><td class="paramname">l</td><td>Input value to be converted </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a65e9839f92b96eac7b0d071fac3bbe40" name="a65e9839f92b96eac7b0d071fac3bbe40"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a65e9839f92b96eac7b0d071fac3bbe40">&#9670;&nbsp;</a></span>ePutUInt16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::ePutUInt16 </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt16&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Write a portable unsigned short value to memory location. </p>
+<p >Converts an unsigned short (16 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.</p>
+<p >This routine puts an unsigned short value to a 2 byte character stream</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Pointer to memory to hold converted value </td></tr>
+ <tr><td class="paramname">s</td><td>Input value to be converted </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa3f6ceae4b96f24875d86848bf13a173" name="aa3f6ceae4b96f24875d86848bf13a173"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa3f6ceae4b96f24875d86848bf13a173">&#9670;&nbsp;</a></span>ePutUInt32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::ePutUInt32 </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ul</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Write a portable unsigned long value to memory location. </p>
+<p >Converts an unsigned long (32 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.</p>
+<p >This routine puts an unsigned long value to a 4 byte character stream.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Pointer to memory to hold converted value </td></tr>
+ <tr><td class="paramname">ul</td><td>Input value to be converted </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a78bd8a11dce102647095baf3aff2b006" name="a78bd8a11dce102647095baf3aff2b006"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78bd8a11dce102647095baf3aff2b006">&#9670;&nbsp;</a></span>FileExists() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbFile::FileExists </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Determines if a file exists. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if file exists<br />
+ xbFalse if file does not exist </dd></dl>
+
+</div>
+</div>
+<a id="a61130b4fbf4cf9d5972dcb4993de2f94" name="a61130b4fbf4cf9d5972dcb4993de2f94"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a61130b4fbf4cf9d5972dcb4993de2f94">&#9670;&nbsp;</a></span>FileExists() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbFile::FileExists </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Determines if a file exists. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- file name to check for</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if file exists<br />
+ xbFalse if file does not exist </dd></dl>
+
+</div>
+</div>
+<a id="a0592168f39a10f2a401a88ef781f6148" name="a0592168f39a10f2a401a88ef781f6148"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0592168f39a10f2a401a88ef781f6148">&#9670;&nbsp;</a></span>FileExists() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbFile::FileExists </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Determines if a file exists. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- file name to check for </td></tr>
+ <tr><td class="paramname">iOption</td><td>if 1, assume this is a request for a dbf file and check for the a dbt memo file also, returns true if both files are found</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if both dbf and dbt files exist<br />
+ xbFalse if file does not exist </dd></dl>
+
+</div>
+</div>
+<a id="a174d8a6aabc9cfcd32fedbd1e5b13ddd" name="a174d8a6aabc9cfcd32fedbd1e5b13ddd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a174d8a6aabc9cfcd32fedbd1e5b13ddd">&#9670;&nbsp;</a></span>FileExists() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbFile::FileExists </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Determines if a file exists. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOption</td><td>if 1, assume this is a request for a dbf file and check for the a dbt memo file also, returns true if both files are found</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if both files exist<br />
+ xbFalse if file does not exist </dd></dl>
+
+</div>
+</div>
+<a id="a7fa837938a32dc9ca3fbc81cbaf50f59" name="a7fa837938a32dc9ca3fbc81cbaf50f59"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7fa837938a32dc9ca3fbc81cbaf50f59">&#9670;&nbsp;</a></span>FileIsOpen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbFile::FileIsOpen </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Determines if file is open. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if file is open<br />
+ xbFalse if file is not open </dd></dl>
+
+</div>
+</div>
+<a id="abb9e20c5efacd4fea80f1515abbc6b55" name="abb9e20c5efacd4fea80f1515abbc6b55"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abb9e20c5efacd4fea80f1515abbc6b55">&#9670;&nbsp;</a></span>GetAutoCommit() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetAutoCommit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get auto commit setting. </p>
+<p >This routine returns the table setting if set, otherwise returns the system level setting.</p>
+<dl class="section return"><dt>Returns</dt><dd>Not 0 - Auto commit on for this table.<br />
+ 0 - Auto commit off for this table. </dd></dl>
+
+</div>
+</div>
+<a id="ae0c00226fd2ea7a67f101e795467ed68" name="ae0c00226fd2ea7a67f101e795467ed68"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae0c00226fd2ea7a67f101e795467ed68">&#9670;&nbsp;</a></span>GetAutoCommit() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetAutoCommit </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get auto commit setting. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOption</td><td>0 - Specific setting for this table<br />
+ 1 - If this table should be auto updated (takes DBMS setting into account) </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Not 0 - Auto commit on for this table.<br />
+ 0 - Auto commit off for this table. </dd></dl>
+
+</div>
+</div>
+<a id="a638e14262410a1627819f016a16cdce2" name="a638e14262410a1627819f016a16cdce2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a638e14262410a1627819f016a16cdce2">&#9670;&nbsp;</a></span>GetBlockSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbFile::GetBlockSize </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the block size. </p>
+<dl class="section return"><dt>Returns</dt><dd>Block Size </dd></dl>
+
+</div>
+</div>
+<a id="a643a80a3792a52760c8e09ba18719503" name="a643a80a3792a52760c8e09ba18719503"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a643a80a3792a52760c8e09ba18719503">&#9670;&nbsp;</a></span>GetCurRecNo()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbDbf::GetCurRecNo </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get Auto Lock setting. </p>
+<dl class="section return"><dt>Returns</dt><dd>Auto lock setting.</dd></dl>
+<p>Get a pointer to the current index object.</p>
+<dl class="section return"><dt>Returns</dt><dd>Pointer to current index.</dd></dl>
+<p>Return the current record number.</p>
+<dl class="section return"><dt>Returns</dt><dd>Returns the current record number. </dd></dl>
+
+</div>
+</div>
+<a id="a1d803a4bfc8ba0561267a0bf9e51f7d9" name="a1d803a4bfc8ba0561267a0bf9e51f7d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d803a4bfc8ba0561267a0bf9e51f7d9">&#9670;&nbsp;</a></span>GetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDataDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the current data directory. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the current data directory where the database files are stored. </dd></dl>
+
+</div>
+</div>
+<a id="ac624e06a97666bfd64b4f252b4548b36" name="ac624e06a97666bfd64b4f252b4548b36"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac624e06a97666bfd64b4f252b4548b36">&#9670;&nbsp;</a></span>GetDateField() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetDateField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dtFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get <a class="el" href="classxb_1_1xbDate.html" title="xbDate class.">xbDate</a> field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to retrieve. </td></tr>
+ <tr><td class="paramname">dtFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="af78ef1fba949463ff7f829d3cffc4555" name="af78ef1fba949463ff7f829d3cffc4555"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af78ef1fba949463ff7f829d3cffc4555">&#9670;&nbsp;</a></span>GetDateField() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetDateField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dtFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get <a class="el" href="classxb_1_1xbDate.html" title="xbDate class.">xbDate</a> field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">dtFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="ac1110d867ba297a52c8b0e83e88f05e6" name="ac1110d867ba297a52c8b0e83e88f05e6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac1110d867ba297a52c8b0e83e88f05e6">&#9670;&nbsp;</a></span>GetDbfStatus()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetDbfStatus </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Return the current dbf status. </p>
+<dl class="section return"><dt>Returns</dt><dd>0 = closed<br />
+ 1 = open<br />
+ 2 = updates pending<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a6982f973e81587b04916f4509746aaf5" name="a6982f973e81587b04916f4509746aaf5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6982f973e81587b04916f4509746aaf5">&#9670;&nbsp;</a></span>GetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the default auto commit setting. </p>
+<p >When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-&gt;Put() and dbf-&gt;<a class="el" href="classxb_1_1xbDbf.html#a5b412dd796241673eb1aa2c93513d69b" title="Append the current record to the data file.">AppendRecord()</a>.</p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if auto commit is turned on<br />
+ xbFalse is auto commit is turned off </dd></dl>
+
+</div>
+</div>
+<a id="a6fbb9c3a550ab0b3378f9586a57791d2" name="a6fbb9c3a550ab0b3378f9586a57791d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6fbb9c3a550ab0b3378f9586a57791d2">&#9670;&nbsp;</a></span>GetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the default date format. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the default date format. </dd></dl>
+
+</div>
+</div>
+<a id="abf3763faf6a8917a963213cd53af529c" name="abf3763faf6a8917a963213cd53af529c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf3763faf6a8917a963213cd53af529c">&#9670;&nbsp;</a></span>GetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a43878d4dc041f2a5e2398a118ccfaf79" name="a43878d4dc041f2a5e2398a118ccfaf79"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a43878d4dc041f2a5e2398a118ccfaf79">&#9670;&nbsp;</a></span>GetDefaultLogFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="acd0fb2166b2bff7e8a1cf65a7bc8be1e" name="acd0fb2166b2bff7e8a1cf65a7bc8be1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd0fb2166b2bff7e8a1cf65a7bc8be1e">&#9670;&nbsp;</a></span>GetDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbFile::GetDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the directory name. </p>
+<dl class="section return"><dt>Returns</dt><dd>the directory name of the file </dd></dl>
+
+</div>
+</div>
+<a id="a6e6774df0f2d7733f4b25a9989596d95" name="a6e6774df0f2d7733f4b25a9989596d95"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6e6774df0f2d7733f4b25a9989596d95">&#9670;&nbsp;</a></span>GetDoubleField() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetDoubleField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;&#160;</td>
+ <td class="paramname"><em>dFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get xbDouble field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to retrieve. </td></tr>
+ <tr><td class="paramname">dFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a4556041a7ff2f6b6f986729901c11f08" name="a4556041a7ff2f6b6f986729901c11f08"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4556041a7ff2f6b6f986729901c11f08">&#9670;&nbsp;</a></span>GetDoubleField() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetDoubleField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;&#160;</td>
+ <td class="paramname"><em>dFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get xbDouble field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">dFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a2370b5e736931441a5968649291b9ef4" name="a2370b5e736931441a5968649291b9ef4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2370b5e736931441a5968649291b9ef4">&#9670;&nbsp;</a></span>GetDoubleField() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetDoubleField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;&#160;</td>
+ <td class="paramname"><em>dFieldValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iRecBufSw</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get xbDouble field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">dFieldValue</td><td>Output field value. </td></tr>
+ <tr><td class="paramname">iRecBufSw</td><td>0 - Record buffer with any updates.<br />
+1 - Record buffer with original data. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a49cd162f066eef2b829ba7c9f6620243" name="a49cd162f066eef2b829ba7c9f6620243"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49cd162f066eef2b829ba7c9f6620243">&#9670;&nbsp;</a></span>GetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::GetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the Endian type. </p>
+<dl class="section return"><dt>Returns</dt><dd>B - Big endian<br />
+ L - Little endian<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a56961d2a67b8e7470098626ac4dac7e4" name="a56961d2a67b8e7470098626ac4dac7e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a56961d2a67b8e7470098626ac4dac7e4">&#9670;&nbsp;</a></span>GetErrorMessage()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char * xb::xbSsv::GetErrorMessage </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get an error message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>ErrorCode is the error number of description to be returned. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Returns a pointer to a string containing a text description for the error code. </dd></dl>
+
+</div>
+</div>
+<a id="a9a0fcf7e2040ab483e3807927833cb26" name="a9a0fcf7e2040ab483e3807927833cb26"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a0fcf7e2040ab483e3807927833cb26">&#9670;&nbsp;</a></span>GetField() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get <a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to retrieve </td></tr>
+ <tr><td class="paramname">sFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="ac81f078f3c932f0da60ad1fbdd848d3e" name="ac81f078f3c932f0da60ad1fbdd848d3e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac81f078f3c932f0da60ad1fbdd848d3e">&#9670;&nbsp;</a></span>GetField() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get field data for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">sFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="ad245a26eb8b79610c9ae7bab19e05513" name="ad245a26eb8b79610c9ae7bab19e05513"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad245a26eb8b79610c9ae7bab19e05513">&#9670;&nbsp;</a></span>GetField() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iRecBufSw</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get field data for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">sFieldValue</td><td>Output field value. </td></tr>
+ <tr><td class="paramname">iRecBufSw</td><td>0 - Record buffer with any updates.<br />
+1 - Record buffer with original data. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="add27d8ef555a13b336b8c804165dc15e" name="add27d8ef555a13b336b8c804165dc15e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#add27d8ef555a13b336b8c804165dc15e">&#9670;&nbsp;</a></span>GetFieldCnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt32 xb::xbDbf::GetFieldCnt </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Return the number of fields in the table. </p>
+<dl class="section return"><dt>Returns</dt><dd>The number of fields in the table. </dd></dl>
+
+</div>
+</div>
+<a id="a607f774fcd6dc0b9913d7a7801b60db2" name="a607f774fcd6dc0b9913d7a7801b60db2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a607f774fcd6dc0b9913d7a7801b60db2">&#9670;&nbsp;</a></span>GetFieldDecimal() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFieldDecimal </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iFieldDecimal</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get decimal for field name. </p>
+<p >This routine retreives a field's decimal length. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to retrieve </td></tr>
+ <tr><td class="paramname">iFieldDecimal</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="abcb4defad2e1b6e67f63cc60737ad840" name="abcb4defad2e1b6e67f63cc60737ad840"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abcb4defad2e1b6e67f63cc60737ad840">&#9670;&nbsp;</a></span>GetFieldDecimal() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFieldDecimal </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iFieldDecimal</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get decimal for field number. </p>
+<p >This routine retreives a field's decimal length. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve </td></tr>
+ <tr><td class="paramname">iFieldDecimal</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="acf06dbccdba1a4bcd90fa0bea6cca59b" name="acf06dbccdba1a4bcd90fa0bea6cca59b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acf06dbccdba1a4bcd90fa0bea6cca59b">&#9670;&nbsp;</a></span>GetFieldLen() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFieldLen </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iFieldLen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get field length for field name. </p>
+<p >This function retrieves a field's length.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to retrieve </td></tr>
+ <tr><td class="paramname">iFieldLen</td><td>Output field length value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="adda4302b58cc6109b048f19d9b68bbd4" name="adda4302b58cc6109b048f19d9b68bbd4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adda4302b58cc6109b048f19d9b68bbd4">&#9670;&nbsp;</a></span>GetFieldLen() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFieldLen </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iFieldLen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get field length for field number. </p>
+<p >This function retrieves a field's length.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Name of field to retrieve </td></tr>
+ <tr><td class="paramname">iFieldLen</td><td>Output field length value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a5e3e4368bfba1724c016b8859023e34c" name="a5e3e4368bfba1724c016b8859023e34c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5e3e4368bfba1724c016b8859023e34c">&#9670;&nbsp;</a></span>GetFieldName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFieldName </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Returns the name of the specified field. </p>
+<p >Returns a pointer to the name for the field specified by iFieldNo.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field. </td></tr>
+ <tr><td class="paramname">sFieldName</td><td>Output variable containing the field name. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="aad9029e63909aeb77d8473256d88bea8" name="aad9029e63909aeb77d8473256d88bea8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aad9029e63909aeb77d8473256d88bea8">&#9670;&nbsp;</a></span>GetFieldNo() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFieldNo </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get field ID number for a given field name. </p>
+<p >Returns the field number for the named field.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Number of field or XB_INVALID_FIELD_NAME. </dd></dl>
+
+</div>
+</div>
+<a id="aed9113b5095c6df1b9c854cbd0d8047b" name="aed9113b5095c6df1b9c854cbd0d8047b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aed9113b5095c6df1b9c854cbd0d8047b">&#9670;&nbsp;</a></span>GetFieldNo() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFieldNo </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the field number for name. </p>
+<p >Returns the field number for the named field.</p>
+<p >All field get/put methods require either a field number or field name as one of the parameters. Using the methods that take the field numbers will yield slightly better performance because the methods that take a name, have to look up the number.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field. </td></tr>
+ <tr><td class="paramname">iFieldNo</td><td>Output field number for the given name. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Number of field named fldName. </dd></dl>
+
+</div>
+</div>
+<a id="a181db879f1a75f93a34c03513a0b2fea" name="a181db879f1a75f93a34c03513a0b2fea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a181db879f1a75f93a34c03513a0b2fea">&#9670;&nbsp;</a></span>GetFieldType() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFieldType </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char &amp;&#160;</td>
+ <td class="paramname"><em>cFieldType</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get field type for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Field name. </td></tr>
+ <tr><td class="paramname">cFieldType</td><td>Output field type. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a5143973e4f165651152aa13c8fd45f84" name="a5143973e4f165651152aa13c8fd45f84"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5143973e4f165651152aa13c8fd45f84">&#9670;&nbsp;</a></span>GetFieldType() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFieldType </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char &amp;&#160;</td>
+ <td class="paramname"><em>cFieldType</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get field type for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Field number. </td></tr>
+ <tr><td class="paramname">cFieldType</td><td>Output field type. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="af5127c92892816e9bbc5c19653c4147a" name="af5127c92892816e9bbc5c19653c4147a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af5127c92892816e9bbc5c19653c4147a">&#9670;&nbsp;</a></span>GetFileDirPart() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileDirPart </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sCompleteFileNameIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileDirPartOut</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the directory part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sCompleteFileNameIn</td><td>- a fully qualfied input file name </td></tr>
+ <tr><td class="paramname">sFileDirPartOut</td><td>- the returned directory name part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a60c53998e3d1b694134b20a87bc9bf5a" name="a60c53998e3d1b694134b20a87bc9bf5a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a60c53998e3d1b694134b20a87bc9bf5a">&#9670;&nbsp;</a></span>GetFileDirPart() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileDirPart </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileDirPartOut</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the directory part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileDirPartOut</td><td>- the returned directory name </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab289b6ffe955321160c1f90220c22e25" name="ab289b6ffe955321160c1f90220c22e25"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab289b6ffe955321160c1f90220c22e25">&#9670;&nbsp;</a></span>GetFileExtPart() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileExtPart </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sCompleteFileNameIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileExtPartOut</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the extension part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sCompleteFileNameIn</td><td>- a fully qualfied input file name</td></tr>
+ <tr><td class="paramname">sFileExtPartOut</td><td>- the returned directory name part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a57a9222e5cbb51019d4eeb2c3ac89fa2" name="a57a9222e5cbb51019d4eeb2c3ac89fa2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57a9222e5cbb51019d4eeb2c3ac89fa2">&#9670;&nbsp;</a></span>GetFileExtPart() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileExtPart </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileNameExtOut</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the extension part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileNameExtOut</td><td>- the returned extension part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a02df78f4c90313243f508fc56b95aba8" name="a02df78f4c90313243f508fc56b95aba8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a02df78f4c90313243f508fc56b95aba8">&#9670;&nbsp;</a></span>GetFileMtime()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileMtime </td>
+ <td>(</td>
+ <td class="paramtype">time_t &amp;&#160;</td>
+ <td class="paramname"><em>mtime</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the time of last file modification timestamp as reported by the OS. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">mtime</td><td>- returned time of last file modification </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ac95cb882ccbcdedc9a233c6ad9fed07a" name="ac95cb882ccbcdedc9a233c6ad9fed07a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac95cb882ccbcdedc9a233c6ad9fed07a">&#9670;&nbsp;</a></span>GetFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbFile::GetFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the file name. </p>
+<dl class="section return"><dt>Returns</dt><dd>the file name portion of the file </dd></dl>
+
+</div>
+</div>
+<a id="a6110763c5ae996b72c7a62c15bdecc73" name="a6110763c5ae996b72c7a62c15bdecc73"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6110763c5ae996b72c7a62c15bdecc73">&#9670;&nbsp;</a></span>GetFileNamePart() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileNamePart </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sCompleteFileNameIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileNamePartOut</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the name part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sCompleteFileNameIn</td><td>- a fully qualified input file name </td></tr>
+ <tr><td class="paramname">sFileNamePartOut</td><td>- the returned file name part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a81422b3dd52763d2cc6c77237ec9af0a" name="a81422b3dd52763d2cc6c77237ec9af0a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81422b3dd52763d2cc6c77237ec9af0a">&#9670;&nbsp;</a></span>GetFileNamePart() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileNamePart </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileNamePartOut</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the name part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileNamePartOut</td><td>- the returned file name part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a50b63c39e49d44e52078038027b24cc5" name="a50b63c39e49d44e52078038027b24cc5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a50b63c39e49d44e52078038027b24cc5">&#9670;&nbsp;</a></span>GetFileSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileSize </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt64 &amp;&#160;</td>
+ <td class="paramname"><em>ullFileSize</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the size of the file as reported by the OS. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ullFileSize</td><td>- unsigned long long field as output </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5548236d38d43b89ae29b9a015b1f678" name="a5548236d38d43b89ae29b9a015b1f678"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5548236d38d43b89ae29b9a015b1f678">&#9670;&nbsp;</a></span>GetFileType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileType </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileTypeOut</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the file type aka Capitalized file extension. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileTypeOut</td><td>- the returned extension part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a6fc5b8a3e2f177d5ceaf9d975cbb5226" name="a6fc5b8a3e2f177d5ceaf9d975cbb5226"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6fc5b8a3e2f177d5ceaf9d975cbb5226">&#9670;&nbsp;</a></span>GetFirstRecord() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFirstRecord </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the first record. </p>
+<p >Get the first not deleted record. This routines skips over any deleted records. </p><dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="acb78991e8435edd36318c653cb977c1a" name="acb78991e8435edd36318c653cb977c1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acb78991e8435edd36318c653cb977c1a">&#9670;&nbsp;</a></span>GetFirstRecord() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFirstRecord </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the first record. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOption</td><td>XB_ALL_RECS - Get the first record, deleted or not.<br />
+ XB_ACTIVE_RECS - Get the first active record.<br />
+ XB_DELETED_RECS - Get the first deleted record.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a81ef2f36f921d7ece066a592eb6393eb" name="a81ef2f36f921d7ece066a592eb6393eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81ef2f36f921d7ece066a592eb6393eb">&#9670;&nbsp;</a></span>GetFloatField() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFloatField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a> &amp;&#160;</td>
+ <td class="paramname"><em>fFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get xbFloat field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">fFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a3443f646038ced14425f067a59c0f2da" name="a3443f646038ced14425f067a59c0f2da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3443f646038ced14425f067a59c0f2da">&#9670;&nbsp;</a></span>GetFloatField() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetFloatField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a> &amp;&#160;</td>
+ <td class="paramname"><em>fFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get xbFloat field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">fFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a31b4e641f93206ba23e2a5a27491dcd4" name="a31b4e641f93206ba23e2a5a27491dcd4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a31b4e641f93206ba23e2a5a27491dcd4">&#9670;&nbsp;</a></span>GetFqFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbFile::GetFqFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the fully qualified file name. </p>
+<dl class="section return"><dt>Returns</dt><dd>the fully qualfied name of the file </dd></dl>
+
+</div>
+</div>
+<a id="a49e667f9c8ee55c36444702663fc5964" name="a49e667f9c8ee55c36444702663fc5964"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49e667f9c8ee55c36444702663fc5964">&#9670;&nbsp;</a></span>GetLastRecord() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetLastRecord </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the last record. </p>
+<p >Get the last not deleted record. This routines skips over any deleted records. </p><dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a8ccfa2291417412b6894940d1b92f9a6" name="a8ccfa2291417412b6894940d1b92f9a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ccfa2291417412b6894940d1b92f9a6">&#9670;&nbsp;</a></span>GetLastRecord() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetLastRecord </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the last record. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOption</td><td>XB_ALL_RECS - Get the last record, deleted or not.<br />
+ XB_ACTIVE_RECS - Get the last active record.<br />
+ XB_DELETED_RECS - Get the last deleted record.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a943cea7fde1b06c1a05184193eff8d2d" name="a943cea7fde1b06c1a05184193eff8d2d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a943cea7fde1b06c1a05184193eff8d2d">&#9670;&nbsp;</a></span>GetLogicalField() <span class="overload">[1/5]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetLogicalField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;&#160;</td>
+ <td class="paramname"><em>bFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get logical field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to retrieve. </td></tr>
+ <tr><td class="paramname">bFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a9cd6819bfd932ff8507e54d9cb9a624e" name="a9cd6819bfd932ff8507e54d9cb9a624e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9cd6819bfd932ff8507e54d9cb9a624e">&#9670;&nbsp;</a></span>GetLogicalField() <span class="overload">[2/5]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetLogicalField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get logical field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to retrieve. </td></tr>
+ <tr><td class="paramname">sFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="aaf615ddcf08f8cd14efc713c2a8d7ae1" name="aaf615ddcf08f8cd14efc713c2a8d7ae1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf615ddcf08f8cd14efc713c2a8d7ae1">&#9670;&nbsp;</a></span>GetLogicalField() <span class="overload">[3/5]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetLogicalField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;&#160;</td>
+ <td class="paramname"><em>bFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get logical field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">bFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="ab28feef20c988b0a6f1c1911a45377b0" name="ab28feef20c988b0a6f1c1911a45377b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab28feef20c988b0a6f1c1911a45377b0">&#9670;&nbsp;</a></span>GetLogicalField() <span class="overload">[4/5]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetLogicalField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;&#160;</td>
+ <td class="paramname"><em>bFieldValue</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iRecBufSw</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get logical field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">bFieldValue</td><td>Output field value. </td></tr>
+ <tr><td class="paramname">iRecBufSw</td><td>0 - Record buffer with any updates.<br />
+1 - Record buffer with original data. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a3254f091fc4a1404abed3dd2bcdd6ce6" name="a3254f091fc4a1404abed3dd2bcdd6ce6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3254f091fc4a1404abed3dd2bcdd6ce6">&#9670;&nbsp;</a></span>GetLogicalField() <span class="overload">[5/5]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetLogicalField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get logical field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">sFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a7b8ef75b17941beac17e50e969b2d3db" name="a7b8ef75b17941beac17e50e969b2d3db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b8ef75b17941beac17e50e969b2d3db">&#9670;&nbsp;</a></span>GetLongField() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetLongField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32 &amp;&#160;</td>
+ <td class="paramname"><em>lFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get long field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">lFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="abe525c0820640e0a9e169d0b7913cfa1" name="abe525c0820640e0a9e169d0b7913cfa1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abe525c0820640e0a9e169d0b7913cfa1">&#9670;&nbsp;</a></span>GetLongField() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetLongField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32 &amp;&#160;</td>
+ <td class="paramname"><em>lFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get long field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">lFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="abd58031c5f1c3766c24d47a82e6fd9c5" name="abd58031c5f1c3766c24d47a82e6fd9c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd58031c5f1c3766c24d47a82e6fd9c5">&#9670;&nbsp;</a></span>GetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetMultiUser </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Multi user mode turned on.<br />
+ xbFalse - Multi user mode turned off.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="ab896fe3b734f556de578d30f92b18fe2" name="ab896fe3b734f556de578d30f92b18fe2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab896fe3b734f556de578d30f92b18fe2">&#9670;&nbsp;</a></span>GetNextRecord() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetNextRecord </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the next record. </p>
+<p >Get the next not deleted record. This routines skips over any deleted records. </p><dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a3191428a7a92d9107d8d42448884f2ac" name="a3191428a7a92d9107d8d42448884f2ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3191428a7a92d9107d8d42448884f2ac">&#9670;&nbsp;</a></span>GetNextRecord() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetNextRecord </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the next record. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOption</td><td>XB_ALL_RECS - Get the next record, deleted or not.<br />
+ XB_ACTIVE_RECS - Get the next active record.<br />
+ XB_DELETED_RECS - Get the next deleted record.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a18fdcb4ab15b36cd47fa6f6f7a540d1a" name="a18fdcb4ab15b36cd47fa6f6f7a540d1a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a18fdcb4ab15b36cd47fa6f6f7a540d1a">&#9670;&nbsp;</a></span>GetNextRecord() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetNextRecord </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulStartRec</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the next record. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOption</td><td>XB_ALL_RECS - Get the next record, deleted or not.<br />
+ XB_ACTIVE_RECS - Get the next active record.<br />
+ XB_DELETED_RECS - Get the next deleted record.<br />
+ </td></tr>
+ <tr><td class="paramname">ulStartRec</td><td>Get next record, starting from ulStartRec. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a3c500dc9dac22c49496e4b29386b2dd3" name="a3c500dc9dac22c49496e4b29386b2dd3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c500dc9dac22c49496e4b29386b2dd3">&#9670;&nbsp;</a></span>GetOpenMode()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetOpenMode </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the open mode of the file. </p>
+<dl class="section return"><dt>Returns</dt><dd>XB_READ<br />
+ XB_READ_WRITE<br />
+ XB_WRITE<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a13393704a8a191d4d6555ae31d3c3e92" name="a13393704a8a191d4d6555ae31d3c3e92"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a13393704a8a191d4d6555ae31d3c3e92">&#9670;&nbsp;</a></span>GetPhysicalIxCnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual xbInt32 xb::xbDbf::GetPhysicalIxCnt </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab3d248e5221b4f0809897cd43af17a1e" name="ab3d248e5221b4f0809897cd43af17a1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3d248e5221b4f0809897cd43af17a1e">&#9670;&nbsp;</a></span>GetPrevRecord() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetPrevRecord </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the previous record. </p>
+<p >Get the previous not deleted record. This routine skips over any deleted records. </p><dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a7eadc7b08d73003802b90584f7b33387" name="a7eadc7b08d73003802b90584f7b33387"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7eadc7b08d73003802b90584f7b33387">&#9670;&nbsp;</a></span>GetPrevRecord() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetPrevRecord </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the previous record. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOption</td><td>XB_ALL_RECS - Get the previous record, deleted or not.<br />
+ XB_ACTIVE_RECS - Get the previous active record.<br />
+ XB_DELETED_RECS - Get the previous deleted record.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="aabd146c0e1054ab905ec96aedd84b02e" name="aabd146c0e1054ab905ec96aedd84b02e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aabd146c0e1054ab905ec96aedd84b02e">&#9670;&nbsp;</a></span>GetRawField()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetRawField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>cBuf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBufSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iRecBufSw</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get raw field data for field number. </p>
+<p >This is a protected method, used by other methods. This method would be subject to buffer overflows if made public.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">cBuf</td><td>Pointer to buffer area provided by calling application program. </td></tr>
+ <tr><td class="paramname">ulBufSize</td><td>Size of data to copy </td></tr>
+ <tr><td class="paramname">iRecBufSw</td><td>0 - Record buffer with any updates.<br />
+1 - Record buffer with original data. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a26fba086b07caeab95066bf1c8d25161" name="a26fba086b07caeab95066bf1c8d25161"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a26fba086b07caeab95066bf1c8d25161">&#9670;&nbsp;</a></span>GetRecord()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetRecord </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulRecNo</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get record for specified record number. </p>
+<p >Retrieve a record from disk and load it into the record buffer. If auto commit is enabled and there are pending updates, this routine will flush the updates to disk before proceeding to ulRecNo.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulRecNo</td><td>- Record number to retrieve. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="aa3e38c4057d726a28a27d07a1610d124" name="aa3e38c4057d726a28a27d07a1610d124"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa3e38c4057d726a28a27d07a1610d124">&#9670;&nbsp;</a></span>GetRecordBuf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">char * xb::xbDbf::GetRecordBuf </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOpt</em> = <code>0</code></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get pointer to record buffer. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOpt</td><td>0 for RecBuf (current) or 1 for RecBuf2 (original contents)</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Pointer to record buffer. </dd></dl>
+
+</div>
+</div>
+<a id="ac196ad55335e1f4789d698748434dc89" name="ac196ad55335e1f4789d698748434dc89"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac196ad55335e1f4789d698748434dc89">&#9670;&nbsp;</a></span>GetRecordCnt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetRecordCnt </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32 &amp;&#160;</td>
+ <td class="paramname"><em>ulRecCnt</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the current number of records in the dbf data file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulRecCnt</td><td>Output number of records in file. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab50d76c6e29e81e347a6feb04c2f62bb" name="ab50d76c6e29e81e347a6feb04c2f62bb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab50d76c6e29e81e347a6feb04c2f62bb">&#9670;&nbsp;</a></span>GetRecordLen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt16 xb::xbDbf::GetRecordLen </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the dbf record length. </p>
+<dl class="section return"><dt>Returns</dt><dd>Record length. </dd></dl>
+
+</div>
+</div>
+<a id="a9b63e05b77f477ff6109ff7b9432c1b6" name="a9b63e05b77f477ff6109ff7b9432c1b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9b63e05b77f477ff6109ff7b9432c1b6">&#9670;&nbsp;</a></span>GetShareMode()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetShareMode </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the share mode of the file. </p>
+<dl class="section return"><dt>Returns</dt><dd>XB_SINGLE_USER - (file buffering on&gt;<br />
+ XB_MULTI_USER - (file buffering off)<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a27758a325c097f204247908b65ba7fbd" name="a27758a325c097f204247908b65ba7fbd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a27758a325c097f204247908b65ba7fbd">&#9670;&nbsp;</a></span>GetTblAlias()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbDbf::GetTblAlias </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the table alias. </p>
+<p >This routine returns the table alias. </p><dl class="section return"><dt>Returns</dt><dd>Table alias </dd></dl>
+
+</div>
+</div>
+<a id="a039eb02418ec4ca862adbc0f95b9cbec" name="a039eb02418ec4ca862adbc0f95b9cbec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a039eb02418ec4ca862adbc0f95b9cbec">&#9670;&nbsp;</a></span>GetULongField() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetULongField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32 &amp;&#160;</td>
+ <td class="paramname"><em>ulFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get unsigned long field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">ulFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a67e3a050f9090edf69eee75aef7f5d83" name="a67e3a050f9090edf69eee75aef7f5d83"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a67e3a050f9090edf69eee75aef7f5d83">&#9670;&nbsp;</a></span>GetULongField() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::GetULongField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32 &amp;&#160;</td>
+ <td class="paramname"><em>ulFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get unsigned long field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to retrieve. </td></tr>
+ <tr><td class="paramname">ulFieldValue</td><td>Output field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a49212a9eb17f7fa9f303e08d5fc50fc6" name="a49212a9eb17f7fa9f303e08d5fc50fc6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49212a9eb17f7fa9f303e08d5fc50fc6">&#9670;&nbsp;</a></span>GetVersion()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual xbInt16 xb::xbDbf::GetVersion </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a7af337808919680b90710ad5e8a99232" name="a7af337808919680b90710ad5e8a99232"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7af337808919680b90710ad5e8a99232">&#9670;&nbsp;</a></span>GetXbaseFileTypeByte() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetXbaseFileTypeByte </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char &amp;&#160;</td>
+ <td class="paramname"><em>cFileTypeByte</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the file type byte and version of the dbf file. </p>
+<p >Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- Name of file to examine </td></tr>
+ <tr><td class="paramname">cFileTypeByte</td><td>- Retruned first byte of dbf file </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a78aebdd21d3de46a450d5f835e3027f6" name="a78aebdd21d3de46a450d5f835e3027f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78aebdd21d3de46a450d5f835e3027f6">&#9670;&nbsp;</a></span>GetXbaseFileTypeByte() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetXbaseFileTypeByte </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char &amp;&#160;</td>
+ <td class="paramname"><em>cFileTypeByte</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iVersion</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the file type byte and version of the dbf file. </p>
+<p >Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- Name of file to examine </td></tr>
+ <tr><td class="paramname">cFileTypeByte</td><td>- Returned first byte of dbf file </td></tr>
+ <tr><td class="paramname">iVersion</td><td>- Returned file version </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="aaf2e697751a0beff41432a66bb83fb5e" name="aaf2e697751a0beff41432a66bb83fb5e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf2e697751a0beff41432a66bb83fb5e">&#9670;&nbsp;</a></span>GetXbaseFileTypeByte() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetXbaseFileTypeByte </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iVersion</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the file type byte and version of the dbf file. </p>
+<p >Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- Name of file to examine </td></tr>
+ <tr><td class="paramname">iVersion</td><td>- Returned file version </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab21ec23c076b0c9affdc0f6672bd133f" name="ab21ec23c076b0c9affdc0f6672bd133f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab21ec23c076b0c9affdc0f6672bd133f">&#9670;&nbsp;</a></span>GetXbasePtr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> * xb::xbDbf::GetXbasePtr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the pointer to the xbXbase structure,. </p>
+<dl class="section return"><dt>Returns</dt><dd>Pointer to xbXbase structure. </dd></dl>
+
+</div>
+</div>
+<a id="ad06fe0f7975fb81125d27d82504e6829" name="ad06fe0f7975fb81125d27d82504e6829"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad06fe0f7975fb81125d27d82504e6829">&#9670;&nbsp;</a></span>InitVars()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbDbf::InitVars </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac856fc1b110b46aefa1b2f5c0f530aa2" name="ac856fc1b110b46aefa1b2f5c0f530aa2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac856fc1b110b46aefa1b2f5c0f530aa2">&#9670;&nbsp;</a></span>MemoFieldsExist()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual <a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbDbf::MemoFieldsExist </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a361e3cc318bbf1c4d10f069e0800a24e" name="a361e3cc318bbf1c4d10f069e0800a24e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a361e3cc318bbf1c4d10f069e0800a24e">&#9670;&nbsp;</a></span>NameSuffixMissing()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::NameSuffixMissing </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Determines status of file extension. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- Name of file to examine </td></tr>
+ <tr><td class="paramname">iOption</td><td>- Inspection type<br />
+ 1 check for DBF<br />
+ 2 check for NDX<br />
+ 3 check for MDX<br />
+ 4 check for NTX<br />
+</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 if suffix found<br />
+ 1 if suffix not found, lower case<br />
+ 2 is suffix not found, upper case<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a97366c7362e409d7f09973a6aef8dad0" name="a97366c7362e409d7f09973a6aef8dad0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97366c7362e409d7f09973a6aef8dad0">&#9670;&nbsp;</a></span>Open() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual xbInt16 xb::xbDbf::Open </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTableName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac658818bf9b8f8ff7467d8d80495b324" name="ac658818bf9b8f8ff7467d8d80495b324"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac658818bf9b8f8ff7467d8d80495b324">&#9670;&nbsp;</a></span>Open() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual xbInt16 xb::xbDbf::Open </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTableName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sAlias</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a4d018cbf44d8d8b2145c9acab02c8adf" name="a4d018cbf44d8d8b2145c9acab02c8adf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4d018cbf44d8d8b2145c9acab02c8adf">&#9670;&nbsp;</a></span>Open() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual xbInt16 xb::xbDbf::Open </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTableName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sAlias</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOpenMode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iShareMode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8a52bf3ef2123c0d17e6b1f67bf0dc55" name="a8a52bf3ef2123c0d17e6b1f67bf0dc55"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8a52bf3ef2123c0d17e6b1f67bf0dc55">&#9670;&nbsp;</a></span>Pack() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::Pack </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Pack dbf file. </p>
+<p >This routine eliminates all deleted records from the file. </p><dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a93bb14ad0451355bfa3379128120988a" name="a93bb14ad0451355bfa3379128120988a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a93bb14ad0451355bfa3379128120988a">&#9670;&nbsp;</a></span>Pack() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::Pack </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32 &amp;&#160;</td>
+ <td class="paramname"><em>ulDeletedRecCnt</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Pack dbf file. </p>
+<p >This routine eliminates all deleted records from the file and clears out any unused blocks in the memo file if one exists. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulDeletedRecCnt</td><td>- Output - number of recrods removed from the file. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a571b36b3a940b1a16d5e834f329b33b9" name="a571b36b3a940b1a16d5e834f329b33b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a571b36b3a940b1a16d5e834f329b33b9">&#9670;&nbsp;</a></span>PutDateField() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutDateField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dtFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put date field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to update. </td></tr>
+ <tr><td class="paramname">dtFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a873f04af528a9d81e6a367a59d998ec5" name="a873f04af528a9d81e6a367a59d998ec5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a873f04af528a9d81e6a367a59d998ec5">&#9670;&nbsp;</a></span>PutDateField() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutDateField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbDate.html">xbDate</a> &amp;&#160;</td>
+ <td class="paramname"><em>dtFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put date field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to update. </td></tr>
+ <tr><td class="paramname">dtFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="ae695bbc71c19abc71c0c5f2ff2e1f971" name="ae695bbc71c19abc71c0c5f2ff2e1f971"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae695bbc71c19abc71c0c5f2ff2e1f971">&#9670;&nbsp;</a></span>PutDoubleField() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutDoubleField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a>&#160;</td>
+ <td class="paramname"><em>dFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put double field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to update. </td></tr>
+ <tr><td class="paramname">dFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a4f34842d7e8ff1f16992c2ece2fc38a5" name="a4f34842d7e8ff1f16992c2ece2fc38a5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4f34842d7e8ff1f16992c2ece2fc38a5">&#9670;&nbsp;</a></span>PutDoubleField() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutDoubleField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a>&#160;</td>
+ <td class="paramname"><em>dFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put double field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to update. </td></tr>
+ <tr><td class="paramname">dFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a7862215dd2f83a1c488e539cd1f9aec0" name="a7862215dd2f83a1c488e539cd1f9aec0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7862215dd2f83a1c488e539cd1f9aec0">&#9670;&nbsp;</a></span>PutField() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to update. </td></tr>
+ <tr><td class="paramname">sFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a142b0c0dc904917f3c68c5572c1237b5" name="a142b0c0dc904917f3c68c5572c1237b5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a142b0c0dc904917f3c68c5572c1237b5">&#9670;&nbsp;</a></span>PutField() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to update. </td></tr>
+ <tr><td class="paramname">sFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a4ea3241bc710d57e5f755efda62288ad" name="a4ea3241bc710d57e5f755efda62288ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4ea3241bc710d57e5f755efda62288ad">&#9670;&nbsp;</a></span>PutFloatField() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutFloatField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a>&#160;</td>
+ <td class="paramname"><em>fFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put float field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to update. </td></tr>
+ <tr><td class="paramname">fFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a64161eb50d72e424b11bf3732657ebd8" name="a64161eb50d72e424b11bf3732657ebd8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a64161eb50d72e424b11bf3732657ebd8">&#9670;&nbsp;</a></span>PutFloatField() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutFloatField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a>&#160;</td>
+ <td class="paramname"><em>fFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put float field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to update. </td></tr>
+ <tr><td class="paramname">fFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a507e400ca6526a9e0391cf06dd6a014e" name="a507e400ca6526a9e0391cf06dd6a014e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a507e400ca6526a9e0391cf06dd6a014e">&#9670;&nbsp;</a></span>PutLogicalField() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutLogicalField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put logical field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to update. </td></tr>
+ <tr><td class="paramname">sFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a623ca3ef5520c42308c1a16b518e7ff3" name="a623ca3ef5520c42308c1a16b518e7ff3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a623ca3ef5520c42308c1a16b518e7ff3">&#9670;&nbsp;</a></span>PutLogicalField() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutLogicalField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put logical field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to update. </td></tr>
+ <tr><td class="paramname">bFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="ab39ac4269ac63bc7ea4f638733bb17f0" name="ab39ac4269ac63bc7ea4f638733bb17f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab39ac4269ac63bc7ea4f638733bb17f0">&#9670;&nbsp;</a></span>PutLogicalField() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutLogicalField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put logical field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to update. </td></tr>
+ <tr><td class="paramname">sFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a423a0cb7bd252cedf956ace4954f275d" name="a423a0cb7bd252cedf956ace4954f275d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a423a0cb7bd252cedf956ace4954f275d">&#9670;&nbsp;</a></span>PutLogicalField() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutLogicalField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put logical field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to update. </td></tr>
+ <tr><td class="paramname">bFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="ae7aad223119edb3d541e9f65e88c9f2f" name="ae7aad223119edb3d541e9f65e88c9f2f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae7aad223119edb3d541e9f65e88c9f2f">&#9670;&nbsp;</a></span>PutLongField() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutLongField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>lFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put long field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to update. </td></tr>
+ <tr><td class="paramname">lFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a56c8f924284bf88aabf90b7930b4eb47" name="a56c8f924284bf88aabf90b7930b4eb47"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a56c8f924284bf88aabf90b7930b4eb47">&#9670;&nbsp;</a></span>PutLongField() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutLongField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>lFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put long field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to update. </td></tr>
+ <tr><td class="paramname">lFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="a3c36a5ffbc7067a1abbcb526dd3b981d" name="a3c36a5ffbc7067a1abbcb526dd3b981d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c36a5ffbc7067a1abbcb526dd3b981d">&#9670;&nbsp;</a></span>PutRecord() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutRecord </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Write the current record to disk. </p>
+<p >This routine is used to write any updates to the current record buffer to disk.</p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="aacbc7bac3ea0c502ee75b838f4f0fcbf" name="aacbc7bac3ea0c502ee75b838f4f0fcbf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aacbc7bac3ea0c502ee75b838f4f0fcbf">&#9670;&nbsp;</a></span>PutRecord() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutRecord </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulRecNo</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Write record to disk. </p>
+<p >This routine is used to write a copy of the current record buffer to disk for a given record number.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulRecNo</td><td>Record number to update. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ac62cb97c4e678c83f41788b1ae4d0381" name="ac62cb97c4e678c83f41788b1ae4d0381"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac62cb97c4e678c83f41788b1ae4d0381">&#9670;&nbsp;</a></span>PutULongField() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutULongField </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFieldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put unsigned long field for field name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFieldName</td><td>Name of field to update. </td></tr>
+ <tr><td class="paramname">ulFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="af5dec5c9ff903efffdb0490a44d296d2" name="af5dec5c9ff903efffdb0490a44d296d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af5dec5c9ff903efffdb0490a44d296d2">&#9670;&nbsp;</a></span>PutULongField() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::PutULongField </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iFieldNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulFieldValue</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Put unsigned long field for field number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iFieldNo</td><td>Number of field to update. </td></tr>
+ <tr><td class="paramname">ulFieldValue</td><td>Field value. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The field routines return one of:<br />
+ XB_NO_ERROR<br />
+XB_INVALID_DATA<br />
+XB_INVALID_FIELD_NO<br />
+XB_INVALID_FIELD_NAME<br />
+ XB_INVALID_FIELD_TYPE<br />
+XB_INVALID_DATA </dd></dl>
+
+</div>
+</div>
+<a id="aa1bb80340abc7a5c22f87f878e9dc825" name="aa1bb80340abc7a5c22f87f878e9dc825"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa1bb80340abc7a5c22f87f878e9dc825">&#9670;&nbsp;</a></span>ReadBlock() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::ReadBlock </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBlockNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>lReadSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>buf</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read a block of data from file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulBlockNo</td><td>- block number to read </td></tr>
+ <tr><td class="paramname">lReadSize</td><td>- size of data to read at block location, set to 0 to read blocksize </td></tr>
+ <tr><td class="paramname">*buf</td><td>- pointer to buffer to write output data, assumed to be previosuly allocated and large enough to contain data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="aef696b1c4c0ef5338e818599f695d485" name="aef696b1c4c0ef5338e818599f695d485"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aef696b1c4c0ef5338e818599f695d485">&#9670;&nbsp;</a></span>ReadBlock() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::ReadBlock </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBlockNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBlockSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>lReadSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>buf</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read a block of data from file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulBlockNo</td><td>- block number to read </td></tr>
+ <tr><td class="paramname">ulBlockSize</td><td>- block size </td></tr>
+ <tr><td class="paramname">lReadSize</td><td>- size of data to read at block location, set to 0 to read blocksize </td></tr>
+ <tr><td class="paramname">buf</td><td>- pointer to buffer to write output data, assumed to be previosuly allocated and large enough to contain data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a060541addb5bb1f0fe12959ed6f66fb9" name="a060541addb5bb1f0fe12959ed6f66fb9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a060541addb5bb1f0fe12959ed6f66fb9">&#9670;&nbsp;</a></span>ReadHeader()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::ReadHeader </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iPositionOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iReadOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read dbf file header information. </p>
+<p >This method assumes the header has been locked appropriately in a multi user environment</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iPositionOption</td><td>0 - Don't fseek to beginning of file before read.<br />
+ 1 - Start from beginning of file.</td></tr>
+ <tr><td class="paramname">iReadOption</td><td>0 - Read entire 32 byte header<br />
+ 1 - Read first eight bytes which includes the last update date and number of records.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a94d7d626ba691fd4b740c034673e6fc6" name="a94d7d626ba691fd4b740c034673e6fc6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94d7d626ba691fd4b740c034673e6fc6">&#9670;&nbsp;</a></span>RecordDeleted()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::RecordDeleted </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOpt</em> = <code>0</code></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Return record deletion status. </p>
+<p >This routine returns the record deletion status. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOpt</td><td>0 = Current record buffer, 1 = Original record buffer </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Record deleted.<br />
+xbFalse - Record not deleted. </dd></dl>
+
+</div>
+</div>
+<a id="a4cf7f0d423164f3cf074ae41f96f4e90" name="a4cf7f0d423164f3cf074ae41f96f4e90"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4cf7f0d423164f3cf074ae41f96f4e90">&#9670;&nbsp;</a></span>SetAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::SetAutoCommit </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iAutoCommit</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set auto commit. </p>
+<p >This routine sets the auto commit setting for this table. </p><dl class="section return"><dt>Returns</dt><dd>XB_NO_ERROR; </dd></dl>
+
+</div>
+</div>
+<a id="a991c5676a6f38fa752435390989f413e" name="a991c5676a6f38fa752435390989f413e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a991c5676a6f38fa752435390989f413e">&#9670;&nbsp;</a></span>SetBlockSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::SetBlockSize </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBlockSize</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the block size. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulBlockSize</td><td>- unsigned long block size, divisible by 512 </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a57caaaadfbd089d9a58ecfcb50c88a6c" name="a57caaaadfbd089d9a58ecfcb50c88a6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57caaaadfbd089d9a58ecfcb50c88a6c">&#9670;&nbsp;</a></span>SetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDataDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDataDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the data directory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDataDirectory</td><td>Set the data direcroty. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a25542afadaaf39b4fb5a1772a29cc0bd" name="a25542afadaaf39b4fb5a1772a29cc0bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25542afadaaf39b4fb5a1772a29cc0bd">&#9670;&nbsp;</a></span>SetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bDefaultAutoCommit</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the default auto commit. </p>
+<p >Disabling auto commit requires the application execute explicit updates using dbf-&gt;Put() and dbf-&gt;<a class="el" href="classxb_1_1xbDbf.html#a5b412dd796241673eb1aa2c93513d69b" title="Append the current record to the data file.">AppendRecord()</a>. With auto commit on, the library posts updates automatically when moving off the current record or closing a file.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bDefaultAutoCommit</td><td>xbTrue - Enable default auto commit.<br />
+ xbFalse - Disable default auto commit.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5f74db23f8902846d581935c7db73f9c" name="a5f74db23f8902846d581935c7db73f9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5f74db23f8902846d581935c7db73f9c">&#9670;&nbsp;</a></span>SetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultDateFormat</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the default date format. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDefaultDateFormat</td><td>Set the default date format. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a84343b8645790791512d6bc22ee6c8eb" name="a84343b8645790791512d6bc22ee6c8eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84343b8645790791512d6bc22ee6c8eb">&#9670;&nbsp;</a></span>SetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultLogDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae78a85255488bc78964c16946dbaead3" name="ae78a85255488bc78964c16946dbaead3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae78a85255488bc78964c16946dbaead3">&#9670;&nbsp;</a></span>SetDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::SetDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the directory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDirectory</td><td>- Valid directory name </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a904ec348fd029d4a76e72b8fde636108" name="a904ec348fd029d4a76e72b8fde636108"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a904ec348fd029d4a76e72b8fde636108">&#9670;&nbsp;</a></span>SetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the endian type. </p>
+<p >This routine determines the Endian-ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. </p>
+
+</div>
+</div>
+<a id="a5419eb27e56822f828b2b88a9502a636" name="a5419eb27e56822f828b2b88a9502a636"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5419eb27e56822f828b2b88a9502a636">&#9670;&nbsp;</a></span>SetFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::SetFileName </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the filename. </p>
+<p >This routine builds out two internal variables from the input file name<br />
+ sFileName - the file name part<br />
+ sFqFileName - the fully qualified file name<br />
+</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- Input file name </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aee832fa11db2077a532f49e1329bd05a" name="aee832fa11db2077a532f49e1329bd05a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aee832fa11db2077a532f49e1329bd05a">&#9670;&nbsp;</a></span>SetFqFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::SetFqFileName </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFqFileName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the fully qualifed filename. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFqFileName</td><td>- Fully qualifed input file name </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aba6e59512f7172dd55dcf92059e5928c" name="aba6e59512f7172dd55dcf92059e5928c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba6e59512f7172dd55dcf92059e5928c">&#9670;&nbsp;</a></span>SetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetMultiUser </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bMultiUser</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bMultiUser</td><td>xbTrue - Turn on Multi user mode.<br />
+ xbFalse - Turn off Multi user mode.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a7e63e852418f337eb7c44de5dcd50323" name="a7e63e852418f337eb7c44de5dcd50323"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7e63e852418f337eb7c44de5dcd50323">&#9670;&nbsp;</a></span>SetVersion()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual xbInt16 xb::xbDbf::SetVersion </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae94cb1bf9f75184f39d9e1a80ab49d4a" name="ae94cb1bf9f75184f39d9e1a80ab49d4a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae94cb1bf9f75184f39d9e1a80ab49d4a">&#9670;&nbsp;</a></span>UndeleteAllRecords()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::UndeleteAllRecords </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Undelete all records. </p>
+<p >This routine will remove the deletion flag on any deleted records in the table. </p><dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a255681976a04fc722538bb630507b3a0" name="a255681976a04fc722538bb630507b3a0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a255681976a04fc722538bb630507b3a0">&#9670;&nbsp;</a></span>UndeleteRecord()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::UndeleteRecord </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Undelete one record. </p>
+<p >This routine will undelete the current record, if it is deleted. </p><dl class="section return"><dt>Returns</dt><dd>XB_NO_ERROR<br />
+XB_INVALID_RECORD </dd></dl>
+
+</div>
+</div>
+<a id="aba5dcac3b4092261bc1669740cdd669d" name="aba5dcac3b4092261bc1669740cdd669d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba5dcac3b4092261bc1669740cdd669d">&#9670;&nbsp;</a></span>ValidateSchema()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">virtual xbInt16 xb::xbDbf::ValidateSchema </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="structxb_1_1xbSchema.html">xbSchema</a> *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">pure virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5d871dcfecc2b4338f7a13722aab766c" name="a5d871dcfecc2b4338f7a13722aab766c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5d871dcfecc2b4338f7a13722aab766c">&#9670;&nbsp;</a></span>WriteBlock()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::WriteBlock </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBlockNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>lWriteSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>buf</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Write a block of data to file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulBlockNo</td><td>- block number to write </td></tr>
+ <tr><td class="paramname">lWriteSize</td><td>- size of data to write, set to 0 to write blocksize </td></tr>
+ <tr><td class="paramname">*buf</td><td>- pointer to buffer of data to be written </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a44e1410109ef7b3d11a6af4b704b62b2" name="a44e1410109ef7b3d11a6af4b704b62b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a44e1410109ef7b3d11a6af4b704b62b2">&#9670;&nbsp;</a></span>WriteHeader()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::WriteHeader </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iPositionOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iWriteOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a18830b5755d74818f60d9c7ce38ddf2d" name="a18830b5755d74818f60d9c7ce38ddf2d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a18830b5755d74818f60d9c7ce38ddf2d">&#9670;&nbsp;</a></span>xbFclose()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFclose </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fclose. </p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="af5b6356832d2a67212070a1aa605f170" name="af5b6356832d2a67212070a1aa605f170"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af5b6356832d2a67212070a1aa605f170">&#9670;&nbsp;</a></span>xbFeof()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFeof </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary feof. </p>
+<dl class="section return"><dt>Returns</dt><dd>non zero if end-of-file is set for the stream. </dd></dl>
+
+</div>
+</div>
+<a id="ad205184d43409f04216540ae22f15009" name="ad205184d43409f04216540ae22f15009"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad205184d43409f04216540ae22f15009">&#9670;&nbsp;</a></span>xbFflush()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFflush </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fflush. </p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5ee229bda4d7d6695e122200e581e7a6" name="a5ee229bda4d7d6695e122200e581e7a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ee229bda4d7d6695e122200e581e7a6">&#9670;&nbsp;</a></span>xbFgetc() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFgetc </td>
+ <td>(</td>
+ <td class="paramtype">char &amp;&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fgetc. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>- output character returned by fgetc </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="afb1c584d2895ffb7834df80aea7eb1e4" name="afb1c584d2895ffb7834df80aea7eb1e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afb1c584d2895ffb7834df80aea7eb1e4">&#9670;&nbsp;</a></span>xbFgetc() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFgetc </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32 &amp;&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fgetc. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>- output integer returned by fgetc </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ad245955ace26e5dde85fd4373b30d026" name="ad245955ace26e5dde85fd4373b30d026"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad245955ace26e5dde85fd4373b30d026">&#9670;&nbsp;</a></span>xbFgets()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFgets </td>
+ <td>(</td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>lSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fgets. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lSize</td><td>- reads in at most, one character less than lSize </td></tr>
+ <tr><td class="paramname">s</td><td>- an <a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing data returned by fseek </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab0fa19686ca8953ff4b556fb5b249135" name="ab0fa19686ca8953ff4b556fb5b249135"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0fa19686ca8953ff4b556fb5b249135">&#9670;&nbsp;</a></span>xbFopen() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFopen </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOpenMode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iShareMode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fopen. </p>
+<p >This routine supports all the standard C library open modes. The Xbase routines only use "r" and "r+b".</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOpenMode</td><td><table class="doxtable">
+<tr>
+<th>OpenMode</th><th>Description </th></tr>
+<tr>
+<td>r</td><td>Reading </td></tr>
+<tr>
+<td>r+</td><td>Reading and Writing </td></tr>
+<tr>
+<td>w</td><td>Open for writing. Truncate to zero bytes if it exists </td></tr>
+<tr>
+<td>w+</td><td>Open for reading and writing, truncate to zero bytes if it exists </td></tr>
+<tr>
+<td>a</td><td>Open for append </td></tr>
+<tr>
+<td>a+</td><td>Open for reading and writing (at end). </td></tr>
+</table>
+The mode can also include the letter "b" for binary ie; "r+b". The "b" is ignored on POSIX compliant systems, but is included for cross platform compatibility. </td></tr>
+ <tr><td class="paramname">sFileName</td><td>File name to open </td></tr>
+ <tr><td class="paramname">iShareMode</td><td>XB_SINGLE_USER<br />
+ XB_MULTI_USER<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a0548cedf0f26b7d8ac221f75b0cd048c" name="a0548cedf0f26b7d8ac221f75b0cd048c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0548cedf0f26b7d8ac221f75b0cd048c">&#9670;&nbsp;</a></span>xbFopen() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFopen </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOpenMode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iShareMode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fopen. </p>
+<p >This routine supports all the standard C library open modes. The Xbase routines only use "r" and "r+".</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOpenMode</td><td><table class="doxtable">
+<tr>
+<th>OpenMode</th><th>Description </th></tr>
+<tr>
+<td>r</td><td>Reading </td></tr>
+<tr>
+<td>r+</td><td>Reading and Writing </td></tr>
+<tr>
+<td>w</td><td>Open for writing. Truncate to zero bytes if it exists </td></tr>
+<tr>
+<td>w+</td><td>Open for reading and writing, truncate to zero bytes if it exists </td></tr>
+<tr>
+<td>a</td><td>Open for append </td></tr>
+<tr>
+<td>a+</td><td>Open for reading and writing (at end). </td></tr>
+</table>
+The mode can also include the letter "b" for binary ie; "r+b". The "b" is ignored on POSIX compliant systems, but is included for cross platform compatibility. </td></tr>
+ <tr><td class="paramname">iShareMode</td><td>XB_SINGLE_USER<br />
+ XB_MULTI_USER<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a7cdfef5ede9ac98d44a28a6b7a70972c" name="a7cdfef5ede9ac98d44a28a6b7a70972c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7cdfef5ede9ac98d44a28a6b7a70972c">&#9670;&nbsp;</a></span>xbFopen() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFopen </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOpenMode</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aabd113333b49c36cad23244b392baab4" name="aabd113333b49c36cad23244b392baab4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aabd113333b49c36cad23244b392baab4">&#9670;&nbsp;</a></span>xbFopen() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFopen </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOpenMode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iShareMode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fopen. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOpenMode</td><td>XB_READ<br />
+ XB_READ_WRITE<br />
+ </td></tr>
+ <tr><td class="paramname">iShareMode</td><td>XB_SINGLE_USER<br />
+ XB_MULTI_USER<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="af2e940c78956e5cb6824f9a1bc404896" name="af2e940c78956e5cb6824f9a1bc404896"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2e940c78956e5cb6824f9a1bc404896">&#9670;&nbsp;</a></span>xbFputc() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFputc </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fputc. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Character to write </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a863f74cf17df8186d88586b4d2a6441a" name="a863f74cf17df8186d88586b4d2a6441a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a863f74cf17df8186d88586b4d2a6441a">&#9670;&nbsp;</a></span>xbFputc() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFputc </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>iNoOfTimes</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fputc. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Character to write </td></tr>
+ <tr><td class="paramname">iNoOfTimes</td><td>Number of times to write the character </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a698f3b40216778562e639e6ca1a47573" name="a698f3b40216778562e639e6ca1a47573"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a698f3b40216778562e639e6ca1a47573">&#9670;&nbsp;</a></span>xbFputs()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFputs </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fputs. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> to write to file </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab4f6afaa1f77539f27a4f05c26e54e2f" name="ab4f6afaa1f77539f27a4f05c26e54e2f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab4f6afaa1f77539f27a4f05c26e54e2f">&#9670;&nbsp;</a></span>xbFread()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFread </td>
+ <td>(</td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>nmemb</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fread. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>Pointer to data to write </td></tr>
+ <tr><td class="paramname">size</td><td>size of write </td></tr>
+ <tr><td class="paramname">nmemb</td><td>Number of times to write it </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5337ab8918df240910c0d19b4f298e3d" name="a5337ab8918df240910c0d19b4f298e3d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5337ab8918df240910c0d19b4f298e3d">&#9670;&nbsp;</a></span>xbFseek()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFseek </td>
+ <td>(</td>
+ <td class="paramtype">xbInt64&#160;</td>
+ <td class="paramname"><em>lOffset</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>iWhence</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fseek. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lOffset</td><td>Position in file to seek to </td></tr>
+ <tr><td class="paramname">iWhence</td><td>SEEK_SET - from beginning of file<br />
+ SEEK_CUR - from current position<br />
+ SEEK_END - from end of file<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a0e1c06aedfa7fbcb92e117f891edd13b" name="a0e1c06aedfa7fbcb92e117f891edd13b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0e1c06aedfa7fbcb92e117f891edd13b">&#9670;&nbsp;</a></span>xbFtell()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t xb::xbFile::xbFtell </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary ftell. </p>
+<p >Returns the current file position. </p><dl class="section return"><dt>Returns</dt><dd>Current file position. </dd></dl>
+
+</div>
+</div>
+<a id="a9891b792f585a696f38a5cf959e30918" name="a9891b792f585a696f38a5cf959e30918"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9891b792f585a696f38a5cf959e30918">&#9670;&nbsp;</a></span>xbFTurnOffFileBuffering()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::xbFTurnOffFileBuffering </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Turn off file buffering. </p>
+<p >Turns off file buffering. File buffering can't be used while in multi user mode. </p>
+
+</div>
+</div>
+<a id="a6aadd871d1782944703fed773d44b85f" name="a6aadd871d1782944703fed773d44b85f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6aadd871d1782944703fed773d44b85f">&#9670;&nbsp;</a></span>xbFwrite()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFwrite </td>
+ <td>(</td>
+ <td class="paramtype">const void *&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>nmemb</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fwrite. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>Pointer to data buffer to write </td></tr>
+ <tr><td class="paramname">size</td><td>Size of data to write </td></tr>
+ <tr><td class="paramname">nmemb</td><td>Number of times to write data buffer </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a08463f506f425c2385acbe1a561506e9" name="a08463f506f425c2385acbe1a561506e9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a08463f506f425c2385acbe1a561506e9">&#9670;&nbsp;</a></span>xbReadUntil()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbReadUntil </td>
+ <td>(</td>
+ <td class="paramtype">const char&#160;</td>
+ <td class="paramname"><em>cDelim</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOut</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Read file until a particular character is encountered on input stream. </p>
+<p >This routine will read until cDelim is encountered or eof, which ever occurs first.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">cDelim</td><td>Delimiter to stop writing at. </td></tr>
+ <tr><td class="paramname">sOut</td><td>Output <a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing data read </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab3c668a8570433188382d31d7c60bd48" name="ab3c668a8570433188382d31d7c60bd48"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3c668a8570433188382d31d7c60bd48">&#9670;&nbsp;</a></span>xbRemove() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbRemove </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Delete file. </p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a58f6a6751fdf7e9549c273bb75d93eb5" name="a58f6a6751fdf7e9549c273bb75d93eb5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58f6a6751fdf7e9549c273bb75d93eb5">&#9670;&nbsp;</a></span>xbRemove() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbRemove </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileNameIn</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Delete file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileNameIn</td><td>Name of file to delete </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a6d919366c2ec95e529906bf8842cbf07" name="a6d919366c2ec95e529906bf8842cbf07"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d919366c2ec95e529906bf8842cbf07">&#9670;&nbsp;</a></span>xbRemove() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbRemove </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileNameIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Delete file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileNameIn</td><td>Name of file to delete </td></tr>
+ <tr><td class="paramname">iOption</td><td>If Set to 1, assume this is a delete request for a dbf file, and should rename the dbt file also </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="afc8ce113aa72611a278233f9bb170012" name="afc8ce113aa72611a278233f9bb170012"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc8ce113aa72611a278233f9bb170012">&#9670;&nbsp;</a></span>xbRename() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbRename </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sNewName</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Rename file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOldName</td><td>Original file name </td></tr>
+ <tr><td class="paramname">sNewName</td><td>New file name </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab0b2a2c88947921d98ebcb5b5ec34ed9" name="ab0b2a2c88947921d98ebcb5b5ec34ed9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0b2a2c88947921d98ebcb5b5ec34ed9">&#9670;&nbsp;</a></span>xbRename() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbRename </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sNewName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Rename file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOldName</td><td>Original file name </td></tr>
+ <tr><td class="paramname">sNewName</td><td>New file name </td></tr>
+ <tr><td class="paramname">iOption</td><td>If Set to 1, assume this is a rename request for a dbf file, and should rename the dbt file also </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a7996b6e084665c37c3892faea64b3505" name="a7996b6e084665c37c3892faea64b3505"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7996b6e084665c37c3892faea64b3505">&#9670;&nbsp;</a></span>xbRewind()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::xbRewind </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for rewind. </p>
+<p >Set file pointer at beginning of file. </p>
+
+</div>
+</div>
+<a id="a518bfcbfa3699d883cf89affee383296" name="a518bfcbfa3699d883cf89affee383296"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a518bfcbfa3699d883cf89affee383296">&#9670;&nbsp;</a></span>xbTruncate()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbTruncate </td>
+ <td>(</td>
+ <td class="paramtype">xbInt64&#160;</td>
+ <td class="paramname"><em>llSize</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for ftruncate. </p>
+<p >Set file size to llSize </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">llSize</td><td>New file size. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a8ed0693b10b95aaa4e46037758d160ed" name="a8ed0693b10b95aaa4e46037758d160ed"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8ed0693b10b95aaa4e46037758d160ed">&#9670;&nbsp;</a></span>Zap()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::Zap </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">virtual</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Zap (remove) everything from the file,. </p>
+<p >This routine eliminates everything from the dbf file and dbt memo file. </p><dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Field Documentation</h2>
+<a id="a8734e799707582f022fc341d515650f4" name="a8734e799707582f022fc341d515650f4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8734e799707582f022fc341d515650f4">&#9670;&nbsp;</a></span>cEncryptionFlag</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbDbf::cEncryptionFlag</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ad59074633641e03647e54d2b66c9102b" name="ad59074633641e03647e54d2b66c9102b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad59074633641e03647e54d2b66c9102b">&#9670;&nbsp;</a></span>cIndexFlag</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbDbf::cIndexFlag</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1" name="aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1">&#9670;&nbsp;</a></span>cLangDriver</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbDbf::cLangDriver</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac3c89fc3bc6a6abf385478a8adbed970" name="ac3c89fc3bc6a6abf385478a8adbed970"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac3c89fc3bc6a6abf385478a8adbed970">&#9670;&nbsp;</a></span>cTransactionFlag</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbDbf::cTransactionFlag</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a6021789d314cd41488991e708fcd0df2" name="a6021789d314cd41488991e708fcd0df2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6021789d314cd41488991e708fcd0df2">&#9670;&nbsp;</a></span>cUpdateDD</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbDbf::cUpdateDD</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9340a5e8ee53eb0f3b6601eec2d71e1b" name="a9340a5e8ee53eb0f3b6601eec2d71e1b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9340a5e8ee53eb0f3b6601eec2d71e1b">&#9670;&nbsp;</a></span>cUpdateMM</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbDbf::cUpdateMM</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a4fcd6a86ddd32d4a9d76a4074573440a" name="a4fcd6a86ddd32d4a9d76a4074573440a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4fcd6a86ddd32d4a9d76a4074573440a">&#9670;&nbsp;</a></span>cUpdateYY</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbDbf::cUpdateYY</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a3a262abf658e5fa968b57ef457a69470" name="a3a262abf658e5fa968b57ef457a69470"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3a262abf658e5fa968b57ef457a69470">&#9670;&nbsp;</a></span>cVersion</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">unsigned char xb::xbDbf::cVersion</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a6219f1b5e24ea12fe158cd5aea56988e" name="a6219f1b5e24ea12fe158cd5aea56988e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6219f1b5e24ea12fe158cd5aea56988e">&#9670;&nbsp;</a></span>ErrorCodeText</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* xb::xbSsv::ErrorCodeText[]</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab506450954bc86e7bf1d7c4efe681f43" name="ab506450954bc86e7bf1d7c4efe681f43"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab506450954bc86e7bf1d7c4efe681f43">&#9670;&nbsp;</a></span>iAutoCommit</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::iAutoCommit</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a6d8e193da3ca414eef1e8866ec5ca81b" name="a6d8e193da3ca414eef1e8866ec5ca81b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d8e193da3ca414eef1e8866ec5ca81b">&#9670;&nbsp;</a></span>iDbfStatus</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::iDbfStatus</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5849e813f5e8e1cd180f0366637adbf3" name="a5849e813f5e8e1cd180f0366637adbf3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5849e813f5e8e1cd180f0366637adbf3">&#9670;&nbsp;</a></span>iEndianType</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::iEndianType = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a15f495446f0d75bcf2fa89e3b699d388" name="a15f495446f0d75bcf2fa89e3b699d388"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a15f495446f0d75bcf2fa89e3b699d388">&#9670;&nbsp;</a></span>iFileVersion</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::iFileVersion</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5056757614c39f725cc775332494966a" name="a5056757614c39f725cc775332494966a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5056757614c39f725cc775332494966a">&#9670;&nbsp;</a></span>iNoOfFields</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbDbf::iNoOfFields</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8a9b3bce0b741e73473d3ebbd6e6f1cd" name="a8a9b3bce0b741e73473d3ebbd6e6f1cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8a9b3bce0b741e73473d3ebbd6e6f1cd">&#9670;&nbsp;</a></span>RecBuf</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">char* xb::xbDbf::RecBuf</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a353ebfc8a2960ef827f429ec74025606" name="a353ebfc8a2960ef827f429ec74025606"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a353ebfc8a2960ef827f429ec74025606">&#9670;&nbsp;</a></span>RecBuf2</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">char* xb::xbDbf::RecBuf2</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a73f9c792d0a769e2e604c1855245a276" name="a73f9c792d0a769e2e604c1855245a276"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a73f9c792d0a769e2e604c1855245a276">&#9670;&nbsp;</a></span>sAlias</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbDbf::sAlias</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ad8c8b5eb12063bb898da1b2cc02cfce7" name="ad8c8b5eb12063bb898da1b2cc02cfce7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad8c8b5eb12063bb898da1b2cc02cfce7">&#9670;&nbsp;</a></span>SchemaPtr</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbSchemaRec* xb::xbDbf::SchemaPtr</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9dec3164c3b264882df634915ecf21da" name="a9dec3164c3b264882df634915ecf21da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9dec3164c3b264882df634915ecf21da">&#9670;&nbsp;</a></span>sNullString</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbSsv::sNullString = &quot;&quot;</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a62f5fa9149ae0f6dc75642823de66918" name="a62f5fa9149ae0f6dc75642823de66918"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62f5fa9149ae0f6dc75642823de66918">&#9670;&nbsp;</a></span>uiHeaderLen</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt16 xb::xbDbf::uiHeaderLen</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1760e222567e2c849f9c799b9d896e91" name="a1760e222567e2c849f9c799b9d896e91"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1760e222567e2c849f9c799b9d896e91">&#9670;&nbsp;</a></span>uiRecordLen</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt16 xb::xbDbf::uiRecordLen</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="afcd99924606be0a9e1e25180bcd1abf8" name="afcd99924606be0a9e1e25180bcd1abf8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afcd99924606be0a9e1e25180bcd1abf8">&#9670;&nbsp;</a></span>ulCurRec</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbDbf::ulCurRec</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="acb594ab61dd35b17bdf28394083f8e87" name="acb594ab61dd35b17bdf28394083f8e87"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acb594ab61dd35b17bdf28394083f8e87">&#9670;&nbsp;</a></span>ulNoOfRecs</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbDbf::ulNoOfRecs</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae39a67ea391b46055d4ca299cb222004" name="ae39a67ea391b46055d4ca299cb222004"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae39a67ea391b46055d4ca299cb222004">&#9670;&nbsp;</a></span>xbase</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a>* xb::xbFile::xbase</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following files:<ul>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/include/<a class="el" href="xbdbf_8h_source.html">xbdbf.h</a></li>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/core/<a class="el" href="xbdbf_8cpp.html">xbdbf.cpp</a></li>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/core/<a class="el" href="xbfields_8cpp.html">xbfields.cpp</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/classxb_1_1xbDbf.png b/docs/doxygen/html/classxb_1_1xbDbf.png
new file mode 100644
index 0000000..d7b0ae3
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbDbf.png
Binary files differ
diff --git a/docs/doxygen/html/classxb_1_1xbFile.html b/docs/doxygen/html/classxb_1_1xbFile.html
new file mode 100644
index 0000000..c3684e1
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbFile.html
@@ -0,0 +1,3362 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: xb::xbFile Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacexb.html">xb</a></li><li class="navelem"><a class="el" href="classxb_1_1xbFile.html">xbFile</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pro-attribs">Protected Attributes</a> &#124;
+<a href="#pro-static-attribs">Static Protected Attributes</a> </div>
+ <div class="headertitle"><div class="title">xb::xbFile Class Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>Class for handling low level file I/O.
+ <a href="classxb_1_1xbFile.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="xbfile_8h_source.html">xbfile.h</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for xb::xbFile:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classxb_1_1xbFile.png" usemap="#xb::xbFile_map" alt=""/>
+ <map id="xb::xbFile_map" name="xb::xbFile_map">
+<area href="classxb_1_1xbSsv.html" title="Class for handling shared system variables." alt="xb::xbSsv" shape="rect" coords="0,0,65,24"/>
+<area href="classxb_1_1xbDbf.html" title="Base class for handling dbf files/tables." alt="xb::xbDbf" shape="rect" coords="0,112,65,136"/>
+ </map>
+</div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a869eedd74c6eddc308852eb546c87176"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a869eedd74c6eddc308852eb546c87176">xbFile</a> (<a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *x)</td></tr>
+<tr class="memdesc:a869eedd74c6eddc308852eb546c87176"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class Constructor. <a href="classxb_1_1xbFile.html#a869eedd74c6eddc308852eb546c87176">More...</a><br /></td></tr>
+<tr class="separator:a869eedd74c6eddc308852eb546c87176"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a491f6c48076e89da2e791a42b2727a90"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a491f6c48076e89da2e791a42b2727a90">~xbFile</a> ()</td></tr>
+<tr class="memdesc:a491f6c48076e89da2e791a42b2727a90"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class Destructor. <a href="classxb_1_1xbFile.html#a491f6c48076e89da2e791a42b2727a90">More...</a><br /></td></tr>
+<tr class="separator:a491f6c48076e89da2e791a42b2727a90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae9a2ddb0adb8165b4ac2b6a28a932f7"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aae9a2ddb0adb8165b4ac2b6a28a932f7">CreateUniqueFileName</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDirIn, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sExtIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFqnOut)</td></tr>
+<tr class="memdesc:aae9a2ddb0adb8165b4ac2b6a28a932f7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a unique file name. <a href="classxb_1_1xbFile.html#aae9a2ddb0adb8165b4ac2b6a28a932f7">More...</a><br /></td></tr>
+<tr class="separator:aae9a2ddb0adb8165b4ac2b6a28a932f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5ffabde2c88ea58324f27e471f6bfc0"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ae5ffabde2c88ea58324f27e471f6bfc0">CreateUniqueFileName</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDirIn, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sExtIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFqnOut, xbInt16 iOption)</td></tr>
+<tr class="memdesc:ae5ffabde2c88ea58324f27e471f6bfc0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a unique file name. <a href="classxb_1_1xbFile.html#ae5ffabde2c88ea58324f27e471f6bfc0">More...</a><br /></td></tr>
+<tr class="separator:ae5ffabde2c88ea58324f27e471f6bfc0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd0fb2166b2bff7e8a1cf65a7bc8be1e"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#acd0fb2166b2bff7e8a1cf65a7bc8be1e">GetDirectory</a> () const</td></tr>
+<tr class="memdesc:acd0fb2166b2bff7e8a1cf65a7bc8be1e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the directory name. <a href="classxb_1_1xbFile.html#acd0fb2166b2bff7e8a1cf65a7bc8be1e">More...</a><br /></td></tr>
+<tr class="separator:acd0fb2166b2bff7e8a1cf65a7bc8be1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac95cb882ccbcdedc9a233c6ad9fed07a"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ac95cb882ccbcdedc9a233c6ad9fed07a">GetFileName</a> () const</td></tr>
+<tr class="memdesc:ac95cb882ccbcdedc9a233c6ad9fed07a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the file name. <a href="classxb_1_1xbFile.html#ac95cb882ccbcdedc9a233c6ad9fed07a">More...</a><br /></td></tr>
+<tr class="separator:ac95cb882ccbcdedc9a233c6ad9fed07a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31b4e641f93206ba23e2a5a27491dcd4"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a31b4e641f93206ba23e2a5a27491dcd4">GetFqFileName</a> () const</td></tr>
+<tr class="memdesc:a31b4e641f93206ba23e2a5a27491dcd4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the fully qualified file name. <a href="classxb_1_1xbFile.html#a31b4e641f93206ba23e2a5a27491dcd4">More...</a><br /></td></tr>
+<tr class="separator:a31b4e641f93206ba23e2a5a27491dcd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae78a85255488bc78964c16946dbaead3"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ae78a85255488bc78964c16946dbaead3">SetDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDirectory)</td></tr>
+<tr class="memdesc:ae78a85255488bc78964c16946dbaead3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the directory. <a href="classxb_1_1xbFile.html#ae78a85255488bc78964c16946dbaead3">More...</a><br /></td></tr>
+<tr class="separator:ae78a85255488bc78964c16946dbaead3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5419eb27e56822f828b2b88a9502a636"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5419eb27e56822f828b2b88a9502a636">SetFileName</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName)</td></tr>
+<tr class="memdesc:a5419eb27e56822f828b2b88a9502a636"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the filename. <a href="classxb_1_1xbFile.html#a5419eb27e56822f828b2b88a9502a636">More...</a><br /></td></tr>
+<tr class="separator:a5419eb27e56822f828b2b88a9502a636"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee832fa11db2077a532f49e1329bd05a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aee832fa11db2077a532f49e1329bd05a">SetFqFileName</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFqName)</td></tr>
+<tr class="memdesc:aee832fa11db2077a532f49e1329bd05a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the fully qualifed filename. <a href="classxb_1_1xbFile.html#aee832fa11db2077a532f49e1329bd05a">More...</a><br /></td></tr>
+<tr class="separator:aee832fa11db2077a532f49e1329bd05a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a638e14262410a1627819f016a16cdce2"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a638e14262410a1627819f016a16cdce2">GetBlockSize</a> () const</td></tr>
+<tr class="memdesc:a638e14262410a1627819f016a16cdce2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the block size. <a href="classxb_1_1xbFile.html#a638e14262410a1627819f016a16cdce2">More...</a><br /></td></tr>
+<tr class="separator:a638e14262410a1627819f016a16cdce2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a991c5676a6f38fa752435390989f413e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a991c5676a6f38fa752435390989f413e">SetBlockSize</a> (xbUInt32 ulBlockSize)</td></tr>
+<tr class="memdesc:a991c5676a6f38fa752435390989f413e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the block size. <a href="classxb_1_1xbFile.html#a991c5676a6f38fa752435390989f413e">More...</a><br /></td></tr>
+<tr class="separator:a991c5676a6f38fa752435390989f413e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c500dc9dac22c49496e4b29386b2dd3"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a3c500dc9dac22c49496e4b29386b2dd3">GetOpenMode</a> () const</td></tr>
+<tr class="memdesc:a3c500dc9dac22c49496e4b29386b2dd3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the open mode of the file. <a href="classxb_1_1xbFile.html#a3c500dc9dac22c49496e4b29386b2dd3">More...</a><br /></td></tr>
+<tr class="separator:a3c500dc9dac22c49496e4b29386b2dd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9b63e05b77f477ff6109ff7b9432c1b6"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a9b63e05b77f477ff6109ff7b9432c1b6">GetShareMode</a> () const</td></tr>
+<tr class="memdesc:a9b63e05b77f477ff6109ff7b9432c1b6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the share mode of the file. <a href="classxb_1_1xbFile.html#a9b63e05b77f477ff6109ff7b9432c1b6">More...</a><br /></td></tr>
+<tr class="separator:a9b63e05b77f477ff6109ff7b9432c1b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60c53998e3d1b694134b20a87bc9bf5a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a60c53998e3d1b694134b20a87bc9bf5a">GetFileDirPart</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileDirPartOut) const</td></tr>
+<tr class="memdesc:a60c53998e3d1b694134b20a87bc9bf5a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the directory part of the file name. <a href="classxb_1_1xbFile.html#a60c53998e3d1b694134b20a87bc9bf5a">More...</a><br /></td></tr>
+<tr class="separator:a60c53998e3d1b694134b20a87bc9bf5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5127c92892816e9bbc5c19653c4147a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#af5127c92892816e9bbc5c19653c4147a">GetFileDirPart</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sCompleteFileNameIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileDirPartOut) const</td></tr>
+<tr class="memdesc:af5127c92892816e9bbc5c19653c4147a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the directory part of the file name. <a href="classxb_1_1xbFile.html#af5127c92892816e9bbc5c19653c4147a">More...</a><br /></td></tr>
+<tr class="separator:af5127c92892816e9bbc5c19653c4147a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57a9222e5cbb51019d4eeb2c3ac89fa2"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a57a9222e5cbb51019d4eeb2c3ac89fa2">GetFileExtPart</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileExtPartOut) const</td></tr>
+<tr class="memdesc:a57a9222e5cbb51019d4eeb2c3ac89fa2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the extension part of the file name. <a href="classxb_1_1xbFile.html#a57a9222e5cbb51019d4eeb2c3ac89fa2">More...</a><br /></td></tr>
+<tr class="separator:a57a9222e5cbb51019d4eeb2c3ac89fa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab289b6ffe955321160c1f90220c22e25"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab289b6ffe955321160c1f90220c22e25">GetFileExtPart</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sCompleteFileNameIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileExtPartOut) const</td></tr>
+<tr class="memdesc:ab289b6ffe955321160c1f90220c22e25"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the extension part of the file name. <a href="classxb_1_1xbFile.html#ab289b6ffe955321160c1f90220c22e25">More...</a><br /></td></tr>
+<tr class="separator:ab289b6ffe955321160c1f90220c22e25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81422b3dd52763d2cc6c77237ec9af0a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a81422b3dd52763d2cc6c77237ec9af0a">GetFileNamePart</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileNamePartOut) const</td></tr>
+<tr class="memdesc:a81422b3dd52763d2cc6c77237ec9af0a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the name part of the file name. <a href="classxb_1_1xbFile.html#a81422b3dd52763d2cc6c77237ec9af0a">More...</a><br /></td></tr>
+<tr class="separator:a81422b3dd52763d2cc6c77237ec9af0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6110763c5ae996b72c7a62c15bdecc73"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a6110763c5ae996b72c7a62c15bdecc73">GetFileNamePart</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sCompleteFileNameIn, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileNamePartOut) const</td></tr>
+<tr class="memdesc:a6110763c5ae996b72c7a62c15bdecc73"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the name part of the file name. <a href="classxb_1_1xbFile.html#a6110763c5ae996b72c7a62c15bdecc73">More...</a><br /></td></tr>
+<tr class="separator:a6110763c5ae996b72c7a62c15bdecc73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5548236d38d43b89ae29b9a015b1f678"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5548236d38d43b89ae29b9a015b1f678">GetFileType</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileType) const</td></tr>
+<tr class="memdesc:a5548236d38d43b89ae29b9a015b1f678"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the file type aka Capitalized file extension. <a href="classxb_1_1xbFile.html#a5548236d38d43b89ae29b9a015b1f678">More...</a><br /></td></tr>
+<tr class="separator:a5548236d38d43b89ae29b9a015b1f678"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf2e697751a0beff41432a66bb83fb5e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aaf2e697751a0beff41432a66bb83fb5e">GetXbaseFileTypeByte</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 &amp;iVersion)</td></tr>
+<tr class="memdesc:aaf2e697751a0beff41432a66bb83fb5e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the file type byte and version of the dbf file. <a href="classxb_1_1xbFile.html#aaf2e697751a0beff41432a66bb83fb5e">More...</a><br /></td></tr>
+<tr class="separator:aaf2e697751a0beff41432a66bb83fb5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7af337808919680b90710ad5e8a99232"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a7af337808919680b90710ad5e8a99232">GetXbaseFileTypeByte</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, unsigned char &amp;cFileTypeByte)</td></tr>
+<tr class="memdesc:a7af337808919680b90710ad5e8a99232"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the file type byte and version of the dbf file. <a href="classxb_1_1xbFile.html#a7af337808919680b90710ad5e8a99232">More...</a><br /></td></tr>
+<tr class="separator:a7af337808919680b90710ad5e8a99232"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78aebdd21d3de46a450d5f835e3027f6"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a78aebdd21d3de46a450d5f835e3027f6">GetXbaseFileTypeByte</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, unsigned char &amp;cFileTypeByte, xbInt16 &amp;iVersion)</td></tr>
+<tr class="memdesc:a78aebdd21d3de46a450d5f835e3027f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the file type byte and version of the dbf file. <a href="classxb_1_1xbFile.html#a78aebdd21d3de46a450d5f835e3027f6">More...</a><br /></td></tr>
+<tr class="separator:a78aebdd21d3de46a450d5f835e3027f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2b6ac26018dc28f77afbb3f008c3f66"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ae2b6ac26018dc28f77afbb3f008c3f66">DetermineXbaseTableVersion</a> (unsigned char cFileTypeByte) const</td></tr>
+<tr class="memdesc:ae2b6ac26018dc28f77afbb3f008c3f66"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine xbase dbf version. <a href="classxb_1_1xbFile.html#ae2b6ac26018dc28f77afbb3f008c3f66">More...</a><br /></td></tr>
+<tr class="separator:ae2b6ac26018dc28f77afbb3f008c3f66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a740033664c9ad2611c90e2a6d0c2d3"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5a740033664c9ad2611c90e2a6d0c2d3">DetermineXbaseMemoVersion</a> (unsigned char cFileTypeByte) const</td></tr>
+<tr class="memdesc:a5a740033664c9ad2611c90e2a6d0c2d3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine which version the memo (dbt) file is. <a href="classxb_1_1xbFile.html#a5a740033664c9ad2611c90e2a6d0c2d3">More...</a><br /></td></tr>
+<tr class="separator:a5a740033664c9ad2611c90e2a6d0c2d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78bd8a11dce102647095baf3aff2b006"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a78bd8a11dce102647095baf3aff2b006">FileExists</a> () const</td></tr>
+<tr class="memdesc:a78bd8a11dce102647095baf3aff2b006"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if a file exists. <a href="classxb_1_1xbFile.html#a78bd8a11dce102647095baf3aff2b006">More...</a><br /></td></tr>
+<tr class="separator:a78bd8a11dce102647095baf3aff2b006"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a174d8a6aabc9cfcd32fedbd1e5b13ddd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a174d8a6aabc9cfcd32fedbd1e5b13ddd">FileExists</a> (xbInt16 iOption) const</td></tr>
+<tr class="memdesc:a174d8a6aabc9cfcd32fedbd1e5b13ddd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if a file exists. <a href="classxb_1_1xbFile.html#a174d8a6aabc9cfcd32fedbd1e5b13ddd">More...</a><br /></td></tr>
+<tr class="separator:a174d8a6aabc9cfcd32fedbd1e5b13ddd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61130b4fbf4cf9d5972dcb4993de2f94"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a61130b4fbf4cf9d5972dcb4993de2f94">FileExists</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName) const</td></tr>
+<tr class="memdesc:a61130b4fbf4cf9d5972dcb4993de2f94"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if a file exists. <a href="classxb_1_1xbFile.html#a61130b4fbf4cf9d5972dcb4993de2f94">More...</a><br /></td></tr>
+<tr class="separator:a61130b4fbf4cf9d5972dcb4993de2f94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0592168f39a10f2a401a88ef781f6148"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a0592168f39a10f2a401a88ef781f6148">FileExists</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iOption) const</td></tr>
+<tr class="memdesc:a0592168f39a10f2a401a88ef781f6148"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if a file exists. <a href="classxb_1_1xbFile.html#a0592168f39a10f2a401a88ef781f6148">More...</a><br /></td></tr>
+<tr class="separator:a0592168f39a10f2a401a88ef781f6148"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7fa837938a32dc9ca3fbc81cbaf50f59"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a7fa837938a32dc9ca3fbc81cbaf50f59">FileIsOpen</a> () const</td></tr>
+<tr class="memdesc:a7fa837938a32dc9ca3fbc81cbaf50f59"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines if file is open. <a href="classxb_1_1xbFile.html#a7fa837938a32dc9ca3fbc81cbaf50f59">More...</a><br /></td></tr>
+<tr class="separator:a7fa837938a32dc9ca3fbc81cbaf50f59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1bb80340abc7a5c22f87f878e9dc825"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aa1bb80340abc7a5c22f87f878e9dc825">ReadBlock</a> (xbUInt32 ulBlockNo, size_t readSize, void *buf)</td></tr>
+<tr class="memdesc:aa1bb80340abc7a5c22f87f878e9dc825"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read a block of data from file. <a href="classxb_1_1xbFile.html#aa1bb80340abc7a5c22f87f878e9dc825">More...</a><br /></td></tr>
+<tr class="separator:aa1bb80340abc7a5c22f87f878e9dc825"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef696b1c4c0ef5338e818599f695d485"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aef696b1c4c0ef5338e818599f695d485">ReadBlock</a> (xbUInt32 ulBlockNo, xbUInt32 ulBlockSize, size_t readSize, void *buf)</td></tr>
+<tr class="memdesc:aef696b1c4c0ef5338e818599f695d485"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read a block of data from file. <a href="classxb_1_1xbFile.html#aef696b1c4c0ef5338e818599f695d485">More...</a><br /></td></tr>
+<tr class="separator:aef696b1c4c0ef5338e818599f695d485"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5d871dcfecc2b4338f7a13722aab766c"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5d871dcfecc2b4338f7a13722aab766c">WriteBlock</a> (xbUInt32 ulBlockNo, size_t writeSize, void *buf)</td></tr>
+<tr class="memdesc:a5d871dcfecc2b4338f7a13722aab766c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a block of data to file. <a href="classxb_1_1xbFile.html#a5d871dcfecc2b4338f7a13722aab766c">More...</a><br /></td></tr>
+<tr class="separator:a5d871dcfecc2b4338f7a13722aab766c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a50b63c39e49d44e52078038027b24cc5"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a50b63c39e49d44e52078038027b24cc5">GetFileSize</a> (xbUInt64 &amp;ullFileSize)</td></tr>
+<tr class="memdesc:a50b63c39e49d44e52078038027b24cc5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the size of the file as reported by the OS. <a href="classxb_1_1xbFile.html#a50b63c39e49d44e52078038027b24cc5">More...</a><br /></td></tr>
+<tr class="separator:a50b63c39e49d44e52078038027b24cc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02df78f4c90313243f508fc56b95aba8"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a02df78f4c90313243f508fc56b95aba8">GetFileMtime</a> (time_t &amp;mtime)</td></tr>
+<tr class="memdesc:a02df78f4c90313243f508fc56b95aba8"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the time of last file modification timestamp as reported by the OS. <a href="classxb_1_1xbFile.html#a02df78f4c90313243f508fc56b95aba8">More...</a><br /></td></tr>
+<tr class="separator:a02df78f4c90313243f508fc56b95aba8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab14e4a11427f5efb81cba1dd32bd1aa1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab14e4a11427f5efb81cba1dd32bd1aa1">eGetDouble</a> (const char *p) const</td></tr>
+<tr class="memdesc:ab14e4a11427f5efb81cba1dd32bd1aa1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a portable double value. <a href="classxb_1_1xbFile.html#ab14e4a11427f5efb81cba1dd32bd1aa1">More...</a><br /></td></tr>
+<tr class="separator:ab14e4a11427f5efb81cba1dd32bd1aa1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60b24a5afc984c586bf384c7e915ba0d"><td class="memItemLeft" align="right" valign="top">xbInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a60b24a5afc984c586bf384c7e915ba0d">eGetInt32</a> (const char *p) const</td></tr>
+<tr class="memdesc:a60b24a5afc984c586bf384c7e915ba0d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a portable long value. <a href="classxb_1_1xbFile.html#a60b24a5afc984c586bf384c7e915ba0d">More...</a><br /></td></tr>
+<tr class="separator:a60b24a5afc984c586bf384c7e915ba0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78f052529d39a18deaface5a0d47d0b0"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a78f052529d39a18deaface5a0d47d0b0">eGetUInt32</a> (const char *p) const</td></tr>
+<tr class="memdesc:a78f052529d39a18deaface5a0d47d0b0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a portable unsigned long value. <a href="classxb_1_1xbFile.html#a78f052529d39a18deaface5a0d47d0b0">More...</a><br /></td></tr>
+<tr class="separator:a78f052529d39a18deaface5a0d47d0b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac40c991110ddc6fb30a72d90f4652762"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ac40c991110ddc6fb30a72d90f4652762">eGetInt16</a> (const char *p) const</td></tr>
+<tr class="memdesc:ac40c991110ddc6fb30a72d90f4652762"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a portable short value. <a href="classxb_1_1xbFile.html#ac40c991110ddc6fb30a72d90f4652762">More...</a><br /></td></tr>
+<tr class="separator:ac40c991110ddc6fb30a72d90f4652762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a936ade458e6d5e6d29f9b5031888d189"><td class="memItemLeft" align="right" valign="top">xbUInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a936ade458e6d5e6d29f9b5031888d189">eGetUInt16</a> (const char *p) const</td></tr>
+<tr class="memdesc:a936ade458e6d5e6d29f9b5031888d189"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a portable unsigned short value. <a href="classxb_1_1xbFile.html#a936ade458e6d5e6d29f9b5031888d189">More...</a><br /></td></tr>
+<tr class="separator:a936ade458e6d5e6d29f9b5031888d189"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98b6ff533ae93f90c977a2ba23eeb105"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a98b6ff533ae93f90c977a2ba23eeb105">ePutDouble</a> (char *p, <a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> d)</td></tr>
+<tr class="memdesc:a98b6ff533ae93f90c977a2ba23eeb105"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a portable double value to memory location. <a href="classxb_1_1xbFile.html#a98b6ff533ae93f90c977a2ba23eeb105">More...</a><br /></td></tr>
+<tr class="separator:a98b6ff533ae93f90c977a2ba23eeb105"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a19c37f76a2ccbb45019cb0fc373d3f46"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a19c37f76a2ccbb45019cb0fc373d3f46">ePutInt32</a> (char *p, xbInt32 l)</td></tr>
+<tr class="memdesc:a19c37f76a2ccbb45019cb0fc373d3f46"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a portable long value to memory location. <a href="classxb_1_1xbFile.html#a19c37f76a2ccbb45019cb0fc373d3f46">More...</a><br /></td></tr>
+<tr class="separator:a19c37f76a2ccbb45019cb0fc373d3f46"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3f6ceae4b96f24875d86848bf13a173"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aa3f6ceae4b96f24875d86848bf13a173">ePutUInt32</a> (char *p, xbUInt32 ul)</td></tr>
+<tr class="memdesc:aa3f6ceae4b96f24875d86848bf13a173"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a portable unsigned long value to memory location. <a href="classxb_1_1xbFile.html#aa3f6ceae4b96f24875d86848bf13a173">More...</a><br /></td></tr>
+<tr class="separator:aa3f6ceae4b96f24875d86848bf13a173"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29130f12739ac8fa837f4eaedf1338b2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a29130f12739ac8fa837f4eaedf1338b2">ePutInt16</a> (char *p, xbInt16 s)</td></tr>
+<tr class="memdesc:a29130f12739ac8fa837f4eaedf1338b2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a portable short value to memory location. <a href="classxb_1_1xbFile.html#a29130f12739ac8fa837f4eaedf1338b2">More...</a><br /></td></tr>
+<tr class="separator:a29130f12739ac8fa837f4eaedf1338b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65e9839f92b96eac7b0d071fac3bbe40"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a65e9839f92b96eac7b0d071fac3bbe40">ePutUInt16</a> (char *p, xbUInt16 s)</td></tr>
+<tr class="memdesc:a65e9839f92b96eac7b0d071fac3bbe40"><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a portable unsigned short value to memory location. <a href="classxb_1_1xbFile.html#a65e9839f92b96eac7b0d071fac3bbe40">More...</a><br /></td></tr>
+<tr class="separator:a65e9839f92b96eac7b0d071fac3bbe40"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18830b5755d74818f60d9c7ce38ddf2d"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a18830b5755d74818f60d9c7ce38ddf2d">xbFclose</a> ()</td></tr>
+<tr class="memdesc:a18830b5755d74818f60d9c7ce38ddf2d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fclose. <a href="classxb_1_1xbFile.html#a18830b5755d74818f60d9c7ce38ddf2d">More...</a><br /></td></tr>
+<tr class="separator:a18830b5755d74818f60d9c7ce38ddf2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5b6356832d2a67212070a1aa605f170"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#af5b6356832d2a67212070a1aa605f170">xbFeof</a> ()</td></tr>
+<tr class="memdesc:af5b6356832d2a67212070a1aa605f170"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary feof. <a href="classxb_1_1xbFile.html#af5b6356832d2a67212070a1aa605f170">More...</a><br /></td></tr>
+<tr class="separator:af5b6356832d2a67212070a1aa605f170"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad205184d43409f04216540ae22f15009"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ad205184d43409f04216540ae22f15009">xbFflush</a> ()</td></tr>
+<tr class="memdesc:ad205184d43409f04216540ae22f15009"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fflush. <a href="classxb_1_1xbFile.html#ad205184d43409f04216540ae22f15009">More...</a><br /></td></tr>
+<tr class="separator:ad205184d43409f04216540ae22f15009"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb1c584d2895ffb7834df80aea7eb1e4"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#afb1c584d2895ffb7834df80aea7eb1e4">xbFgetc</a> (xbInt32 &amp;c)</td></tr>
+<tr class="memdesc:afb1c584d2895ffb7834df80aea7eb1e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fgetc. <a href="classxb_1_1xbFile.html#afb1c584d2895ffb7834df80aea7eb1e4">More...</a><br /></td></tr>
+<tr class="separator:afb1c584d2895ffb7834df80aea7eb1e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ee229bda4d7d6695e122200e581e7a6"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5ee229bda4d7d6695e122200e581e7a6">xbFgetc</a> (char &amp;c)</td></tr>
+<tr class="memdesc:a5ee229bda4d7d6695e122200e581e7a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fgetc. <a href="classxb_1_1xbFile.html#a5ee229bda4d7d6695e122200e581e7a6">More...</a><br /></td></tr>
+<tr class="separator:a5ee229bda4d7d6695e122200e581e7a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7cdfef5ede9ac98d44a28a6b7a70972c"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a7cdfef5ede9ac98d44a28a6b7a70972c">xbFopen</a> (xbInt16 iOpenMode)</td></tr>
+<tr class="separator:a7cdfef5ede9ac98d44a28a6b7a70972c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0548cedf0f26b7d8ac221f75b0cd048c"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a0548cedf0f26b7d8ac221f75b0cd048c">xbFopen</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOpenMode, xbInt16 iShareMode)</td></tr>
+<tr class="memdesc:a0548cedf0f26b7d8ac221f75b0cd048c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fopen. <a href="classxb_1_1xbFile.html#a0548cedf0f26b7d8ac221f75b0cd048c">More...</a><br /></td></tr>
+<tr class="separator:a0548cedf0f26b7d8ac221f75b0cd048c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aabd113333b49c36cad23244b392baab4"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#aabd113333b49c36cad23244b392baab4">xbFopen</a> (xbInt16 iOpenMode, xbInt16 iShareMode)</td></tr>
+<tr class="memdesc:aabd113333b49c36cad23244b392baab4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fopen. <a href="classxb_1_1xbFile.html#aabd113333b49c36cad23244b392baab4">More...</a><br /></td></tr>
+<tr class="separator:aabd113333b49c36cad23244b392baab4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0fa19686ca8953ff4b556fb5b249135"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab0fa19686ca8953ff4b556fb5b249135">xbFopen</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sMode, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iShareMode)</td></tr>
+<tr class="memdesc:ab0fa19686ca8953ff4b556fb5b249135"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fopen. <a href="classxb_1_1xbFile.html#ab0fa19686ca8953ff4b556fb5b249135">More...</a><br /></td></tr>
+<tr class="separator:ab0fa19686ca8953ff4b556fb5b249135"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2e940c78956e5cb6824f9a1bc404896"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#af2e940c78956e5cb6824f9a1bc404896">xbFputc</a> (xbInt32 c)</td></tr>
+<tr class="memdesc:af2e940c78956e5cb6824f9a1bc404896"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fputc. <a href="classxb_1_1xbFile.html#af2e940c78956e5cb6824f9a1bc404896">More...</a><br /></td></tr>
+<tr class="separator:af2e940c78956e5cb6824f9a1bc404896"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a863f74cf17df8186d88586b4d2a6441a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a863f74cf17df8186d88586b4d2a6441a">xbFputc</a> (xbInt32 c, xbInt32 iNoTimes)</td></tr>
+<tr class="memdesc:a863f74cf17df8186d88586b4d2a6441a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fputc. <a href="classxb_1_1xbFile.html#a863f74cf17df8186d88586b4d2a6441a">More...</a><br /></td></tr>
+<tr class="separator:a863f74cf17df8186d88586b4d2a6441a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a698f3b40216778562e639e6ca1a47573"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a698f3b40216778562e639e6ca1a47573">xbFputs</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:a698f3b40216778562e639e6ca1a47573"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fputs. <a href="classxb_1_1xbFile.html#a698f3b40216778562e639e6ca1a47573">More...</a><br /></td></tr>
+<tr class="separator:a698f3b40216778562e639e6ca1a47573"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4f6afaa1f77539f27a4f05c26e54e2f"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab4f6afaa1f77539f27a4f05c26e54e2f">xbFread</a> (void *ptr, size_t size, size_t nmemb)</td></tr>
+<tr class="memdesc:ab4f6afaa1f77539f27a4f05c26e54e2f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fread. <a href="classxb_1_1xbFile.html#ab4f6afaa1f77539f27a4f05c26e54e2f">More...</a><br /></td></tr>
+<tr class="separator:ab4f6afaa1f77539f27a4f05c26e54e2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad245955ace26e5dde85fd4373b30d026"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ad245955ace26e5dde85fd4373b30d026">xbFgets</a> (size_t lSize, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sLine)</td></tr>
+<tr class="memdesc:ad245955ace26e5dde85fd4373b30d026"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fgets. <a href="classxb_1_1xbFile.html#ad245955ace26e5dde85fd4373b30d026">More...</a><br /></td></tr>
+<tr class="separator:ad245955ace26e5dde85fd4373b30d026"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e1c06aedfa7fbcb92e117f891edd13b"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a0e1c06aedfa7fbcb92e117f891edd13b">xbFtell</a> ()</td></tr>
+<tr class="memdesc:a0e1c06aedfa7fbcb92e117f891edd13b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary ftell. <a href="classxb_1_1xbFile.html#a0e1c06aedfa7fbcb92e117f891edd13b">More...</a><br /></td></tr>
+<tr class="separator:a0e1c06aedfa7fbcb92e117f891edd13b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5337ab8918df240910c0d19b4f298e3d"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a5337ab8918df240910c0d19b4f298e3d">xbFseek</a> (xbInt64 llOffset, xbInt32 whence)</td></tr>
+<tr class="memdesc:a5337ab8918df240910c0d19b4f298e3d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fseek. <a href="classxb_1_1xbFile.html#a5337ab8918df240910c0d19b4f298e3d">More...</a><br /></td></tr>
+<tr class="separator:a5337ab8918df240910c0d19b4f298e3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9891b792f585a696f38a5cf959e30918"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a9891b792f585a696f38a5cf959e30918">xbFTurnOffFileBuffering</a> ()</td></tr>
+<tr class="memdesc:a9891b792f585a696f38a5cf959e30918"><td class="mdescLeft">&#160;</td><td class="mdescRight">Turn off file buffering. <a href="classxb_1_1xbFile.html#a9891b792f585a696f38a5cf959e30918">More...</a><br /></td></tr>
+<tr class="separator:a9891b792f585a696f38a5cf959e30918"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6aadd871d1782944703fed773d44b85f"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a6aadd871d1782944703fed773d44b85f">xbFwrite</a> (const void *ptr, size_t lSize, size_t lNmemb)</td></tr>
+<tr class="memdesc:a6aadd871d1782944703fed773d44b85f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for standard libary fwrite. <a href="classxb_1_1xbFile.html#a6aadd871d1782944703fed773d44b85f">More...</a><br /></td></tr>
+<tr class="separator:a6aadd871d1782944703fed773d44b85f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08463f506f425c2385acbe1a561506e9"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a08463f506f425c2385acbe1a561506e9">xbReadUntil</a> (const char cDelim, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOut)</td></tr>
+<tr class="memdesc:a08463f506f425c2385acbe1a561506e9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Read file until a particular character is encountered on input stream. <a href="classxb_1_1xbFile.html#a08463f506f425c2385acbe1a561506e9">More...</a><br /></td></tr>
+<tr class="separator:a08463f506f425c2385acbe1a561506e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6d919366c2ec95e529906bf8842cbf07"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a6d919366c2ec95e529906bf8842cbf07">xbRemove</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iOption)</td></tr>
+<tr class="memdesc:a6d919366c2ec95e529906bf8842cbf07"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete file. <a href="classxb_1_1xbFile.html#a6d919366c2ec95e529906bf8842cbf07">More...</a><br /></td></tr>
+<tr class="separator:a6d919366c2ec95e529906bf8842cbf07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58f6a6751fdf7e9549c273bb75d93eb5"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a58f6a6751fdf7e9549c273bb75d93eb5">xbRemove</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName)</td></tr>
+<tr class="memdesc:a58f6a6751fdf7e9549c273bb75d93eb5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete file. <a href="classxb_1_1xbFile.html#a58f6a6751fdf7e9549c273bb75d93eb5">More...</a><br /></td></tr>
+<tr class="separator:a58f6a6751fdf7e9549c273bb75d93eb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3c668a8570433188382d31d7c60bd48"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab3c668a8570433188382d31d7c60bd48">xbRemove</a> ()</td></tr>
+<tr class="memdesc:ab3c668a8570433188382d31d7c60bd48"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete file. <a href="classxb_1_1xbFile.html#ab3c668a8570433188382d31d7c60bd48">More...</a><br /></td></tr>
+<tr class="separator:ab3c668a8570433188382d31d7c60bd48"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc8ce113aa72611a278233f9bb170012"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#afc8ce113aa72611a278233f9bb170012">xbRename</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOldName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sNewName)</td></tr>
+<tr class="memdesc:afc8ce113aa72611a278233f9bb170012"><td class="mdescLeft">&#160;</td><td class="mdescRight">Rename file. <a href="classxb_1_1xbFile.html#afc8ce113aa72611a278233f9bb170012">More...</a><br /></td></tr>
+<tr class="separator:afc8ce113aa72611a278233f9bb170012"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0b2a2c88947921d98ebcb5b5ec34ed9"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ab0b2a2c88947921d98ebcb5b5ec34ed9">xbRename</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOldName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sNewName, xbInt16 iOption)</td></tr>
+<tr class="memdesc:ab0b2a2c88947921d98ebcb5b5ec34ed9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Rename file. <a href="classxb_1_1xbFile.html#ab0b2a2c88947921d98ebcb5b5ec34ed9">More...</a><br /></td></tr>
+<tr class="separator:ab0b2a2c88947921d98ebcb5b5ec34ed9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7996b6e084665c37c3892faea64b3505"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a7996b6e084665c37c3892faea64b3505">xbRewind</a> ()</td></tr>
+<tr class="memdesc:a7996b6e084665c37c3892faea64b3505"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for rewind. <a href="classxb_1_1xbFile.html#a7996b6e084665c37c3892faea64b3505">More...</a><br /></td></tr>
+<tr class="separator:a7996b6e084665c37c3892faea64b3505"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a518bfcbfa3699d883cf89affee383296"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a518bfcbfa3699d883cf89affee383296">xbTruncate</a> (xbInt64 llSize)</td></tr>
+<tr class="memdesc:a518bfcbfa3699d883cf89affee383296"><td class="mdescLeft">&#160;</td><td class="mdescRight">Xbase wrapper for ftruncate. <a href="classxb_1_1xbFile.html#a518bfcbfa3699d883cf89affee383296">More...</a><br /></td></tr>
+<tr class="separator:a518bfcbfa3699d883cf89affee383296"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a361e3cc318bbf1c4d10f069e0800a24e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#a361e3cc318bbf1c4d10f069e0800a24e">NameSuffixMissing</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iOption) const</td></tr>
+<tr class="memdesc:a361e3cc318bbf1c4d10f069e0800a24e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determines status of file extension. <a href="classxb_1_1xbFile.html#a361e3cc318bbf1c4d10f069e0800a24e">More...</a><br /></td></tr>
+<tr class="separator:a361e3cc318bbf1c4d10f069e0800a24e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">DisplayError</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a97dfa59ab9a8e9f17454da0faceb023d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Display error message on console for a given error number. <a href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">More...</a><br /></td></tr>
+<tr class="separator:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">GetDefaultDateFormat</a> () const</td></tr>
+<tr class="memdesc:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default date format. <a href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">More...</a><br /></td></tr>
+<tr class="separator:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">GetDataDirectory</a> () const</td></tr>
+<tr class="memdesc:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the current data directory. <a href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">More...</a><br /></td></tr>
+<tr class="separator:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49cd162f066eef2b829ba7c9f6620243"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">GetEndianType</a> () const</td></tr>
+<tr class="memdesc:a49cd162f066eef2b829ba7c9f6620243"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the Endian type. <a href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">More...</a><br /></td></tr>
+<tr class="separator:a49cd162f066eef2b829ba7c9f6620243"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56961d2a67b8e7470098626ac4dac7e4"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">GetErrorMessage</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a56961d2a67b8e7470098626ac4dac7e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get an error message. <a href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">More...</a><br /></td></tr>
+<tr class="separator:a56961d2a67b8e7470098626ac4dac7e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">SetDataDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDataDirectory)</td></tr>
+<tr class="memdesc:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data directory. <a href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">More...</a><br /></td></tr>
+<tr class="separator:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f74db23f8902846d581935c7db73f9c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">SetDefaultDateFormat</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultDateFormat)</td></tr>
+<tr class="memdesc:a5f74db23f8902846d581935c7db73f9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default date format. <a href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">More...</a><br /></td></tr>
+<tr class="separator:a5f74db23f8902846d581935c7db73f9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62e4fd0a5888665c76bbbad962794e72"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">BitSet</a> (unsigned char c, xbInt16 iBitNo) const</td></tr>
+<tr class="memdesc:a62e4fd0a5888665c76bbbad962794e72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check a bit in a one byte field and see if it is set. <a href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">More...</a><br /></td></tr>
+<tr class="separator:a62e4fd0a5888665c76bbbad962794e72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6982f973e81587b04916f4509746aaf5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">GetDefaultAutoCommit</a> () const</td></tr>
+<tr class="memdesc:a6982f973e81587b04916f4509746aaf5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default auto commit setting. <a href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">More...</a><br /></td></tr>
+<tr class="separator:a6982f973e81587b04916f4509746aaf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">SetDefaultAutoCommit</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bDefaultAutoCommit)</td></tr>
+<tr class="memdesc:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default auto commit. <a href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">More...</a><br /></td></tr>
+<tr class="separator:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf3763faf6a8917a963213cd53af529c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abf3763faf6a8917a963213cd53af529c">GetDefaultLogDirectory</a> () const</td></tr>
+<tr class="separator:abf3763faf6a8917a963213cd53af529c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a43878d4dc041f2a5e2398a118ccfaf79">GetDefaultLogFileName</a> () const</td></tr>
+<tr class="separator:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84343b8645790791512d6bc22ee6c8eb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a84343b8645790791512d6bc22ee6c8eb">SetDefaultLogDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultLogDirectory)</td></tr>
+<tr class="separator:a84343b8645790791512d6bc22ee6c8eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">GetMultiUser</a> () const</td></tr>
+<tr class="memdesc:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">More...</a><br /></td></tr>
+<tr class="separator:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba6e59512f7172dd55dcf92059e5928c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">SetMultiUser</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bMultiUser)</td></tr>
+<tr class="memdesc:aba6e59512f7172dd55dcf92059e5928c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">More...</a><br /></td></tr>
+<tr class="separator:aba6e59512f7172dd55dcf92059e5928c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-static-attribs" name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memItemLeft" align="right" valign="top">static const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e">ErrorCodeText</a> []</td></tr>
+<tr class="separator:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-methods" name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a904ec348fd029d4a76e72b8fde636108"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">SetEndianType</a> ()</td></tr>
+<tr class="memdesc:a904ec348fd029d4a76e72b8fde636108"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the endian type. <a href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">More...</a><br /></td></tr>
+<tr class="separator:a904ec348fd029d4a76e72b8fde636108"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-attribs" name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr class="memitem:ae39a67ea391b46055d4ca299cb222004"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html#ae39a67ea391b46055d4ca299cb222004">xbase</a></td></tr>
+<tr class="separator:ae39a67ea391b46055d4ca299cb222004"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-static-attribs" name="pro-static-attribs"></a>
+Static Protected Attributes</h2></td></tr>
+<tr class="memitem:a5849e813f5e8e1cd180f0366637adbf3"><td class="memItemLeft" align="right" valign="top">static xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3">iEndianType</a> = 0</td></tr>
+<tr class="separator:a5849e813f5e8e1cd180f0366637adbf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9dec3164c3b264882df634915ecf21da"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da">sNullString</a> = &quot;&quot;</td></tr>
+<tr class="separator:a9dec3164c3b264882df634915ecf21da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p >Class for handling low level file I/O. </p>
+<p >The <a class="el" href="classxb_1_1xbFile.html" title="Class for handling low level file I/O.">xbFile</a> class is used as an abstraction layer to isolate the library from the nuances of different operating systems and machine architectures.</p>
+<p >This module handles low level file I/O and is a base class for the (dbf) table, (dbt) memo and (ndx,mdx) index classes. Files are opened and manipulated via methods in the <a class="el" href="classxb_1_1xbFile.html" title="Class for handling low level file I/O.">xbFile</a> class.<br />
+ This class handles:<br />
+ 1) Big and little endian reads/writes<br />
+ 2) 32 or 64 bit system calls, depending on OS<br />
+ 3) Various different c/c++ calls to open/close/read/write based on OS and compiler version<br />
+ <br />
+ If you are wanting to port this library to a new platform, start with this class. This class could be used if you want to write a platform independent program that needs R/W file access. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a869eedd74c6eddc308852eb546c87176" name="a869eedd74c6eddc308852eb546c87176"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a869eedd74c6eddc308852eb546c87176">&#9670;&nbsp;</a></span>xbFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbFile::xbFile </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td>
+ <td class="paramname"><em>x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Class Constructor. </p>
+
+</div>
+</div>
+<a id="a491f6c48076e89da2e791a42b2727a90" name="a491f6c48076e89da2e791a42b2727a90"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a491f6c48076e89da2e791a42b2727a90">&#9670;&nbsp;</a></span>~xbFile()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbFile::~xbFile </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Class Destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a62e4fd0a5888665c76bbbad962794e72" name="a62e4fd0a5888665c76bbbad962794e72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62e4fd0a5888665c76bbbad962794e72">&#9670;&nbsp;</a></span>BitSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::BitSet </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iBitNo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Check a bit in a one byte field and see if it is set. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>One byte char field to examine. </td></tr>
+ <tr><td class="paramname">iBitNo</td><td>which bit to examine. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue Bit is set<br />
+ xbFalse Bit is not set </dd></dl>
+
+</div>
+</div>
+<a id="aae9a2ddb0adb8165b4ac2b6a28a932f7" name="aae9a2ddb0adb8165b4ac2b6a28a932f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aae9a2ddb0adb8165b4ac2b6a28a932f7">&#9670;&nbsp;</a></span>CreateUniqueFileName() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::CreateUniqueFileName </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDirIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sExtIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFqnOut</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Create a unique file name. </p>
+<p >Given a directory and file extension as inputs, create a unique file name.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDirIn</td><td>Directory </td></tr>
+ <tr><td class="paramname">sExtIn</td><td>File Extension </td></tr>
+ <tr><td class="paramname">sFqnOut</td><td>A fully qualifed unique file name as output </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae5ffabde2c88ea58324f27e471f6bfc0" name="ae5ffabde2c88ea58324f27e471f6bfc0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae5ffabde2c88ea58324f27e471f6bfc0">&#9670;&nbsp;</a></span>CreateUniqueFileName() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::CreateUniqueFileName </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDirIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sExtIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFqnOut</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Create a unique file name. </p>
+<p >Given a directory and file extension as inputs, create a unique file name.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDirIn</td><td>Directory </td></tr>
+ <tr><td class="paramname">sExtIn</td><td>File Extension </td></tr>
+ <tr><td class="paramname">iOption</td><td>0 - look only for one file for a given directory and extension<br />
+ 1 - if file name extension is "dbf" or "DBF", verify unique dbt or DBT (memo) file is also available<br />
+ </td></tr>
+ <tr><td class="paramname">sFqnOut</td><td>A fully qualifed unique file name as output </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5a740033664c9ad2611c90e2a6d0c2d3" name="a5a740033664c9ad2611c90e2a6d0c2d3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a740033664c9ad2611c90e2a6d0c2d3">&#9670;&nbsp;</a></span>DetermineXbaseMemoVersion()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::DetermineXbaseMemoVersion </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char&#160;</td>
+ <td class="paramname"><em>cFileTypeByte</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determine which version the memo (dbt) file is. </p>
+<p >This routine uses the first byte in the dbf file to determine which memo file version is in use. The main difference between version 3 and 4 is that version 4 will reuse blocks if they become available. Version 3 does not.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">cFileTypeByte</td><td>is an output field and is one of:<br />
+ <br />
+ 0 - none<br />
+ 3 - Dbase III+<br />
+ 4 - Dbase IV<br />
+</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae2b6ac26018dc28f77afbb3f008c3f66" name="ae2b6ac26018dc28f77afbb3f008c3f66"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae2b6ac26018dc28f77afbb3f008c3f66">&#9670;&nbsp;</a></span>DetermineXbaseTableVersion()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::DetermineXbaseTableVersion </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char&#160;</td>
+ <td class="paramname"><em>cFileTypeByte</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determine xbase dbf version. </p>
+<p >This routine is used to determine which version of the Xbase classes can be used for a given DBF file.<br />
+</p>
+<p >It attempts to use the highest version compiled into the library.<br />
+</p>
+<p >References:<br />
+ This routine uses the first byte from the dbf file.<br />
+ Per DBase documentation:<br />
+ Valid dBASE for Windows table file, bits 0-2 indicate version number: 3 for dBASE Level 5, 4 for dBASE Level 7.<br />
+ Bit 3 and bit 7 indicate presence of a dBASE IV or dBASE for Windows memo file;<br />
+ Bits 4-6 indicate the presence of a dBASE IV SQL table;<br />
+ Bit 7 indicates the presence of any .DBT memo file (either a dBASE III PLUS type or a dBASE IV or dBASE for Windows memo file).<br />
+ <br />
+ Bachmann spec (used extensively in library build), page 7 - does not match DBase documentation<br />
+ <br />
+ returns<br />
+ 0 - unknown<br />
+ 3 - Dbase level 3<br />
+ 4 - Dbase level 4<br />
+ 5 - Dbase Level 5 (future)<br />
+ 7 - Dbase Level 7 (future)<br />
+ <br />
+ 1x - Clipper files (future)<br />
+ 2x - Foxbase files (future)<br />
+ <br />
+ </p>
+
+</div>
+</div>
+<a id="a97dfa59ab9a8e9f17454da0faceb023d" name="a97dfa59ab9a8e9f17454da0faceb023d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97dfa59ab9a8e9f17454da0faceb023d">&#9670;&nbsp;</a></span>DisplayError()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::DisplayError </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Display error message on console for a given error number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>Error number to reference </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab14e4a11427f5efb81cba1dd32bd1aa1" name="ab14e4a11427f5efb81cba1dd32bd1aa1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab14e4a11427f5efb81cba1dd32bd1aa1">&#9670;&nbsp;</a></span>eGetDouble()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> xb::xbFile::eGetDouble </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get a portable double value. </p>
+<p >This routine returns a double value from an 8 byte character stream, accounting for endian type.</p>
+<p >Converts a double (64 bit floating point) value stored at p from a portable format to the machine format.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>pointer to memory containing the portable double value</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the double value. </dd></dl>
+
+</div>
+</div>
+<a id="ac40c991110ddc6fb30a72d90f4652762" name="ac40c991110ddc6fb30a72d90f4652762"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac40c991110ddc6fb30a72d90f4652762">&#9670;&nbsp;</a></span>eGetInt16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::eGetInt16 </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get a portable short value. </p>
+<p >This routine returns a short int value from a 2 byte character stream, accounting for endian type.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>pointer to memory containing the portable long value</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the short value. </dd></dl>
+
+</div>
+</div>
+<a id="a60b24a5afc984c586bf384c7e915ba0d" name="a60b24a5afc984c586bf384c7e915ba0d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a60b24a5afc984c586bf384c7e915ba0d">&#9670;&nbsp;</a></span>eGetInt32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt32 xb::xbFile::eGetInt32 </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get a portable long value. </p>
+<p >This routine returns a long int value from a 4 byte character stream, accounting for endian type.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>pointer to memory containing the portable long value</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the long value. </dd></dl>
+
+</div>
+</div>
+<a id="a936ade458e6d5e6d29f9b5031888d189" name="a936ade458e6d5e6d29f9b5031888d189"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a936ade458e6d5e6d29f9b5031888d189">&#9670;&nbsp;</a></span>eGetUInt16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt16 xb::xbFile::eGetUInt16 </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get a portable unsigned short value. </p>
+<p >This routine returns a short unsigned int value from a 2 byte character stream, accounting for endian type.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>pointer to memory containing the portable long value</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the short value. </dd></dl>
+
+</div>
+</div>
+<a id="a78f052529d39a18deaface5a0d47d0b0" name="a78f052529d39a18deaface5a0d47d0b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78f052529d39a18deaface5a0d47d0b0">&#9670;&nbsp;</a></span>eGetUInt32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbFile::eGetUInt32 </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get a portable unsigned long value. </p>
+<p >This routine returns an unsigned long int value from a 4 byte character stream, accounting for endian type.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>pointer to memory containing the portable long value</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>the unsigned long value. </dd></dl>
+
+</div>
+</div>
+<a id="a98b6ff533ae93f90c977a2ba23eeb105" name="a98b6ff533ae93f90c977a2ba23eeb105"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a98b6ff533ae93f90c977a2ba23eeb105">&#9670;&nbsp;</a></span>ePutDouble()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::ePutDouble </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a>&#160;</td>
+ <td class="paramname"><em>d</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write a portable double value to memory location. </p>
+<p >Converts a double (64 bit floating point) value from machine format to a portable format and stores the converted value in the memory referenced by c.</p>
+<p >This routine puts a double value to an 8 byte character stream</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Pointer to memory to hold converted value </td></tr>
+ <tr><td class="paramname">d</td><td>Input value to be converted </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a29130f12739ac8fa837f4eaedf1338b2" name="a29130f12739ac8fa837f4eaedf1338b2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a29130f12739ac8fa837f4eaedf1338b2">&#9670;&nbsp;</a></span>ePutInt16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::ePutInt16 </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write a portable short value to memory location. </p>
+<p >Converts a short (16 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.</p>
+<p >This routine puts a short value to a 2 byte character stream</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Pointer to memory to hold converted value </td></tr>
+ <tr><td class="paramname">s</td><td>Input value to be converted </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a19c37f76a2ccbb45019cb0fc373d3f46" name="a19c37f76a2ccbb45019cb0fc373d3f46"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a19c37f76a2ccbb45019cb0fc373d3f46">&#9670;&nbsp;</a></span>ePutInt32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::ePutInt32 </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>l</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write a portable long value to memory location. </p>
+<p >Converts a long (32 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.</p>
+<p >This routine puts a long value to a 4 byte character stream.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Pointer to memory to hold converted value </td></tr>
+ <tr><td class="paramname">l</td><td>Input value to be converted </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a65e9839f92b96eac7b0d071fac3bbe40" name="a65e9839f92b96eac7b0d071fac3bbe40"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a65e9839f92b96eac7b0d071fac3bbe40">&#9670;&nbsp;</a></span>ePutUInt16()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::ePutUInt16 </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt16&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write a portable unsigned short value to memory location. </p>
+<p >Converts an unsigned short (16 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.</p>
+<p >This routine puts an unsigned short value to a 2 byte character stream</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Pointer to memory to hold converted value </td></tr>
+ <tr><td class="paramname">s</td><td>Input value to be converted </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa3f6ceae4b96f24875d86848bf13a173" name="aa3f6ceae4b96f24875d86848bf13a173"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa3f6ceae4b96f24875d86848bf13a173">&#9670;&nbsp;</a></span>ePutUInt32()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::ePutUInt32 </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ul</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write a portable unsigned long value to memory location. </p>
+<p >Converts an unsigned long (32 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.</p>
+<p >This routine puts an unsigned long value to a 4 byte character stream.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Pointer to memory to hold converted value </td></tr>
+ <tr><td class="paramname">ul</td><td>Input value to be converted </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a78bd8a11dce102647095baf3aff2b006" name="a78bd8a11dce102647095baf3aff2b006"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78bd8a11dce102647095baf3aff2b006">&#9670;&nbsp;</a></span>FileExists() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbFile::FileExists </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determines if a file exists. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if file exists<br />
+ xbFalse if file does not exist </dd></dl>
+
+</div>
+</div>
+<a id="a61130b4fbf4cf9d5972dcb4993de2f94" name="a61130b4fbf4cf9d5972dcb4993de2f94"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a61130b4fbf4cf9d5972dcb4993de2f94">&#9670;&nbsp;</a></span>FileExists() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbFile::FileExists </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determines if a file exists. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- file name to check for</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if file exists<br />
+ xbFalse if file does not exist </dd></dl>
+
+</div>
+</div>
+<a id="a0592168f39a10f2a401a88ef781f6148" name="a0592168f39a10f2a401a88ef781f6148"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0592168f39a10f2a401a88ef781f6148">&#9670;&nbsp;</a></span>FileExists() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbFile::FileExists </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determines if a file exists. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- file name to check for </td></tr>
+ <tr><td class="paramname">iOption</td><td>if 1, assume this is a request for a dbf file and check for the a dbt memo file also, returns true if both files are found</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if both dbf and dbt files exist<br />
+ xbFalse if file does not exist </dd></dl>
+
+</div>
+</div>
+<a id="a174d8a6aabc9cfcd32fedbd1e5b13ddd" name="a174d8a6aabc9cfcd32fedbd1e5b13ddd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a174d8a6aabc9cfcd32fedbd1e5b13ddd">&#9670;&nbsp;</a></span>FileExists() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbFile::FileExists </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determines if a file exists. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOption</td><td>if 1, assume this is a request for a dbf file and check for the a dbt memo file also, returns true if both files are found</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if both files exist<br />
+ xbFalse if file does not exist </dd></dl>
+
+</div>
+</div>
+<a id="a7fa837938a32dc9ca3fbc81cbaf50f59" name="a7fa837938a32dc9ca3fbc81cbaf50f59"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7fa837938a32dc9ca3fbc81cbaf50f59">&#9670;&nbsp;</a></span>FileIsOpen()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbFile::FileIsOpen </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determines if file is open. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if file is open<br />
+ xbFalse if file is not open </dd></dl>
+
+</div>
+</div>
+<a id="a638e14262410a1627819f016a16cdce2" name="a638e14262410a1627819f016a16cdce2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a638e14262410a1627819f016a16cdce2">&#9670;&nbsp;</a></span>GetBlockSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbFile::GetBlockSize </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the block size. </p>
+<dl class="section return"><dt>Returns</dt><dd>Block Size </dd></dl>
+
+</div>
+</div>
+<a id="a1d803a4bfc8ba0561267a0bf9e51f7d9" name="a1d803a4bfc8ba0561267a0bf9e51f7d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d803a4bfc8ba0561267a0bf9e51f7d9">&#9670;&nbsp;</a></span>GetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDataDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the current data directory. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the current data directory where the database files are stored. </dd></dl>
+
+</div>
+</div>
+<a id="a6982f973e81587b04916f4509746aaf5" name="a6982f973e81587b04916f4509746aaf5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6982f973e81587b04916f4509746aaf5">&#9670;&nbsp;</a></span>GetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the default auto commit setting. </p>
+<p >When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-&gt;Put() and dbf-&gt;AppendRecord().</p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if auto commit is turned on<br />
+ xbFalse is auto commit is turned off </dd></dl>
+
+</div>
+</div>
+<a id="a6fbb9c3a550ab0b3378f9586a57791d2" name="a6fbb9c3a550ab0b3378f9586a57791d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6fbb9c3a550ab0b3378f9586a57791d2">&#9670;&nbsp;</a></span>GetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the default date format. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the default date format. </dd></dl>
+
+</div>
+</div>
+<a id="abf3763faf6a8917a963213cd53af529c" name="abf3763faf6a8917a963213cd53af529c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf3763faf6a8917a963213cd53af529c">&#9670;&nbsp;</a></span>GetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a43878d4dc041f2a5e2398a118ccfaf79" name="a43878d4dc041f2a5e2398a118ccfaf79"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a43878d4dc041f2a5e2398a118ccfaf79">&#9670;&nbsp;</a></span>GetDefaultLogFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="acd0fb2166b2bff7e8a1cf65a7bc8be1e" name="acd0fb2166b2bff7e8a1cf65a7bc8be1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd0fb2166b2bff7e8a1cf65a7bc8be1e">&#9670;&nbsp;</a></span>GetDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbFile::GetDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the directory name. </p>
+<dl class="section return"><dt>Returns</dt><dd>the directory name of the file </dd></dl>
+
+</div>
+</div>
+<a id="a49cd162f066eef2b829ba7c9f6620243" name="a49cd162f066eef2b829ba7c9f6620243"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49cd162f066eef2b829ba7c9f6620243">&#9670;&nbsp;</a></span>GetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::GetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the Endian type. </p>
+<dl class="section return"><dt>Returns</dt><dd>B - Big endian<br />
+ L - Little endian<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a56961d2a67b8e7470098626ac4dac7e4" name="a56961d2a67b8e7470098626ac4dac7e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a56961d2a67b8e7470098626ac4dac7e4">&#9670;&nbsp;</a></span>GetErrorMessage()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char * xb::xbSsv::GetErrorMessage </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get an error message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>ErrorCode is the error number of description to be returned. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Returns a pointer to a string containing a text description for the error code. </dd></dl>
+
+</div>
+</div>
+<a id="af5127c92892816e9bbc5c19653c4147a" name="af5127c92892816e9bbc5c19653c4147a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af5127c92892816e9bbc5c19653c4147a">&#9670;&nbsp;</a></span>GetFileDirPart() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileDirPart </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sCompleteFileNameIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileDirPartOut</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the directory part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sCompleteFileNameIn</td><td>- a fully qualfied input file name </td></tr>
+ <tr><td class="paramname">sFileDirPartOut</td><td>- the returned directory name part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a60c53998e3d1b694134b20a87bc9bf5a" name="a60c53998e3d1b694134b20a87bc9bf5a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a60c53998e3d1b694134b20a87bc9bf5a">&#9670;&nbsp;</a></span>GetFileDirPart() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileDirPart </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileDirPartOut</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the directory part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileDirPartOut</td><td>- the returned directory name </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab289b6ffe955321160c1f90220c22e25" name="ab289b6ffe955321160c1f90220c22e25"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab289b6ffe955321160c1f90220c22e25">&#9670;&nbsp;</a></span>GetFileExtPart() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileExtPart </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sCompleteFileNameIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileExtPartOut</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the extension part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sCompleteFileNameIn</td><td>- a fully qualfied input file name</td></tr>
+ <tr><td class="paramname">sFileExtPartOut</td><td>- the returned directory name part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a57a9222e5cbb51019d4eeb2c3ac89fa2" name="a57a9222e5cbb51019d4eeb2c3ac89fa2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57a9222e5cbb51019d4eeb2c3ac89fa2">&#9670;&nbsp;</a></span>GetFileExtPart() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileExtPart </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileNameExtOut</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the extension part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileNameExtOut</td><td>- the returned extension part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a02df78f4c90313243f508fc56b95aba8" name="a02df78f4c90313243f508fc56b95aba8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a02df78f4c90313243f508fc56b95aba8">&#9670;&nbsp;</a></span>GetFileMtime()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileMtime </td>
+ <td>(</td>
+ <td class="paramtype">time_t &amp;&#160;</td>
+ <td class="paramname"><em>mtime</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the time of last file modification timestamp as reported by the OS. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">mtime</td><td>- returned time of last file modification </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ac95cb882ccbcdedc9a233c6ad9fed07a" name="ac95cb882ccbcdedc9a233c6ad9fed07a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac95cb882ccbcdedc9a233c6ad9fed07a">&#9670;&nbsp;</a></span>GetFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbFile::GetFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the file name. </p>
+<dl class="section return"><dt>Returns</dt><dd>the file name portion of the file </dd></dl>
+
+</div>
+</div>
+<a id="a6110763c5ae996b72c7a62c15bdecc73" name="a6110763c5ae996b72c7a62c15bdecc73"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6110763c5ae996b72c7a62c15bdecc73">&#9670;&nbsp;</a></span>GetFileNamePart() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileNamePart </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sCompleteFileNameIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileNamePartOut</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the name part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sCompleteFileNameIn</td><td>- a fully qualified input file name </td></tr>
+ <tr><td class="paramname">sFileNamePartOut</td><td>- the returned file name part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a81422b3dd52763d2cc6c77237ec9af0a" name="a81422b3dd52763d2cc6c77237ec9af0a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a81422b3dd52763d2cc6c77237ec9af0a">&#9670;&nbsp;</a></span>GetFileNamePart() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileNamePart </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileNamePartOut</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the name part of the file name. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileNamePartOut</td><td>- the returned file name part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a50b63c39e49d44e52078038027b24cc5" name="a50b63c39e49d44e52078038027b24cc5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a50b63c39e49d44e52078038027b24cc5">&#9670;&nbsp;</a></span>GetFileSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileSize </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt64 &amp;&#160;</td>
+ <td class="paramname"><em>ullFileSize</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the size of the file as reported by the OS. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ullFileSize</td><td>- unsigned long long field as output </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5548236d38d43b89ae29b9a015b1f678" name="a5548236d38d43b89ae29b9a015b1f678"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5548236d38d43b89ae29b9a015b1f678">&#9670;&nbsp;</a></span>GetFileType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetFileType </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileTypeOut</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the file type aka Capitalized file extension. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileTypeOut</td><td>- the returned extension part out of sCompleteFileNameIn </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a31b4e641f93206ba23e2a5a27491dcd4" name="a31b4e641f93206ba23e2a5a27491dcd4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a31b4e641f93206ba23e2a5a27491dcd4">&#9670;&nbsp;</a></span>GetFqFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbFile::GetFqFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the fully qualified file name. </p>
+<dl class="section return"><dt>Returns</dt><dd>the fully qualfied name of the file </dd></dl>
+
+</div>
+</div>
+<a id="abd58031c5f1c3766c24d47a82e6fd9c5" name="abd58031c5f1c3766c24d47a82e6fd9c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd58031c5f1c3766c24d47a82e6fd9c5">&#9670;&nbsp;</a></span>GetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetMultiUser </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Multi user mode turned on.<br />
+ xbFalse - Multi user mode turned off.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a3c500dc9dac22c49496e4b29386b2dd3" name="a3c500dc9dac22c49496e4b29386b2dd3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c500dc9dac22c49496e4b29386b2dd3">&#9670;&nbsp;</a></span>GetOpenMode()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetOpenMode </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the open mode of the file. </p>
+<dl class="section return"><dt>Returns</dt><dd>XB_READ<br />
+ XB_READ_WRITE<br />
+ XB_WRITE<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a9b63e05b77f477ff6109ff7b9432c1b6" name="a9b63e05b77f477ff6109ff7b9432c1b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9b63e05b77f477ff6109ff7b9432c1b6">&#9670;&nbsp;</a></span>GetShareMode()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetShareMode </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the share mode of the file. </p>
+<dl class="section return"><dt>Returns</dt><dd>XB_SINGLE_USER - (file buffering on&gt;<br />
+ XB_MULTI_USER - (file buffering off)<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a7af337808919680b90710ad5e8a99232" name="a7af337808919680b90710ad5e8a99232"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7af337808919680b90710ad5e8a99232">&#9670;&nbsp;</a></span>GetXbaseFileTypeByte() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetXbaseFileTypeByte </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char &amp;&#160;</td>
+ <td class="paramname"><em>cFileTypeByte</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the file type byte and version of the dbf file. </p>
+<p >Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- Name of file to examine </td></tr>
+ <tr><td class="paramname">cFileTypeByte</td><td>- Retruned first byte of dbf file </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a78aebdd21d3de46a450d5f835e3027f6" name="a78aebdd21d3de46a450d5f835e3027f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a78aebdd21d3de46a450d5f835e3027f6">&#9670;&nbsp;</a></span>GetXbaseFileTypeByte() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetXbaseFileTypeByte </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">unsigned char &amp;&#160;</td>
+ <td class="paramname"><em>cFileTypeByte</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iVersion</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the file type byte and version of the dbf file. </p>
+<p >Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- Name of file to examine </td></tr>
+ <tr><td class="paramname">cFileTypeByte</td><td>- Returned first byte of dbf file </td></tr>
+ <tr><td class="paramname">iVersion</td><td>- Returned file version </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="aaf2e697751a0beff41432a66bb83fb5e" name="aaf2e697751a0beff41432a66bb83fb5e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf2e697751a0beff41432a66bb83fb5e">&#9670;&nbsp;</a></span>GetXbaseFileTypeByte() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::GetXbaseFileTypeByte </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iVersion</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the file type byte and version of the dbf file. </p>
+<p >Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- Name of file to examine </td></tr>
+ <tr><td class="paramname">iVersion</td><td>- Returned file version </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a361e3cc318bbf1c4d10f069e0800a24e" name="a361e3cc318bbf1c4d10f069e0800a24e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a361e3cc318bbf1c4d10f069e0800a24e">&#9670;&nbsp;</a></span>NameSuffixMissing()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::NameSuffixMissing </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determines status of file extension. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- Name of file to examine </td></tr>
+ <tr><td class="paramname">iOption</td><td>- Inspection type<br />
+ 1 check for DBF<br />
+ 2 check for NDX<br />
+ 3 check for MDX<br />
+ 4 check for NTX<br />
+</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>0 if suffix found<br />
+ 1 if suffix not found, lower case<br />
+ 2 is suffix not found, upper case<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="aa1bb80340abc7a5c22f87f878e9dc825" name="aa1bb80340abc7a5c22f87f878e9dc825"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa1bb80340abc7a5c22f87f878e9dc825">&#9670;&nbsp;</a></span>ReadBlock() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::ReadBlock </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBlockNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>lReadSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>buf</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read a block of data from file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulBlockNo</td><td>- block number to read </td></tr>
+ <tr><td class="paramname">lReadSize</td><td>- size of data to read at block location, set to 0 to read blocksize </td></tr>
+ <tr><td class="paramname">*buf</td><td>- pointer to buffer to write output data, assumed to be previosuly allocated and large enough to contain data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="aef696b1c4c0ef5338e818599f695d485" name="aef696b1c4c0ef5338e818599f695d485"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aef696b1c4c0ef5338e818599f695d485">&#9670;&nbsp;</a></span>ReadBlock() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::ReadBlock </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBlockNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBlockSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>lReadSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>buf</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read a block of data from file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulBlockNo</td><td>- block number to read </td></tr>
+ <tr><td class="paramname">ulBlockSize</td><td>- block size </td></tr>
+ <tr><td class="paramname">lReadSize</td><td>- size of data to read at block location, set to 0 to read blocksize </td></tr>
+ <tr><td class="paramname">buf</td><td>- pointer to buffer to write output data, assumed to be previosuly allocated and large enough to contain data </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a991c5676a6f38fa752435390989f413e" name="a991c5676a6f38fa752435390989f413e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a991c5676a6f38fa752435390989f413e">&#9670;&nbsp;</a></span>SetBlockSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::SetBlockSize </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBlockSize</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the block size. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulBlockSize</td><td>- unsigned long block size, divisible by 512 </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a57caaaadfbd089d9a58ecfcb50c88a6c" name="a57caaaadfbd089d9a58ecfcb50c88a6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57caaaadfbd089d9a58ecfcb50c88a6c">&#9670;&nbsp;</a></span>SetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDataDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDataDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the data directory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDataDirectory</td><td>Set the data direcroty. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a25542afadaaf39b4fb5a1772a29cc0bd" name="a25542afadaaf39b4fb5a1772a29cc0bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25542afadaaf39b4fb5a1772a29cc0bd">&#9670;&nbsp;</a></span>SetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bDefaultAutoCommit</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the default auto commit. </p>
+<p >Disabling auto commit requires the application execute explicit updates using dbf-&gt;Put() and dbf-&gt;AppendRecord(). With auto commit on, the library posts updates automatically when moving off the current record or closing a file.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bDefaultAutoCommit</td><td>xbTrue - Enable default auto commit.<br />
+ xbFalse - Disable default auto commit.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5f74db23f8902846d581935c7db73f9c" name="a5f74db23f8902846d581935c7db73f9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5f74db23f8902846d581935c7db73f9c">&#9670;&nbsp;</a></span>SetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultDateFormat</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the default date format. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDefaultDateFormat</td><td>Set the default date format. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a84343b8645790791512d6bc22ee6c8eb" name="a84343b8645790791512d6bc22ee6c8eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84343b8645790791512d6bc22ee6c8eb">&#9670;&nbsp;</a></span>SetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultLogDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae78a85255488bc78964c16946dbaead3" name="ae78a85255488bc78964c16946dbaead3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae78a85255488bc78964c16946dbaead3">&#9670;&nbsp;</a></span>SetDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::SetDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the directory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDirectory</td><td>- Valid directory name </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a904ec348fd029d4a76e72b8fde636108" name="a904ec348fd029d4a76e72b8fde636108"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a904ec348fd029d4a76e72b8fde636108">&#9670;&nbsp;</a></span>SetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the endian type. </p>
+<p >This routine determines the Endian-ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. </p>
+
+</div>
+</div>
+<a id="a5419eb27e56822f828b2b88a9502a636" name="a5419eb27e56822f828b2b88a9502a636"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5419eb27e56822f828b2b88a9502a636">&#9670;&nbsp;</a></span>SetFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::SetFileName </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the filename. </p>
+<p >This routine builds out two internal variables from the input file name<br />
+ sFileName - the file name part<br />
+ sFqFileName - the fully qualified file name<br />
+</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileName</td><td>- Input file name </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aee832fa11db2077a532f49e1329bd05a" name="aee832fa11db2077a532f49e1329bd05a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aee832fa11db2077a532f49e1329bd05a">&#9670;&nbsp;</a></span>SetFqFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::SetFqFileName </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFqFileName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the fully qualifed filename. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFqFileName</td><td>- Fully qualifed input file name </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aba6e59512f7172dd55dcf92059e5928c" name="aba6e59512f7172dd55dcf92059e5928c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba6e59512f7172dd55dcf92059e5928c">&#9670;&nbsp;</a></span>SetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetMultiUser </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bMultiUser</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bMultiUser</td><td>xbTrue - Turn on Multi user mode.<br />
+ xbFalse - Turn off Multi user mode.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5d871dcfecc2b4338f7a13722aab766c" name="a5d871dcfecc2b4338f7a13722aab766c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5d871dcfecc2b4338f7a13722aab766c">&#9670;&nbsp;</a></span>WriteBlock()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::WriteBlock </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulBlockNo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>lWriteSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>buf</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Write a block of data to file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulBlockNo</td><td>- block number to write </td></tr>
+ <tr><td class="paramname">lWriteSize</td><td>- size of data to write, set to 0 to write blocksize </td></tr>
+ <tr><td class="paramname">*buf</td><td>- pointer to buffer of data to be written </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a18830b5755d74818f60d9c7ce38ddf2d" name="a18830b5755d74818f60d9c7ce38ddf2d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a18830b5755d74818f60d9c7ce38ddf2d">&#9670;&nbsp;</a></span>xbFclose()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFclose </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fclose. </p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="af5b6356832d2a67212070a1aa605f170" name="af5b6356832d2a67212070a1aa605f170"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af5b6356832d2a67212070a1aa605f170">&#9670;&nbsp;</a></span>xbFeof()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFeof </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary feof. </p>
+<dl class="section return"><dt>Returns</dt><dd>non zero if end-of-file is set for the stream. </dd></dl>
+
+</div>
+</div>
+<a id="ad205184d43409f04216540ae22f15009" name="ad205184d43409f04216540ae22f15009"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad205184d43409f04216540ae22f15009">&#9670;&nbsp;</a></span>xbFflush()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFflush </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fflush. </p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5ee229bda4d7d6695e122200e581e7a6" name="a5ee229bda4d7d6695e122200e581e7a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ee229bda4d7d6695e122200e581e7a6">&#9670;&nbsp;</a></span>xbFgetc() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFgetc </td>
+ <td>(</td>
+ <td class="paramtype">char &amp;&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fgetc. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>- output character returned by fgetc </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="afb1c584d2895ffb7834df80aea7eb1e4" name="afb1c584d2895ffb7834df80aea7eb1e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afb1c584d2895ffb7834df80aea7eb1e4">&#9670;&nbsp;</a></span>xbFgetc() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFgetc </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32 &amp;&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fgetc. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>- output integer returned by fgetc </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ad245955ace26e5dde85fd4373b30d026" name="ad245955ace26e5dde85fd4373b30d026"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad245955ace26e5dde85fd4373b30d026">&#9670;&nbsp;</a></span>xbFgets()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFgets </td>
+ <td>(</td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>lSize</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fgets. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lSize</td><td>- reads in at most, one character less than lSize </td></tr>
+ <tr><td class="paramname">s</td><td>- an <a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing data returned by fseek </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab0fa19686ca8953ff4b556fb5b249135" name="ab0fa19686ca8953ff4b556fb5b249135"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0fa19686ca8953ff4b556fb5b249135">&#9670;&nbsp;</a></span>xbFopen() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFopen </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOpenMode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iShareMode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fopen. </p>
+<p >This routine supports all the standard C library open modes. The Xbase routines only use "r" and "r+b".</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOpenMode</td><td><table class="doxtable">
+<tr>
+<th>OpenMode</th><th>Description </th></tr>
+<tr>
+<td>r</td><td>Reading </td></tr>
+<tr>
+<td>r+</td><td>Reading and Writing </td></tr>
+<tr>
+<td>w</td><td>Open for writing. Truncate to zero bytes if it exists </td></tr>
+<tr>
+<td>w+</td><td>Open for reading and writing, truncate to zero bytes if it exists </td></tr>
+<tr>
+<td>a</td><td>Open for append </td></tr>
+<tr>
+<td>a+</td><td>Open for reading and writing (at end). </td></tr>
+</table>
+The mode can also include the letter "b" for binary ie; "r+b". The "b" is ignored on POSIX compliant systems, but is included for cross platform compatibility. </td></tr>
+ <tr><td class="paramname">sFileName</td><td>File name to open </td></tr>
+ <tr><td class="paramname">iShareMode</td><td>XB_SINGLE_USER<br />
+ XB_MULTI_USER<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a0548cedf0f26b7d8ac221f75b0cd048c" name="a0548cedf0f26b7d8ac221f75b0cd048c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0548cedf0f26b7d8ac221f75b0cd048c">&#9670;&nbsp;</a></span>xbFopen() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFopen </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOpenMode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iShareMode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fopen. </p>
+<p >This routine supports all the standard C library open modes. The Xbase routines only use "r" and "r+".</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOpenMode</td><td><table class="doxtable">
+<tr>
+<th>OpenMode</th><th>Description </th></tr>
+<tr>
+<td>r</td><td>Reading </td></tr>
+<tr>
+<td>r+</td><td>Reading and Writing </td></tr>
+<tr>
+<td>w</td><td>Open for writing. Truncate to zero bytes if it exists </td></tr>
+<tr>
+<td>w+</td><td>Open for reading and writing, truncate to zero bytes if it exists </td></tr>
+<tr>
+<td>a</td><td>Open for append </td></tr>
+<tr>
+<td>a+</td><td>Open for reading and writing (at end). </td></tr>
+</table>
+The mode can also include the letter "b" for binary ie; "r+b". The "b" is ignored on POSIX compliant systems, but is included for cross platform compatibility. </td></tr>
+ <tr><td class="paramname">iShareMode</td><td>XB_SINGLE_USER<br />
+ XB_MULTI_USER<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a7cdfef5ede9ac98d44a28a6b7a70972c" name="a7cdfef5ede9ac98d44a28a6b7a70972c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7cdfef5ede9ac98d44a28a6b7a70972c">&#9670;&nbsp;</a></span>xbFopen() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFopen </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOpenMode</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aabd113333b49c36cad23244b392baab4" name="aabd113333b49c36cad23244b392baab4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aabd113333b49c36cad23244b392baab4">&#9670;&nbsp;</a></span>xbFopen() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFopen </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOpenMode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iShareMode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fopen. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iOpenMode</td><td>XB_READ<br />
+ XB_READ_WRITE<br />
+ </td></tr>
+ <tr><td class="paramname">iShareMode</td><td>XB_SINGLE_USER<br />
+ XB_MULTI_USER<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="af2e940c78956e5cb6824f9a1bc404896" name="af2e940c78956e5cb6824f9a1bc404896"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af2e940c78956e5cb6824f9a1bc404896">&#9670;&nbsp;</a></span>xbFputc() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFputc </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fputc. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Character to write </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a863f74cf17df8186d88586b4d2a6441a" name="a863f74cf17df8186d88586b4d2a6441a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a863f74cf17df8186d88586b4d2a6441a">&#9670;&nbsp;</a></span>xbFputc() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFputc </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>iNoOfTimes</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fputc. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Character to write </td></tr>
+ <tr><td class="paramname">iNoOfTimes</td><td>Number of times to write the character </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a698f3b40216778562e639e6ca1a47573" name="a698f3b40216778562e639e6ca1a47573"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a698f3b40216778562e639e6ca1a47573">&#9670;&nbsp;</a></span>xbFputs()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFputs </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fputs. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> to write to file </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab4f6afaa1f77539f27a4f05c26e54e2f" name="ab4f6afaa1f77539f27a4f05c26e54e2f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab4f6afaa1f77539f27a4f05c26e54e2f">&#9670;&nbsp;</a></span>xbFread()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFread </td>
+ <td>(</td>
+ <td class="paramtype">void *&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>nmemb</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fread. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>Pointer to data to write </td></tr>
+ <tr><td class="paramname">size</td><td>size of write </td></tr>
+ <tr><td class="paramname">nmemb</td><td>Number of times to write it </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a5337ab8918df240910c0d19b4f298e3d" name="a5337ab8918df240910c0d19b4f298e3d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5337ab8918df240910c0d19b4f298e3d">&#9670;&nbsp;</a></span>xbFseek()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFseek </td>
+ <td>(</td>
+ <td class="paramtype">xbInt64&#160;</td>
+ <td class="paramname"><em>lOffset</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>iWhence</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fseek. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lOffset</td><td>Position in file to seek to </td></tr>
+ <tr><td class="paramname">iWhence</td><td>SEEK_SET - from beginning of file<br />
+ SEEK_CUR - from current position<br />
+ SEEK_END - from end of file<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a0e1c06aedfa7fbcb92e117f891edd13b" name="a0e1c06aedfa7fbcb92e117f891edd13b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0e1c06aedfa7fbcb92e117f891edd13b">&#9670;&nbsp;</a></span>xbFtell()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">size_t xb::xbFile::xbFtell </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary ftell. </p>
+<p >Returns the current file position. </p><dl class="section return"><dt>Returns</dt><dd>Current file position. </dd></dl>
+
+</div>
+</div>
+<a id="a9891b792f585a696f38a5cf959e30918" name="a9891b792f585a696f38a5cf959e30918"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9891b792f585a696f38a5cf959e30918">&#9670;&nbsp;</a></span>xbFTurnOffFileBuffering()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::xbFTurnOffFileBuffering </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Turn off file buffering. </p>
+<p >Turns off file buffering. File buffering can't be used while in multi user mode. </p>
+
+</div>
+</div>
+<a id="a6aadd871d1782944703fed773d44b85f" name="a6aadd871d1782944703fed773d44b85f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6aadd871d1782944703fed773d44b85f">&#9670;&nbsp;</a></span>xbFwrite()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbFwrite </td>
+ <td>(</td>
+ <td class="paramtype">const void *&#160;</td>
+ <td class="paramname"><em>p</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>nmemb</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for standard libary fwrite. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">p</td><td>Pointer to data buffer to write </td></tr>
+ <tr><td class="paramname">size</td><td>Size of data to write </td></tr>
+ <tr><td class="paramname">nmemb</td><td>Number of times to write data buffer </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a08463f506f425c2385acbe1a561506e9" name="a08463f506f425c2385acbe1a561506e9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a08463f506f425c2385acbe1a561506e9">&#9670;&nbsp;</a></span>xbReadUntil()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbReadUntil </td>
+ <td>(</td>
+ <td class="paramtype">const char&#160;</td>
+ <td class="paramname"><em>cDelim</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOut</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Read file until a particular character is encountered on input stream. </p>
+<p >This routine will read until cDelim is encountered or eof, which ever occurs first.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">cDelim</td><td>Delimiter to stop writing at. </td></tr>
+ <tr><td class="paramname">sOut</td><td>Output <a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing data read </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab3c668a8570433188382d31d7c60bd48" name="ab3c668a8570433188382d31d7c60bd48"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab3c668a8570433188382d31d7c60bd48">&#9670;&nbsp;</a></span>xbRemove() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbRemove </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Delete file. </p>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a58f6a6751fdf7e9549c273bb75d93eb5" name="a58f6a6751fdf7e9549c273bb75d93eb5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58f6a6751fdf7e9549c273bb75d93eb5">&#9670;&nbsp;</a></span>xbRemove() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbRemove </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileNameIn</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Delete file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileNameIn</td><td>Name of file to delete </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a6d919366c2ec95e529906bf8842cbf07" name="a6d919366c2ec95e529906bf8842cbf07"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6d919366c2ec95e529906bf8842cbf07">&#9670;&nbsp;</a></span>xbRemove() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbRemove </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sFileNameIn</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Delete file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFileNameIn</td><td>Name of file to delete </td></tr>
+ <tr><td class="paramname">iOption</td><td>If Set to 1, assume this is a delete request for a dbf file, and should rename the dbt file also </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="afc8ce113aa72611a278233f9bb170012" name="afc8ce113aa72611a278233f9bb170012"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afc8ce113aa72611a278233f9bb170012">&#9670;&nbsp;</a></span>xbRename() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbRename </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sNewName</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Rename file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOldName</td><td>Original file name </td></tr>
+ <tr><td class="paramname">sNewName</td><td>New file name </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ab0b2a2c88947921d98ebcb5b5ec34ed9" name="ab0b2a2c88947921d98ebcb5b5ec34ed9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0b2a2c88947921d98ebcb5b5ec34ed9">&#9670;&nbsp;</a></span>xbRename() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbRename </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOldName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sNewName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOption</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Rename file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOldName</td><td>Original file name </td></tr>
+ <tr><td class="paramname">sNewName</td><td>New file name </td></tr>
+ <tr><td class="paramname">iOption</td><td>If Set to 1, assume this is a rename request for a dbf file, and should rename the dbt file also </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="a7996b6e084665c37c3892faea64b3505" name="a7996b6e084665c37c3892faea64b3505"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7996b6e084665c37c3892faea64b3505">&#9670;&nbsp;</a></span>xbRewind()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbFile::xbRewind </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for rewind. </p>
+<p >Set file pointer at beginning of file. </p>
+
+</div>
+</div>
+<a id="a518bfcbfa3699d883cf89affee383296" name="a518bfcbfa3699d883cf89affee383296"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a518bfcbfa3699d883cf89affee383296">&#9670;&nbsp;</a></span>xbTruncate()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbFile::xbTruncate </td>
+ <td>(</td>
+ <td class="paramtype">xbInt64&#160;</td>
+ <td class="paramname"><em>llSize</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Xbase wrapper for ftruncate. </p>
+<p >Set file size to llSize </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">llSize</td><td>New file size. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Field Documentation</h2>
+<a id="a6219f1b5e24ea12fe158cd5aea56988e" name="a6219f1b5e24ea12fe158cd5aea56988e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6219f1b5e24ea12fe158cd5aea56988e">&#9670;&nbsp;</a></span>ErrorCodeText</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* xb::xbSsv::ErrorCodeText[]</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5849e813f5e8e1cd180f0366637adbf3" name="a5849e813f5e8e1cd180f0366637adbf3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5849e813f5e8e1cd180f0366637adbf3">&#9670;&nbsp;</a></span>iEndianType</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::iEndianType = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9dec3164c3b264882df634915ecf21da" name="a9dec3164c3b264882df634915ecf21da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9dec3164c3b264882df634915ecf21da">&#9670;&nbsp;</a></span>sNullString</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbSsv::sNullString = &quot;&quot;</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae39a67ea391b46055d4ca299cb222004" name="ae39a67ea391b46055d4ca299cb222004"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae39a67ea391b46055d4ca299cb222004">&#9670;&nbsp;</a></span>xbase</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a>* xb::xbFile::xbase</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following files:<ul>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/include/<a class="el" href="xbfile_8h_source.html">xbfile.h</a></li>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/core/<a class="el" href="xbfile_8cpp.html">xbfile.cpp</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/classxb_1_1xbFile.png b/docs/doxygen/html/classxb_1_1xbFile.png
new file mode 100644
index 0000000..cb7b45f
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbFile.png
Binary files differ
diff --git a/docs/doxygen/html/classxb_1_1xbSsv.html b/docs/doxygen/html/classxb_1_1xbSsv.html
new file mode 100644
index 0000000..38c9d8d
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbSsv.html
@@ -0,0 +1,652 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: xb::xbSsv Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacexb.html">xb</a></li><li class="navelem"><a class="el" href="classxb_1_1xbSsv.html">xbSsv</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pro-static-attribs">Static Protected Attributes</a> </div>
+ <div class="headertitle"><div class="title">xb::xbSsv Class Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>Class for handling shared system variables.
+ <a href="classxb_1_1xbSsv.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="xbssv_8h_source.html">xbssv.h</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for xb::xbSsv:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classxb_1_1xbSsv.png" usemap="#xb::xbSsv_map" alt=""/>
+ <map id="xb::xbSsv_map" name="xb::xbSsv_map">
+<area href="classxb_1_1xbDate.html" title="xbDate class." alt="xb::xbDate" shape="rect" coords="0,56,84,80"/>
+<area href="classxb_1_1xbFile.html" title="Class for handling low level file I/O." alt="xb::xbFile" shape="rect" coords="94,56,178,80"/>
+<area href="classxb_1_1xbTblMgr.html" alt="xb::xbTblMgr" shape="rect" coords="188,56,272,80"/>
+<area href="classxb_1_1xbDbf.html" title="Base class for handling dbf files/tables." alt="xb::xbDbf" shape="rect" coords="94,112,178,136"/>
+<area href="classxb_1_1xbXBase.html" title="xbXbase class." alt="xb::xbXBase" shape="rect" coords="188,112,272,136"/>
+ </map>
+</div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a58f85692c3167af20b1a7c17c621523b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a58f85692c3167af20b1a7c17c621523b">xbSsv</a> ()</td></tr>
+<tr class="memdesc:a58f85692c3167af20b1a7c17c621523b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class Constructor. <a href="classxb_1_1xbSsv.html#a58f85692c3167af20b1a7c17c621523b">More...</a><br /></td></tr>
+<tr class="separator:a58f85692c3167af20b1a7c17c621523b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">DisplayError</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a97dfa59ab9a8e9f17454da0faceb023d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Display error message on console for a given error number. <a href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">More...</a><br /></td></tr>
+<tr class="separator:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">GetDefaultDateFormat</a> () const</td></tr>
+<tr class="memdesc:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default date format. <a href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">More...</a><br /></td></tr>
+<tr class="separator:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">GetDataDirectory</a> () const</td></tr>
+<tr class="memdesc:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the current data directory. <a href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">More...</a><br /></td></tr>
+<tr class="separator:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49cd162f066eef2b829ba7c9f6620243"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">GetEndianType</a> () const</td></tr>
+<tr class="memdesc:a49cd162f066eef2b829ba7c9f6620243"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the Endian type. <a href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">More...</a><br /></td></tr>
+<tr class="separator:a49cd162f066eef2b829ba7c9f6620243"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56961d2a67b8e7470098626ac4dac7e4"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">GetErrorMessage</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a56961d2a67b8e7470098626ac4dac7e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get an error message. <a href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">More...</a><br /></td></tr>
+<tr class="separator:a56961d2a67b8e7470098626ac4dac7e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">SetDataDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDataDirectory)</td></tr>
+<tr class="memdesc:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data directory. <a href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">More...</a><br /></td></tr>
+<tr class="separator:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f74db23f8902846d581935c7db73f9c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">SetDefaultDateFormat</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultDateFormat)</td></tr>
+<tr class="memdesc:a5f74db23f8902846d581935c7db73f9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default date format. <a href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">More...</a><br /></td></tr>
+<tr class="separator:a5f74db23f8902846d581935c7db73f9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62e4fd0a5888665c76bbbad962794e72"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">BitSet</a> (unsigned char c, xbInt16 iBitNo) const</td></tr>
+<tr class="memdesc:a62e4fd0a5888665c76bbbad962794e72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check a bit in a one byte field and see if it is set. <a href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">More...</a><br /></td></tr>
+<tr class="separator:a62e4fd0a5888665c76bbbad962794e72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6982f973e81587b04916f4509746aaf5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">GetDefaultAutoCommit</a> () const</td></tr>
+<tr class="memdesc:a6982f973e81587b04916f4509746aaf5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default auto commit setting. <a href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">More...</a><br /></td></tr>
+<tr class="separator:a6982f973e81587b04916f4509746aaf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">SetDefaultAutoCommit</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bDefaultAutoCommit)</td></tr>
+<tr class="memdesc:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default auto commit. <a href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">More...</a><br /></td></tr>
+<tr class="separator:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf3763faf6a8917a963213cd53af529c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abf3763faf6a8917a963213cd53af529c">GetDefaultLogDirectory</a> () const</td></tr>
+<tr class="separator:abf3763faf6a8917a963213cd53af529c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a43878d4dc041f2a5e2398a118ccfaf79">GetDefaultLogFileName</a> () const</td></tr>
+<tr class="separator:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84343b8645790791512d6bc22ee6c8eb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a84343b8645790791512d6bc22ee6c8eb">SetDefaultLogDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultLogDirectory)</td></tr>
+<tr class="separator:a84343b8645790791512d6bc22ee6c8eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">GetMultiUser</a> () const</td></tr>
+<tr class="memdesc:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">More...</a><br /></td></tr>
+<tr class="separator:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba6e59512f7172dd55dcf92059e5928c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">SetMultiUser</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bMultiUser)</td></tr>
+<tr class="memdesc:aba6e59512f7172dd55dcf92059e5928c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">More...</a><br /></td></tr>
+<tr class="separator:aba6e59512f7172dd55dcf92059e5928c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-static-attribs" name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memItemLeft" align="right" valign="top">static const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e">ErrorCodeText</a> []</td></tr>
+<tr class="separator:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-methods" name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a904ec348fd029d4a76e72b8fde636108"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">SetEndianType</a> ()</td></tr>
+<tr class="memdesc:a904ec348fd029d4a76e72b8fde636108"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the endian type. <a href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">More...</a><br /></td></tr>
+<tr class="separator:a904ec348fd029d4a76e72b8fde636108"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-static-attribs" name="pro-static-attribs"></a>
+Static Protected Attributes</h2></td></tr>
+<tr class="memitem:a5849e813f5e8e1cd180f0366637adbf3"><td class="memItemLeft" align="right" valign="top">static xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3">iEndianType</a> = 0</td></tr>
+<tr class="separator:a5849e813f5e8e1cd180f0366637adbf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9dec3164c3b264882df634915ecf21da"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da">sNullString</a> = &quot;&quot;</td></tr>
+<tr class="separator:a9dec3164c3b264882df634915ecf21da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p >Class for handling shared system variables. </p>
+<p >This class defines static variables which are referenced across class instances.</p>
+<p >This class is designed to have the variables set when the <a class="el" href="classxb_1_1xbXBase.html" title="xbXbase class.">xbXBase</a> class constructor is called (<a class="el" href="classxb_1_1xbXBase.html" title="xbXbase class.">xbXBase</a> is a derived class). The xbXbase class is designed to be called first in an application programs, and it is only called once. The static values in this class are typically initialized at program startup and don't require additional updates. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a58f85692c3167af20b1a7c17c621523b" name="a58f85692c3167af20b1a7c17c621523b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a58f85692c3167af20b1a7c17c621523b">&#9670;&nbsp;</a></span>xbSsv()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbSsv::xbSsv </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Class Constructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a62e4fd0a5888665c76bbbad962794e72" name="a62e4fd0a5888665c76bbbad962794e72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62e4fd0a5888665c76bbbad962794e72">&#9670;&nbsp;</a></span>BitSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::BitSet </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iBitNo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check a bit in a one byte field and see if it is set. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>One byte char field to examine. </td></tr>
+ <tr><td class="paramname">iBitNo</td><td>which bit to examine. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue Bit is set<br />
+ xbFalse Bit is not set </dd></dl>
+
+</div>
+</div>
+<a id="a97dfa59ab9a8e9f17454da0faceb023d" name="a97dfa59ab9a8e9f17454da0faceb023d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97dfa59ab9a8e9f17454da0faceb023d">&#9670;&nbsp;</a></span>DisplayError()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::DisplayError </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Display error message on console for a given error number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>Error number to reference </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a1d803a4bfc8ba0561267a0bf9e51f7d9" name="a1d803a4bfc8ba0561267a0bf9e51f7d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d803a4bfc8ba0561267a0bf9e51f7d9">&#9670;&nbsp;</a></span>GetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDataDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the current data directory. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the current data directory where the database files are stored. </dd></dl>
+
+</div>
+</div>
+<a id="a6982f973e81587b04916f4509746aaf5" name="a6982f973e81587b04916f4509746aaf5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6982f973e81587b04916f4509746aaf5">&#9670;&nbsp;</a></span>GetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the default auto commit setting. </p>
+<p >When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-&gt;Put() and dbf-&gt;AppendRecord().</p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if auto commit is turned on<br />
+ xbFalse is auto commit is turned off </dd></dl>
+
+</div>
+</div>
+<a id="a6fbb9c3a550ab0b3378f9586a57791d2" name="a6fbb9c3a550ab0b3378f9586a57791d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6fbb9c3a550ab0b3378f9586a57791d2">&#9670;&nbsp;</a></span>GetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the default date format. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the default date format. </dd></dl>
+
+</div>
+</div>
+<a id="abf3763faf6a8917a963213cd53af529c" name="abf3763faf6a8917a963213cd53af529c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf3763faf6a8917a963213cd53af529c">&#9670;&nbsp;</a></span>GetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a43878d4dc041f2a5e2398a118ccfaf79" name="a43878d4dc041f2a5e2398a118ccfaf79"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a43878d4dc041f2a5e2398a118ccfaf79">&#9670;&nbsp;</a></span>GetDefaultLogFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a49cd162f066eef2b829ba7c9f6620243" name="a49cd162f066eef2b829ba7c9f6620243"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49cd162f066eef2b829ba7c9f6620243">&#9670;&nbsp;</a></span>GetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::GetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the Endian type. </p>
+<dl class="section return"><dt>Returns</dt><dd>B - Big endian<br />
+ L - Little endian<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a56961d2a67b8e7470098626ac4dac7e4" name="a56961d2a67b8e7470098626ac4dac7e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a56961d2a67b8e7470098626ac4dac7e4">&#9670;&nbsp;</a></span>GetErrorMessage()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char * xb::xbSsv::GetErrorMessage </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get an error message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>ErrorCode is the error number of description to be returned. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Returns a pointer to a string containing a text description for the error code. </dd></dl>
+
+</div>
+</div>
+<a id="abd58031c5f1c3766c24d47a82e6fd9c5" name="abd58031c5f1c3766c24d47a82e6fd9c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd58031c5f1c3766c24d47a82e6fd9c5">&#9670;&nbsp;</a></span>GetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetMultiUser </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Multi user mode turned on.<br />
+ xbFalse - Multi user mode turned off.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a57caaaadfbd089d9a58ecfcb50c88a6c" name="a57caaaadfbd089d9a58ecfcb50c88a6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57caaaadfbd089d9a58ecfcb50c88a6c">&#9670;&nbsp;</a></span>SetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDataDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDataDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the data directory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDataDirectory</td><td>Set the data direcroty. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a25542afadaaf39b4fb5a1772a29cc0bd" name="a25542afadaaf39b4fb5a1772a29cc0bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25542afadaaf39b4fb5a1772a29cc0bd">&#9670;&nbsp;</a></span>SetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bDefaultAutoCommit</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the default auto commit. </p>
+<p >Disabling auto commit requires the application execute explicit updates using dbf-&gt;Put() and dbf-&gt;AppendRecord(). With auto commit on, the library posts updates automatically when moving off the current record or closing a file.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bDefaultAutoCommit</td><td>xbTrue - Enable default auto commit.<br />
+ xbFalse - Disable default auto commit.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5f74db23f8902846d581935c7db73f9c" name="a5f74db23f8902846d581935c7db73f9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5f74db23f8902846d581935c7db73f9c">&#9670;&nbsp;</a></span>SetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultDateFormat</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the default date format. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDefaultDateFormat</td><td>Set the default date format. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a84343b8645790791512d6bc22ee6c8eb" name="a84343b8645790791512d6bc22ee6c8eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84343b8645790791512d6bc22ee6c8eb">&#9670;&nbsp;</a></span>SetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultLogDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a904ec348fd029d4a76e72b8fde636108" name="a904ec348fd029d4a76e72b8fde636108"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a904ec348fd029d4a76e72b8fde636108">&#9670;&nbsp;</a></span>SetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the endian type. </p>
+<p >This routine determines the Endian-ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. </p>
+
+</div>
+</div>
+<a id="aba6e59512f7172dd55dcf92059e5928c" name="aba6e59512f7172dd55dcf92059e5928c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba6e59512f7172dd55dcf92059e5928c">&#9670;&nbsp;</a></span>SetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetMultiUser </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bMultiUser</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bMultiUser</td><td>xbTrue - Turn on Multi user mode.<br />
+ xbFalse - Turn off Multi user mode.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Field Documentation</h2>
+<a id="a6219f1b5e24ea12fe158cd5aea56988e" name="a6219f1b5e24ea12fe158cd5aea56988e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6219f1b5e24ea12fe158cd5aea56988e">&#9670;&nbsp;</a></span>ErrorCodeText</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* xb::xbSsv::ErrorCodeText[]</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5849e813f5e8e1cd180f0366637adbf3" name="a5849e813f5e8e1cd180f0366637adbf3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5849e813f5e8e1cd180f0366637adbf3">&#9670;&nbsp;</a></span>iEndianType</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::iEndianType = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9dec3164c3b264882df634915ecf21da" name="a9dec3164c3b264882df634915ecf21da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9dec3164c3b264882df634915ecf21da">&#9670;&nbsp;</a></span>sNullString</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbSsv::sNullString = &quot;&quot;</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following files:<ul>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/include/<a class="el" href="xbssv_8h_source.html">xbssv.h</a></li>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/core/<a class="el" href="xbssv_8cpp.html">xbssv.cpp</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/classxb_1_1xbSsv.png b/docs/doxygen/html/classxb_1_1xbSsv.png
new file mode 100644
index 0000000..bdbc1de
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbSsv.png
Binary files differ
diff --git a/docs/doxygen/html/classxb_1_1xbString.html b/docs/doxygen/html/classxb_1_1xbString.html
new file mode 100644
index 0000000..1f771c6
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbString.html
@@ -0,0 +1,2799 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: xb::xbString Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacexb.html">xb</a></li><li class="navelem"><a class="el" href="classxb_1_1xbString.html">xbString</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#friends">Friends</a> </div>
+ <div class="headertitle"><div class="title">xb::xbString Class Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>Class for handling string data.
+ <a href="classxb_1_1xbString.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="xbstring_8h_source.html">xbstring.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a63f9313217e0ff3c9789ec59316216a1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a63f9313217e0ff3c9789ec59316216a1">xbString</a> (xbUInt32 size)</td></tr>
+<tr class="memdesc:a63f9313217e0ff3c9789ec59316216a1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbString.html#a63f9313217e0ff3c9789ec59316216a1">More...</a><br /></td></tr>
+<tr class="separator:a63f9313217e0ff3c9789ec59316216a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14bbaa293c8d40dd6c64332f2668a92e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a14bbaa293c8d40dd6c64332f2668a92e">xbString</a> (char c)</td></tr>
+<tr class="memdesc:a14bbaa293c8d40dd6c64332f2668a92e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbString.html#a14bbaa293c8d40dd6c64332f2668a92e">More...</a><br /></td></tr>
+<tr class="separator:a14bbaa293c8d40dd6c64332f2668a92e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18f3598dcdf2ec5692274fc8ee769ad7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a18f3598dcdf2ec5692274fc8ee769ad7">xbString</a> (const char *s, xbUInt32 lMaxLen)</td></tr>
+<tr class="memdesc:a18f3598dcdf2ec5692274fc8ee769ad7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbString.html#a18f3598dcdf2ec5692274fc8ee769ad7">More...</a><br /></td></tr>
+<tr class="separator:a18f3598dcdf2ec5692274fc8ee769ad7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d81016b93fc36ebbbafacf35c677f07"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a0d81016b93fc36ebbbafacf35c677f07">xbString</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:a0d81016b93fc36ebbbafacf35c677f07"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbString.html#a0d81016b93fc36ebbbafacf35c677f07">More...</a><br /></td></tr>
+<tr class="separator:a0d81016b93fc36ebbbafacf35c677f07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25856311106c5fb15d39017b63f0ddc7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a25856311106c5fb15d39017b63f0ddc7">xbString</a> (const char *=&quot;&quot;)</td></tr>
+<tr class="memdesc:a25856311106c5fb15d39017b63f0ddc7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbString.html#a25856311106c5fb15d39017b63f0ddc7">More...</a><br /></td></tr>
+<tr class="separator:a25856311106c5fb15d39017b63f0ddc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad865b55e3b08dffd527afee8e7e8e3fe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ad865b55e3b08dffd527afee8e7e8e3fe">xbString</a> (<a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> d)</td></tr>
+<tr class="memdesc:ad865b55e3b08dffd527afee8e7e8e3fe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Constructor. <a href="classxb_1_1xbString.html#ad865b55e3b08dffd527afee8e7e8e3fe">More...</a><br /></td></tr>
+<tr class="separator:ad865b55e3b08dffd527afee8e7e8e3fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a10a6549efab02bc76ab33b15916b1eb1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a10a6549efab02bc76ab33b15916b1eb1">~xbString</a> ()</td></tr>
+<tr class="memdesc:a10a6549efab02bc76ab33b15916b1eb1"><td class="mdescLeft">&#160;</td><td class="mdescRight">Destructor. <a href="classxb_1_1xbString.html#a10a6549efab02bc76ab33b15916b1eb1">More...</a><br /></td></tr>
+<tr class="separator:a10a6549efab02bc76ab33b15916b1eb1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4f69d11cbd43edf71725a606d0ca8f40"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a4f69d11cbd43edf71725a606d0ca8f40">operator=</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:a4f69d11cbd43edf71725a606d0ca8f40"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set operator =. <a href="classxb_1_1xbString.html#a4f69d11cbd43edf71725a606d0ca8f40">More...</a><br /></td></tr>
+<tr class="separator:a4f69d11cbd43edf71725a606d0ca8f40"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84ae7d16c5d73c5aa2270aa9895a7f7c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a84ae7d16c5d73c5aa2270aa9895a7f7c">operator=</a> (const char *s)</td></tr>
+<tr class="memdesc:a84ae7d16c5d73c5aa2270aa9895a7f7c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set operator =. <a href="classxb_1_1xbString.html#a84ae7d16c5d73c5aa2270aa9895a7f7c">More...</a><br /></td></tr>
+<tr class="separator:a84ae7d16c5d73c5aa2270aa9895a7f7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a545df0ae9590f0ea5844a165e38a6388"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a545df0ae9590f0ea5844a165e38a6388">operator const char *</a> () const</td></tr>
+<tr class="memdesc:a545df0ae9590f0ea5844a165e38a6388"><td class="mdescLeft">&#160;</td><td class="mdescRight">Operator const char *. <a href="classxb_1_1xbString.html#a545df0ae9590f0ea5844a165e38a6388">More...</a><br /></td></tr>
+<tr class="separator:a545df0ae9590f0ea5844a165e38a6388"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe45e463226ac8e18550ced18c5a9df3"><td class="memItemLeft" align="right" valign="top">char &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#abe45e463226ac8e18550ced18c5a9df3">operator[]</a> (xbUInt32 n) const</td></tr>
+<tr class="memdesc:abe45e463226ac8e18550ced18c5a9df3"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator [] <a href="classxb_1_1xbString.html#abe45e463226ac8e18550ced18c5a9df3">More...</a><br /></td></tr>
+<tr class="separator:abe45e463226ac8e18550ced18c5a9df3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4deaa68d9571753349c29baacb5613e8"><td class="memItemLeft" align="right" valign="top">char &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a4deaa68d9571753349c29baacb5613e8">operator[]</a> (xbInt32 n) const</td></tr>
+<tr class="memdesc:a4deaa68d9571753349c29baacb5613e8"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator [] <a href="classxb_1_1xbString.html#a4deaa68d9571753349c29baacb5613e8">More...</a><br /></td></tr>
+<tr class="separator:a4deaa68d9571753349c29baacb5613e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a76a47af239797a266ada6141c150001c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a76a47af239797a266ada6141c150001c">operator+=</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:a76a47af239797a266ada6141c150001c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append operator +=. <a href="classxb_1_1xbString.html#a76a47af239797a266ada6141c150001c">More...</a><br /></td></tr>
+<tr class="separator:a76a47af239797a266ada6141c150001c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab319120dbad9107e1e7090139c956100"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ab319120dbad9107e1e7090139c956100">operator+=</a> (const char *s)</td></tr>
+<tr class="memdesc:ab319120dbad9107e1e7090139c956100"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append operator +=. <a href="classxb_1_1xbString.html#ab319120dbad9107e1e7090139c956100">More...</a><br /></td></tr>
+<tr class="separator:ab319120dbad9107e1e7090139c956100"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae12f45b8be84e438e032c0b860f985c6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ae12f45b8be84e438e032c0b860f985c6">operator+=</a> (char c)</td></tr>
+<tr class="memdesc:ae12f45b8be84e438e032c0b860f985c6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append operator +=. <a href="classxb_1_1xbString.html#ae12f45b8be84e438e032c0b860f985c6">More...</a><br /></td></tr>
+<tr class="separator:ae12f45b8be84e438e032c0b860f985c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7f4db1b4eae9dfad46346db6e17ea15"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#aa7f4db1b4eae9dfad46346db6e17ea15">operator-=</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:aa7f4db1b4eae9dfad46346db6e17ea15"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append operator -=. <a href="classxb_1_1xbString.html#aa7f4db1b4eae9dfad46346db6e17ea15">More...</a><br /></td></tr>
+<tr class="separator:aa7f4db1b4eae9dfad46346db6e17ea15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaae97e6eda3d18c9f463993ade985bf4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#aaae97e6eda3d18c9f463993ade985bf4">operator-=</a> (const char *s)</td></tr>
+<tr class="memdesc:aaae97e6eda3d18c9f463993ade985bf4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append operator -=. <a href="classxb_1_1xbString.html#aaae97e6eda3d18c9f463993ade985bf4">More...</a><br /></td></tr>
+<tr class="separator:aaae97e6eda3d18c9f463993ade985bf4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcafd019df23bb5724c46e34f3f31194"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#adcafd019df23bb5724c46e34f3f31194">operator-=</a> (char c)</td></tr>
+<tr class="memdesc:adcafd019df23bb5724c46e34f3f31194"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append operator -=. <a href="classxb_1_1xbString.html#adcafd019df23bb5724c46e34f3f31194">More...</a><br /></td></tr>
+<tr class="separator:adcafd019df23bb5724c46e34f3f31194"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2df3ed2fc9456214f5fd2fcf77b69bc1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a2df3ed2fc9456214f5fd2fcf77b69bc1">operator==</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;) const</td></tr>
+<tr class="memdesc:a2df3ed2fc9456214f5fd2fcf77b69bc1"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator == <a href="classxb_1_1xbString.html#a2df3ed2fc9456214f5fd2fcf77b69bc1">More...</a><br /></td></tr>
+<tr class="separator:a2df3ed2fc9456214f5fd2fcf77b69bc1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94031269af3c433393d4cf0ff9b4be38"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a94031269af3c433393d4cf0ff9b4be38">operator==</a> (const char *) const</td></tr>
+<tr class="memdesc:a94031269af3c433393d4cf0ff9b4be38"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator == <a href="classxb_1_1xbString.html#a94031269af3c433393d4cf0ff9b4be38">More...</a><br /></td></tr>
+<tr class="separator:a94031269af3c433393d4cf0ff9b4be38"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf89691607050b0505dc6af28d059c38"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#acf89691607050b0505dc6af28d059c38">operator!=</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;) const</td></tr>
+<tr class="memdesc:acf89691607050b0505dc6af28d059c38"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator != <a href="classxb_1_1xbString.html#acf89691607050b0505dc6af28d059c38">More...</a><br /></td></tr>
+<tr class="separator:acf89691607050b0505dc6af28d059c38"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a822448f2a0ce653473d4c1de5763a3a6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a822448f2a0ce653473d4c1de5763a3a6">operator!=</a> (const char *) const</td></tr>
+<tr class="memdesc:a822448f2a0ce653473d4c1de5763a3a6"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator != <a href="classxb_1_1xbString.html#a822448f2a0ce653473d4c1de5763a3a6">More...</a><br /></td></tr>
+<tr class="separator:a822448f2a0ce653473d4c1de5763a3a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a71c7aafa0d523c72cbe58c474be2270a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a71c7aafa0d523c72cbe58c474be2270a">operator&lt;</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;) const</td></tr>
+<tr class="memdesc:a71c7aafa0d523c72cbe58c474be2270a"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator &lt; <a href="classxb_1_1xbString.html#a71c7aafa0d523c72cbe58c474be2270a">More...</a><br /></td></tr>
+<tr class="separator:a71c7aafa0d523c72cbe58c474be2270a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae46f6a45da5686b607a4edf2786a2fff"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ae46f6a45da5686b607a4edf2786a2fff">operator&gt;</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;) const</td></tr>
+<tr class="memdesc:ae46f6a45da5686b607a4edf2786a2fff"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator &gt; <a href="classxb_1_1xbString.html#ae46f6a45da5686b607a4edf2786a2fff">More...</a><br /></td></tr>
+<tr class="separator:ae46f6a45da5686b607a4edf2786a2fff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a461f245e60cddfdf5f78a972a46e5880"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a461f245e60cddfdf5f78a972a46e5880">operator&lt;=</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;) const</td></tr>
+<tr class="memdesc:a461f245e60cddfdf5f78a972a46e5880"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator &lt;= <a href="classxb_1_1xbString.html#a461f245e60cddfdf5f78a972a46e5880">More...</a><br /></td></tr>
+<tr class="separator:a461f245e60cddfdf5f78a972a46e5880"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8f16643cb7ba3ee9cf685422c9ea0e67"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a8f16643cb7ba3ee9cf685422c9ea0e67">operator&gt;=</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;) const</td></tr>
+<tr class="memdesc:a8f16643cb7ba3ee9cf685422c9ea0e67"><td class="mdescLeft">&#160;</td><td class="mdescRight">operator &gt;= <a href="classxb_1_1xbString.html#a8f16643cb7ba3ee9cf685422c9ea0e67">More...</a><br /></td></tr>
+<tr class="separator:a8f16643cb7ba3ee9cf685422c9ea0e67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a06abec236b95f6933ba17bf67089f7cf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a06abec236b95f6933ba17bf67089f7cf">operator-</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:a06abec236b95f6933ba17bf67089f7cf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatonate operator -. <a href="classxb_1_1xbString.html#a06abec236b95f6933ba17bf67089f7cf">More...</a><br /></td></tr>
+<tr class="separator:a06abec236b95f6933ba17bf67089f7cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab556e8c3cb478dd95643327d72a48bd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#aab556e8c3cb478dd95643327d72a48bd">operator+</a> (const char *s)</td></tr>
+<tr class="memdesc:aab556e8c3cb478dd95643327d72a48bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatonate operator +. <a href="classxb_1_1xbString.html#aab556e8c3cb478dd95643327d72a48bd">More...</a><br /></td></tr>
+<tr class="separator:aab556e8c3cb478dd95643327d72a48bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f289d577ba90c500bc1be3ec7bb0206"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a1f289d577ba90c500bc1be3ec7bb0206">operator+</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:a1f289d577ba90c500bc1be3ec7bb0206"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatonate operator +. <a href="classxb_1_1xbString.html#a1f289d577ba90c500bc1be3ec7bb0206">More...</a><br /></td></tr>
+<tr class="separator:a1f289d577ba90c500bc1be3ec7bb0206"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af559654baba81c3c0c19823c0b7a69d3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#af559654baba81c3c0c19823c0b7a69d3">operator+</a> (const char c)</td></tr>
+<tr class="memdesc:af559654baba81c3c0c19823c0b7a69d3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Concatonate operator +. <a href="classxb_1_1xbString.html#af559654baba81c3c0c19823c0b7a69d3">More...</a><br /></td></tr>
+<tr class="separator:af559654baba81c3c0c19823c0b7a69d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c4fdb689d27a9d19a0b5b4236e1ca62"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a6c4fdb689d27a9d19a0b5b4236e1ca62">AddBackSlash</a> (char c)</td></tr>
+<tr class="memdesc:a6c4fdb689d27a9d19a0b5b4236e1ca62"><td class="mdescLeft">&#160;</td><td class="mdescRight">Add a prefixing back slash to specified characters in the string. <a href="classxb_1_1xbString.html#a6c4fdb689d27a9d19a0b5b4236e1ca62">More...</a><br /></td></tr>
+<tr class="separator:a6c4fdb689d27a9d19a0b5b4236e1ca62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8f202e4798491f2ae9ce51ff58dd5815"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a8f202e4798491f2ae9ce51ff58dd5815">Append</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:a8f202e4798491f2ae9ce51ff58dd5815"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append data to string. <a href="classxb_1_1xbString.html#a8f202e4798491f2ae9ce51ff58dd5815">More...</a><br /></td></tr>
+<tr class="separator:a8f202e4798491f2ae9ce51ff58dd5815"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1922319303feb6da1f40b5994c5e8240"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a1922319303feb6da1f40b5994c5e8240">Append</a> (const char *s)</td></tr>
+<tr class="memdesc:a1922319303feb6da1f40b5994c5e8240"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append data to string. <a href="classxb_1_1xbString.html#a1922319303feb6da1f40b5994c5e8240">More...</a><br /></td></tr>
+<tr class="separator:a1922319303feb6da1f40b5994c5e8240"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a097453cb71fbf0b5511cf1259ddce4fb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a097453cb71fbf0b5511cf1259ddce4fb">Append</a> (const char *s, xbUInt32 iByteCount)</td></tr>
+<tr class="memdesc:a097453cb71fbf0b5511cf1259ddce4fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append data to string. <a href="classxb_1_1xbString.html#a097453cb71fbf0b5511cf1259ddce4fb">More...</a><br /></td></tr>
+<tr class="separator:a097453cb71fbf0b5511cf1259ddce4fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a093c6ab5df375a2589755bb8f48fa5c7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a093c6ab5df375a2589755bb8f48fa5c7">Append</a> (char c)</td></tr>
+<tr class="memdesc:a093c6ab5df375a2589755bb8f48fa5c7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Append data to string. <a href="classxb_1_1xbString.html#a093c6ab5df375a2589755bb8f48fa5c7">More...</a><br /></td></tr>
+<tr class="separator:a093c6ab5df375a2589755bb8f48fa5c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85bef82dfa22122a1ab8dfe58a107d96"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a85bef82dfa22122a1ab8dfe58a107d96">Assign</a> (const char *srcStr, xbUInt32 lStartPos, xbUInt32 lCopyLen)</td></tr>
+<tr class="memdesc:a85bef82dfa22122a1ab8dfe58a107d96"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assign portion of string. <a href="classxb_1_1xbString.html#a85bef82dfa22122a1ab8dfe58a107d96">More...</a><br /></td></tr>
+<tr class="separator:a85bef82dfa22122a1ab8dfe58a107d96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08eb7ca6740423acab4e8bd7a6c8043d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a08eb7ca6740423acab4e8bd7a6c8043d">Assign</a> (const char *srcStr, xbUInt32 lStartPos)</td></tr>
+<tr class="memdesc:a08eb7ca6740423acab4e8bd7a6c8043d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assign portion of string. <a href="classxb_1_1xbString.html#a08eb7ca6740423acab4e8bd7a6c8043d">More...</a><br /></td></tr>
+<tr class="separator:a08eb7ca6740423acab4e8bd7a6c8043d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a210707223fffc7b3ab31eca4ef29f731"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a210707223fffc7b3ab31eca4ef29f731">Assign</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s, xbUInt32 pos, xbUInt32 n)</td></tr>
+<tr class="memdesc:a210707223fffc7b3ab31eca4ef29f731"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assign portion of string. <a href="classxb_1_1xbString.html#a210707223fffc7b3ab31eca4ef29f731">More...</a><br /></td></tr>
+<tr class="separator:a210707223fffc7b3ab31eca4ef29f731"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab9045442e57293843652dfce6522ff83"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ab9045442e57293843652dfce6522ff83">Assign</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s, xbUInt32 n)</td></tr>
+<tr class="memdesc:ab9045442e57293843652dfce6522ff83"><td class="mdescLeft">&#160;</td><td class="mdescRight">Assign portion of string. <a href="classxb_1_1xbString.html#ab9045442e57293843652dfce6522ff83">More...</a><br /></td></tr>
+<tr class="separator:ab9045442e57293843652dfce6522ff83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac7a8466b03c04df838bd182ef244f792"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ac7a8466b03c04df838bd182ef244f792">Copy</a> () const</td></tr>
+<tr class="memdesc:ac7a8466b03c04df838bd182ef244f792"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy a string. <a href="classxb_1_1xbString.html#ac7a8466b03c04df838bd182ef244f792">More...</a><br /></td></tr>
+<tr class="separator:ac7a8466b03c04df838bd182ef244f792"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26bc14d92dc7ce1f2bf31cd74af0db0f"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a26bc14d92dc7ce1f2bf31cd74af0db0f">CountChar</a> (char c) const</td></tr>
+<tr class="memdesc:a26bc14d92dc7ce1f2bf31cd74af0db0f"><td class="mdescLeft">&#160;</td><td class="mdescRight">Count the number of characters in the string. <a href="classxb_1_1xbString.html#a26bc14d92dc7ce1f2bf31cd74af0db0f">More...</a><br /></td></tr>
+<tr class="separator:a26bc14d92dc7ce1f2bf31cd74af0db0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc0204bcfd1c052b9aea9229b10acf72"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#adc0204bcfd1c052b9aea9229b10acf72">CountChar</a> (char c, xbInt16 iOpt) const</td></tr>
+<tr class="memdesc:adc0204bcfd1c052b9aea9229b10acf72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Count the number of characters in the string. <a href="classxb_1_1xbString.html#adc0204bcfd1c052b9aea9229b10acf72">More...</a><br /></td></tr>
+<tr class="separator:adc0204bcfd1c052b9aea9229b10acf72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a737bd408a94903f214eb2879eb56de"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a0a737bd408a94903f214eb2879eb56de">CvtHexChar</a> (char &amp;cOut)</td></tr>
+<tr class="memdesc:a0a737bd408a94903f214eb2879eb56de"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert hex character to string. <a href="classxb_1_1xbString.html#a0a737bd408a94903f214eb2879eb56de">More...</a><br /></td></tr>
+<tr class="separator:a0a737bd408a94903f214eb2879eb56de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5eb6918a0ae9ab6c0e961318f3d1eb0"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ab5eb6918a0ae9ab6c0e961318f3d1eb0">CvtHexString</a> (<a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sOut)</td></tr>
+<tr class="memdesc:ab5eb6918a0ae9ab6c0e961318f3d1eb0"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert string of hex characters to string. <a href="classxb_1_1xbString.html#ab5eb6918a0ae9ab6c0e961318f3d1eb0">More...</a><br /></td></tr>
+<tr class="separator:ab5eb6918a0ae9ab6c0e961318f3d1eb0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1528b30b84a41c3564ef31d1f4496b15"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a1528b30b84a41c3564ef31d1f4496b15">CvtULongLong</a> (xbUInt64 &amp;ullOut)</td></tr>
+<tr class="memdesc:a1528b30b84a41c3564ef31d1f4496b15"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert string to xbUInt64 number. <a href="classxb_1_1xbString.html#a1528b30b84a41c3564ef31d1f4496b15">More...</a><br /></td></tr>
+<tr class="separator:a1528b30b84a41c3564ef31d1f4496b15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3ab18365e132323f8ae4c99eb72181c"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ae3ab18365e132323f8ae4c99eb72181c">CvtLongLong</a> (xbInt64 &amp;llOut)</td></tr>
+<tr class="memdesc:ae3ab18365e132323f8ae4c99eb72181c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Convert string to xbInt64 number. <a href="classxb_1_1xbString.html#ae3ab18365e132323f8ae4c99eb72181c">More...</a><br /></td></tr>
+<tr class="separator:ae3ab18365e132323f8ae4c99eb72181c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77195fc4957952625cb33bb503517a3e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a77195fc4957952625cb33bb503517a3e">ExtractElement</a> (const char *src, char delim, xbUInt32 iCnt, xbInt16 iOpt=0)</td></tr>
+<tr class="memdesc:a77195fc4957952625cb33bb503517a3e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extract an element out of a delimited string. <a href="classxb_1_1xbString.html#a77195fc4957952625cb33bb503517a3e">More...</a><br /></td></tr>
+<tr class="separator:a77195fc4957952625cb33bb503517a3e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a685187a5f8401b322fc61f3fbe56330d"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a685187a5f8401b322fc61f3fbe56330d">GetCharacter</a> (xbUInt32 lPos) const</td></tr>
+<tr class="memdesc:a685187a5f8401b322fc61f3fbe56330d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a character by position. <a href="classxb_1_1xbString.html#a685187a5f8401b322fc61f3fbe56330d">More...</a><br /></td></tr>
+<tr class="separator:a685187a5f8401b322fc61f3fbe56330d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac7698665f44413a5e99a5b5bc573c6df"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ac7698665f44413a5e99a5b5bc573c6df">GetLastPos</a> (char c) const</td></tr>
+<tr class="memdesc:ac7698665f44413a5e99a5b5bc573c6df"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the position of the last occurrence of a given character. <a href="classxb_1_1xbString.html#ac7698665f44413a5e99a5b5bc573c6df">More...</a><br /></td></tr>
+<tr class="separator:ac7698665f44413a5e99a5b5bc573c6df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c55587904fe7e534290559d0ecb8646"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a1c55587904fe7e534290559d0ecb8646">GetLastPos</a> (const char *s) const</td></tr>
+<tr class="memdesc:a1c55587904fe7e534290559d0ecb8646"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the position of the last occurrence of a given string. <a href="classxb_1_1xbString.html#a1c55587904fe7e534290559d0ecb8646">More...</a><br /></td></tr>
+<tr class="separator:a1c55587904fe7e534290559d0ecb8646"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af8b8b808cf43cd352321b43f500142db"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#af8b8b808cf43cd352321b43f500142db">GetPathSeparator</a> () const</td></tr>
+<tr class="memdesc:af8b8b808cf43cd352321b43f500142db"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the path separator out of the string. <a href="classxb_1_1xbString.html#af8b8b808cf43cd352321b43f500142db">More...</a><br /></td></tr>
+<tr class="separator:af8b8b808cf43cd352321b43f500142db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c33e73659f8e98819289d2661c7271c"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a6c33e73659f8e98819289d2661c7271c">GetSize</a> () const</td></tr>
+<tr class="memdesc:a6c33e73659f8e98819289d2661c7271c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieve the size of the string buffer. <a href="classxb_1_1xbString.html#a6c33e73659f8e98819289d2661c7271c">More...</a><br /></td></tr>
+<tr class="separator:a6c33e73659f8e98819289d2661c7271c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa13f6b72e5a529eab04545892bbc98b4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#aa13f6b72e5a529eab04545892bbc98b4">HasAlphaChars</a> () const</td></tr>
+<tr class="memdesc:aa13f6b72e5a529eab04545892bbc98b4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine if the string has any alpha characters. <a href="classxb_1_1xbString.html#aa13f6b72e5a529eab04545892bbc98b4">More...</a><br /></td></tr>
+<tr class="separator:aa13f6b72e5a529eab04545892bbc98b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a255a30d683acd62ea09c1617b53cb3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a4a255a30d683acd62ea09c1617b53cb3">IsEmpty</a> () const</td></tr>
+<tr class="memdesc:a4a255a30d683acd62ea09c1617b53cb3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine if string is empty. <a href="classxb_1_1xbString.html#a4a255a30d683acd62ea09c1617b53cb3">More...</a><br /></td></tr>
+<tr class="separator:a4a255a30d683acd62ea09c1617b53cb3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3fa34fa31bcb7244ecb054ab628ad500"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a3fa34fa31bcb7244ecb054ab628ad500">IsNull</a> () const</td></tr>
+<tr class="memdesc:a3fa34fa31bcb7244ecb054ab628ad500"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine if string is NULL. <a href="classxb_1_1xbString.html#a3fa34fa31bcb7244ecb054ab628ad500">More...</a><br /></td></tr>
+<tr class="separator:a3fa34fa31bcb7244ecb054ab628ad500"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acdc3a6d6955b99f0a6b1d181fb3098b9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#acdc3a6d6955b99f0a6b1d181fb3098b9">Left</a> (xbUInt32 ulLen)</td></tr>
+<tr class="memdesc:acdc3a6d6955b99f0a6b1d181fb3098b9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retain left part of string, drop rightmost characters. <a href="classxb_1_1xbString.html#acdc3a6d6955b99f0a6b1d181fb3098b9">More...</a><br /></td></tr>
+<tr class="separator:acdc3a6d6955b99f0a6b1d181fb3098b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a998b240eedac311aea5843047f55649b"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a998b240eedac311aea5843047f55649b">Len</a> () const</td></tr>
+<tr class="memdesc:a998b240eedac311aea5843047f55649b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Retrieve length of current string. <a href="classxb_1_1xbString.html#a998b240eedac311aea5843047f55649b">More...</a><br /></td></tr>
+<tr class="separator:a998b240eedac311aea5843047f55649b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a90e0d0be4fd0d82dd2ebbe689adf18ee"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a90e0d0be4fd0d82dd2ebbe689adf18ee">Ltrim</a> ()</td></tr>
+<tr class="memdesc:a90e0d0be4fd0d82dd2ebbe689adf18ee"><td class="mdescLeft">&#160;</td><td class="mdescRight">Left trim white space from string. <a href="classxb_1_1xbString.html#a90e0d0be4fd0d82dd2ebbe689adf18ee">More...</a><br /></td></tr>
+<tr class="separator:a90e0d0be4fd0d82dd2ebbe689adf18ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a656f5854f74064b7257ff96d96dfb68b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a656f5854f74064b7257ff96d96dfb68b">Ltrunc</a> (xbUInt32 ulCnt)</td></tr>
+<tr class="memdesc:a656f5854f74064b7257ff96d96dfb68b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Left truncate string. <a href="classxb_1_1xbString.html#a656f5854f74064b7257ff96d96dfb68b">More...</a><br /></td></tr>
+<tr class="separator:a656f5854f74064b7257ff96d96dfb68b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f9eefc836b24c4ee7c5a316c5d812b7"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a0f9eefc836b24c4ee7c5a316c5d812b7">Mid</a> (xbUInt32 ulPos, xbUInt32 lLen)</td></tr>
+<tr class="memdesc:a0f9eefc836b24c4ee7c5a316c5d812b7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Extract portion of data from string. <a href="classxb_1_1xbString.html#a0f9eefc836b24c4ee7c5a316c5d812b7">More...</a><br /></td></tr>
+<tr class="separator:a0f9eefc836b24c4ee7c5a316c5d812b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a09cfed22066b0c72432f26960f9e7b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a6a09cfed22066b0c72432f26960f9e7b">PadLeft</a> (char c, xbUInt32 ulLen)</td></tr>
+<tr class="memdesc:a6a09cfed22066b0c72432f26960f9e7b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Left pad string. <a href="classxb_1_1xbString.html#a6a09cfed22066b0c72432f26960f9e7b">More...</a><br /></td></tr>
+<tr class="separator:a6a09cfed22066b0c72432f26960f9e7b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba13f0c77eb6c4a22996039569fad284"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#aba13f0c77eb6c4a22996039569fad284">PadRight</a> (char c, xbUInt32 ulLen)</td></tr>
+<tr class="memdesc:aba13f0c77eb6c4a22996039569fad284"><td class="mdescLeft">&#160;</td><td class="mdescRight">Right pad string. <a href="classxb_1_1xbString.html#aba13f0c77eb6c4a22996039569fad284">More...</a><br /></td></tr>
+<tr class="separator:aba13f0c77eb6c4a22996039569fad284"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3baf59d15099589ff631995f129e582b"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a3baf59d15099589ff631995f129e582b">Pos</a> (char c) const</td></tr>
+<tr class="memdesc:a3baf59d15099589ff631995f129e582b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine position of a given character. <a href="classxb_1_1xbString.html#a3baf59d15099589ff631995f129e582b">More...</a><br /></td></tr>
+<tr class="separator:a3baf59d15099589ff631995f129e582b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8705d7277b72f5aa98021e84438914da"><td class="memItemLeft" align="right" valign="top">xbUInt32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a8705d7277b72f5aa98021e84438914da">Pos</a> (const char *s) const</td></tr>
+<tr class="memdesc:a8705d7277b72f5aa98021e84438914da"><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine position of a given substring. <a href="classxb_1_1xbString.html#a8705d7277b72f5aa98021e84438914da">More...</a><br /></td></tr>
+<tr class="separator:a8705d7277b72f5aa98021e84438914da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1bae6fa8f608261f6e889616482f6e39"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a1bae6fa8f608261f6e889616482f6e39">PutAt</a> (xbUInt32 ulPos, char c)</td></tr>
+<tr class="memdesc:a1bae6fa8f608261f6e889616482f6e39"><td class="mdescLeft">&#160;</td><td class="mdescRight">Insert character into string. <a href="classxb_1_1xbString.html#a1bae6fa8f608261f6e889616482f6e39">More...</a><br /></td></tr>
+<tr class="separator:a1bae6fa8f608261f6e889616482f6e39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afaac65eaa6d9ef1596d6a0e7b91ed0f2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#afaac65eaa6d9ef1596d6a0e7b91ed0f2">Remove</a> (xbUInt32 ulPos, xbUInt32 ulN)</td></tr>
+<tr class="memdesc:afaac65eaa6d9ef1596d6a0e7b91ed0f2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Remove portion of string. <a href="classxb_1_1xbString.html#afaac65eaa6d9ef1596d6a0e7b91ed0f2">More...</a><br /></td></tr>
+<tr class="separator:afaac65eaa6d9ef1596d6a0e7b91ed0f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6d346ab04e5bb8852f0bb996163a35e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#aa6d346ab04e5bb8852f0bb996163a35e">Resize</a> (xbUInt32 lSize)</td></tr>
+<tr class="memdesc:aa6d346ab04e5bb8852f0bb996163a35e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Resize a string. <a href="classxb_1_1xbString.html#aa6d346ab04e5bb8852f0bb996163a35e">More...</a><br /></td></tr>
+<tr class="separator:aa6d346ab04e5bb8852f0bb996163a35e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf330188d67c347ecae0d16f65b22077"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#aaf330188d67c347ecae0d16f65b22077">Rtrim</a> ()</td></tr>
+<tr class="memdesc:aaf330188d67c347ecae0d16f65b22077"><td class="mdescLeft">&#160;</td><td class="mdescRight">Right trim the string. <a href="classxb_1_1xbString.html#aaf330188d67c347ecae0d16f65b22077">More...</a><br /></td></tr>
+<tr class="separator:aaf330188d67c347ecae0d16f65b22077"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab85753d2c39882e946a8468cbb587700"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ab85753d2c39882e946a8468cbb587700">Set</a> (const char *s)</td></tr>
+<tr class="memdesc:ab85753d2c39882e946a8468cbb587700"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the value of the string. <a href="classxb_1_1xbString.html#ab85753d2c39882e946a8468cbb587700">More...</a><br /></td></tr>
+<tr class="separator:ab85753d2c39882e946a8468cbb587700"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac0d08bd688fd0e3707e32886d0dfeb09"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#ac0d08bd688fd0e3707e32886d0dfeb09">Set</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:ac0d08bd688fd0e3707e32886d0dfeb09"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the value of the string. <a href="classxb_1_1xbString.html#ac0d08bd688fd0e3707e32886d0dfeb09">More...</a><br /></td></tr>
+<tr class="separator:ac0d08bd688fd0e3707e32886d0dfeb09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6eba6ccd0c805a22516de2c18a30f8a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a6eba6ccd0c805a22516de2c18a30f8a3">Set</a> (const char *s, xbUInt32 ulSize)</td></tr>
+<tr class="memdesc:a6eba6ccd0c805a22516de2c18a30f8a3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the value of the string. <a href="classxb_1_1xbString.html#a6eba6ccd0c805a22516de2c18a30f8a3">More...</a><br /></td></tr>
+<tr class="separator:a6eba6ccd0c805a22516de2c18a30f8a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3af5b1f111f94b0667551fcbd1d97abd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a3af5b1f111f94b0667551fcbd1d97abd">SetNum</a> (xbInt32 lNum)</td></tr>
+<tr class="memdesc:a3af5b1f111f94b0667551fcbd1d97abd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the string to long integer numeric value. <a href="classxb_1_1xbString.html#a3af5b1f111f94b0667551fcbd1d97abd">More...</a><br /></td></tr>
+<tr class="separator:a3af5b1f111f94b0667551fcbd1d97abd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e9bfa29d86377b915f1628aeb0e9195"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a9e9bfa29d86377b915f1628aeb0e9195">Sprintf</a> (const char *format,...)</td></tr>
+<tr class="memdesc:a9e9bfa29d86377b915f1628aeb0e9195"><td class="mdescLeft">&#160;</td><td class="mdescRight">Printf routine for formatting a string. <a href="classxb_1_1xbString.html#a9e9bfa29d86377b915f1628aeb0e9195">More...</a><br /></td></tr>
+<tr class="separator:a9e9bfa29d86377b915f1628aeb0e9195"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6715f4c0010f3ab487c9d787838a29b3"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a6715f4c0010f3ab487c9d787838a29b3">Str</a> () const</td></tr>
+<tr class="memdesc:a6715f4c0010f3ab487c9d787838a29b3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Return string data. <a href="classxb_1_1xbString.html#a6715f4c0010f3ab487c9d787838a29b3">More...</a><br /></td></tr>
+<tr class="separator:a6715f4c0010f3ab487c9d787838a29b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3bc9e856c34f0c240a6e36e5b6e3ea7b"><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a3bc9e856c34f0c240a6e36e5b6e3ea7b">strncpy</a> (char *cDest, xbUInt32 n) const</td></tr>
+<tr class="memdesc:a3bc9e856c34f0c240a6e36e5b6e3ea7b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy all or part of string to character array. <a href="classxb_1_1xbString.html#a3bc9e856c34f0c240a6e36e5b6e3ea7b">More...</a><br /></td></tr>
+<tr class="separator:a3bc9e856c34f0c240a6e36e5b6e3ea7b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a054683872e1f05d11c2cf8683a63a6fe"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a054683872e1f05d11c2cf8683a63a6fe">SwapChars</a> (char from, char to)</td></tr>
+<tr class="memdesc:a054683872e1f05d11c2cf8683a63a6fe"><td class="mdescLeft">&#160;</td><td class="mdescRight">Swap characters. <a href="classxb_1_1xbString.html#a054683872e1f05d11c2cf8683a63a6fe">More...</a><br /></td></tr>
+<tr class="separator:a054683872e1f05d11c2cf8683a63a6fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a602cac1a6ef3f6b52f587ac4c0ef4fb2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a602cac1a6ef3f6b52f587ac4c0ef4fb2">ToLowerCase</a> ()</td></tr>
+<tr class="memdesc:a602cac1a6ef3f6b52f587ac4c0ef4fb2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Replace all upper case charaters with lower case characters. <a href="classxb_1_1xbString.html#a602cac1a6ef3f6b52f587ac4c0ef4fb2">More...</a><br /></td></tr>
+<tr class="separator:a602cac1a6ef3f6b52f587ac4c0ef4fb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68001d0a44e6b4fe61e29a4e41ded9d4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a68001d0a44e6b4fe61e29a4e41ded9d4">ToUpperCase</a> ()</td></tr>
+<tr class="memdesc:a68001d0a44e6b4fe61e29a4e41ded9d4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Replace all lower case charaters with lower case characters. <a href="classxb_1_1xbString.html#a68001d0a44e6b4fe61e29a4e41ded9d4">More...</a><br /></td></tr>
+<tr class="separator:a68001d0a44e6b4fe61e29a4e41ded9d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc9bd33687d4e03ca52d77885721d626"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#abc9bd33687d4e03ca52d77885721d626">Trim</a> ()</td></tr>
+<tr class="memdesc:abc9bd33687d4e03ca52d77885721d626"><td class="mdescLeft">&#160;</td><td class="mdescRight">Trim all leading and trailing white space from string. <a href="classxb_1_1xbString.html#abc9bd33687d4e03ca52d77885721d626">More...</a><br /></td></tr>
+<tr class="separator:abc9bd33687d4e03ca52d77885721d626"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a72b16c15fd8822efaa5f158c34df7b1e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a72b16c15fd8822efaa5f158c34df7b1e">ValidLogicalValue</a> () const</td></tr>
+<tr class="memdesc:a72b16c15fd8822efaa5f158c34df7b1e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check for valid logical field data. <a href="classxb_1_1xbString.html#a72b16c15fd8822efaa5f158c34df7b1e">More...</a><br /></td></tr>
+<tr class="separator:a72b16c15fd8822efaa5f158c34df7b1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeed920d2a25111f776ddde2d530eb81b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#aeed920d2a25111f776ddde2d530eb81b">ValidNumericValue</a> () const</td></tr>
+<tr class="memdesc:aeed920d2a25111f776ddde2d530eb81b"><td class="mdescLeft">&#160;</td><td class="mdescRight">This function returns true if the data is valid numeric data. <a href="classxb_1_1xbString.html#aeed920d2a25111f776ddde2d530eb81b">More...</a><br /></td></tr>
+<tr class="separator:aeed920d2a25111f776ddde2d530eb81b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2fd30956a26a260d1ef6fdbe73dd93f9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a2fd30956a26a260d1ef6fdbe73dd93f9">ZapChar</a> (char c)</td></tr>
+<tr class="memdesc:a2fd30956a26a260d1ef6fdbe73dd93f9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Remove every instance of a character from a string. <a href="classxb_1_1xbString.html#a2fd30956a26a260d1ef6fdbe73dd93f9">More...</a><br /></td></tr>
+<tr class="separator:a2fd30956a26a260d1ef6fdbe73dd93f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:addc3a470f6cd85d4c21bf9da38cf5ac9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#addc3a470f6cd85d4c21bf9da38cf5ac9">ZapLeadingChar</a> (char c)</td></tr>
+<tr class="memdesc:addc3a470f6cd85d4c21bf9da38cf5ac9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Remove leading character from a string. <a href="classxb_1_1xbString.html#addc3a470f6cd85d4c21bf9da38cf5ac9">More...</a><br /></td></tr>
+<tr class="separator:addc3a470f6cd85d4c21bf9da38cf5ac9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe3415bfa2e1089b792aeda0462fb99e"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#afe3415bfa2e1089b792aeda0462fb99e">ZapTrailingChar</a> (char c)</td></tr>
+<tr class="memdesc:afe3415bfa2e1089b792aeda0462fb99e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Remove trailing character from a string. <a href="classxb_1_1xbString.html#afe3415bfa2e1089b792aeda0462fb99e">More...</a><br /></td></tr>
+<tr class="separator:afe3415bfa2e1089b792aeda0462fb99e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="friends" name="friends"></a>
+Friends</h2></td></tr>
+<tr class="memitem:a3fa915061156521e9dd772a8d7e5f8fb"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html#a3fa915061156521e9dd772a8d7e5f8fb">operator&lt;&lt;</a> (std::ostream &amp;os, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:a3fa915061156521e9dd772a8d7e5f8fb"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stream insertion operator &lt;&lt;. <a href="classxb_1_1xbString.html#a3fa915061156521e9dd772a8d7e5f8fb">More...</a><br /></td></tr>
+<tr class="separator:a3fa915061156521e9dd772a8d7e5f8fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p >Class for handling string data. </p>
+<p >This class defines a basic string class with all the functions one would expect in a string class.</p>
+<p >For purposes of the <a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> class, a string is defined as a variable sized array of one byte characters terminated with a null (0x00 or \0) byte.<br />
+<br />
+</p>
+<p >This version of the <a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> class does not support wide (wchar_t) characters. Perhaps you would be interested in creating a class for supporting wide characters.<br />
+<br />
+</p>
+<p >This string class handle strings in a 1-based (not 0 based) fashion. Any string routines taking an offset use a 1-based value. That is, the first position of the string is position 1, not 0.<br />
+<br />
+ <br />
+</p>
+<p >Position 1 (not 0) is considered the first position in a string. <br />
+ A return of 0 would indicate a not found condition. A return of 1, would be the first byte. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a63f9313217e0ff3c9789ec59316216a1" name="a63f9313217e0ff3c9789ec59316216a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a63f9313217e0ff3c9789ec59316216a1">&#9670;&nbsp;</a></span>xbString() <span class="overload">[1/6]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbString::xbString </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulSize</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulSize</td><td>- Allocation size. The allocation size is normally handled internally by the class, but it can be set in this constructor. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a14bbaa293c8d40dd6c64332f2668a92e" name="a14bbaa293c8d40dd6c64332f2668a92e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a14bbaa293c8d40dd6c64332f2668a92e">&#9670;&nbsp;</a></span>xbString() <span class="overload">[2/6]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbString::xbString </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>- Initialize string to c. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a18f3598dcdf2ec5692274fc8ee769ad7" name="a18f3598dcdf2ec5692274fc8ee769ad7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a18f3598dcdf2ec5692274fc8ee769ad7">&#9670;&nbsp;</a></span>xbString() <span class="overload">[3/6]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbString::xbString </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulMaxLen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>Initialize string to s. </td></tr>
+ <tr><td class="paramname">ulMaxLen</td><td>Maximum length of string. Truncate any characters greater than ulMaxLen. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0d81016b93fc36ebbbafacf35c677f07" name="a0d81016b93fc36ebbbafacf35c677f07"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0d81016b93fc36ebbbafacf35c677f07">&#9670;&nbsp;</a></span>xbString() <span class="overload">[4/6]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbString::xbString </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>Initialize string to s. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a25856311106c5fb15d39017b63f0ddc7" name="a25856311106c5fb15d39017b63f0ddc7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25856311106c5fb15d39017b63f0ddc7">&#9670;&nbsp;</a></span>xbString() <span class="overload">[5/6]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbString::xbString </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em> = <code>&quot;&quot;</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>- Initialize string to s. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ad865b55e3b08dffd527afee8e7e8e3fe" name="ad865b55e3b08dffd527afee8e7e8e3fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad865b55e3b08dffd527afee8e7e8e3fe">&#9670;&nbsp;</a></span>xbString() <span class="overload">[6/6]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbString::xbString </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a>&#160;</td>
+ <td class="paramname"><em>d</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Constructor. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">d</td><td>- Initiailize string to d. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a10a6549efab02bc76ab33b15916b1eb1" name="a10a6549efab02bc76ab33b15916b1eb1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a10a6549efab02bc76ab33b15916b1eb1">&#9670;&nbsp;</a></span>~xbString()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbString::~xbString </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Destructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a6c4fdb689d27a9d19a0b5b4236e1ca62" name="a6c4fdb689d27a9d19a0b5b4236e1ca62"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c4fdb689d27a9d19a0b5b4236e1ca62">&#9670;&nbsp;</a></span>AddBackSlash()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::AddBackSlash </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Add a prefixing back slash to specified characters in the string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Character to prefix with a backslash. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a093c6ab5df375a2589755bb8f48fa5c7" name="a093c6ab5df375a2589755bb8f48fa5c7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a093c6ab5df375a2589755bb8f48fa5c7">&#9670;&nbsp;</a></span>Append() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Append </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Append data to string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>String data to append. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a1922319303feb6da1f40b5994c5e8240" name="a1922319303feb6da1f40b5994c5e8240"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1922319303feb6da1f40b5994c5e8240">&#9670;&nbsp;</a></span>Append() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Append </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Append data to string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String data to append. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a097453cb71fbf0b5511cf1259ddce4fb" name="a097453cb71fbf0b5511cf1259ddce4fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a097453cb71fbf0b5511cf1259ddce4fb">&#9670;&nbsp;</a></span>Append() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Append </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulByteCount</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Append data to string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String data to append. </td></tr>
+ <tr><td class="paramname">ulByteCount</td><td>Maximum number of bytes to append. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a8f202e4798491f2ae9ce51ff58dd5815" name="a8f202e4798491f2ae9ce51ff58dd5815"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8f202e4798491f2ae9ce51ff58dd5815">&#9670;&nbsp;</a></span>Append() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Append </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Append data to string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String data to append. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a08eb7ca6740423acab4e8bd7a6c8043d" name="a08eb7ca6740423acab4e8bd7a6c8043d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a08eb7ca6740423acab4e8bd7a6c8043d">&#9670;&nbsp;</a></span>Assign() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Assign </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>sStr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulStartPos</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Assign portion of string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sStr</td><td>- Source string for copy operation. sStr needs to be a Null terminated string. </td></tr>
+ <tr><td class="paramname">ulStartPos</td><td>- Starting position within source string. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a85bef82dfa22122a1ab8dfe58a107d96" name="a85bef82dfa22122a1ab8dfe58a107d96"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a85bef82dfa22122a1ab8dfe58a107d96">&#9670;&nbsp;</a></span>Assign() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Assign </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>sStr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulStartPos</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulCopyLen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Assign portion of string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sStr</td><td>- Source string for copy operation. sStr needs to be a Null terminated string. </td></tr>
+ <tr><td class="paramname">ulStartPos</td><td>- Starting position within source string. </td></tr>
+ <tr><td class="paramname">ulCopyLen</td><td>- Length of data to copy. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="ab9045442e57293843652dfce6522ff83" name="ab9045442e57293843652dfce6522ff83"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab9045442e57293843652dfce6522ff83">&#9670;&nbsp;</a></span>Assign() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Assign </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sStr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulStartPos</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Assign portion of string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sStr</td><td>- Source string for copy operation. sStr needs to be a Null terminated string. </td></tr>
+ <tr><td class="paramname">ulStartPos</td><td>- Starting position within source string. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a210707223fffc7b3ab31eca4ef29f731" name="a210707223fffc7b3ab31eca4ef29f731"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a210707223fffc7b3ab31eca4ef29f731">&#9670;&nbsp;</a></span>Assign() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Assign </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sStr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulStartPos</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulCopyLen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Assign portion of string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sStr</td><td>- Source string for copy operation. sStr needs to be a Null terminated string. </td></tr>
+ <tr><td class="paramname">ulStartPos</td><td>- Starting position within source string. </td></tr>
+ <tr><td class="paramname">ulCopyLen</td><td>- Length of data to copy. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="ac7a8466b03c04df838bd182ef244f792" name="ac7a8466b03c04df838bd182ef244f792"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac7a8466b03c04df838bd182ef244f792">&#9670;&nbsp;</a></span>Copy()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbString::Copy </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy a string. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a>. </dd></dl>
+
+</div>
+</div>
+<a id="a26bc14d92dc7ce1f2bf31cd74af0db0f" name="a26bc14d92dc7ce1f2bf31cd74af0db0f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a26bc14d92dc7ce1f2bf31cd74af0db0f">&#9670;&nbsp;</a></span>CountChar() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbString::CountChar </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Count the number of characters in the string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Character to count. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The number of characters. </dd></dl>
+
+</div>
+</div>
+<a id="adc0204bcfd1c052b9aea9229b10acf72" name="adc0204bcfd1c052b9aea9229b10acf72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adc0204bcfd1c052b9aea9229b10acf72">&#9670;&nbsp;</a></span>CountChar() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbString::CountChar </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOpt</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Count the number of characters in the string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Character to count. </td></tr>
+ <tr><td class="paramname">iOpt</td><td>0 - Count the number of characters.<br />
+ 1 - Count the number of characters not between single or double quotes. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>The number of characters. </dd></dl>
+
+</div>
+</div>
+<a id="a0a737bd408a94903f214eb2879eb56de" name="a0a737bd408a94903f214eb2879eb56de"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0a737bd408a94903f214eb2879eb56de">&#9670;&nbsp;</a></span>CvtHexChar()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbString::CvtHexChar </td>
+ <td>(</td>
+ <td class="paramtype">char &amp;&#160;</td>
+ <td class="paramname"><em>cOut</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Convert hex character to string. </p>
+<p >This routine converts a four byte string in the format of 0x00 to a one byte char value. The first four bytes of the string must be in the format 0x00. Anything past the first four bytes is disregarded.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">cOut</td><td>Output character. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_INVALID_PARM on error<br />
+ XB_NO_ERROR on success. </dd></dl>
+
+</div>
+</div>
+<a id="ab5eb6918a0ae9ab6c0e961318f3d1eb0" name="ab5eb6918a0ae9ab6c0e961318f3d1eb0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5eb6918a0ae9ab6c0e961318f3d1eb0">&#9670;&nbsp;</a></span>CvtHexString()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbString::CvtHexString </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sOut</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Convert string of hex characters to string. </p>
+<p >This routine converts a string of four byte format of 0x00 to a string of one byte chars.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sOut</td><td>Output string of converted characters. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_INVALID_PARM on error<br />
+ XB_NO_ERROR on success. </dd></dl>
+
+</div>
+</div>
+<a id="ae3ab18365e132323f8ae4c99eb72181c" name="ae3ab18365e132323f8ae4c99eb72181c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae3ab18365e132323f8ae4c99eb72181c">&#9670;&nbsp;</a></span>CvtLongLong()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbString::CvtLongLong </td>
+ <td>(</td>
+ <td class="paramtype">xbInt64 &amp;&#160;</td>
+ <td class="paramname"><em>llOut</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Convert string to xbInt64 number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">llOut</td><td>- output long long. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_NO_ERROR </dd></dl>
+
+</div>
+</div>
+<a id="a1528b30b84a41c3564ef31d1f4496b15" name="a1528b30b84a41c3564ef31d1f4496b15"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1528b30b84a41c3564ef31d1f4496b15">&#9670;&nbsp;</a></span>CvtULongLong()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbString::CvtULongLong </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt64 &amp;&#160;</td>
+ <td class="paramname"><em>ullOut</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Convert string to xbUInt64 number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ullOut</td><td>- output unsigned long long. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>XB_NO_ERROR </dd></dl>
+
+</div>
+</div>
+<a id="a77195fc4957952625cb33bb503517a3e" name="a77195fc4957952625cb33bb503517a3e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a77195fc4957952625cb33bb503517a3e">&#9670;&nbsp;</a></span>ExtractElement()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::ExtractElement </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>pSrc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>cDelim</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>lSkipCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOpt</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extract an element out of a delimited string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">pSrc</td><td>Source string. </td></tr>
+ <tr><td class="paramname">cDelim</td><td>Delimiter. </td></tr>
+ <tr><td class="paramname">lSkipCnt</td><td>Number of delimiters to skip. </td></tr>
+ <tr><td class="paramname">iOpt</td><td>0 - ignore single and double quotes.<br />
+ 1 - ignore delimiters between single or double quotes. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to string extracted from element. </dd></dl>
+
+</div>
+</div>
+<a id="a685187a5f8401b322fc61f3fbe56330d" name="a685187a5f8401b322fc61f3fbe56330d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a685187a5f8401b322fc61f3fbe56330d">&#9670;&nbsp;</a></span>GetCharacter()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbString::GetCharacter </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>n</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get a character by position. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">n</td><td>- Position in string to extract. First position is 1 (not 0). </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Character from position n, or null. </dd></dl>
+
+</div>
+</div>
+<a id="ac7698665f44413a5e99a5b5bc573c6df" name="ac7698665f44413a5e99a5b5bc573c6df"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac7698665f44413a5e99a5b5bc573c6df">&#9670;&nbsp;</a></span>GetLastPos() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbString::GetLastPos </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the position of the last occurrence of a given character. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>- Character to search for. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Last position of character in the string. </dd></dl>
+
+</div>
+</div>
+<a id="a1c55587904fe7e534290559d0ecb8646" name="a1c55587904fe7e534290559d0ecb8646"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c55587904fe7e534290559d0ecb8646">&#9670;&nbsp;</a></span>GetLastPos() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbString::GetLastPos </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the position of the last occurrence of a given string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>- String to search for. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Last position of character in the string. </dd></dl>
+
+</div>
+</div>
+<a id="af8b8b808cf43cd352321b43f500142db" name="af8b8b808cf43cd352321b43f500142db"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af8b8b808cf43cd352321b43f500142db">&#9670;&nbsp;</a></span>GetPathSeparator()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbString::GetPathSeparator </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the path separator out of the string. </p>
+<dl class="section return"><dt>Returns</dt><dd>Char value containing either / or \ depending on OS. </dd></dl>
+
+</div>
+</div>
+<a id="a6c33e73659f8e98819289d2661c7271c" name="a6c33e73659f8e98819289d2661c7271c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c33e73659f8e98819289d2661c7271c">&#9670;&nbsp;</a></span>GetSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbString::GetSize </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Retrieve the size of the string buffer. </p>
+<dl class="section return"><dt>Returns</dt><dd>Size of string buffer including the null terminating byte. </dd></dl>
+
+</div>
+</div>
+<a id="aa13f6b72e5a529eab04545892bbc98b4" name="aa13f6b72e5a529eab04545892bbc98b4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa13f6b72e5a529eab04545892bbc98b4">&#9670;&nbsp;</a></span>HasAlphaChars()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::HasAlphaChars </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determine if the string has any alpha characters. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - String contains one or more aloha characters.<br />
+ xbFalse - String contains no alpha characters. </dd></dl>
+
+</div>
+</div>
+<a id="a4a255a30d683acd62ea09c1617b53cb3" name="a4a255a30d683acd62ea09c1617b53cb3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a255a30d683acd62ea09c1617b53cb3">&#9670;&nbsp;</a></span>IsEmpty()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::IsEmpty </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determine if string is empty. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if string is empty.<br />
+ xbFalse if string is not empty. </dd></dl>
+
+</div>
+</div>
+<a id="a3fa34fa31bcb7244ecb054ab628ad500" name="a3fa34fa31bcb7244ecb054ab628ad500"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3fa34fa31bcb7244ecb054ab628ad500">&#9670;&nbsp;</a></span>IsNull()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::IsNull </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determine if string is NULL. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if string is NULL.<br />
+ xbFalse if string is not NULL. </dd></dl>
+
+</div>
+</div>
+<a id="acdc3a6d6955b99f0a6b1d181fb3098b9" name="acdc3a6d6955b99f0a6b1d181fb3098b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acdc3a6d6955b99f0a6b1d181fb3098b9">&#9670;&nbsp;</a></span>Left()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Left </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulLen</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Retain left part of string, drop rightmost characters. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulLen</td><td>New string length, truncate rightmost excess. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to string. </dd></dl>
+
+</div>
+</div>
+<a id="a998b240eedac311aea5843047f55649b" name="a998b240eedac311aea5843047f55649b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a998b240eedac311aea5843047f55649b">&#9670;&nbsp;</a></span>Len()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbString::Len </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Retrieve length of current string. </p>
+<dl class="section return"><dt>Returns</dt><dd>String length, excluding the terminating null byte. </dd></dl>
+
+</div>
+</div>
+<a id="a90e0d0be4fd0d82dd2ebbe689adf18ee" name="a90e0d0be4fd0d82dd2ebbe689adf18ee"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a90e0d0be4fd0d82dd2ebbe689adf18ee">&#9670;&nbsp;</a></span>Ltrim()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Ltrim </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Left trim white space from string. </p>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a656f5854f74064b7257ff96d96dfb68b" name="a656f5854f74064b7257ff96d96dfb68b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a656f5854f74064b7257ff96d96dfb68b">&#9670;&nbsp;</a></span>Ltrunc()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Ltrunc </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulCnt</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Left truncate string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulCnt</td><td>Number of bytes to remove from the left. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a0f9eefc836b24c4ee7c5a316c5d812b7" name="a0f9eefc836b24c4ee7c5a316c5d812b7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0f9eefc836b24c4ee7c5a316c5d812b7">&#9670;&nbsp;</a></span>Mid()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Mid </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulStartPos</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulTargLen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Extract portion of data from string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulStartPos</td><td>Starting position </td></tr>
+ <tr><td class="paramname">ulTargLen</td><td>Length </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to string </dd></dl>
+
+</div>
+</div>
+<a id="a545df0ae9590f0ea5844a165e38a6388" name="a545df0ae9590f0ea5844a165e38a6388"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a545df0ae9590f0ea5844a165e38a6388">&#9670;&nbsp;</a></span>operator const char *()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbString::operator const char * </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Operator const char *. </p>
+<dl class="section return"><dt>Returns</dt><dd>Pointer to string data. </dd></dl>
+
+</div>
+</div>
+<a id="a822448f2a0ce653473d4c1de5763a3a6" name="a822448f2a0ce653473d4c1de5763a3a6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a822448f2a0ce653473d4c1de5763a3a6">&#9670;&nbsp;</a></span>operator!=() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator != </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String to compare </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Strings don't match.<br />
+ zbFalse - Strings match.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="acf89691607050b0505dc6af28d059c38" name="acf89691607050b0505dc6af28d059c38"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acf89691607050b0505dc6af28d059c38">&#9670;&nbsp;</a></span>operator!=() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::operator!= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator != </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String to compare </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Strings don't match.<br />
+ xbFalse - Strings match.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="aab556e8c3cb478dd95643327d72a48bd" name="aab556e8c3cb478dd95643327d72a48bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aab556e8c3cb478dd95643327d72a48bd">&#9670;&nbsp;</a></span>operator+() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbString::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s1</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Concatonate operator +. </p>
+<p >Concatonate left string with right string returning reference to new string.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s1</td><td>Right string operator. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="af559654baba81c3c0c19823c0b7a69d3" name="af559654baba81c3c0c19823c0b7a69d3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af559654baba81c3c0c19823c0b7a69d3">&#9670;&nbsp;</a></span>operator+() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbString::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Concatonate operator +. </p>
+<p >Concatonate left string with right string returning reference to new string.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Right string operator. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a1f289d577ba90c500bc1be3ec7bb0206" name="a1f289d577ba90c500bc1be3ec7bb0206"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1f289d577ba90c500bc1be3ec7bb0206">&#9670;&nbsp;</a></span>operator+() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbString::operator+ </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s1</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Concatonate operator +. </p>
+<p >Concatonate left string with right string returning reference to new string.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s1</td><td>Right string operator. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ae12f45b8be84e438e032c0b860f985c6" name="ae12f45b8be84e438e032c0b860f985c6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae12f45b8be84e438e032c0b860f985c6">&#9670;&nbsp;</a></span>operator+=() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::operator+= </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Append operator +=. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>- Append c to the string. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="ab319120dbad9107e1e7090139c956100" name="ab319120dbad9107e1e7090139c956100"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab319120dbad9107e1e7090139c956100">&#9670;&nbsp;</a></span>operator+=() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::operator+= </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Append operator +=. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>- Append s to the string. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a76a47af239797a266ada6141c150001c" name="a76a47af239797a266ada6141c150001c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a76a47af239797a266ada6141c150001c">&#9670;&nbsp;</a></span>operator+=() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::operator+= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Append operator +=. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>- Append s to the string. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a06abec236b95f6933ba17bf67089f7cf" name="a06abec236b95f6933ba17bf67089f7cf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a06abec236b95f6933ba17bf67089f7cf">&#9670;&nbsp;</a></span>operator-()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbString::operator- </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s1</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Concatonate operator -. </p>
+<p >Concatonate left string with right string returning reference to new string. Both strings are trimmed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s1</td><td>Right string operator. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="adcafd019df23bb5724c46e34f3f31194" name="adcafd019df23bb5724c46e34f3f31194"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adcafd019df23bb5724c46e34f3f31194">&#9670;&nbsp;</a></span>operator-=() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::operator-= </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Append operator -=. </p>
+<p >Append c to the right of this string, trimming right space on this string first. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>- Append s to the right of the string value. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aaae97e6eda3d18c9f463993ade985bf4" name="aaae97e6eda3d18c9f463993ade985bf4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaae97e6eda3d18c9f463993ade985bf4">&#9670;&nbsp;</a></span>operator-=() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::operator-= </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Append operator -=. </p>
+<p >Append s to the right of this string, right trimming both strings. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>- Append s to the right of the string value. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="aa7f4db1b4eae9dfad46346db6e17ea15" name="aa7f4db1b4eae9dfad46346db6e17ea15"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa7f4db1b4eae9dfad46346db6e17ea15">&#9670;&nbsp;</a></span>operator-=() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::operator-= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Append operator -=. </p>
+<p >Append s to the right of this string, right trimming both strings. </p><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>- Append s to the right of the string value. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a71c7aafa0d523c72cbe58c474be2270a" name="a71c7aafa0d523c72cbe58c474be2270a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a71c7aafa0d523c72cbe58c474be2270a">&#9670;&nbsp;</a></span>operator&lt;()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::operator&lt; </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator &lt; </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String to compare </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Left string is less than the right string.<br />
+ zbFalse - Left string is not less than the right string.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a461f245e60cddfdf5f78a972a46e5880" name="a461f245e60cddfdf5f78a972a46e5880"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a461f245e60cddfdf5f78a972a46e5880">&#9670;&nbsp;</a></span>operator&lt;=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::operator&lt;= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator &lt;= </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String to compare </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Left string is less than or equal to the right string.<br />
+ zbFalse - Left string is not less than or equal to the right string.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a84ae7d16c5d73c5aa2270aa9895a7f7c" name="a84ae7d16c5d73c5aa2270aa9895a7f7c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84ae7d16c5d73c5aa2270aa9895a7f7c">&#9670;&nbsp;</a></span>operator=() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set operator =. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>- Set the string to the string on the right of the equal sign. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a4f69d11cbd43edf71725a606d0ca8f40" name="a4f69d11cbd43edf71725a606d0ca8f40"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4f69d11cbd43edf71725a606d0ca8f40">&#9670;&nbsp;</a></span>operator=() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::operator= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set operator =. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>- Set the string to the string on the right of the equal sign. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a94031269af3c433393d4cf0ff9b4be38" name="a94031269af3c433393d4cf0ff9b4be38"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94031269af3c433393d4cf0ff9b4be38">&#9670;&nbsp;</a></span>operator==() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator == </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String to compare </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Strings match.<br />
+ zbFalse - Strings don't match.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a2df3ed2fc9456214f5fd2fcf77b69bc1" name="a2df3ed2fc9456214f5fd2fcf77b69bc1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2df3ed2fc9456214f5fd2fcf77b69bc1">&#9670;&nbsp;</a></span>operator==() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::operator== </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator == </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String to compare </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Strings match.<br />
+ zbFalse - Strings don't match.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="ae46f6a45da5686b607a4edf2786a2fff" name="ae46f6a45da5686b607a4edf2786a2fff"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae46f6a45da5686b607a4edf2786a2fff">&#9670;&nbsp;</a></span>operator&gt;()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::operator&gt; </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator &gt; </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String to compare </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Left string is greater than the right string.<br />
+ zbFalse - Left string is not greater than the right string.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a8f16643cb7ba3ee9cf685422c9ea0e67" name="a8f16643cb7ba3ee9cf685422c9ea0e67"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8f16643cb7ba3ee9cf685422c9ea0e67">&#9670;&nbsp;</a></span>operator&gt;=()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::operator&gt;= </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator &gt;= </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>String to compare </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Left string is greater than or equal to the right string.<br />
+ zbFalse - Left string is not greater than or equal to the right string.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a4deaa68d9571753349c29baacb5613e8" name="a4deaa68d9571753349c29baacb5613e8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4deaa68d9571753349c29baacb5613e8">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char &amp; xb::xbString::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>n</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator [] </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">n</td><td>- Offset into the string of the byte to retrieve. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>c - The character to return from the offset within the [] brackets. </dd></dl>
+
+</div>
+</div>
+<a id="abe45e463226ac8e18550ced18c5a9df3" name="abe45e463226ac8e18550ced18c5a9df3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abe45e463226ac8e18550ced18c5a9df3">&#9670;&nbsp;</a></span>operator[]() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char &amp; xb::xbString::operator[] </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>n</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>operator [] </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">n</td><td>- Offset into the string of the byte to retrieve. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>c - The character to return from the offset within the [] brackets. </dd></dl>
+
+</div>
+</div>
+<a id="a6a09cfed22066b0c72432f26960f9e7b" name="a6a09cfed22066b0c72432f26960f9e7b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6a09cfed22066b0c72432f26960f9e7b">&#9670;&nbsp;</a></span>PadLeft()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::PadLeft </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulNewLen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Left pad string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Padding character. </td></tr>
+ <tr><td class="paramname">ulNewLen</td><td>New string length. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="aba13f0c77eb6c4a22996039569fad284" name="aba13f0c77eb6c4a22996039569fad284"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba13f0c77eb6c4a22996039569fad284">&#9670;&nbsp;</a></span>PadRight()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::PadRight </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulNewLen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Right pad string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Padding character. </td></tr>
+ <tr><td class="paramname">ulNewLen</td><td>New string length. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a3baf59d15099589ff631995f129e582b" name="a3baf59d15099589ff631995f129e582b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3baf59d15099589ff631995f129e582b">&#9670;&nbsp;</a></span>Pos() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbString::Pos </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determine position of a given character. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>Seek character </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Position within string. Returns 0 if not found. </dd></dl>
+
+</div>
+</div>
+<a id="a8705d7277b72f5aa98021e84438914da" name="a8705d7277b72f5aa98021e84438914da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8705d7277b72f5aa98021e84438914da">&#9670;&nbsp;</a></span>Pos() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbUInt32 xb::xbString::Pos </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Determine position of a given substring. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>Substring </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Position within string. Returns 0 if not found. </dd></dl>
+
+</div>
+</div>
+<a id="a1bae6fa8f608261f6e889616482f6e39" name="a1bae6fa8f608261f6e889616482f6e39"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1bae6fa8f608261f6e889616482f6e39">&#9670;&nbsp;</a></span>PutAt()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::PutAt </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulPos</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Insert character into string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulPos</td><td>Insertion position. </td></tr>
+ <tr><td class="paramname">c</td><td>Character to insert. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="afaac65eaa6d9ef1596d6a0e7b91ed0f2" name="afaac65eaa6d9ef1596d6a0e7b91ed0f2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afaac65eaa6d9ef1596d6a0e7b91ed0f2">&#9670;&nbsp;</a></span>Remove()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Remove </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulStartPos</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulDelSize</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Remove portion of string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulStartPos</td><td>Starting position for removal operation. </td></tr>
+ <tr><td class="paramname">ulDelSize</td><td>Size of deletion. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to string. </dd></dl>
+
+</div>
+</div>
+<a id="aa6d346ab04e5bb8852f0bb996163a35e" name="aa6d346ab04e5bb8852f0bb996163a35e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa6d346ab04e5bb8852f0bb996163a35e">&#9670;&nbsp;</a></span>Resize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Resize </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulSize</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Resize a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">ulSize</td><td>- New string size, including null termination byte. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="aaf330188d67c347ecae0d16f65b22077" name="aaf330188d67c347ecae0d16f65b22077"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaf330188d67c347ecae0d16f65b22077">&#9670;&nbsp;</a></span>Rtrim()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Rtrim </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Right trim the string. </p>
+<p >This routine removes any trailing white space on the string.</p>
+<dl class="section return"><dt>Returns</dt><dd>Reference to string. </dd></dl>
+
+</div>
+</div>
+<a id="ab85753d2c39882e946a8468cbb587700" name="ab85753d2c39882e946a8468cbb587700"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab85753d2c39882e946a8468cbb587700">&#9670;&nbsp;</a></span>Set() <span class="overload">[1/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Set </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the value of the string. </p>
+<p >Note: This routine fails if you try to set the string to itself or some part of itself.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>Value to set the string. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to string. </dd></dl>
+
+</div>
+</div>
+<a id="a6eba6ccd0c805a22516de2c18a30f8a3" name="a6eba6ccd0c805a22516de2c18a30f8a3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6eba6ccd0c805a22516de2c18a30f8a3">&#9670;&nbsp;</a></span>Set() <span class="overload">[2/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Set </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>ulSize</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the value of the string. </p>
+<p >Note: This routine fails if you try to set the string to itself or some part of itself.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>Value to set the string. </td></tr>
+ <tr><td class="paramname">ulSize</td><td>Maximum size of resultant string. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to string. </dd></dl>
+
+</div>
+</div>
+<a id="ac0d08bd688fd0e3707e32886d0dfeb09" name="ac0d08bd688fd0e3707e32886d0dfeb09"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac0d08bd688fd0e3707e32886d0dfeb09">&#9670;&nbsp;</a></span>Set() <span class="overload">[3/3]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Set </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the value of the string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>Value to set the string. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to string. </dd></dl>
+
+</div>
+</div>
+<a id="a3af5b1f111f94b0667551fcbd1d97abd" name="a3af5b1f111f94b0667551fcbd1d97abd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3af5b1f111f94b0667551fcbd1d97abd">&#9670;&nbsp;</a></span>SetNum()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::SetNum </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>lNum</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Set the string to long integer numeric value. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lNum</td><td>Value to set the string </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a9e9bfa29d86377b915f1628aeb0e9195" name="a9e9bfa29d86377b915f1628aeb0e9195"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9e9bfa29d86377b915f1628aeb0e9195">&#9670;&nbsp;</a></span>Sprintf()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Sprintf </td>
+ <td>(</td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>sFormat</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>...</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Printf routine for formatting a string. </p>
+<p >See documentation on the standard C printf function for how to use this.</p>
+<p >MyString.Sprintf( "a number %d some text %s", 100, "test text data" );</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sFormat</td><td>A format specifier </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to a formatted string </dd></dl>
+
+</div>
+</div>
+<a id="a6715f4c0010f3ab487c9d787838a29b3" name="a6715f4c0010f3ab487c9d787838a29b3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6715f4c0010f3ab487c9d787838a29b3">&#9670;&nbsp;</a></span>Str()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char * xb::xbString::Str </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Return string data. </p>
+<dl class="section return"><dt>Returns</dt><dd>char * to string data or NULL if string is empty </dd></dl>
+
+</div>
+</div>
+<a id="a3bc9e856c34f0c240a6e36e5b6e3ea7b" name="a3bc9e856c34f0c240a6e36e5b6e3ea7b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3bc9e856c34f0c240a6e36e5b6e3ea7b">&#9670;&nbsp;</a></span>strncpy()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char * xb::xbString::strncpy </td>
+ <td>(</td>
+ <td class="paramtype">char *&#160;</td>
+ <td class="paramname"><em>cDest</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>n</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Copy all or part of string to character array. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">cDest</td><td>pointer to destination buffer. </td></tr>
+ <tr><td class="paramname">n</td><td>Number of bytest to copy. It is the responsibility of the application to verify the buffer is large enough to hold the string contents. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>char * to result </dd></dl>
+
+</div>
+</div>
+<a id="a054683872e1f05d11c2cf8683a63a6fe" name="a054683872e1f05d11c2cf8683a63a6fe"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a054683872e1f05d11c2cf8683a63a6fe">&#9670;&nbsp;</a></span>SwapChars()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::SwapChars </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>cFrom</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>cTo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Swap characters. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">cFrom</td><td>character to replace. </td></tr>
+ <tr><td class="paramname">cTo</td><td>character to replace with. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a602cac1a6ef3f6b52f587ac4c0ef4fb2" name="a602cac1a6ef3f6b52f587ac4c0ef4fb2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a602cac1a6ef3f6b52f587ac4c0ef4fb2">&#9670;&nbsp;</a></span>ToLowerCase()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::ToLowerCase </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Replace all upper case charaters with lower case characters. </p>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="a68001d0a44e6b4fe61e29a4e41ded9d4" name="a68001d0a44e6b4fe61e29a4e41ded9d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a68001d0a44e6b4fe61e29a4e41ded9d4">&#9670;&nbsp;</a></span>ToUpperCase()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::ToUpperCase </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Replace all lower case charaters with lower case characters. </p>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="abc9bd33687d4e03ca52d77885721d626" name="abc9bd33687d4e03ca52d77885721d626"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abc9bd33687d4e03ca52d77885721d626">&#9670;&nbsp;</a></span>Trim()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::Trim </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Trim all leading and trailing white space from string. </p>
+<dl class="section return"><dt>Returns</dt><dd>Reference to string. </dd></dl>
+
+</div>
+</div>
+<a id="a72b16c15fd8822efaa5f158c34df7b1e" name="a72b16c15fd8822efaa5f158c34df7b1e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a72b16c15fd8822efaa5f158c34df7b1e">&#9670;&nbsp;</a></span>ValidLogicalValue()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::ValidLogicalValue </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Check for valid logical field data. </p>
+<p >Valid logical data is one 'T', 'F', 'N' or 'Y'.<br />
+</p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if the data is valid logical data.<br />
+ xbFalse if not valid logical data. </dd></dl>
+
+</div>
+</div>
+<a id="aeed920d2a25111f776ddde2d530eb81b" name="aeed920d2a25111f776ddde2d530eb81b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeed920d2a25111f776ddde2d530eb81b">&#9670;&nbsp;</a></span>ValidNumericValue()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbString::ValidNumericValue </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>This function returns true if the data is valid numeric data. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if valid numeric data.<br />
+ xbFalse if not valid numeric daata. </dd></dl>
+
+</div>
+</div>
+<a id="a2fd30956a26a260d1ef6fdbe73dd93f9" name="a2fd30956a26a260d1ef6fdbe73dd93f9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2fd30956a26a260d1ef6fdbe73dd93f9">&#9670;&nbsp;</a></span>ZapChar()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::ZapChar </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Remove every instance of a character from a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>character to remove from string. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this stirng.void </dd></dl>
+
+</div>
+</div>
+<a id="addc3a470f6cd85d4c21bf9da38cf5ac9" name="addc3a470f6cd85d4c21bf9da38cf5ac9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#addc3a470f6cd85d4c21bf9da38cf5ac9">&#9670;&nbsp;</a></span>ZapLeadingChar()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::ZapLeadingChar </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Remove leading character from a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>character to remove from beginning of string. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<a id="afe3415bfa2e1089b792aeda0462fb99e" name="afe3415bfa2e1089b792aeda0462fb99e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afe3415bfa2e1089b792aeda0462fb99e">&#9670;&nbsp;</a></span>ZapTrailingChar()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbString::ZapTrailingChar </td>
+ <td>(</td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Remove trailing character from a string. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>character to remove from ending of string. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Reference to this string. </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Friends And Related Function Documentation</h2>
+<a id="a3fa915061156521e9dd772a8d7e5f8fb" name="a3fa915061156521e9dd772a8d7e5f8fb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3fa915061156521e9dd772a8d7e5f8fb">&#9670;&nbsp;</a></span>operator&lt;&lt;</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::ostream &amp; operator&lt;&lt; </td>
+ <td>(</td>
+ <td class="paramtype">std::ostream &amp;&#160;</td>
+ <td class="paramname"><em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">friend</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Stream insertion operator &lt;&lt;. </p>
+<p >std::cout &lt;&lt; MyString &lt;&lt; std::endl;</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">os</td><td>Output stream </td></tr>
+ <tr><td class="paramname">s</td><td>String to send to output stream </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following files:<ul>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/include/<a class="el" href="xbstring_8h_source.html">xbstring.h</a></li>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/core/<a class="el" href="xbstring_8cpp.html">xbstring.cpp</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/classxb_1_1xbTblMgr.html b/docs/doxygen/html/classxb_1_1xbTblMgr.html
new file mode 100644
index 0000000..1203682
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbTblMgr.html
@@ -0,0 +1,962 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: xb::xbTblMgr Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacexb.html">xb</a></li><li class="navelem"><a class="el" href="classxb_1_1xbTblMgr.html">xbTblMgr</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pro-static-attribs">Static Protected Attributes</a> </div>
+ <div class="headertitle"><div class="title">xb::xbTblMgr Class Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;<a class="el" href="xbtblmgr_8h_source.html">xbtblmgr.h</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for xb::xbTblMgr:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classxb_1_1xbTblMgr.png" usemap="#xb::xbTblMgr_map" alt=""/>
+ <map id="xb::xbTblMgr_map" name="xb::xbTblMgr_map">
+<area href="classxb_1_1xbSsv.html" title="Class for handling shared system variables." alt="xb::xbSsv" shape="rect" coords="0,0,84,24"/>
+<area href="classxb_1_1xbXBase.html" title="xbXbase class." alt="xb::xbXBase" shape="rect" coords="0,112,84,136"/>
+ </map>
+</div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:aad83f5ecc184ca6cbdfc6f356b598d6c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#aad83f5ecc184ca6cbdfc6f356b598d6c">xbTblMgr</a> ()</td></tr>
+<tr class="separator:aad83f5ecc184ca6cbdfc6f356b598d6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aad6be32d7b3378c71d47fa27ebfe6cbf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#aad6be32d7b3378c71d47fa27ebfe6cbf">~xbTblMgr</a> ()</td></tr>
+<tr class="separator:aad6be32d7b3378c71d47fa27ebfe6cbf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a721f69ccc7893842422a043468ffccea"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#a721f69ccc7893842422a043468ffccea">AddTblToTblList</a> (<a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *d, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTblName)</td></tr>
+<tr class="separator:a721f69ccc7893842422a043468ffccea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62f6841849dbe5c1768f7e90f1b7e766"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#a62f6841849dbe5c1768f7e90f1b7e766">AddTblToTblList</a> (<a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *d, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTblName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTblAlias)</td></tr>
+<tr class="separator:a62f6841849dbe5c1768f7e90f1b7e766"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5eebffb9e8cc64141e35c2622045cb50"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#a5eebffb9e8cc64141e35c2622045cb50">DisplayTableList</a> () const</td></tr>
+<tr class="separator:a5eebffb9e8cc64141e35c2622045cb50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad8a5d28a2ee6720a9aa74bcb45662cf5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#ad8a5d28a2ee6720a9aa74bcb45662cf5">GetDbfPtr</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTblAlias) const</td></tr>
+<tr class="separator:ad8a5d28a2ee6720a9aa74bcb45662cf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a801dfecf7fc216954b4197b2c31b25d6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#a801dfecf7fc216954b4197b2c31b25d6">GetDbfPtr</a> (xbInt16 sItemNo) const</td></tr>
+<tr class="separator:a801dfecf7fc216954b4197b2c31b25d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0d2d4adabc0dc0e761cfdee63c84069"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#ad0d2d4adabc0dc0e761cfdee63c84069">GetOpenTableCount</a> () const</td></tr>
+<tr class="separator:ad0d2d4adabc0dc0e761cfdee63c84069"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac8eaef41acf08911b90f900aac8e70af"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#ac8eaef41acf08911b90f900aac8e70af">RemoveTblFromTblList</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTblAlias)</td></tr>
+<tr class="separator:ac8eaef41acf08911b90f900aac8e70af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d82b6e73d5c0bc8cac22b9a260389c1"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#a3d82b6e73d5c0bc8cac22b9a260389c1">RemoveTblFromTblList</a> (<a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *d)</td></tr>
+<tr class="separator:a3d82b6e73d5c0bc8cac22b9a260389c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">DisplayError</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a97dfa59ab9a8e9f17454da0faceb023d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Display error message on console for a given error number. <a href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">More...</a><br /></td></tr>
+<tr class="separator:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">GetDefaultDateFormat</a> () const</td></tr>
+<tr class="memdesc:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default date format. <a href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">More...</a><br /></td></tr>
+<tr class="separator:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">GetDataDirectory</a> () const</td></tr>
+<tr class="memdesc:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the current data directory. <a href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">More...</a><br /></td></tr>
+<tr class="separator:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49cd162f066eef2b829ba7c9f6620243"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">GetEndianType</a> () const</td></tr>
+<tr class="memdesc:a49cd162f066eef2b829ba7c9f6620243"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the Endian type. <a href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">More...</a><br /></td></tr>
+<tr class="separator:a49cd162f066eef2b829ba7c9f6620243"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56961d2a67b8e7470098626ac4dac7e4"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">GetErrorMessage</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a56961d2a67b8e7470098626ac4dac7e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get an error message. <a href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">More...</a><br /></td></tr>
+<tr class="separator:a56961d2a67b8e7470098626ac4dac7e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">SetDataDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDataDirectory)</td></tr>
+<tr class="memdesc:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data directory. <a href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">More...</a><br /></td></tr>
+<tr class="separator:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f74db23f8902846d581935c7db73f9c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">SetDefaultDateFormat</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultDateFormat)</td></tr>
+<tr class="memdesc:a5f74db23f8902846d581935c7db73f9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default date format. <a href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">More...</a><br /></td></tr>
+<tr class="separator:a5f74db23f8902846d581935c7db73f9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62e4fd0a5888665c76bbbad962794e72"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">BitSet</a> (unsigned char c, xbInt16 iBitNo) const</td></tr>
+<tr class="memdesc:a62e4fd0a5888665c76bbbad962794e72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check a bit in a one byte field and see if it is set. <a href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">More...</a><br /></td></tr>
+<tr class="separator:a62e4fd0a5888665c76bbbad962794e72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6982f973e81587b04916f4509746aaf5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">GetDefaultAutoCommit</a> () const</td></tr>
+<tr class="memdesc:a6982f973e81587b04916f4509746aaf5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default auto commit setting. <a href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">More...</a><br /></td></tr>
+<tr class="separator:a6982f973e81587b04916f4509746aaf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">SetDefaultAutoCommit</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bDefaultAutoCommit)</td></tr>
+<tr class="memdesc:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default auto commit. <a href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">More...</a><br /></td></tr>
+<tr class="separator:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf3763faf6a8917a963213cd53af529c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abf3763faf6a8917a963213cd53af529c">GetDefaultLogDirectory</a> () const</td></tr>
+<tr class="separator:abf3763faf6a8917a963213cd53af529c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a43878d4dc041f2a5e2398a118ccfaf79">GetDefaultLogFileName</a> () const</td></tr>
+<tr class="separator:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84343b8645790791512d6bc22ee6c8eb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a84343b8645790791512d6bc22ee6c8eb">SetDefaultLogDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultLogDirectory)</td></tr>
+<tr class="separator:a84343b8645790791512d6bc22ee6c8eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">GetMultiUser</a> () const</td></tr>
+<tr class="memdesc:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">More...</a><br /></td></tr>
+<tr class="separator:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba6e59512f7172dd55dcf92059e5928c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">SetMultiUser</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bMultiUser)</td></tr>
+<tr class="memdesc:aba6e59512f7172dd55dcf92059e5928c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">More...</a><br /></td></tr>
+<tr class="separator:aba6e59512f7172dd55dcf92059e5928c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-static-attribs" name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memItemLeft" align="right" valign="top">static const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e">ErrorCodeText</a> []</td></tr>
+<tr class="separator:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-methods" name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a904ec348fd029d4a76e72b8fde636108"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">SetEndianType</a> ()</td></tr>
+<tr class="memdesc:a904ec348fd029d4a76e72b8fde636108"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the endian type. <a href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">More...</a><br /></td></tr>
+<tr class="separator:a904ec348fd029d4a76e72b8fde636108"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-static-attribs" name="pro-static-attribs"></a>
+Static Protected Attributes</h2></td></tr>
+<tr class="memitem:a5849e813f5e8e1cd180f0366637adbf3"><td class="memItemLeft" align="right" valign="top">static xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3">iEndianType</a> = 0</td></tr>
+<tr class="separator:a5849e813f5e8e1cd180f0366637adbf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9dec3164c3b264882df634915ecf21da"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da">sNullString</a> = &quot;&quot;</td></tr>
+<tr class="separator:a9dec3164c3b264882df634915ecf21da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="aad83f5ecc184ca6cbdfc6f356b598d6c" name="aad83f5ecc184ca6cbdfc6f356b598d6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aad83f5ecc184ca6cbdfc6f356b598d6c">&#9670;&nbsp;</a></span>xbTblMgr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbTblMgr::xbTblMgr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aad6be32d7b3378c71d47fa27ebfe6cbf" name="aad6be32d7b3378c71d47fa27ebfe6cbf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aad6be32d7b3378c71d47fa27ebfe6cbf">&#9670;&nbsp;</a></span>~xbTblMgr()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbTblMgr::~xbTblMgr </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a721f69ccc7893842422a043468ffccea" name="a721f69ccc7893842422a043468ffccea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a721f69ccc7893842422a043468ffccea">&#9670;&nbsp;</a></span>AddTblToTblList() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::AddTblToTblList </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTblName</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a62f6841849dbe5c1768f7e90f1b7e766" name="a62f6841849dbe5c1768f7e90f1b7e766"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62f6841849dbe5c1768f7e90f1b7e766">&#9670;&nbsp;</a></span>AddTblToTblList() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::AddTblToTblList </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTblName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTblAlias</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a62e4fd0a5888665c76bbbad962794e72" name="a62e4fd0a5888665c76bbbad962794e72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62e4fd0a5888665c76bbbad962794e72">&#9670;&nbsp;</a></span>BitSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::BitSet </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iBitNo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Check a bit in a one byte field and see if it is set. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>One byte char field to examine. </td></tr>
+ <tr><td class="paramname">iBitNo</td><td>which bit to examine. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue Bit is set<br />
+ xbFalse Bit is not set </dd></dl>
+
+</div>
+</div>
+<a id="a97dfa59ab9a8e9f17454da0faceb023d" name="a97dfa59ab9a8e9f17454da0faceb023d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97dfa59ab9a8e9f17454da0faceb023d">&#9670;&nbsp;</a></span>DisplayError()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::DisplayError </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Display error message on console for a given error number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>Error number to reference </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5eebffb9e8cc64141e35c2622045cb50" name="a5eebffb9e8cc64141e35c2622045cb50"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5eebffb9e8cc64141e35c2622045cb50">&#9670;&nbsp;</a></span>DisplayTableList()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::DisplayTableList </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1d803a4bfc8ba0561267a0bf9e51f7d9" name="a1d803a4bfc8ba0561267a0bf9e51f7d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d803a4bfc8ba0561267a0bf9e51f7d9">&#9670;&nbsp;</a></span>GetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDataDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the current data directory. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the current data directory where the database files are stored. </dd></dl>
+
+</div>
+</div>
+<a id="ad8a5d28a2ee6720a9aa74bcb45662cf5" name="ad8a5d28a2ee6720a9aa74bcb45662cf5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad8a5d28a2ee6720a9aa74bcb45662cf5">&#9670;&nbsp;</a></span>GetDbfPtr() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> * xb::xbTblMgr::GetDbfPtr </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTblAlias</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a801dfecf7fc216954b4197b2c31b25d6" name="a801dfecf7fc216954b4197b2c31b25d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a801dfecf7fc216954b4197b2c31b25d6">&#9670;&nbsp;</a></span>GetDbfPtr() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> * xb::xbTblMgr::GetDbfPtr </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>sItemNo</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a6982f973e81587b04916f4509746aaf5" name="a6982f973e81587b04916f4509746aaf5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6982f973e81587b04916f4509746aaf5">&#9670;&nbsp;</a></span>GetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the default auto commit setting. </p>
+<p >When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-&gt;Put() and dbf-&gt;AppendRecord().</p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if auto commit is turned on<br />
+ xbFalse is auto commit is turned off </dd></dl>
+
+</div>
+</div>
+<a id="a6fbb9c3a550ab0b3378f9586a57791d2" name="a6fbb9c3a550ab0b3378f9586a57791d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6fbb9c3a550ab0b3378f9586a57791d2">&#9670;&nbsp;</a></span>GetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the default date format. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the default date format. </dd></dl>
+
+</div>
+</div>
+<a id="abf3763faf6a8917a963213cd53af529c" name="abf3763faf6a8917a963213cd53af529c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf3763faf6a8917a963213cd53af529c">&#9670;&nbsp;</a></span>GetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a43878d4dc041f2a5e2398a118ccfaf79" name="a43878d4dc041f2a5e2398a118ccfaf79"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a43878d4dc041f2a5e2398a118ccfaf79">&#9670;&nbsp;</a></span>GetDefaultLogFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a49cd162f066eef2b829ba7c9f6620243" name="a49cd162f066eef2b829ba7c9f6620243"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49cd162f066eef2b829ba7c9f6620243">&#9670;&nbsp;</a></span>GetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::GetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the Endian type. </p>
+<dl class="section return"><dt>Returns</dt><dd>B - Big endian<br />
+ L - Little endian<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a56961d2a67b8e7470098626ac4dac7e4" name="a56961d2a67b8e7470098626ac4dac7e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a56961d2a67b8e7470098626ac4dac7e4">&#9670;&nbsp;</a></span>GetErrorMessage()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char * xb::xbSsv::GetErrorMessage </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get an error message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>ErrorCode is the error number of description to be returned. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Returns a pointer to a string containing a text description for the error code. </dd></dl>
+
+</div>
+</div>
+<a id="abd58031c5f1c3766c24d47a82e6fd9c5" name="abd58031c5f1c3766c24d47a82e6fd9c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd58031c5f1c3766c24d47a82e6fd9c5">&#9670;&nbsp;</a></span>GetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetMultiUser </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Multi user mode turned on.<br />
+ xbFalse - Multi user mode turned off.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="ad0d2d4adabc0dc0e761cfdee63c84069" name="ad0d2d4adabc0dc0e761cfdee63c84069"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0d2d4adabc0dc0e761cfdee63c84069">&#9670;&nbsp;</a></span>GetOpenTableCount()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::GetOpenTableCount </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac8eaef41acf08911b90f900aac8e70af" name="ac8eaef41acf08911b90f900aac8e70af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac8eaef41acf08911b90f900aac8e70af">&#9670;&nbsp;</a></span>RemoveTblFromTblList() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::RemoveTblFromTblList </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTblAlias</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a3d82b6e73d5c0bc8cac22b9a260389c1" name="a3d82b6e73d5c0bc8cac22b9a260389c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d82b6e73d5c0bc8cac22b9a260389c1">&#9670;&nbsp;</a></span>RemoveTblFromTblList() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::RemoveTblFromTblList </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>d</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a57caaaadfbd089d9a58ecfcb50c88a6c" name="a57caaaadfbd089d9a58ecfcb50c88a6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57caaaadfbd089d9a58ecfcb50c88a6c">&#9670;&nbsp;</a></span>SetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDataDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDataDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the data directory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDataDirectory</td><td>Set the data direcroty. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a25542afadaaf39b4fb5a1772a29cc0bd" name="a25542afadaaf39b4fb5a1772a29cc0bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25542afadaaf39b4fb5a1772a29cc0bd">&#9670;&nbsp;</a></span>SetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bDefaultAutoCommit</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the default auto commit. </p>
+<p >Disabling auto commit requires the application execute explicit updates using dbf-&gt;Put() and dbf-&gt;AppendRecord(). With auto commit on, the library posts updates automatically when moving off the current record or closing a file.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bDefaultAutoCommit</td><td>xbTrue - Enable default auto commit.<br />
+ xbFalse - Disable default auto commit.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5f74db23f8902846d581935c7db73f9c" name="a5f74db23f8902846d581935c7db73f9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5f74db23f8902846d581935c7db73f9c">&#9670;&nbsp;</a></span>SetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultDateFormat</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the default date format. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDefaultDateFormat</td><td>Set the default date format. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a84343b8645790791512d6bc22ee6c8eb" name="a84343b8645790791512d6bc22ee6c8eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84343b8645790791512d6bc22ee6c8eb">&#9670;&nbsp;</a></span>SetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultLogDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a904ec348fd029d4a76e72b8fde636108" name="a904ec348fd029d4a76e72b8fde636108"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a904ec348fd029d4a76e72b8fde636108">&#9670;&nbsp;</a></span>SetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the endian type. </p>
+<p >This routine determines the Endian-ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. </p>
+
+</div>
+</div>
+<a id="aba6e59512f7172dd55dcf92059e5928c" name="aba6e59512f7172dd55dcf92059e5928c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba6e59512f7172dd55dcf92059e5928c">&#9670;&nbsp;</a></span>SetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetMultiUser </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bMultiUser</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bMultiUser</td><td>xbTrue - Turn on Multi user mode.<br />
+ xbFalse - Turn off Multi user mode.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Field Documentation</h2>
+<a id="a6219f1b5e24ea12fe158cd5aea56988e" name="a6219f1b5e24ea12fe158cd5aea56988e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6219f1b5e24ea12fe158cd5aea56988e">&#9670;&nbsp;</a></span>ErrorCodeText</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* xb::xbSsv::ErrorCodeText[]</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5849e813f5e8e1cd180f0366637adbf3" name="a5849e813f5e8e1cd180f0366637adbf3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5849e813f5e8e1cd180f0366637adbf3">&#9670;&nbsp;</a></span>iEndianType</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::iEndianType = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9dec3164c3b264882df634915ecf21da" name="a9dec3164c3b264882df634915ecf21da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9dec3164c3b264882df634915ecf21da">&#9670;&nbsp;</a></span>sNullString</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbSsv::sNullString = &quot;&quot;</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following files:<ul>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/include/<a class="el" href="xbtblmgr_8h_source.html">xbtblmgr.h</a></li>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/core/<a class="el" href="xbtblmgr_8cpp.html">xbtblmgr.cpp</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/classxb_1_1xbTblMgr.png b/docs/doxygen/html/classxb_1_1xbTblMgr.png
new file mode 100644
index 0000000..2e50067
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbTblMgr.png
Binary files differ
diff --git a/docs/doxygen/html/classxb_1_1xbXBase.html b/docs/doxygen/html/classxb_1_1xbXBase.html
new file mode 100644
index 0000000..1d2115e
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbXBase.html
@@ -0,0 +1,1690 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: xb::xbXBase Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacexb.html">xb</a></li><li class="navelem"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pro-static-methods">Static Protected Member Functions</a> &#124;
+<a href="#pro-static-attribs">Static Protected Attributes</a> &#124;
+<a href="#friends">Friends</a> </div>
+ <div class="headertitle"><div class="title">xb::xbXBase Class Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>xbXbase class.
+ <a href="classxb_1_1xbXBase.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="xbxbase_8h_source.html">xbxbase.h</a>&gt;</code></p>
+<div class="dynheader">
+Inheritance diagram for xb::xbXBase:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classxb_1_1xbXBase.png" usemap="#xb::xbXBase_map" alt=""/>
+ <map id="xb::xbXBase_map" name="xb::xbXBase_map">
+<area href="classxb_1_1xbTblMgr.html" alt="xb::xbTblMgr" shape="rect" coords="0,56,84,80"/>
+<area href="classxb_1_1xbSsv.html" title="Class for handling shared system variables." alt="xb::xbSsv" shape="rect" coords="0,0,84,24"/>
+ </map>
+</div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a6c68588e33946fb5416af3f86fe83224"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a6c68588e33946fb5416af3f86fe83224">xbXBase</a> ()</td></tr>
+<tr class="memdesc:a6c68588e33946fb5416af3f86fe83224"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class Constructor. <a href="classxb_1_1xbXBase.html#a6c68588e33946fb5416af3f86fe83224">More...</a><br /></td></tr>
+<tr class="separator:a6c68588e33946fb5416af3f86fe83224"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a204f8634894ac2066d3209117803306d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a204f8634894ac2066d3209117803306d">~xbXBase</a> ()</td></tr>
+<tr class="memdesc:a204f8634894ac2066d3209117803306d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class Deconstructor. <a href="classxb_1_1xbXBase.html#a204f8634894ac2066d3209117803306d">More...</a><br /></td></tr>
+<tr class="separator:a204f8634894ac2066d3209117803306d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afccb552ca0daff779c0500ff20d22c2b"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#afccb552ca0daff779c0500ff20d22c2b">CloseAllTables</a> ()</td></tr>
+<tr class="memdesc:afccb552ca0daff779c0500ff20d22c2b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Close all tables / files. <a href="classxb_1_1xbXBase.html#afccb552ca0daff779c0500ff20d22c2b">More...</a><br /></td></tr>
+<tr class="separator:afccb552ca0daff779c0500ff20d22c2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae357fac4fdebdf49e46563cf611caf65"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#ae357fac4fdebdf49e46563cf611caf65">DisableMsgLogging</a> ()</td></tr>
+<tr class="separator:ae357fac4fdebdf49e46563cf611caf65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a470e6eb0ed0be60338f9b40976d3ad48"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a470e6eb0ed0be60338f9b40976d3ad48">EnableMsgLogging</a> ()</td></tr>
+<tr class="separator:a470e6eb0ed0be60338f9b40976d3ad48"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a5ecaed9777978344902446c9ae3b8e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a5a5ecaed9777978344902446c9ae3b8e">FlushLog</a> ()</td></tr>
+<tr class="separator:a5a5ecaed9777978344902446c9ae3b8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51d49b4d699740194b28c6ec0d0ee07b"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a51d49b4d699740194b28c6ec0d0ee07b">GetLogDirectory</a> () const</td></tr>
+<tr class="separator:a51d49b4d699740194b28c6ec0d0ee07b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac0744edf9e4aa959d8cf2daa874376af"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#ac0744edf9e4aa959d8cf2daa874376af">GetLogFileName</a> () const</td></tr>
+<tr class="separator:ac0744edf9e4aa959d8cf2daa874376af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5d63cd7d9137eba8a1d4d9c3df522b7"><td class="memItemLeft" align="right" valign="top">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#ab5d63cd7d9137eba8a1d4d9c3df522b7">GetLogFqFileName</a> () const</td></tr>
+<tr class="separator:ab5d63cd7d9137eba8a1d4d9c3df522b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade34cd72c2a7e70fb55429a8a6f6c028"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#ade34cd72c2a7e70fb55429a8a6f6c028">GetLogStatus</a> () const</td></tr>
+<tr class="separator:ade34cd72c2a7e70fb55429a8a6f6c028"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa957eb502ecd076e5df89e7415cb094b"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#aa957eb502ecd076e5df89e7415cb094b">OpenHighestVersion</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias, <a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> &amp;dbf, int dummy)</td></tr>
+<tr class="separator:aa957eb502ecd076e5df89e7415cb094b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa7bbac08a4601f49cd53b457196ee0e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#afa7bbac08a4601f49cd53b457196ee0e">OpenHighestVersion</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias, <a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> **dbf)</td></tr>
+<tr class="separator:afa7bbac08a4601f49cd53b457196ee0e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aafb1abd6b6124cddf635adaf9f615a4a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#aafb1abd6b6124cddf635adaf9f615a4a">Open</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, xbInt16 &amp;iRc)</td></tr>
+<tr class="memdesc:aafb1abd6b6124cddf635adaf9f615a4a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Open highest qualified class available for dbf file. <a href="classxb_1_1xbXBase.html#aafb1abd6b6124cddf635adaf9f615a4a">More...</a><br /></td></tr>
+<tr class="separator:aafb1abd6b6124cddf635adaf9f615a4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab35cec5ac8f0fa95f10653ca7ac817f6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#ab35cec5ac8f0fa95f10653ca7ac817f6">Open</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias, xbInt16 iOpenMode, xbInt16 iShareMode, xbInt16 iVersion, xbInt16 &amp;iRc)</td></tr>
+<tr class="memdesc:ab35cec5ac8f0fa95f10653ca7ac817f6"><td class="mdescLeft">&#160;</td><td class="mdescRight">Open highest qualified class available for dbf file. <a href="classxb_1_1xbXBase.html#ab35cec5ac8f0fa95f10653ca7ac817f6">More...</a><br /></td></tr>
+<tr class="separator:ab35cec5ac8f0fa95f10653ca7ac817f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a48d82dbe298c6f4cf68a63ac82dd8292"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a48d82dbe298c6f4cf68a63ac82dd8292">SetLogDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sLogFileDirectory)</td></tr>
+<tr class="separator:a48d82dbe298c6f4cf68a63ac82dd8292"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94010b88a309315ef980715eb581336c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a94010b88a309315ef980715eb581336c">SetLogFileName</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sLogFileName)</td></tr>
+<tr class="separator:a94010b88a309315ef980715eb581336c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a666a0cb5b76ec7a9a3677d339e0c6b42"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a666a0cb5b76ec7a9a3677d339e0c6b42">SetLogSize</a> (size_t lSize)</td></tr>
+<tr class="separator:a666a0cb5b76ec7a9a3677d339e0c6b42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ca5be73abffd0fdd18bdc799877272a"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a9ca5be73abffd0fdd18bdc799877272a">WriteLogMessage</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sLogMessage, xbInt16 iOutputOpt=0)</td></tr>
+<tr class="separator:a9ca5be73abffd0fdd18bdc799877272a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0dff00b9ee3c288841e137ca01168116"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a0dff00b9ee3c288841e137ca01168116">WriteLogBytes</a> (xbUInt32 lCnt, const char *p)</td></tr>
+<tr class="separator:a0dff00b9ee3c288841e137ca01168116"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0915aff7be4b2dd3e881f3c5d0da4baf"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a0915aff7be4b2dd3e881f3c5d0da4baf">xbSleep</a> (xbInt32 lMillisecs)</td></tr>
+<tr class="memdesc:a0915aff7be4b2dd3e881f3c5d0da4baf"><td class="mdescLeft">&#160;</td><td class="mdescRight">Cross platform sleep function. <a href="classxb_1_1xbXBase.html#a0915aff7be4b2dd3e881f3c5d0da4baf">More...</a><br /></td></tr>
+<tr class="separator:a0915aff7be4b2dd3e881f3c5d0da4baf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a721f69ccc7893842422a043468ffccea"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#a721f69ccc7893842422a043468ffccea">AddTblToTblList</a> (<a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *d, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTblName)</td></tr>
+<tr class="separator:a721f69ccc7893842422a043468ffccea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62f6841849dbe5c1768f7e90f1b7e766"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#a62f6841849dbe5c1768f7e90f1b7e766">AddTblToTblList</a> (<a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *d, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTblName, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTblAlias)</td></tr>
+<tr class="separator:a62f6841849dbe5c1768f7e90f1b7e766"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5eebffb9e8cc64141e35c2622045cb50"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#a5eebffb9e8cc64141e35c2622045cb50">DisplayTableList</a> () const</td></tr>
+<tr class="separator:a5eebffb9e8cc64141e35c2622045cb50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad8a5d28a2ee6720a9aa74bcb45662cf5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#ad8a5d28a2ee6720a9aa74bcb45662cf5">GetDbfPtr</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTblAlias) const</td></tr>
+<tr class="separator:ad8a5d28a2ee6720a9aa74bcb45662cf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a801dfecf7fc216954b4197b2c31b25d6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#a801dfecf7fc216954b4197b2c31b25d6">GetDbfPtr</a> (xbInt16 sItemNo) const</td></tr>
+<tr class="separator:a801dfecf7fc216954b4197b2c31b25d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0d2d4adabc0dc0e761cfdee63c84069"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#ad0d2d4adabc0dc0e761cfdee63c84069">GetOpenTableCount</a> () const</td></tr>
+<tr class="separator:ad0d2d4adabc0dc0e761cfdee63c84069"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac8eaef41acf08911b90f900aac8e70af"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#ac8eaef41acf08911b90f900aac8e70af">RemoveTblFromTblList</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sTblAlias)</td></tr>
+<tr class="separator:ac8eaef41acf08911b90f900aac8e70af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d82b6e73d5c0bc8cac22b9a260389c1"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html#a3d82b6e73d5c0bc8cac22b9a260389c1">RemoveTblFromTblList</a> (<a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *d)</td></tr>
+<tr class="separator:a3d82b6e73d5c0bc8cac22b9a260389c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">DisplayError</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a97dfa59ab9a8e9f17454da0faceb023d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Display error message on console for a given error number. <a href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">More...</a><br /></td></tr>
+<tr class="separator:a97dfa59ab9a8e9f17454da0faceb023d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">GetDefaultDateFormat</a> () const</td></tr>
+<tr class="memdesc:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default date format. <a href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">More...</a><br /></td></tr>
+<tr class="separator:a6fbb9c3a550ab0b3378f9586a57791d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">GetDataDirectory</a> () const</td></tr>
+<tr class="memdesc:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the current data directory. <a href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">More...</a><br /></td></tr>
+<tr class="separator:a1d803a4bfc8ba0561267a0bf9e51f7d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49cd162f066eef2b829ba7c9f6620243"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">GetEndianType</a> () const</td></tr>
+<tr class="memdesc:a49cd162f066eef2b829ba7c9f6620243"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the Endian type. <a href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">More...</a><br /></td></tr>
+<tr class="separator:a49cd162f066eef2b829ba7c9f6620243"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56961d2a67b8e7470098626ac4dac7e4"><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">GetErrorMessage</a> (xbInt16 ErrorCode) const</td></tr>
+<tr class="memdesc:a56961d2a67b8e7470098626ac4dac7e4"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get an error message. <a href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">More...</a><br /></td></tr>
+<tr class="separator:a56961d2a67b8e7470098626ac4dac7e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">SetDataDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDataDirectory)</td></tr>
+<tr class="memdesc:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data directory. <a href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">More...</a><br /></td></tr>
+<tr class="separator:a57caaaadfbd089d9a58ecfcb50c88a6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f74db23f8902846d581935c7db73f9c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">SetDefaultDateFormat</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultDateFormat)</td></tr>
+<tr class="memdesc:a5f74db23f8902846d581935c7db73f9c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default date format. <a href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">More...</a><br /></td></tr>
+<tr class="separator:a5f74db23f8902846d581935c7db73f9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62e4fd0a5888665c76bbbad962794e72"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">BitSet</a> (unsigned char c, xbInt16 iBitNo) const</td></tr>
+<tr class="memdesc:a62e4fd0a5888665c76bbbad962794e72"><td class="mdescLeft">&#160;</td><td class="mdescRight">Check a bit in a one byte field and see if it is set. <a href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">More...</a><br /></td></tr>
+<tr class="separator:a62e4fd0a5888665c76bbbad962794e72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6982f973e81587b04916f4509746aaf5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">GetDefaultAutoCommit</a> () const</td></tr>
+<tr class="memdesc:a6982f973e81587b04916f4509746aaf5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the default auto commit setting. <a href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">More...</a><br /></td></tr>
+<tr class="separator:a6982f973e81587b04916f4509746aaf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">SetDefaultAutoCommit</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bDefaultAutoCommit)</td></tr>
+<tr class="memdesc:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the default auto commit. <a href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">More...</a><br /></td></tr>
+<tr class="separator:a25542afadaaf39b4fb5a1772a29cc0bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf3763faf6a8917a963213cd53af529c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abf3763faf6a8917a963213cd53af529c">GetDefaultLogDirectory</a> () const</td></tr>
+<tr class="separator:abf3763faf6a8917a963213cd53af529c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a43878d4dc041f2a5e2398a118ccfaf79">GetDefaultLogFileName</a> () const</td></tr>
+<tr class="separator:a43878d4dc041f2a5e2398a118ccfaf79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84343b8645790791512d6bc22ee6c8eb"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a84343b8645790791512d6bc22ee6c8eb">SetDefaultLogDirectory</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultLogDirectory)</td></tr>
+<tr class="separator:a84343b8645790791512d6bc22ee6c8eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">GetMultiUser</a> () const</td></tr>
+<tr class="memdesc:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">More...</a><br /></td></tr>
+<tr class="separator:abd58031c5f1c3766c24d47a82e6fd9c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba6e59512f7172dd55dcf92059e5928c"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">SetMultiUser</a> (<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bMultiUser)</td></tr>
+<tr class="memdesc:aba6e59512f7172dd55dcf92059e5928c"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the multi user setting. <a href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">More...</a><br /></td></tr>
+<tr class="separator:aba6e59512f7172dd55dcf92059e5928c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-static-attribs" name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memItemLeft" align="right" valign="top">static const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e">ErrorCodeText</a> []</td></tr>
+<tr class="separator:a6219f1b5e24ea12fe158cd5aea56988e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-methods" name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:ae52e53340593b4253936c1372ec15ee1"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#ae52e53340593b4253936c1372ec15ee1">GetFunctionInfo</a> (const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sExpLine, char &amp;cReturnType, xbInt16 &amp;iReturnLenCalc, xbInt32 &amp;lReturnLenVal) const</td></tr>
+<tr class="separator:ae52e53340593b4253936c1372ec15ee1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a904ec348fd029d4a76e72b8fde636108"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">SetEndianType</a> ()</td></tr>
+<tr class="memdesc:a904ec348fd029d4a76e72b8fde636108"><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the endian type. <a href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">More...</a><br /></td></tr>
+<tr class="separator:a904ec348fd029d4a76e72b8fde636108"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-static-methods" name="pro-static-methods"></a>
+Static Protected Member Functions</h2></td></tr>
+<tr class="memitem:a1b239c021358476382942522911b5c66"><td class="memItemLeft" align="right" valign="top">static xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a1b239c021358476382942522911b5c66">xbMemcmp</a> (const unsigned char *s1, const unsigned char *s2, size_t n)</td></tr>
+<tr class="memdesc:a1b239c021358476382942522911b5c66"><td class="mdescLeft">&#160;</td><td class="mdescRight">Cross memcmp function. <a href="classxb_1_1xbXBase.html#a1b239c021358476382942522911b5c66">More...</a><br /></td></tr>
+<tr class="separator:a1b239c021358476382942522911b5c66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pro-static-attribs" name="pro-static-attribs"></a>
+Static Protected Attributes</h2></td></tr>
+<tr class="memitem:a5849e813f5e8e1cd180f0366637adbf3"><td class="memItemLeft" align="right" valign="top">static xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3">iEndianType</a> = 0</td></tr>
+<tr class="separator:a5849e813f5e8e1cd180f0366637adbf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9dec3164c3b264882df634915ecf21da"><td class="memItemLeft" align="right" valign="top">static <a class="el" href="classxb_1_1xbString.html">xbString</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da">sNullString</a> = &quot;&quot;</td></tr>
+<tr class="separator:a9dec3164c3b264882df634915ecf21da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="friends" name="friends"></a>
+Friends</h2></td></tr>
+<tr class="memitem:a86a53ce3efbf910996df0f853f1c0add"><td class="memItemLeft" align="right" valign="top">class&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a86a53ce3efbf910996df0f853f1c0add">xbBcd</a></td></tr>
+<tr class="separator:a86a53ce3efbf910996df0f853f1c0add"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c3e5617be811d732472fe2cc8fb18cc"><td class="memItemLeft" align="right" valign="top">class&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html#a3c3e5617be811d732472fe2cc8fb18cc">xbExp</a></td></tr>
+<tr class="separator:a3c3e5617be811d732472fe2cc8fb18cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p >xbXbase class. </p>
+<p >The <a class="el" href="classxb_1_1xbXBase.html" title="xbXbase class.">xbXBase</a> class is the core class that needs to be in every application program. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a id="a6c68588e33946fb5416af3f86fe83224" name="a6c68588e33946fb5416af3f86fe83224"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6c68588e33946fb5416af3f86fe83224">&#9670;&nbsp;</a></span>xbXBase()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbXBase::xbXBase </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Class Constructor. </p>
+
+</div>
+</div>
+<a id="a204f8634894ac2066d3209117803306d" name="a204f8634894ac2066d3209117803306d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a204f8634894ac2066d3209117803306d">&#9670;&nbsp;</a></span>~xbXBase()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xb::xbXBase::~xbXBase </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Class Deconstructor. </p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a id="a721f69ccc7893842422a043468ffccea" name="a721f69ccc7893842422a043468ffccea"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a721f69ccc7893842422a043468ffccea">&#9670;&nbsp;</a></span>AddTblToTblList() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::AddTblToTblList </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTblName</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a62f6841849dbe5c1768f7e90f1b7e766" name="a62f6841849dbe5c1768f7e90f1b7e766"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62f6841849dbe5c1768f7e90f1b7e766">&#9670;&nbsp;</a></span>AddTblToTblList() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::AddTblToTblList </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTblName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTblAlias</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a62e4fd0a5888665c76bbbad962794e72" name="a62e4fd0a5888665c76bbbad962794e72"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a62e4fd0a5888665c76bbbad962794e72">&#9670;&nbsp;</a></span>BitSet()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::BitSet </td>
+ <td>(</td>
+ <td class="paramtype">unsigned char&#160;</td>
+ <td class="paramname"><em>c</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iBitNo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Check a bit in a one byte field and see if it is set. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">c</td><td>One byte char field to examine. </td></tr>
+ <tr><td class="paramname">iBitNo</td><td>which bit to examine. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue Bit is set<br />
+ xbFalse Bit is not set </dd></dl>
+
+</div>
+</div>
+<a id="afccb552ca0daff779c0500ff20d22c2b" name="afccb552ca0daff779c0500ff20d22c2b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afccb552ca0daff779c0500ff20d22c2b">&#9670;&nbsp;</a></span>CloseAllTables()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbXBase::CloseAllTables </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Close all tables / files. </p>
+<p >This closes everything. </p><dl class="section return"><dt>Returns</dt><dd><a href="xbretcod_8h.html">Return Codes</a> </dd></dl>
+
+</div>
+</div>
+<a id="ae357fac4fdebdf49e46563cf611caf65" name="ae357fac4fdebdf49e46563cf611caf65"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae357fac4fdebdf49e46563cf611caf65">&#9670;&nbsp;</a></span>DisableMsgLogging()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbXBase::DisableMsgLogging </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a97dfa59ab9a8e9f17454da0faceb023d" name="a97dfa59ab9a8e9f17454da0faceb023d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97dfa59ab9a8e9f17454da0faceb023d">&#9670;&nbsp;</a></span>DisplayError()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::DisplayError </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Display error message on console for a given error number. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>Error number to reference </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5eebffb9e8cc64141e35c2622045cb50" name="a5eebffb9e8cc64141e35c2622045cb50"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5eebffb9e8cc64141e35c2622045cb50">&#9670;&nbsp;</a></span>DisplayTableList()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::DisplayTableList </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a470e6eb0ed0be60338f9b40976d3ad48" name="a470e6eb0ed0be60338f9b40976d3ad48"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a470e6eb0ed0be60338f9b40976d3ad48">&#9670;&nbsp;</a></span>EnableMsgLogging()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbXBase::EnableMsgLogging </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5a5ecaed9777978344902446c9ae3b8e" name="a5a5ecaed9777978344902446c9ae3b8e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5a5ecaed9777978344902446c9ae3b8e">&#9670;&nbsp;</a></span>FlushLog()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbXBase::FlushLog </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1d803a4bfc8ba0561267a0bf9e51f7d9" name="a1d803a4bfc8ba0561267a0bf9e51f7d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d803a4bfc8ba0561267a0bf9e51f7d9">&#9670;&nbsp;</a></span>GetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDataDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the current data directory. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the current data directory where the database files are stored. </dd></dl>
+
+</div>
+</div>
+<a id="ad8a5d28a2ee6720a9aa74bcb45662cf5" name="ad8a5d28a2ee6720a9aa74bcb45662cf5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad8a5d28a2ee6720a9aa74bcb45662cf5">&#9670;&nbsp;</a></span>GetDbfPtr() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> * xb::xbTblMgr::GetDbfPtr </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTblAlias</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a801dfecf7fc216954b4197b2c31b25d6" name="a801dfecf7fc216954b4197b2c31b25d6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a801dfecf7fc216954b4197b2c31b25d6">&#9670;&nbsp;</a></span>GetDbfPtr() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> * xb::xbTblMgr::GetDbfPtr </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>sItemNo</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a6982f973e81587b04916f4509746aaf5" name="a6982f973e81587b04916f4509746aaf5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6982f973e81587b04916f4509746aaf5">&#9670;&nbsp;</a></span>GetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the default auto commit setting. </p>
+<p >When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-&gt;Put() and dbf-&gt;AppendRecord().</p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue if auto commit is turned on<br />
+ xbFalse is auto commit is turned off </dd></dl>
+
+</div>
+</div>
+<a id="a6fbb9c3a550ab0b3378f9586a57791d2" name="a6fbb9c3a550ab0b3378f9586a57791d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6fbb9c3a550ab0b3378f9586a57791d2">&#9670;&nbsp;</a></span>GetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the default date format. </p>
+<dl class="section return"><dt>Returns</dt><dd><a class="el" href="classxb_1_1xbString.html" title="Class for handling string data.">xbString</a> containing the default date format. </dd></dl>
+
+</div>
+</div>
+<a id="abf3763faf6a8917a963213cd53af529c" name="abf3763faf6a8917a963213cd53af529c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abf3763faf6a8917a963213cd53af529c">&#9670;&nbsp;</a></span>GetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a43878d4dc041f2a5e2398a118ccfaf79" name="a43878d4dc041f2a5e2398a118ccfaf79"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a43878d4dc041f2a5e2398a118ccfaf79">&#9670;&nbsp;</a></span>GetDefaultLogFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbSsv::GetDefaultLogFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a49cd162f066eef2b829ba7c9f6620243" name="a49cd162f066eef2b829ba7c9f6620243"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a49cd162f066eef2b829ba7c9f6620243">&#9670;&nbsp;</a></span>GetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::GetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the Endian type. </p>
+<dl class="section return"><dt>Returns</dt><dd>B - Big endian<br />
+ L - Little endian<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="a56961d2a67b8e7470098626ac4dac7e4" name="a56961d2a67b8e7470098626ac4dac7e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a56961d2a67b8e7470098626ac4dac7e4">&#9670;&nbsp;</a></span>GetErrorMessage()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char * xb::xbSsv::GetErrorMessage </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErrorCode</em></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get an error message. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">iErrorCode</td><td>ErrorCode is the error number of description to be returned. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Returns a pointer to a string containing a text description for the error code. </dd></dl>
+
+</div>
+</div>
+<a id="ae52e53340593b4253936c1372ec15ee1" name="ae52e53340593b4253936c1372ec15ee1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae52e53340593b4253936c1372ec15ee1">&#9670;&nbsp;</a></span>GetFunctionInfo()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbXBase::GetFunctionInfo </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sExpLine</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char &amp;&#160;</td>
+ <td class="paramname"><em>cReturnType</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iReturnLenCalc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32 &amp;&#160;</td>
+ <td class="paramname"><em>lReturnLenVal</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a51d49b4d699740194b28c6ec0d0ee07b" name="a51d49b4d699740194b28c6ec0d0ee07b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a51d49b4d699740194b28c6ec0d0ee07b">&#9670;&nbsp;</a></span>GetLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbXBase::GetLogDirectory </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac0744edf9e4aa959d8cf2daa874376af" name="ac0744edf9e4aa959d8cf2daa874376af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac0744edf9e4aa959d8cf2daa874376af">&#9670;&nbsp;</a></span>GetLogFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbXBase::GetLogFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab5d63cd7d9137eba8a1d4d9c3df522b7" name="ab5d63cd7d9137eba8a1d4d9c3df522b7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab5d63cd7d9137eba8a1d4d9c3df522b7">&#9670;&nbsp;</a></span>GetLogFqFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp; xb::xbXBase::GetLogFqFileName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ade34cd72c2a7e70fb55429a8a6f6c028" name="ade34cd72c2a7e70fb55429a8a6f6c028"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ade34cd72c2a7e70fb55429a8a6f6c028">&#9670;&nbsp;</a></span>GetLogStatus()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbXBase::GetLogStatus </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="abd58031c5f1c3766c24d47a82e6fd9c5" name="abd58031c5f1c3766c24d47a82e6fd9c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abd58031c5f1c3766c24d47a82e6fd9c5">&#9670;&nbsp;</a></span>GetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xb::xbSsv::GetMultiUser </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="section return"><dt>Returns</dt><dd>xbTrue - Multi user mode turned on.<br />
+ xbFalse - Multi user mode turned off.<br />
+ </dd></dl>
+
+</div>
+</div>
+<a id="ad0d2d4adabc0dc0e761cfdee63c84069" name="ad0d2d4adabc0dc0e761cfdee63c84069"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0d2d4adabc0dc0e761cfdee63c84069">&#9670;&nbsp;</a></span>GetOpenTableCount()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::GetOpenTableCount </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td> const</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab35cec5ac8f0fa95f10653ca7ac817f6" name="ab35cec5ac8f0fa95f10653ca7ac817f6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab35cec5ac8f0fa95f10653ca7ac817f6">&#9670;&nbsp;</a></span>Open() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> * xb::xbXBase::Open </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTableName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sAlias</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOpenMode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iShareMode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iRequestVersion</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iRc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Open highest qualified class available for dbf file. </p>
+<p >This routine can open various versions of the dbf file dependent on the iVersion field</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sTableName</td><td>- Table name to open. </td></tr>
+ <tr><td class="paramname">sAlias</td><td>- Optional alias name. </td></tr>
+ <tr><td class="paramname">iOpenMode</td><td>- XB_READ_WRITE or XB_READ </td></tr>
+ <tr><td class="paramname">iShareMode</td><td>- XB_SINGLE_USER or XB_MULTI_USER </td></tr>
+ <tr><td class="paramname">iRequestVersion</td><td>0 - Highest available 4 - Version four dbf 3 - Version three dbf </td></tr>
+ <tr><td class="paramname">iRc</td><td>- Return code from open request </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>param dbf - Output pointer to dbf file opened or null if error </dd></dl>
+
+</div>
+</div>
+<a id="aafb1abd6b6124cddf635adaf9f615a4a" name="aafb1abd6b6124cddf635adaf9f615a4a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aafb1abd6b6124cddf635adaf9f615a4a">&#9670;&nbsp;</a></span>Open() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> * xb::xbXBase::Open </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTableName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16 &amp;&#160;</td>
+ <td class="paramname"><em>iRc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Open highest qualified class available for dbf file. </p>
+<p >This routine opens the highest available version of the dbf file. Defaults to XB_READ_WRITE and XB_MULTI_USER mode. </p><dl class="section return"><dt>Returns</dt><dd>param dbf - Output pointer to dbf file opened or null if error </dd></dl>
+
+</div>
+</div>
+<a id="aa957eb502ecd076e5df89e7415cb094b" name="aa957eb502ecd076e5df89e7415cb094b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa957eb502ecd076e5df89e7415cb094b">&#9670;&nbsp;</a></span>OpenHighestVersion() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbXBase::OpenHighestVersion </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTableName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sAlias</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> &amp;&#160;</td>
+ <td class="paramname"><em>dbf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>dummy</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="afa7bbac08a4601f49cd53b457196ee0e" name="afa7bbac08a4601f49cd53b457196ee0e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afa7bbac08a4601f49cd53b457196ee0e">&#9670;&nbsp;</a></span>OpenHighestVersion() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbXBase::OpenHighestVersion </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTableName</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sAlias</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> **&#160;</td>
+ <td class="paramname"><em>dbf</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac8eaef41acf08911b90f900aac8e70af" name="ac8eaef41acf08911b90f900aac8e70af"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac8eaef41acf08911b90f900aac8e70af">&#9670;&nbsp;</a></span>RemoveTblFromTblList() <span class="overload">[1/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::RemoveTblFromTblList </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sTblAlias</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a3d82b6e73d5c0bc8cac22b9a260389c1" name="a3d82b6e73d5c0bc8cac22b9a260389c1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3d82b6e73d5c0bc8cac22b9a260389c1">&#9670;&nbsp;</a></span>RemoveTblFromTblList() <span class="overload">[2/2]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbTblMgr::RemoveTblFromTblList </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>d</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a57caaaadfbd089d9a58ecfcb50c88a6c" name="a57caaaadfbd089d9a58ecfcb50c88a6c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57caaaadfbd089d9a58ecfcb50c88a6c">&#9670;&nbsp;</a></span>SetDataDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDataDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDataDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the data directory. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDataDirectory</td><td>Set the data direcroty. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a25542afadaaf39b4fb5a1772a29cc0bd" name="a25542afadaaf39b4fb5a1772a29cc0bd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25542afadaaf39b4fb5a1772a29cc0bd">&#9670;&nbsp;</a></span>SetDefaultAutoCommit()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultAutoCommit </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bDefaultAutoCommit</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the default auto commit. </p>
+<p >Disabling auto commit requires the application execute explicit updates using dbf-&gt;Put() and dbf-&gt;AppendRecord(). With auto commit on, the library posts updates automatically when moving off the current record or closing a file.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bDefaultAutoCommit</td><td>xbTrue - Enable default auto commit.<br />
+ xbFalse - Disable default auto commit.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a5f74db23f8902846d581935c7db73f9c" name="a5f74db23f8902846d581935c7db73f9c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5f74db23f8902846d581935c7db73f9c">&#9670;&nbsp;</a></span>SetDefaultDateFormat()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultDateFormat </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultDateFormat</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the default date format. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">sDefaultDateFormat</td><td>Set the default date format. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a84343b8645790791512d6bc22ee6c8eb" name="a84343b8645790791512d6bc22ee6c8eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a84343b8645790791512d6bc22ee6c8eb">&#9670;&nbsp;</a></span>SetDefaultLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetDefaultLogDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sDefaultLogDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a904ec348fd029d4a76e72b8fde636108" name="a904ec348fd029d4a76e72b8fde636108"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a904ec348fd029d4a76e72b8fde636108">&#9670;&nbsp;</a></span>SetEndianType()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetEndianType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Set the endian type. </p>
+<p >This routine determines the Endian-ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. </p>
+
+</div>
+</div>
+<a id="a48d82dbe298c6f4cf68a63ac82dd8292" name="a48d82dbe298c6f4cf68a63ac82dd8292"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a48d82dbe298c6f4cf68a63ac82dd8292">&#9670;&nbsp;</a></span>SetLogDirectory()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbXBase::SetLogDirectory </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sLogFileDirectory</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a94010b88a309315ef980715eb581336c" name="a94010b88a309315ef980715eb581336c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a94010b88a309315ef980715eb581336c">&#9670;&nbsp;</a></span>SetLogFileName()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbXBase::SetLogFileName </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sLogFileName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a666a0cb5b76ec7a9a3677d339e0c6b42" name="a666a0cb5b76ec7a9a3677d339e0c6b42"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a666a0cb5b76ec7a9a3677d339e0c6b42">&#9670;&nbsp;</a></span>SetLogSize()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbXBase::SetLogSize </td>
+ <td>(</td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>lSize</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aba6e59512f7172dd55dcf92059e5928c" name="aba6e59512f7172dd55dcf92059e5928c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aba6e59512f7172dd55dcf92059e5928c">&#9670;&nbsp;</a></span>SetMultiUser()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbSsv::SetMultiUser </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bMultiUser</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Get the multi user setting. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">bMultiUser</td><td>xbTrue - Turn on Multi user mode.<br />
+ xbFalse - Turn off Multi user mode.<br />
+ </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a id="a0dff00b9ee3c288841e137ca01168116" name="a0dff00b9ee3c288841e137ca01168116"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0dff00b9ee3c288841e137ca01168116">&#9670;&nbsp;</a></span>WriteLogBytes()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbXBase::WriteLogBytes </td>
+ <td>(</td>
+ <td class="paramtype">xbUInt32&#160;</td>
+ <td class="paramname"><em>lCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>p</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9ca5be73abffd0fdd18bdc799877272a" name="a9ca5be73abffd0fdd18bdc799877272a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ca5be73abffd0fdd18bdc799877272a">&#9670;&nbsp;</a></span>WriteLogMessage()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbXBase::WriteLogMessage </td>
+ <td>(</td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sLogMessage</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iOutputOpt</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1b239c021358476382942522911b5c66" name="a1b239c021358476382942522911b5c66"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1b239c021358476382942522911b5c66">&#9670;&nbsp;</a></span>xbMemcmp()</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbXBase::xbMemcmp </td>
+ <td>(</td>
+ <td class="paramtype">const unsigned char *&#160;</td>
+ <td class="paramname"><em>s1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const unsigned char *&#160;</td>
+ <td class="paramname"><em>s2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>n</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Cross memcmp function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s1</td><td>Left operand to compare. </td></tr>
+ <tr><td class="paramname">s2</td><td>Right operand to compare. </td></tr>
+ <tr><td class="paramname">n</td><td>Number of bytes to compare. </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>1 s1 &gt; s2<br />
+ 0 s1 == s2<br />
+ -1 s1 &lt; s2 </dd></dl>
+
+</div>
+</div>
+<a id="a0915aff7be4b2dd3e881f3c5d0da4baf" name="a0915aff7be4b2dd3e881f3c5d0da4baf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0915aff7be4b2dd3e881f3c5d0da4baf">&#9670;&nbsp;</a></span>xbSleep()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void xb::xbXBase::xbSleep </td>
+ <td>(</td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>lMillisecs</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Cross platform sleep function. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">lMillisecs</td><td>Milliseconds to sleep. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Friends And Related Function Documentation</h2>
+<a id="a86a53ce3efbf910996df0f853f1c0add" name="a86a53ce3efbf910996df0f853f1c0add"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a86a53ce3efbf910996df0f853f1c0add">&#9670;&nbsp;</a></span>xbBcd</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">friend class xbBcd</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">friend</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a3c3e5617be811d732472fe2cc8fb18cc" name="a3c3e5617be811d732472fe2cc8fb18cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3c3e5617be811d732472fe2cc8fb18cc">&#9670;&nbsp;</a></span>xbExp</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">friend class xbExp</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">friend</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Field Documentation</h2>
+<a id="a6219f1b5e24ea12fe158cd5aea56988e" name="a6219f1b5e24ea12fe158cd5aea56988e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6219f1b5e24ea12fe158cd5aea56988e">&#9670;&nbsp;</a></span>ErrorCodeText</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">const char* xb::xbSsv::ErrorCodeText[]</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5849e813f5e8e1cd180f0366637adbf3" name="a5849e813f5e8e1cd180f0366637adbf3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5849e813f5e8e1cd180f0366637adbf3">&#9670;&nbsp;</a></span>iEndianType</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSsv::iEndianType = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9dec3164c3b264882df634915ecf21da" name="a9dec3164c3b264882df634915ecf21da"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9dec3164c3b264882df634915ecf21da">&#9670;&nbsp;</a></span>sNullString</h2>
+
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a> xb::xbSsv::sNullString = &quot;&quot;</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">protected</span><span class="mlabel">inherited</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following files:<ul>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/include/<a class="el" href="xbxbase_8h_source.html">xbxbase.h</a></li>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/core/<a class="el" href="xbxbase_8cpp.html">xbxbase.cpp</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/classxb_1_1xbXBase.png b/docs/doxygen/html/classxb_1_1xbXBase.png
new file mode 100644
index 0000000..4b4ae14
--- /dev/null
+++ b/docs/doxygen/html/classxb_1_1xbXBase.png
Binary files differ
diff --git a/docs/doxygen/html/closed.png b/docs/doxygen/html/closed.png
new file mode 100644
index 0000000..98cc2c9
--- /dev/null
+++ b/docs/doxygen/html/closed.png
Binary files differ
diff --git a/docs/doxygen/html/dbfxtrct_8cpp.html b/docs/doxygen/html/dbfxtrct_8cpp.html
new file mode 100644
index 0000000..7e00be1
--- /dev/null
+++ b/docs/doxygen/html/dbfxtrct_8cpp.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/dbfxtrct.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">dbfxtrct.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;xbase64/xbase64.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5ae07f63d6b390e42068d941038dadf2"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dbfxtrct_8cpp.html#a5ae07f63d6b390e42068d941038dadf2">Usage</a> ()</td></tr>
+<tr class="separator:a5ae07f63d6b390e42068d941038dadf2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dbfxtrct_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5ae07f63d6b390e42068d941038dadf2" name="a5ae07f63d6b390e42068d941038dadf2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5ae07f63d6b390e42068d941038dadf2">&#9670;&nbsp;</a></span>Usage()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void Usage </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/dir_25b94c3afce00ed38231227d8141f932.html b/docs/doxygen/html/dir_25b94c3afce00ed38231227d8141f932.html
new file mode 100644
index 0000000..acb76a6
--- /dev/null
+++ b/docs/doxygen/html/dir_25b94c3afce00ed38231227d8141f932.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_25b94c3afce00ed38231227d8141f932.html">sql</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">sql Directory Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="files" name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbcrix_8cpp.html">xbcrix.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbcrtbl_8cpp.html">xbcrtbl.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdrpix_8cpp.html">xbdrpix.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdrptbl_8cpp.html">xbdrptbl.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbinsert_8cpp.html">xbinsert.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbset_8cpp.html">xbset.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbsql_8cpp.html">xbsql.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/dir_313caf1132e152dd9b58bea13a4052ca.html b/docs/doxygen/html/dir_313caf1132e152dd9b58bea13a4052ca.html
new file mode 100644
index 0000000..a67b05b
--- /dev/null
+++ b/docs/doxygen/html/dir_313caf1132e152dd9b58bea13a4052ca.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">utils Directory Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="files" name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="checkndx_8cpp.html">checkndx.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dbfxtrct_8cpp.html">dbfxtrct.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="reindex_8cpp.html">reindex.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__cfg__check_8cpp.html">xb_cfg_check.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__copydbf_8cpp.html">xb_copydbf.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__dbfutil_8cpp.html">xb_dbfutil.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__deletall_8cpp.html">xb_deletall.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__dumpdbt_8cpp.html">xb_dumpdbt.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__dumphdr_8cpp.html">xb_dumphdr.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__dumpix_8cpp.html">xb_dumpix.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__dumprecs_8cpp.html">xb_dumprecs.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__execsql_8cpp.html">xb_execsql.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__pack_8cpp.html">xb_pack.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__tblinfo_8cpp.html">xb_tblinfo.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__undelall_8cpp.html">xb_undelall.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__zap_8cpp.html">xb_zap.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/docs/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
new file mode 100644
index 0000000..e8e40b0
--- /dev/null
+++ b/docs/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">src Directory Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="subdirs" name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_e931c1a3f0014e624d0645a271726ad2.html">examples</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_25b94c3afce00ed38231227d8141f932.html">sql</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html b/docs/doxygen/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html
new file mode 100644
index 0000000..ccb523e
--- /dev/null
+++ b/docs/doxygen/html/dir_aebb8dcc11953d78e620bbef0b9e2183.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">core Directory Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="files" name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbbcd_8cpp.html">xbbcd.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdate_8cpp.html">xbdate.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8cpp.html">xbdbf.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf3_8cpp.html">xbdbf3.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf4_8cpp.html">xbdbf4.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbexp_8cpp.html">xbexp.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbexpnode_8cpp.html">xbexpnode.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfields_8cpp.html">xbfields.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfile_8cpp.html">xbfile.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfilter_8cpp.html">xbfilter.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfuncs_8cpp.html">xbfuncs.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbixbase_8cpp.html">xbixbase.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbixmdx_8cpp.html">xbixmdx.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbixndx_8cpp.html">xbixndx.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xblog_8cpp.html">xblog.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbmemo_8cpp.html">xbmemo.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbmemo3_8cpp.html">xbmemo3.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbmemo4_8cpp.html">xbmemo4.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbssv_8cpp.html">xbssv.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbstring_8cpp.html">xbstring.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbtag_8cpp.html">xbtag.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbtblmgr_8cpp.html">xbtblmgr.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbuda_8cpp.html">xbuda.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbxbase_8cpp.html">xbxbase.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html b/docs/doxygen/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html
new file mode 100644
index 0000000..3a44668
--- /dev/null
+++ b/docs/doxygen/html/dir_b0856f6b0d80ccb263b2f415c91f9e17.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">include Directory Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="files" name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbase_8h.html">xbase.h</a> <a href="xbase_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbbcd_8h.html">xbbcd.h</a> <a href="xbbcd_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdate_8h.html">xbdate.h</a> <a href="xbdate_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html">xbdbf.h</a> <a href="xbdbf_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbexp_8h.html">xbexp.h</a> <a href="xbexp_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbexpnode_8h.html">xbexpnode.h</a> <a href="xbexpnode_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfile_8h.html">xbfile.h</a> <a href="xbfile_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfilter_8h.html">xbfilter.h</a> <a href="xbfilter_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbindex_8h.html">xbindex.h</a> <a href="xbindex_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xblnklst_8h.html">xblnklst.h</a> <a href="xblnklst_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xblnklstord_8h.html">xblnklstord.h</a> <a href="xblnklstord_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xblnknod_8h.html">xblnknod.h</a> <a href="xblnknod_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xblog_8h.html">xblog.h</a> <a href="xblog_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbmemo_8h.html">xbmemo.h</a> <a href="xbmemo_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html">xbretcod.h</a> <a href="xbretcod_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbsql_8h.html">xbsql.h</a> <a href="xbsql_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbssv_8h.html">xbssv.h</a> <a href="xbssv_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbstring_8h.html">xbstring.h</a> <a href="xbstring_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbtag_8h.html">xbtag.h</a> <a href="xbtag_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbtblmgr_8h.html">xbtblmgr.h</a> <a href="xbtblmgr_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbtypes_8h.html">xbtypes.h</a> <a href="xbtypes_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbuda_8h.html">xbuda.h</a> <a href="xbuda_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbxbase_8h.html">xbxbase.h</a> <a href="xbxbase_8h_source.html">[code]</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/dir_d93a1d4020dea85bb71b237545b5e722.html b/docs/doxygen/html/dir_d93a1d4020dea85bb71b237545b5e722.html
new file mode 100644
index 0000000..2d23c9f
--- /dev/null
+++ b/docs/doxygen/html/dir_d93a1d4020dea85bb71b237545b5e722.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">tests Directory Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="files" name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__bcd_8cpp.html">xb_test_bcd.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__date_8cpp.html">xb_test_date.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__dbf__v3__memos_8cpp.html">xb_test_dbf_v3_memos.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__dbf__v3__nomemos_8cpp.html">xb_test_dbf_v3_nomemos.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__dbf__v4__memos_8cpp.html">xb_test_dbf_v4_memos.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__dbf__v4__nomemos_8cpp.html">xb_test_dbf_v4_nomemos.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expnode_8cpp.html">xb_test_expnode.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expression_8cpp.html">xb_test_expression.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__file_8cpp.html">xb_test_file.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__filter_8cpp.html">xb_test_filter.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__funcs_8cpp.html">xb_test_funcs.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__linklist_8cpp.html">xb_test_linklist.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__lock_8cpp.html">xb_test_lock.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__lock2_8cpp.html">xb_test_lock2.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__log_8cpp.html">xb_test_log.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__mdx_8cpp.html">xb_test_mdx.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__ndx_8cpp.html">xb_test_ndx.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__ndx2_8cpp.html">xb_test_ndx2.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__sql_8cpp.html">xb_test_sql.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__string_8cpp.html">xb_test_string.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__tblmgr_8cpp.html">xb_test_tblmgr.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__uda_8cpp.html">xb_test_uda.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__xbase_8cpp.html">xb_test_xbase.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/dir_e931c1a3f0014e624d0645a271726ad2.html b/docs/doxygen/html/dir_e931c1a3f0014e624d0645a271726ad2.html
new file mode 100644
index 0000000..fe510dd
--- /dev/null
+++ b/docs/doxygen/html/dir_e931c1a3f0014e624d0645a271726ad2.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_e931c1a3f0014e624d0645a271726ad2.html">examples</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">examples Directory Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="files" name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__date_8cpp.html">xb_ex_date.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__sql_8cpp.html">xb_ex_sql.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__string_8cpp.html">xb_ex_string.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__v3__create__dbf_8cpp.html">xb_ex_v3_create_dbf.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__v3__upd__dbf_8cpp.html">xb_ex_v3_upd_dbf.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__v4__create__dbf_8cpp.html">xb_ex_v4_create_dbf.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__v4__upd__dbf_8cpp.html">xb_ex_v4_upd_dbf.cpp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/doc.png b/docs/doxygen/html/doc.png
new file mode 100644
index 0000000..17edabf
--- /dev/null
+++ b/docs/doxygen/html/doc.png
Binary files differ
diff --git a/docs/doxygen/html/doxygen.css b/docs/doxygen/html/doxygen.css
new file mode 100644
index 0000000..9036737
--- /dev/null
+++ b/docs/doxygen/html/doxygen.css
@@ -0,0 +1,1841 @@
+/* The standard CSS for doxygen 1.9.3 */
+
+body, table, div, p, dl {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+p.reference, p.definition {
+ font: 400 14px/22px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+.title {
+ font: 400 14px/28px Roboto,sans-serif;
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #879ECB;
+ color: #354C7B;
+ font-size: 150%;
+ font-weight: normal;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px cyan;
+}
+
+dt {
+ font-weight: bold;
+}
+
+ul.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+ column-count: 3;
+}
+
+p.startli, p.startdd {
+ margin-top: 2px;
+}
+
+th p.starttd, th p.intertd, th p.endtd {
+ font-size: 100%;
+ font-weight: 700;
+}
+
+p.starttd {
+ margin-top: 0px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+p.interli {
+}
+
+p.interdd {
+}
+
+p.intertd {
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.navtab {
+ border-right: 1px solid #A3B4D7;
+ padding-right: 15px;
+ text-align: right;
+ line-height: 110%;
+}
+
+div.navtab table {
+ border-spacing: 0;
+}
+
+td.navtab {
+ padding-right: 6px;
+ padding-left: 6px;
+}
+td.navtabHL {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ padding-right: 6px;
+ padding-left: 6px;
+}
+
+td.navtabHL a, td.navtabHL a:visited {
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+a.navtab {
+ font-weight: bold;
+}
+
+div.qindex{
+ text-align: center;
+ width: 100%;
+ line-height: 140%;
+ font-size: 130%;
+ color: #A0A0A0;
+}
+
+dt.alphachar{
+ font-size: 180%;
+ font-weight: bold;
+}
+
+.alphachar a{
+ color: black;
+}
+
+.alphachar a:hover, .alphachar a:visited{
+ text-decoration: none;
+}
+
+.classindex dl {
+ padding: 25px;
+ column-count:1
+}
+
+.classindex dd {
+ display:inline-block;
+ margin-left: 50px;
+ width: 90%;
+ line-height: 1.15em;
+}
+
+.classindex dl.odd {
+ background-color: #F8F9FC;
+}
+
+@media(min-width: 1120px) {
+ .classindex dl {
+ column-count:2
+ }
+}
+
+@media(min-width: 1320px) {
+ .classindex dl {
+ column-count:3
+ }
+}
+
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+.contents a.qindexHL:visited {
+ color: #FFFFFF;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited, a.line, a.line:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
+ color: #4665A2;
+}
+
+a.code.hl_class { /* style for links to class names in code snippets */ }
+a.code.hl_struct { /* style for links to struct names in code snippets */ }
+a.code.hl_union { /* style for links to union names in code snippets */ }
+a.code.hl_interface { /* style for links to interface names in code snippets */ }
+a.code.hl_protocol { /* style for links to protocol names in code snippets */ }
+a.code.hl_category { /* style for links to category names in code snippets */ }
+a.code.hl_exception { /* style for links to exception names in code snippets */ }
+a.code.hl_service { /* style for links to service names in code snippets */ }
+a.code.hl_singleton { /* style for links to singleton names in code snippets */ }
+a.code.hl_concept { /* style for links to concept names in code snippets */ }
+a.code.hl_namespace { /* style for links to namespace names in code snippets */ }
+a.code.hl_package { /* style for links to package names in code snippets */ }
+a.code.hl_define { /* style for links to macro names in code snippets */ }
+a.code.hl_function { /* style for links to function names in code snippets */ }
+a.code.hl_variable { /* style for links to variable names in code snippets */ }
+a.code.hl_typedef { /* style for links to typedef names in code snippets */ }
+a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ }
+a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ }
+a.code.hl_signal { /* style for links to Qt signal names in code snippets */ }
+a.code.hl_slot { /* style for links to Qt slot names in code snippets */ }
+a.code.hl_friend { /* style for links to friend names in code snippets */ }
+a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ }
+a.code.hl_property { /* style for links to property names in code snippets */ }
+a.code.hl_event { /* style for links to event names in code snippets */ }
+a.code.hl_sequence { /* style for links to sequence names in code snippets */ }
+a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ }
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+ul {
+ overflow: visible;
+}
+
+#side-nav ul {
+ overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */
+}
+
+#main-nav ul {
+ overflow: visible; /* reset ul rule for the navigation bar drop down lists */
+}
+
+.fragment {
+ text-align: left;
+ direction: ltr;
+ overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/
+ overflow-y: hidden;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+div.fragment {
+ padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/
+ margin: 4px 8px 4px 2px;
+ background-color: #FBFCFD;
+ border: 1px solid #C4CFE5;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+div.line:after {
+ content:"\000A";
+ white-space: pre;
+}
+
+div.line.glow {
+ background-color: cyan;
+ box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+ padding-right: 4px;
+ margin-right: 9px;
+ text-align: right;
+ border-right: 2px solid #0F0;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+span.lineno a {
+ background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+}
+
+.lineno {
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+div.ah, span.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #FFFFFF;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%);
+}
+
+div.classindex ul {
+ list-style: none;
+ padding-left: 0;
+}
+
+div.classindex span.ai {
+ display: inline-block;
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 12px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl, img.inline {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+.compoundTemplParams {
+ color: #4665A2;
+ font-size: 80%;
+ line-height: 120%;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+blockquote.DocNodeRTL {
+ border-left: 0;
+ border-right: 2px solid #9CAFD4;
+ margin: 0 4px 0 24px;
+ padding: 0 16px 0 12px;
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: cyan;
+ box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memSeparator {
+ border-bottom: 1px solid #DEE4F0;
+ line-height: 1px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight, .memTemplItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtitle {
+ padding: 8px;
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ margin-bottom: -1px;
+ background-image: url('nav_f.png');
+ background-repeat: repeat-x;
+ background-color: #E2E8F2;
+ line-height: 1.25;
+ font-weight: 300;
+ float:left;
+}
+
+.permalink
+{
+ font-size: 65%;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: box-shadow 0.5s linear;
+ -moz-transition: box-shadow 0.5s linear;
+ -ms-transition: box-shadow 0.5s linear;
+ -o-transition: box-shadow 0.5s linear;
+ transition: box-shadow 0.5s linear;
+ display: table !important;
+ width: 100%;
+}
+
+.memitem.glow {
+ box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+ font-weight: 400;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ background-color: #DFE5F1;
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 4px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 4px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 4px;
+
+}
+
+.overload {
+ font-family: "courier new",courier,monospace;
+ font-size: 65%;
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 10px 2px 10px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ background-image:url('nav_g.png');
+ background-repeat:repeat-x;
+ background-color: #FFFFFF;
+ /* opera specific markup */
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+.paramname code {
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype, .tparams .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir, .tparams .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #728DC1;
+ border-top:1px solid #5373B4;
+ border-left:1px solid #5373B4;
+ border-right:1px solid #C4CFE5;
+ border-bottom:1px solid #C4CFE5;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 2px 3px;
+ border-radius: 3px;
+ font-size: 7pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view inside a (index) page */
+
+div.directory {
+ margin: 10px 0px;
+ border-top: 1px solid #9CAFD4;
+ border-bottom: 1px solid #9CAFD4;
+ width: 100%;
+}
+
+.directory table {
+ border-collapse:collapse;
+}
+
+.directory td {
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+
+.directory td.entry {
+ white-space: nowrap;
+ padding-right: 6px;
+ padding-top: 3px;
+}
+
+.directory td.entry a {
+ outline:none;
+}
+
+.directory td.entry a img {
+ border: none;
+}
+
+.directory td.desc {
+ width: 100%;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 3px;
+ border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+ padding-left: 6px;
+ background-color: #F7F8FB;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+}
+
+.directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #3D578C;
+}
+
+.arrow {
+ color: #9CAFD4;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ cursor: pointer;
+ font-size: 80%;
+ display: inline-block;
+ width: 16px;
+ height: 22px;
+}
+
+.icon {
+ font-family: Arial, Helvetica;
+ font-weight: bold;
+ font-size: 12px;
+ height: 14px;
+ width: 16px;
+ display: inline-block;
+ background-color: #728DC1;
+ color: white;
+ text-align: center;
+ border-radius: 4px;
+ margin-left: 2px;
+ margin-right: 2px;
+}
+
+.icona {
+ width: 24px;
+ height: 22px;
+ display: inline-block;
+}
+
+.iconfopen {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderopen.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.iconfclosed {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('folderclosed.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+.icondoc {
+ width: 24px;
+ height: 18px;
+ margin-bottom: 4px;
+ background-image:url('doc.png');
+ background-position: 0px -4px;
+ background-repeat: repeat-y;
+ vertical-align:top;
+ display: inline-block;
+}
+
+table.directory {
+ font: 400 14px Roboto,sans-serif;
+}
+
+/* @end */
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable caption {
+ caption-side: top;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ /*width: 100%;*/
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+ padding-top: 3px;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+ margin-top: 0px;
+}
+
+.fieldtable td.fielddoc p:last-child {
+ margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ font-weight: 400;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ background-position: 0 -5px;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: #283A5D;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+table.classindex
+{
+ margin: 10px;
+ white-space: nowrap;
+ margin-left: 3%;
+ margin-right: 3%;
+ width: 94%;
+ border: 0;
+ border-spacing: 0;
+ padding: 0;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+.PageDocRTL-title div.headertitle {
+ text-align: right;
+ direction: rtl;
+}
+
+dl {
+ padding: 0 0 0 0;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */
+dl.section {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.section.DocNodeRTL {
+ margin-right: 0px;
+ padding-right: 0px;
+}
+
+dl.note {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #D0C000;
+}
+
+dl.note.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #FF0000;
+}
+
+dl.warning.DocNodeRTL, dl.attention.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #00D000;
+}
+
+dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #00D000;
+}
+
+dl.deprecated {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #505050;
+}
+
+dl.deprecated.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #505050;
+}
+
+dl.todo {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #00C0E0;
+}
+
+dl.todo.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #00C0E0;
+}
+
+dl.test {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #3030E0;
+}
+
+dl.test.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #3030E0;
+}
+
+dl.bug {
+ margin-left: -7px;
+ padding-left: 3px;
+ border-left: 4px solid;
+ border-color: #C08050;
+}
+
+dl.bug.DocNodeRTL {
+ margin-left: 0;
+ padding-left: 0;
+ border-left: 0;
+ margin-right: -7px;
+ padding-right: 3px;
+ border-right: 4px solid;
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectrow
+{
+ height: 56px;
+}
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectalign
+{
+ vertical-align: middle;
+ padding-left: 0.5em;
+}
+
+#projectname
+{
+ font: 200% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 90% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.plantumlgraph
+{
+ text-align: center;
+}
+
+.diagraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+ text-align:right;
+ width:52px;
+}
+
+dl.citelist dd {
+ margin:2px 0 2px 72px;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F4F6FA;
+ border: 1px solid #D8DFEE;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 8px 10px 10px;
+ width: 200px;
+}
+
+.PageDocRTL-title div.toc {
+ float: left !important;
+ text-align: right;
+}
+
+div.toc li {
+ background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+.PageDocRTL-title div.toc li {
+ background-position-x: right !important;
+ padding-left: 0 !important;
+ padding-right: 10px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+ color: #4665A2;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 30px;
+}
+
+div.toc li.level4 {
+ margin-left: 45px;
+}
+
+span.emoji {
+ /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html
+ * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort;
+ */
+}
+
+span.obfuscator {
+ display: none;
+}
+
+.PageDocRTL-title div.toc li.level1 {
+ margin-left: 0 !important;
+ margin-right: 0;
+}
+
+.PageDocRTL-title div.toc li.level2 {
+ margin-left: 0 !important;
+ margin-right: 15px;
+}
+
+.PageDocRTL-title div.toc li.level3 {
+ margin-left: 0 !important;
+ margin-right: 30px;
+}
+
+.PageDocRTL-title div.toc li.level4 {
+ margin-left: 0 !important;
+ margin-right: 45px;
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+tr.heading h2 {
+ margin-top: 12px;
+ margin-bottom: 4px;
+}
+
+/* tooltip related style info */
+
+.ttc {
+ position: absolute;
+ display: none;
+}
+
+#powerTip {
+ cursor: default;
+ /*white-space: nowrap;*/
+ background-color: white;
+ border: 1px solid gray;
+ border-radius: 4px 4px 4px 4px;
+ box-shadow: 1px 1px 7px gray;
+ display: none;
+ font-size: smaller;
+ max-width: 80%;
+ opacity: 0.9;
+ padding: 1ex 1em 1em;
+ position: absolute;
+ z-index: 2147483647;
+}
+
+#powerTip div.ttdoc {
+ color: grey;
+ font-style: italic;
+}
+
+#powerTip div.ttname a {
+ font-weight: bold;
+}
+
+#powerTip div.ttname {
+ font-weight: bold;
+}
+
+#powerTip div.ttdeci {
+ color: #006318;
+}
+
+#powerTip div {
+ margin: 0px;
+ padding: 0px;
+ font: 12px/16px Roboto,sans-serif;
+}
+
+#powerTip:before, #powerTip:after {
+ content: "";
+ position: absolute;
+ margin: 0px;
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.w:after, #powerTip.w:before,
+#powerTip.e:after, #powerTip.e:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.nw:after, #powerTip.nw:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+}
+
+#powerTip.n:after, #powerTip.s:after,
+#powerTip.w:after, #powerTip.e:after,
+#powerTip.nw:after, #powerTip.ne:after,
+#powerTip.sw:after, #powerTip.se:after {
+ border-color: rgba(255, 255, 255, 0);
+}
+
+#powerTip.n:before, #powerTip.s:before,
+#powerTip.w:before, #powerTip.e:before,
+#powerTip.nw:before, #powerTip.ne:before,
+#powerTip.sw:before, #powerTip.se:before {
+ border-color: rgba(128, 128, 128, 0);
+}
+
+#powerTip.n:after, #powerTip.n:before,
+#powerTip.ne:after, #powerTip.ne:before,
+#powerTip.nw:after, #powerTip.nw:before {
+ top: 100%;
+}
+
+#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after {
+ border-top-color: #FFFFFF;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+#powerTip.n:before {
+ border-top-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+#powerTip.n:after, #powerTip.n:before {
+ left: 50%;
+}
+
+#powerTip.nw:after, #powerTip.nw:before {
+ right: 14px;
+}
+
+#powerTip.ne:after, #powerTip.ne:before {
+ left: 14px;
+}
+
+#powerTip.s:after, #powerTip.s:before,
+#powerTip.se:after, #powerTip.se:before,
+#powerTip.sw:after, #powerTip.sw:before {
+ bottom: 100%;
+}
+
+#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after {
+ border-bottom-color: #FFFFFF;
+ border-width: 10px;
+ margin: 0px -10px;
+}
+
+#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before {
+ border-bottom-color: #808080;
+ border-width: 11px;
+ margin: 0px -11px;
+}
+
+#powerTip.s:after, #powerTip.s:before {
+ left: 50%;
+}
+
+#powerTip.sw:after, #powerTip.sw:before {
+ right: 14px;
+}
+
+#powerTip.se:after, #powerTip.se:before {
+ left: 14px;
+}
+
+#powerTip.e:after, #powerTip.e:before {
+ left: 100%;
+}
+#powerTip.e:after {
+ border-left-color: #FFFFFF;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.e:before {
+ border-left-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+#powerTip.w:after, #powerTip.w:before {
+ right: 100%;
+}
+#powerTip.w:after {
+ border-right-color: #FFFFFF;
+ border-width: 10px;
+ top: 50%;
+ margin-top: -10px;
+}
+#powerTip.w:before {
+ border-right-color: #808080;
+ border-width: 11px;
+ top: 50%;
+ margin-top: -11px;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+}
+
+/* @group Markdown */
+
+table.markdownTable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.markdownTable td, table.markdownTable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.markdownTable tr {
+}
+
+th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+th.markdownTableHeadLeft, td.markdownTableBodyLeft {
+ text-align: left
+}
+
+th.markdownTableHeadRight, td.markdownTableBodyRight {
+ text-align: right
+}
+
+th.markdownTableHeadCenter, td.markdownTableBodyCenter {
+ text-align: center
+}
+
+.DocNodeRTL {
+ text-align: right;
+ direction: rtl;
+}
+
+.DocNodeLTR {
+ text-align: left;
+ direction: ltr;
+}
+
+table.DocNodeRTL {
+ width: auto;
+ margin-right: 0;
+ margin-left: auto;
+}
+
+table.DocNodeLTR {
+ width: auto;
+ margin-right: auto;
+ margin-left: 0;
+}
+
+code.JavaDocCode
+ direction:ltr;
+}
+
+tt, code, kbd, samp
+{
+ display: inline-block;
+ direction:ltr;
+}
+/* @end */
+
+u {
+ text-decoration: underline;
+}
+
diff --git a/docs/doxygen/html/doxygen.svg b/docs/doxygen/html/doxygen.svg
new file mode 100644
index 0000000..d42dad5
--- /dev/null
+++ b/docs/doxygen/html/doxygen.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" viewBox="0 0 104 31" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <defs>
+ <linearGradient id="a">
+ <stop stop-color="#5373B4" offset="0"/>
+ <stop stop-color="#7C95C6" offset="1"/>
+ </linearGradient>
+ <linearGradient id="d" x1="31.474" x2="31.474" y1="24.821" y2="26.773" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="c" x1="31.474" x2="31.474" y1="24.821" y2="26.773" gradientTransform="matrix(.6816 0 0 1.0248 72.391 -.91809)" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="b" x1="56.295" x2="56.295" y1="24.622" y2="26.574" gradientUnits="userSpaceOnUse" xlink:href="#a"/>
+ <linearGradient id="e" x1="49.067" x2="48.956" y1="19.719" y2="9.5227" gradientTransform="matrix(.97968 0 0 1.0207 -.25579 -.25579)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#C0CCE3" offset="0"/>
+ <stop stop-color="#EEF1F7" offset="1"/>
+ </linearGradient>
+ <filter id="f" x="-.010676" y="-.045304" width="1.0214" height="1.0906" color-interpolation-filters="sRGB">
+ <feGaussianBlur stdDeviation="0.45293203"/>
+ </filter>
+ </defs>
+ <g>
+ <path transform="translate(-2.5759 -27.848)" d="m13.609 32.203v6.8633h-0.05078c-0.40533-0.66867-0.96254-1.1715-1.6719-1.5059-0.69244-0.35193-1.4282-0.52734-2.2051-0.52734-0.96267 0-1.807 0.2027-2.5332 0.60742-0.72622 0.38713-1.3344 0.90556-1.8242 1.5566-0.47289 0.65108-0.83456 1.4092-1.0879 2.2715-0.23644 0.84464-0.35547 1.7236-0.35547 2.6387 0 0.95022 0.11902 1.8643 0.35547 2.7441 0.25333 0.87983 0.615 1.6633 1.0879 2.3496 0.48978 0.66867 1.1065 1.2066 1.8496 1.6113 0.74311 0.38713 1.6044 0.58008 2.584 0.58008 0.86133 0 1.6311-0.15787 2.3066-0.47461 0.69244-0.33434 1.2497-0.87227 1.6719-1.6113h0.05078v1.7422h3.4199v-18.846zm12.875 4.8301c-1.0302 0-1.9596 0.17541-2.7871 0.52734-0.82756 0.33434-1.5358 0.81965-2.127 1.4531-0.59111 0.61588-1.0483 1.3721-1.3691 2.2695-0.32089 0.87983-0.48047 1.866-0.48047 2.957s0.15958 2.0752 0.48047 2.9551c0.32089 0.87983 0.77803 1.6361 1.3691 2.2695 0.59111 0.61588 1.2994 1.0914 2.127 1.4258 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.0302 0 1.9596-0.16762 2.7871-0.50195 0.84444-0.33434 1.5612-0.8099 2.1523-1.4258 0.59111-0.63348 1.0483-1.3897 1.3691-2.2695 0.32089-0.87983 0.48047-1.8641 0.48047-2.9551s-0.15958-2.0772-0.48047-2.957c-0.32089-0.89743-0.77803-1.6536-1.3691-2.2695-0.59111-0.63348-1.3079-1.1188-2.1523-1.4531-0.82756-0.35193-1.7569-0.52734-2.7871-0.52734zm41.715 0c-0.912 0-1.7223 0.18516-2.4316 0.55469-0.69244 0.36953-1.2752 0.87043-1.748 1.5039-0.47289 0.61588-0.83651 1.337-1.0898 2.1641-0.23645 0.80944-0.35352 1.6553-0.35352 2.5352 0 0.93262 0.10007 1.8214 0.30273 2.666 0.21956 0.82704 0.55767 1.556 1.0137 2.1895 0.456 0.61588 1.0387 1.109 1.748 1.4785 0.70933 0.35193 1.5536 0.5293 2.5332 0.5293 0.79378 0 1.5446-0.16762 2.2539-0.50195 0.72622-0.35193 1.2834-0.88986 1.6719-1.6113h0.05078v1.7949c0.01689 0.96782-0.21071 1.7689-0.68359 2.4023-0.456 0.63348-1.1898 0.95117-2.2031 0.95117-0.64178 0-1.2075-0.14228-1.6973-0.42383-0.48978-0.26395-0.81939-0.74731-0.98828-1.4512h-3.5723c0.05067 0.77425 0.25276 1.435 0.60742 1.9805 0.37156 0.56309 0.8287 1.0192 1.3691 1.3711 0.55733 0.35193 1.1656 0.60726 1.8242 0.76562 0.67556 0.17597 1.3328 0.26562 1.9746 0.26562 1.5031 0 2.7025-0.21245 3.5977-0.63477 0.89511-0.42232 1.5798-0.94076 2.0527-1.5566 0.47289-0.59829 0.777-1.2493 0.91211-1.9531 0.152-0.70386 0.22656-1.3295 0.22656-1.875v-12.775h-3.4199v1.8223h-0.05078c-0.43911-0.79185-0.98782-1.3551-1.6465-1.6895-0.64178-0.33434-1.3926-0.50195-2.2539-0.50195zm16.523 0c-0.99644 0-1.9088 0.18516-2.7363 0.55469-0.81067 0.36953-1.5124 0.88018-2.1035 1.5312-0.59111 0.63348-1.0463 1.3897-1.3672 2.2695s-0.48047 1.831-0.48047 2.8516c0 1.0558 0.15108 2.0225 0.45508 2.9023 0.32089 0.87983 0.76758 1.6361 1.3418 2.2695 0.57422 0.63348 1.276 1.1266 2.1035 1.4785 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.4862 0 2.7517-0.35277 3.7988-1.0566 1.0471-0.70387 1.8254-1.8733 2.332-3.5098h-3.168c-0.11822 0.42232-0.43934 0.82772-0.96289 1.2148-0.52355 0.36953-1.1468 0.55274-1.873 0.55273-1.0133 0-1.7916-0.27286-2.332-0.81836-0.54044-0.5455-0.83605-1.4245-0.88672-2.6387h9.4492c0.06756-1.0558-0.01551-2.0673-0.25195-3.0352-0.23644-0.96782-0.62557-1.8293-1.166-2.5859-0.52356-0.75666-1.1998-1.355-2.0273-1.7949-0.82756-0.45751-1.7974-0.6875-2.9121-0.6875zm16.189 0c-0.76 0-1.5023 0.18516-2.2285 0.55469-0.72622 0.35193-1.3174 0.92299-1.7734 1.7148h-0.07617v-1.9004h-3.4199v13.646h3.5977v-7.1523c0-1.3901 0.21909-2.3841 0.6582-2.9824 0.43911-0.61588 1.1494-0.92383 2.1289-0.92383 0.86133 0 1.4611 0.28066 1.7988 0.84375 0.33777 0.5455 0.50586 1.3816 0.50586 2.5078v7.707h3.5976v-8.3926c0-0.84464-0.0765-1.6106-0.22851-2.2969-0.13511-0.70387-0.37971-1.2925-0.73438-1.7676-0.35466-0.49271-0.84386-0.87277-1.4688-1.1367-0.608-0.28155-1.3948-0.42188-2.3574-0.42188zm-66.063 0.36914 4.3066 6.4668-4.7129 7.1797h4.0293l2.7363-4.3027 2.7344 4.3027h4.1055l-4.8398-7.2578 4.3066-6.3887h-3.9766l-2.2793 3.5645-2.3066-3.5645zm13.275 0 4.584 12.803c0.10133 0.26395 0.15234 0.54461 0.15234 0.84375 0 0.40472-0.11707 0.77504-0.35352 1.1094-0.21956 0.33434-0.56617 0.52729-1.0391 0.58008-0.35467 0.0176-0.70979 0.0098-1.0645-0.02539-0.35467-0.03519-0.70128-0.07028-1.0391-0.10547v3.0879c0.37156 0.03519 0.73518 0.06051 1.0898 0.07813 0.37156 0.03519 0.74368 0.05273 1.1152 0.05273 1.2329 0 2.1943-0.23778 2.8867-0.71289 0.69244-0.47511 1.2326-1.2664 1.6211-2.375l5.4727-15.336h-3.7246l-2.8613 9.3438h-0.05078l-2.9648-9.3438zm-37.48 2.4551c0.59111 0 1.0823 0.12279 1.4707 0.36914 0.38844 0.24635 0.6991 0.57184 0.93555 0.97656 0.25333 0.38713 0.43187 0.84515 0.5332 1.373 0.10133 0.5103 0.15234 1.0482 0.15234 1.6113 0 0.56309-0.05101 1.1069-0.15234 1.6348-0.10133 0.5279-0.27137 1.0035-0.50781 1.4258-0.23644 0.40472-0.5556 0.73021-0.96094 0.97656-0.38844 0.24635-0.87959 0.36914-1.4707 0.36914-0.55733 0-1.038-0.12279-1.4434-0.36914-0.38844-0.26395-0.71806-0.59723-0.98828-1.002-0.25333-0.42232-0.43842-0.89788-0.55664-1.4258s-0.17773-1.0561-0.17773-1.584c-1e-7 -0.56309 0.05101-1.0991 0.15234-1.6094 0.11822-0.5279 0.29481-0.99567 0.53125-1.4004 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.24635 0.90303-0.36914 1.4941-0.36914zm15.84 0c0.608 0 1.1142 0.13253 1.5195 0.39648 0.42222 0.24635 0.75184 0.57184 0.98828 0.97656 0.25333 0.40472 0.42992 0.87054 0.53125 1.3984 0.10133 0.5279 0.15234 1.0658 0.15234 1.6113 0 0.5455-0.05101 1.0815-0.15234 1.6094-0.10134 0.5103-0.27792 0.97612-0.53125 1.3984-0.23644 0.40472-0.56606 0.73021-0.98828 0.97656-0.40533 0.24635-0.91153 0.36914-1.5195 0.36914-0.608 0-1.1142-0.12279-1.5195-0.36914s-0.73495-0.57184-0.98828-0.97656c-0.23644-0.42232-0.40648-0.88814-0.50781-1.3984-0.10133-0.5279-0.15234-1.0639-0.15234-1.6094 0-0.5455 0.05101-1.0834 0.15234-1.6113 0.10133-0.5279 0.27137-0.99371 0.50781-1.3984 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.26395 0.91153-0.39648 1.5195-0.39648zm42.602 0c0.59111 0 1.0803 0.11499 1.4688 0.34375 0.38844 0.22876 0.70105 0.5367 0.9375 0.92383 0.23644 0.38713 0.40648 0.8354 0.50781 1.3457 0.10133 0.49271 0.15039 1.0209 0.15039 1.584 0 0.4927-0.06606 0.96827-0.20117 1.4258-0.11822 0.43992-0.30526 0.83557-0.55859 1.1875-0.25333 0.35193-0.57445 0.63259-0.96289 0.84375-0.38844 0.21116-0.83513 0.31836-1.3418 0.31836-0.55733 0-1.021-0.12474-1.3926-0.37109-0.37156-0.24635-0.67566-0.56209-0.91211-0.94922-0.21956-0.38713-0.38109-0.81786-0.48242-1.293-0.08444-0.49271-0.12695-0.98581-0.12695-1.4785 0-0.5103 0.05101-0.99366 0.15234-1.4512 0.11822-0.47511 0.29676-0.89025 0.5332-1.2422 0.25333-0.36953 0.55744-0.65993 0.91211-0.87109 0.37156-0.21116 0.80974-0.31641 1.3164-0.31641zm15.535 0c0.87822 0 1.529 0.24753 1.9512 0.74023 0.43911 0.49271 0.74322 1.2138 0.91211 2.1641h-5.8535c0.01689-0.26395 0.0679-0.5641 0.15234-0.89844 0.10133-0.33434 0.26287-0.65008 0.48242-0.94922 0.23644-0.29914 0.54055-0.54667 0.91211-0.74023 0.38845-0.21116 0.86914-0.31641 1.4434-0.31641z" filter="url(#f)" opacity=".3" stroke="#969696" xlink:href="#path141"/>
+ <path d="m0.97202 24.161 43.605-0.0019 0.0508 3.3061-43.6 0.04174z" fill="url(#d)" stroke="#000" stroke-width=".5"/>
+ <path d="m10.283 3.5547v6.8633h-0.05078c-0.40533-0.66867-0.96254-1.1715-1.6719-1.5059-0.69244-0.35193-1.4282-0.52734-2.2051-0.52734-0.96267 0-1.807 0.2027-2.5332 0.60742-0.72622 0.38713-1.3344 0.90556-1.8242 1.5566-0.47289 0.65108-0.83456 1.4092-1.0879 2.2715-0.23644 0.84464-0.35547 1.7236-0.35547 2.6387 0 0.95022 0.11902 1.8643 0.35547 2.7441 0.25333 0.87983 0.615 1.6633 1.0879 2.3496 0.48978 0.66867 1.1065 1.2066 1.8496 1.6113 0.74311 0.38713 1.6044 0.58008 2.584 0.58008 0.86133 0 1.6311-0.15787 2.3066-0.47461 0.69244-0.33434 1.2497-0.87227 1.6719-1.6113h0.05078v1.7422h3.4199v-18.846zm12.875 4.8301c-1.0302 0-1.9596 0.17541-2.7871 0.52734-0.82756 0.33434-1.5358 0.81965-2.127 1.4531-0.59111 0.61588-1.0483 1.3721-1.3691 2.2695-0.32089 0.87983-0.48047 1.866-0.48047 2.957s0.15958 2.0752 0.48047 2.9551c0.32089 0.87983 0.77803 1.6361 1.3691 2.2695 0.59111 0.61588 1.2994 1.0914 2.127 1.4258 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.0302 0 1.9596-0.16762 2.7871-0.50195 0.84444-0.33434 1.5612-0.8099 2.1523-1.4258 0.59111-0.63348 1.0483-1.3897 1.3691-2.2695 0.32089-0.87983 0.48047-1.8641 0.48047-2.9551s-0.15958-2.0772-0.48047-2.957c-0.32089-0.89743-0.77803-1.6536-1.3691-2.2695-0.59111-0.63348-1.3079-1.1188-2.1523-1.4531-0.82756-0.35193-1.7569-0.52734-2.7871-0.52734zm41.715 0c-0.912 0-1.7223 0.18516-2.4316 0.55469-0.69244 0.36953-1.2752 0.87043-1.748 1.5039-0.47289 0.61588-0.83651 1.337-1.0898 2.1641-0.23644 0.80944-0.35352 1.6553-0.35352 2.5352 0 0.93262 0.10007 1.8214 0.30273 2.666 0.21956 0.82704 0.55767 1.556 1.0137 2.1895 0.456 0.61588 1.0387 1.109 1.748 1.4785 0.70933 0.35193 1.5536 0.5293 2.5332 0.5293 0.79378 0 1.5446-0.16762 2.2539-0.50195 0.72622-0.35193 1.2834-0.88986 1.6719-1.6113h0.05078v1.7949c0.01689 0.96782-0.21071 1.7689-0.68359 2.4023-0.456 0.63348-1.1898 0.95117-2.2031 0.95117-0.64178 0-1.2075-0.14228-1.6973-0.42383-0.48978-0.26395-0.81939-0.74731-0.98828-1.4512h-3.5723c0.05067 0.77425 0.25276 1.435 0.60742 1.9805 0.37156 0.56309 0.8287 1.0192 1.3691 1.3711 0.55733 0.35193 1.1656 0.60726 1.8242 0.76562 0.67556 0.17597 1.3328 0.26562 1.9746 0.26562 1.5031 0 2.7025-0.21245 3.5977-0.63477 0.89511-0.42232 1.5798-0.94076 2.0527-1.5566 0.47289-0.59829 0.777-1.2493 0.91211-1.9531 0.152-0.70386 0.22656-1.3295 0.22656-1.875v-12.775h-3.4199v1.8223h-0.05078c-0.43911-0.79185-0.98782-1.3551-1.6465-1.6895-0.64178-0.33434-1.3926-0.50195-2.2539-0.50195zm16.523 0c-0.99644 0-1.9088 0.18516-2.7363 0.55469-0.81067 0.36953-1.5124 0.88017-2.1035 1.5312-0.59111 0.63348-1.0463 1.3897-1.3672 2.2695s-0.48047 1.831-0.48047 2.8516c0 1.0558 0.15108 2.0225 0.45508 2.9023 0.32089 0.87983 0.76758 1.6361 1.3418 2.2695 0.57422 0.63348 1.276 1.1266 2.1035 1.4785 0.82756 0.33434 1.7569 0.50195 2.7871 0.50195 1.4862 0 2.7517-0.35278 3.7988-1.0566 1.0471-0.70386 1.8254-1.8733 2.332-3.5098h-3.168c-0.11822 0.42232-0.43934 0.82772-0.96289 1.2148-0.52355 0.36953-1.1468 0.55274-1.873 0.55273-1.0133 0-1.7916-0.27286-2.332-0.81836-0.54044-0.5455-0.83605-1.4245-0.88672-2.6387h9.4492c0.06756-1.0558-0.01551-2.0673-0.25195-3.0352-0.23644-0.96782-0.62557-1.8293-1.166-2.5859-0.52356-0.75666-1.1998-1.355-2.0273-1.7949-0.82756-0.45751-1.7974-0.6875-2.9121-0.6875zm16.189 0c-0.76 0-1.5023 0.18516-2.2285 0.55469-0.72622 0.35193-1.3174 0.923-1.7734 1.7148h-0.07617v-1.9004h-3.4199v13.646h3.5977v-7.1523c0-1.3901 0.21909-2.3841 0.6582-2.9824 0.43911-0.61588 1.1494-0.92383 2.1289-0.92383 0.86133 0 1.461 0.28066 1.7988 0.84375 0.33778 0.5455 0.50586 1.3816 0.50586 2.5078v7.707h3.5977v-8.3926c0-0.84464-0.0765-1.6106-0.22852-2.2969-0.13511-0.70387-0.3797-1.2925-0.73437-1.7676-0.35466-0.49271-0.84386-0.87277-1.4688-1.1367-0.608-0.28155-1.3948-0.42188-2.3574-0.42188zm-66.062 0.36914 4.3066 6.4668-4.7129 7.1797h4.0293l2.7363-4.3027 2.7344 4.3027h4.1055l-4.8398-7.2578 4.3066-6.3887h-3.9766l-2.2793 3.5645-2.3066-3.5645zm13.275 0 4.584 12.803c0.10133 0.26395 0.15234 0.54461 0.15234 0.84375 0 0.40472-0.11707 0.77504-0.35352 1.1094-0.21956 0.33434-0.56617 0.52729-1.0391 0.58008-0.35467 0.0176-0.70979 0.0098-1.0645-0.02539-0.35467-0.03519-0.70128-0.07027-1.0391-0.10547v3.0879c0.37156 0.03519 0.73518 0.06052 1.0898 0.07813 0.37156 0.03519 0.74368 0.05273 1.1152 0.05273 1.2329 0 2.1943-0.23778 2.8867-0.71289 0.69244-0.47511 1.2326-1.2664 1.6211-2.375l5.4727-15.336h-3.7246l-2.8613 9.3437h-0.05078l-2.9648-9.3437zm-37.48 2.4551c0.59111 0 1.0823 0.12279 1.4707 0.36914s0.6991 0.57184 0.93555 0.97656c0.25333 0.38713 0.43187 0.84515 0.5332 1.373 0.10133 0.5103 0.15234 1.0482 0.15234 1.6113 0 0.56309-0.05101 1.1069-0.15234 1.6348-0.10133 0.5279-0.27137 1.0035-0.50781 1.4258-0.23644 0.40472-0.5556 0.73021-0.96094 0.97656-0.38844 0.24635-0.87959 0.36914-1.4707 0.36914-0.55733 0-1.038-0.12279-1.4434-0.36914-0.38844-0.26395-0.71806-0.59723-0.98828-1.002-0.25333-0.42232-0.43842-0.89788-0.55664-1.4258s-0.17773-1.0561-0.17773-1.584c-1e-7 -0.56309 0.05101-1.0991 0.15234-1.6094 0.11822-0.5279 0.29481-0.99567 0.53125-1.4004 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.24635 0.90303-0.36914 1.4941-0.36914zm15.84 0c0.608 0 1.1142 0.13254 1.5195 0.39648 0.42222 0.24635 0.75184 0.57184 0.98828 0.97656 0.25333 0.40472 0.42992 0.87054 0.53125 1.3984 0.10133 0.5279 0.15234 1.0658 0.15234 1.6113 0 0.5455-0.05101 1.0815-0.15234 1.6094-0.10133 0.5103-0.27792 0.97612-0.53125 1.3984-0.23644 0.40472-0.56606 0.73021-0.98828 0.97656-0.40533 0.24635-0.91153 0.36914-1.5195 0.36914-0.608 0-1.1142-0.12279-1.5195-0.36914s-0.73495-0.57184-0.98828-0.97656c-0.23644-0.42232-0.40648-0.88813-0.50781-1.3984-0.10133-0.5279-0.15234-1.0639-0.15234-1.6094 0-0.5455 0.05101-1.0834 0.15234-1.6113 0.10133-0.5279 0.27137-0.99371 0.50781-1.3984 0.25333-0.40472 0.58295-0.73021 0.98828-0.97656 0.40533-0.26395 0.91153-0.39648 1.5195-0.39648zm42.602 0c0.59111 0 1.0803 0.11499 1.4688 0.34375 0.38844 0.22876 0.70106 0.5367 0.9375 0.92383 0.23644 0.38713 0.40648 0.8354 0.50781 1.3457 0.10133 0.49271 0.15039 1.0209 0.15039 1.584 0 0.49271-0.06606 0.96827-0.20117 1.4258-0.11822 0.43992-0.30526 0.83557-0.55859 1.1875-0.25333 0.35193-0.57445 0.63259-0.96289 0.84375-0.38844 0.21116-0.83513 0.31836-1.3418 0.31836-0.55733 0-1.021-0.12474-1.3926-0.37109-0.37156-0.24635-0.67566-0.56209-0.91211-0.94922-0.21956-0.38713-0.38109-0.81786-0.48242-1.293-0.08444-0.49271-0.12695-0.98581-0.12695-1.4785 0-0.5103 0.05101-0.99366 0.15234-1.4512 0.11822-0.47511 0.29676-0.89026 0.5332-1.2422 0.25333-0.36953 0.55744-0.65993 0.91211-0.87109 0.37156-0.21116 0.80974-0.31641 1.3164-0.31641zm15.535 0c0.87822 0 1.529 0.24753 1.9512 0.74024 0.43911 0.49271 0.74322 1.2138 0.91211 2.1641h-5.8535c0.01689-0.26395 0.0679-0.5641 0.15234-0.89844 0.10133-0.33434 0.26287-0.65008 0.48242-0.94922 0.23644-0.29914 0.54055-0.54667 0.91211-0.74023 0.38845-0.21116 0.86914-0.31641 1.4434-0.31641z" fill="url(#e)" stroke="#4665A2" stroke-width=".7"/>
+ <path d="m52.988 27.291c0.99602-1.0359 1.3944-1.8725 1.7928-3.1076l3.8247-0.03984c0.3113 1.6096 0.82413 2.5137 1.6335 3.1474z" fill="url(#b)" stroke="#000" stroke-width=".5"/>
+ <path d="m73.89 24.04 28.885-0.2011-0.12476 3.3879-31.033 0.16229c1.2621-1.0234 1.9665-2.2859 2.2724-3.3491z" fill="url(#c)" stroke="#000" stroke-width=".41788"/>
+ </g>
+</svg>
diff --git a/docs/doxygen/html/dynsections.js b/docs/doxygen/html/dynsections.js
new file mode 100644
index 0000000..3174bd7
--- /dev/null
+++ b/docs/doxygen/html/dynsections.js
@@ -0,0 +1,121 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ 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.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+ */
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+ content.hide();
+ summary.show();
+ $(linkObj).addClass('closed').removeClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ content.show();
+ summary.hide();
+ $(linkObj).removeClass('closed').addClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+ return false;
+}
+
+function updateStripes()
+{
+ $('table.directory tr').
+ removeClass('even').filter(':visible:even').addClass('even');
+}
+
+function toggleLevel(level)
+{
+ $('table.directory tr').each(function() {
+ var l = this.id.split('_').length-1;
+ var i = $('#img'+this.id.substring(3));
+ var a = $('#arr'+this.id.substring(3));
+ if (l<level+1) {
+ i.removeClass('iconfopen iconfclosed').addClass('iconfopen');
+ a.html('&#9660;');
+ $(this).show();
+ } else if (l==level+1) {
+ i.removeClass('iconfclosed iconfopen').addClass('iconfclosed');
+ a.html('&#9658;');
+ $(this).show();
+ } else {
+ $(this).hide();
+ }
+ });
+ updateStripes();
+}
+
+function toggleFolder(id)
+{
+ // the clicked row
+ var currentRow = $('#row_'+id);
+
+ // all rows after the clicked row
+ var rows = currentRow.nextAll("tr");
+
+ var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
+
+ // only match elements AFTER this one (can't hide elements before)
+ var childRows = rows.filter(function() { return this.id.match(re); });
+
+ // first row is visible we are HIDING
+ if (childRows.filter(':first').is(':visible')===true) {
+ // replace down arrow by right arrow for current row
+ var currentRowSpans = currentRow.find("span");
+ currentRowSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+ currentRowSpans.filter(".arrow").html('&#9658;');
+ rows.filter("[id^=row_"+id+"]").hide(); // hide all children
+ } else { // we are SHOWING
+ // replace right arrow by down arrow for current row
+ var currentRowSpans = currentRow.find("span");
+ currentRowSpans.filter(".iconfclosed").removeClass("iconfclosed").addClass("iconfopen");
+ currentRowSpans.filter(".arrow").html('&#9660;');
+ // replace down arrows by right arrows for child rows
+ var childRowsSpans = childRows.find("span");
+ childRowsSpans.filter(".iconfopen").removeClass("iconfopen").addClass("iconfclosed");
+ childRowsSpans.filter(".arrow").html('&#9658;');
+ childRows.show(); //show all children
+ }
+ updateStripes();
+}
+
+
+function toggleInherit(id)
+{
+ var rows = $('tr.inherit.'+id);
+ var img = $('tr.inherit_header.'+id+' img');
+ var src = $(img).attr('src');
+ if (rows.filter(':first').is(':visible')===true) {
+ rows.css('display','none');
+ $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ rows.css('display','table-row'); // using show() causes jump in firefox
+ $(img).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+}
+/* @license-end */
diff --git a/docs/doxygen/html/files.html b/docs/doxygen/html/files.html
new file mode 100644
index 0000000..de1cd6e
--- /dev/null
+++ b/docs/doxygen/html/files.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: File List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle"><div class="title">File List</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')">&#160;</span><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html" target="_self">src</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_0_" class="arrow" onclick="toggleFolder('0_0_')">&#9658;</span><span id="img_0_0_" class="iconfclosed" onclick="toggleFolder('0_0_')">&#160;</span><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html" target="_self">core</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_0_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbbcd_8cpp.html" target="_self">xbbcd.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_1_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbdate_8cpp.html" target="_self">xbdate.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_2_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbdbf_8cpp.html" target="_self">xbdbf.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_3_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbdbf3_8cpp.html" target="_self">xbdbf3.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_4_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbdbf4_8cpp.html" target="_self">xbdbf4.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_5_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbexp_8cpp.html" target="_self">xbexp.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_6_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbexpnode_8cpp.html" target="_self">xbexpnode.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_7_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbfields_8cpp.html" target="_self">xbfields.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_8_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbfile_8cpp.html" target="_self">xbfile.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_9_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbfilter_8cpp.html" target="_self">xbfilter.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_10_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbfuncs_8cpp.html" target="_self">xbfuncs.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_11_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbixbase_8cpp.html" target="_self">xbixbase.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_12_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbixmdx_8cpp.html" target="_self">xbixmdx.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_13_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbixndx_8cpp.html" target="_self">xbixndx.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_14_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xblog_8cpp.html" target="_self">xblog.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_15_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbmemo_8cpp.html" target="_self">xbmemo.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_16_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbmemo3_8cpp.html" target="_self">xbmemo3.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_17_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbmemo4_8cpp.html" target="_self">xbmemo4.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_18_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbssv_8cpp.html" target="_self">xbssv.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_19_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbstring_8cpp.html" target="_self">xbstring.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_20_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbtag_8cpp.html" target="_self">xbtag.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_21_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbtblmgr_8cpp.html" target="_self">xbtblmgr.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_22_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbuda_8cpp.html" target="_self">xbuda.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_23_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbxbase_8cpp.html" target="_self">xbxbase.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_1_" class="arrow" onclick="toggleFolder('0_1_')">&#9658;</span><span id="img_0_1_" class="iconfclosed" onclick="toggleFolder('0_1_')">&#160;</span><a class="el" href="dir_e931c1a3f0014e624d0645a271726ad2.html" target="_self">examples</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__ex__date_8cpp.html" target="_self">xb_ex_date.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_1_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__ex__sql_8cpp.html" target="_self">xb_ex_sql.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_2_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__ex__string_8cpp.html" target="_self">xb_ex_string.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_3_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__ex__v3__create__dbf_8cpp.html" target="_self">xb_ex_v3_create_dbf.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_4_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__ex__v3__upd__dbf_8cpp.html" target="_self">xb_ex_v3_upd_dbf.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_5_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__ex__v4__create__dbf_8cpp.html" target="_self">xb_ex_v4_create_dbf.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_6_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__ex__v4__upd__dbf_8cpp.html" target="_self">xb_ex_v4_upd_dbf.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_2_" class="arrow" onclick="toggleFolder('0_2_')">&#9658;</span><span id="img_0_2_" class="iconfclosed" onclick="toggleFolder('0_2_')">&#160;</span><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html" target="_self">include</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_0_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbase_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbase_8h.html" target="_self">xbase.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_1_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbbcd_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbbcd_8h.html" target="_self">xbbcd.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_2_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbdate_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbdate_8h.html" target="_self">xbdate.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_3_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbdbf_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbdbf_8h.html" target="_self">xbdbf.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_4_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbexp_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbexp_8h.html" target="_self">xbexp.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_5_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbexpnode_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbexpnode_8h.html" target="_self">xbexpnode.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_6_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbfile_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbfile_8h.html" target="_self">xbfile.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_7_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbfilter_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbfilter_8h.html" target="_self">xbfilter.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_8_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbindex_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbindex_8h.html" target="_self">xbindex.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_9_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xblnklst_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xblnklst_8h.html" target="_self">xblnklst.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_10_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xblnklstord_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xblnklstord_8h.html" target="_self">xblnklstord.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_11_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xblnknod_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xblnknod_8h.html" target="_self">xblnknod.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_12_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xblog_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xblog_8h.html" target="_self">xblog.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_13_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbmemo_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbmemo_8h.html" target="_self">xbmemo.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_14_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbretcod_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbretcod_8h.html" target="_self">xbretcod.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_15_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbsql_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbsql_8h.html" target="_self">xbsql.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_16_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbssv_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbssv_8h.html" target="_self">xbssv.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_17_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbstring_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbstring_8h.html" target="_self">xbstring.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_18_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbtag_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbtag_8h.html" target="_self">xbtag.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_19_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbtblmgr_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbtblmgr_8h.html" target="_self">xbtblmgr.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_20_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbtypes_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbtypes_8h.html" target="_self">xbtypes.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_21_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbuda_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbuda_8h.html" target="_self">xbuda.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_22_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><a href="xbxbase_8h_source.html"><span class="icondoc"></span></a><a class="el" href="xbxbase_8h.html" target="_self">xbxbase.h</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_3_" class="arrow" onclick="toggleFolder('0_3_')">&#9658;</span><span id="img_0_3_" class="iconfclosed" onclick="toggleFolder('0_3_')">&#160;</span><a class="el" href="dir_25b94c3afce00ed38231227d8141f932.html" target="_self">sql</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_0_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbcrix_8cpp.html" target="_self">xbcrix.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_1_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbcrtbl_8cpp.html" target="_self">xbcrtbl.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_2_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbdrpix_8cpp.html" target="_self">xbdrpix.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_3_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbdrptbl_8cpp.html" target="_self">xbdrptbl.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_4_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbinsert_8cpp.html" target="_self">xbinsert.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_5_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbset_8cpp.html" target="_self">xbset.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_6_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xbsql_8cpp.html" target="_self">xbsql.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_4_" class="arrow" onclick="toggleFolder('0_4_')">&#9658;</span><span id="img_0_4_" class="iconfclosed" onclick="toggleFolder('0_4_')">&#160;</span><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html" target="_self">tests</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_0_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="tstfuncs_8cpp.html" target="_self">tstfuncs.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_1_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__bcd_8cpp.html" target="_self">xb_test_bcd.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_2_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__date_8cpp.html" target="_self">xb_test_date.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_3_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__dbf__v3__memos_8cpp.html" target="_self">xb_test_dbf_v3_memos.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_4_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__dbf__v3__nomemos_8cpp.html" target="_self">xb_test_dbf_v3_nomemos.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_5_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__dbf__v4__memos_8cpp.html" target="_self">xb_test_dbf_v4_memos.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_6_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__dbf__v4__nomemos_8cpp.html" target="_self">xb_test_dbf_v4_nomemos.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_7_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__expnode_8cpp.html" target="_self">xb_test_expnode.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_8_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__expression_8cpp.html" target="_self">xb_test_expression.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_9_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__file_8cpp.html" target="_self">xb_test_file.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_10_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__filter_8cpp.html" target="_self">xb_test_filter.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_11_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__funcs_8cpp.html" target="_self">xb_test_funcs.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_12_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__linklist_8cpp.html" target="_self">xb_test_linklist.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_13_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__lock_8cpp.html" target="_self">xb_test_lock.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_14_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__lock2_8cpp.html" target="_self">xb_test_lock2.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_15_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__log_8cpp.html" target="_self">xb_test_log.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_16_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__mdx_8cpp.html" target="_self">xb_test_mdx.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_17_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__ndx_8cpp.html" target="_self">xb_test_ndx.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_18_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__ndx2_8cpp.html" target="_self">xb_test_ndx2.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_19_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__sql_8cpp.html" target="_self">xb_test_sql.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_20_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__string_8cpp.html" target="_self">xb_test_string.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_21_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__tblmgr_8cpp.html" target="_self">xb_test_tblmgr.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_22_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__uda_8cpp.html" target="_self">xb_test_uda.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_23_" class="even" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__test__xbase_8cpp.html" target="_self">xb_test_xbase.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_0_5_" class="arrow" onclick="toggleFolder('0_5_')">&#9658;</span><span id="img_0_5_" class="iconfclosed" onclick="toggleFolder('0_5_')">&#160;</span><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html" target="_self">utils</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_0_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="checkndx_8cpp.html" target="_self">checkndx.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_1_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="dbfxtrct_8cpp.html" target="_self">dbfxtrct.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_2_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="reindex_8cpp.html" target="_self">reindex.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_3_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__cfg__check_8cpp.html" target="_self">xb_cfg_check.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_4_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__copydbf_8cpp.html" target="_self">xb_copydbf.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_5_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__dbfutil_8cpp.html" target="_self">xb_dbfutil.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_6_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__deletall_8cpp.html" target="_self">xb_deletall.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_7_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__dumpdbt_8cpp.html" target="_self">xb_dumpdbt.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_8_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__dumphdr_8cpp.html" target="_self">xb_dumphdr.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_9_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__dumpix_8cpp.html" target="_self">xb_dumpix.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_10_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__dumprecs_8cpp.html" target="_self">xb_dumprecs.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_11_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__execsql_8cpp.html" target="_self">xb_execsql.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_12_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__pack_8cpp.html" target="_self">xb_pack.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_13_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__tblinfo_8cpp.html" target="_self">xb_tblinfo.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_14_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__undelall_8cpp.html" target="_self">xb_undelall.cpp</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_15_" style="display:none;"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icondoc"></span><a class="el" href="xb__zap_8cpp.html" target="_self">xb_zap.cpp</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/folderclosed.png b/docs/doxygen/html/folderclosed.png
new file mode 100644
index 0000000..bb8ab35
--- /dev/null
+++ b/docs/doxygen/html/folderclosed.png
Binary files differ
diff --git a/docs/doxygen/html/folderopen.png b/docs/doxygen/html/folderopen.png
new file mode 100644
index 0000000..d6c7f67
--- /dev/null
+++ b/docs/doxygen/html/folderopen.png
Binary files differ
diff --git a/docs/doxygen/html/functions.html b/docs/doxygen/html/functions.html
new file mode 100644
index 0000000..4332e69
--- /dev/null
+++ b/docs/doxygen/html/functions.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_a" name="index_a"></a>- a -</h3><ul>
+<li>Abort()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4edcf31390fbdc8c3558004770fd9f2f">xb::xbDbf</a></li>
+<li>AddBackSlash()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a6c4fdb689d27a9d19a0b5b4236e1ca62">xb::xbString</a></li>
+<li>AddTblToTblList()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#a721f69ccc7893842422a043468ffccea">xb::xbTblMgr</a></li>
+<li>Append()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a8f202e4798491f2ae9ce51ff58dd5815">xb::xbString</a></li>
+<li>AppendRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a5b412dd796241673eb1aa2c93513d69b">xb::xbDbf</a></li>
+<li>Assign()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a85bef82dfa22122a1ab8dfe58a107d96">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_b.html b/docs/doxygen/html/functions_b.html
new file mode 100644
index 0000000..0fc903f
--- /dev/null
+++ b/docs/doxygen/html/functions_b.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_b" name="index_b"></a>- b -</h3><ul>
+<li>BitSet()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">xb::xbSsv</a></li>
+<li>BlankRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a78da5a3d2011a3f2e7618cbdd3ba02d6">xb::xbDbf</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_c.html b/docs/doxygen/html/functions_c.html
new file mode 100644
index 0000000..efdafde
--- /dev/null
+++ b/docs/doxygen/html/functions_c.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
+<li>CalcRollingCenturyForYear()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a9df58caa54105c489c314785c457e8cb">xb::xbDate</a></li>
+<li>cEncryptionFlag&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a8734e799707582f022fc341d515650f4">xb::xbDbf</a></li>
+<li>CenturyOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a38b2c5285c69ed65e94ece6c22dafde0">xb::xbDate</a></li>
+<li>cFieldName&#160;:&#160;<a class="el" href="structxb_1_1xbSchema.html#a514183856094123fd37df67885b4681e">xb::xbSchema</a></li>
+<li>CharDayOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a9fc29730b66cddfbb58c69992a99cc7c">xb::xbDate</a></li>
+<li>CharMonthOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#afffc84f02bd421335ff8ebe9fb3db0ac">xb::xbDate</a></li>
+<li>cIndexFlag&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ad59074633641e03647e54d2b66c9102b">xb::xbDbf</a></li>
+<li>cLangDriver&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1">xb::xbDbf</a></li>
+<li>Close()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ad68d73113e54e1b5f326e90f45e9989d">xb::xbDbf</a></li>
+<li>CloseAllTables()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#afccb552ca0daff779c0500ff20d22c2b">xb::xbXBase</a></li>
+<li>Commit()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#abd69532c885ab72bcf3fb5066b318f4f">xb::xbDbf</a></li>
+<li>Copy()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#ac7a8466b03c04df838bd182ef244f792">xb::xbString</a></li>
+<li>CopyDbfStructure()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a829c615a130a1fdf609d93438d8a6264">xb::xbDbf</a></li>
+<li>CountChar()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#adc0204bcfd1c052b9aea9229b10acf72">xb::xbString</a></li>
+<li>CreateTable()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a73e41bfe679dd06ab16c436652df93f1">xb::xbDbf</a></li>
+<li>CreateUniqueFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#aae9a2ddb0adb8165b4ac2b6a28a932f7">xb::xbFile</a></li>
+<li>CTOD()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#abb1eb4b0394e4a67aadab15779b1b8c5">xb::xbDate</a></li>
+<li>cTransactionFlag&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ac3c89fc3bc6a6abf385478a8adbed970">xb::xbDbf</a></li>
+<li>cType&#160;:&#160;<a class="el" href="structxb_1_1xbSchema.html#a1d612b2ed5dc0b0289c9e91b3cda3a25">xb::xbSchema</a></li>
+<li>cUpdateDD&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a6021789d314cd41488991e708fcd0df2">xb::xbDbf</a></li>
+<li>cUpdateMM&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a9340a5e8ee53eb0f3b6601eec2d71e1b">xb::xbDbf</a></li>
+<li>cUpdateYY&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4fcd6a86ddd32d4a9d76a4074573440a">xb::xbDbf</a></li>
+<li>cVersion&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3a262abf658e5fa968b57ef457a69470">xb::xbDbf</a></li>
+<li>CvtHexChar()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a0a737bd408a94903f214eb2879eb56de">xb::xbString</a></li>
+<li>CvtHexString()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#ab5eb6918a0ae9ab6c0e961318f3d1eb0">xb::xbString</a></li>
+<li>CvtLongLong()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#ae3ab18365e132323f8ae4c99eb72181c">xb::xbString</a></li>
+<li>CvtULongLong()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a1528b30b84a41c3564ef31d1f4496b15">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_d.html b/docs/doxygen/html/functions_d.html
new file mode 100644
index 0000000..cdce904
--- /dev/null
+++ b/docs/doxygen/html/functions_d.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_d" name="index_d"></a>- d -</h3><ul>
+<li>DateIsValid()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a367f66ef0c03c1747c12a18784554ccb">xb::xbDate</a></li>
+<li>DayOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ad6417a900ce64a46f8909c0c7a2ddea2">xb::xbDate</a></li>
+<li>DeleteAll()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a01c26b67e312be1e674b3da710e031b9">xb::xbDbf</a></li>
+<li>DeleteAllRecords()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3067fdfa3a7a5c15651f6e89d1102176">xb::xbDbf</a></li>
+<li>DeleteRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#acd8c10579229f3a2e2c5fdb7fcef90db">xb::xbDbf</a></li>
+<li>DeleteTable()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4085ed4f049d976124d8edc3d3c56397">xb::xbDbf</a></li>
+<li>DetermineXbaseMemoVersion()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a5a740033664c9ad2611c90e2a6d0c2d3">xb::xbFile</a></li>
+<li>DetermineXbaseTableVersion()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ae2b6ac26018dc28f77afbb3f008c3f66">xb::xbFile</a></li>
+<li>DisableMsgLogging()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#ae357fac4fdebdf49e46563cf611caf65">xb::xbXBase</a></li>
+<li>DisplayError()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">xb::xbSsv</a></li>
+<li>DisplayTableList()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#a5eebffb9e8cc64141e35c2622045cb50">xb::xbTblMgr</a></li>
+<li>DumpHeader()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab1f4a515533402f872cedcd0322aabd4">xb::xbDbf</a></li>
+<li>DumpRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3a6a068addffd06fc9a996639d6ca69e">xb::xbDbf</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_e.html b/docs/doxygen/html/functions_e.html
new file mode 100644
index 0000000..74be731
--- /dev/null
+++ b/docs/doxygen/html/functions_e.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_e" name="index_e"></a>- e -</h3><ul>
+<li>eGetDouble()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ab14e4a11427f5efb81cba1dd32bd1aa1">xb::xbFile</a></li>
+<li>eGetInt16()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ac40c991110ddc6fb30a72d90f4652762">xb::xbFile</a></li>
+<li>eGetInt32()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a60b24a5afc984c586bf384c7e915ba0d">xb::xbFile</a></li>
+<li>eGetUInt16()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a936ade458e6d5e6d29f9b5031888d189">xb::xbFile</a></li>
+<li>eGetUInt32()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a78f052529d39a18deaface5a0d47d0b0">xb::xbFile</a></li>
+<li>EnableMsgLogging()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a470e6eb0ed0be60338f9b40976d3ad48">xb::xbXBase</a></li>
+<li>ePutDouble()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a98b6ff533ae93f90c977a2ba23eeb105">xb::xbFile</a></li>
+<li>ePutInt16()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a29130f12739ac8fa837f4eaedf1338b2">xb::xbFile</a></li>
+<li>ePutInt32()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a19c37f76a2ccbb45019cb0fc373d3f46">xb::xbFile</a></li>
+<li>ePutUInt16()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a65e9839f92b96eac7b0d071fac3bbe40">xb::xbFile</a></li>
+<li>ePutUInt32()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#aa3f6ceae4b96f24875d86848bf13a173">xb::xbFile</a></li>
+<li>ErrorCodeText&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e">xb::xbSsv</a></li>
+<li>ExtractElement()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a77195fc4957952625cb33bb503517a3e">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_f.html b/docs/doxygen/html/functions_f.html
new file mode 100644
index 0000000..152931e
--- /dev/null
+++ b/docs/doxygen/html/functions_f.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_f" name="index_f"></a>- f -</h3><ul>
+<li>FileExists()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a78bd8a11dce102647095baf3aff2b006">xb::xbFile</a></li>
+<li>FileIsOpen()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a7fa837938a32dc9ca3fbc81cbaf50f59">xb::xbFile</a></li>
+<li>FlushLog()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a5a5ecaed9777978344902446c9ae3b8e">xb::xbXBase</a></li>
+<li>FormatDate()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a01de44dc869f7db99f33046fc91f2c6a">xb::xbDate</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func.html b/docs/doxygen/html/functions_func.html
new file mode 100644
index 0000000..e26f40d
--- /dev/null
+++ b/docs/doxygen/html/functions_func.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_a" name="index_a"></a>- a -</h3><ul>
+<li>Abort()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4edcf31390fbdc8c3558004770fd9f2f">xb::xbDbf</a></li>
+<li>AddBackSlash()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a6c4fdb689d27a9d19a0b5b4236e1ca62">xb::xbString</a></li>
+<li>AddTblToTblList()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#a721f69ccc7893842422a043468ffccea">xb::xbTblMgr</a></li>
+<li>Append()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a8f202e4798491f2ae9ce51ff58dd5815">xb::xbString</a></li>
+<li>AppendRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a5b412dd796241673eb1aa2c93513d69b">xb::xbDbf</a></li>
+<li>Assign()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a85bef82dfa22122a1ab8dfe58a107d96">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_b.html b/docs/doxygen/html/functions_func_b.html
new file mode 100644
index 0000000..2981d25
--- /dev/null
+++ b/docs/doxygen/html/functions_func_b.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_b" name="index_b"></a>- b -</h3><ul>
+<li>BitSet()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72">xb::xbSsv</a></li>
+<li>BlankRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a78da5a3d2011a3f2e7618cbdd3ba02d6">xb::xbDbf</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_c.html b/docs/doxygen/html/functions_func_c.html
new file mode 100644
index 0000000..c1c8ba2
--- /dev/null
+++ b/docs/doxygen/html/functions_func_c.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
+<li>CalcRollingCenturyForYear()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a9df58caa54105c489c314785c457e8cb">xb::xbDate</a></li>
+<li>CenturyOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a38b2c5285c69ed65e94ece6c22dafde0">xb::xbDate</a></li>
+<li>CharDayOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a9fc29730b66cddfbb58c69992a99cc7c">xb::xbDate</a></li>
+<li>CharMonthOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#afffc84f02bd421335ff8ebe9fb3db0ac">xb::xbDate</a></li>
+<li>Close()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ad68d73113e54e1b5f326e90f45e9989d">xb::xbDbf</a></li>
+<li>CloseAllTables()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#afccb552ca0daff779c0500ff20d22c2b">xb::xbXBase</a></li>
+<li>Commit()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#abd69532c885ab72bcf3fb5066b318f4f">xb::xbDbf</a></li>
+<li>Copy()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#ac7a8466b03c04df838bd182ef244f792">xb::xbString</a></li>
+<li>CopyDbfStructure()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a829c615a130a1fdf609d93438d8a6264">xb::xbDbf</a></li>
+<li>CountChar()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a26bc14d92dc7ce1f2bf31cd74af0db0f">xb::xbString</a></li>
+<li>CreateTable()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a73e41bfe679dd06ab16c436652df93f1">xb::xbDbf</a></li>
+<li>CreateUniqueFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#aae9a2ddb0adb8165b4ac2b6a28a932f7">xb::xbFile</a></li>
+<li>CTOD()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#abb1eb4b0394e4a67aadab15779b1b8c5">xb::xbDate</a></li>
+<li>CvtHexChar()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a0a737bd408a94903f214eb2879eb56de">xb::xbString</a></li>
+<li>CvtHexString()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#ab5eb6918a0ae9ab6c0e961318f3d1eb0">xb::xbString</a></li>
+<li>CvtLongLong()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#ae3ab18365e132323f8ae4c99eb72181c">xb::xbString</a></li>
+<li>CvtULongLong()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a1528b30b84a41c3564ef31d1f4496b15">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_d.html b/docs/doxygen/html/functions_func_d.html
new file mode 100644
index 0000000..a6f53b2
--- /dev/null
+++ b/docs/doxygen/html/functions_func_d.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_d" name="index_d"></a>- d -</h3><ul>
+<li>DateIsValid()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a367f66ef0c03c1747c12a18784554ccb">xb::xbDate</a></li>
+<li>DayOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ad6417a900ce64a46f8909c0c7a2ddea2">xb::xbDate</a></li>
+<li>DeleteAll()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a01c26b67e312be1e674b3da710e031b9">xb::xbDbf</a></li>
+<li>DeleteAllRecords()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3067fdfa3a7a5c15651f6e89d1102176">xb::xbDbf</a></li>
+<li>DeleteRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#acd8c10579229f3a2e2c5fdb7fcef90db">xb::xbDbf</a></li>
+<li>DeleteTable()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4085ed4f049d976124d8edc3d3c56397">xb::xbDbf</a></li>
+<li>DetermineXbaseMemoVersion()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a5a740033664c9ad2611c90e2a6d0c2d3">xb::xbFile</a></li>
+<li>DetermineXbaseTableVersion()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ae2b6ac26018dc28f77afbb3f008c3f66">xb::xbFile</a></li>
+<li>DisableMsgLogging()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#ae357fac4fdebdf49e46563cf611caf65">xb::xbXBase</a></li>
+<li>DisplayError()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d">xb::xbSsv</a></li>
+<li>DisplayTableList()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#a5eebffb9e8cc64141e35c2622045cb50">xb::xbTblMgr</a></li>
+<li>DumpHeader()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab1f4a515533402f872cedcd0322aabd4">xb::xbDbf</a></li>
+<li>DumpRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3a6a068addffd06fc9a996639d6ca69e">xb::xbDbf</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_e.html b/docs/doxygen/html/functions_func_e.html
new file mode 100644
index 0000000..430c0ac
--- /dev/null
+++ b/docs/doxygen/html/functions_func_e.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_e" name="index_e"></a>- e -</h3><ul>
+<li>eGetDouble()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ab14e4a11427f5efb81cba1dd32bd1aa1">xb::xbFile</a></li>
+<li>eGetInt16()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ac40c991110ddc6fb30a72d90f4652762">xb::xbFile</a></li>
+<li>eGetInt32()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a60b24a5afc984c586bf384c7e915ba0d">xb::xbFile</a></li>
+<li>eGetUInt16()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a936ade458e6d5e6d29f9b5031888d189">xb::xbFile</a></li>
+<li>eGetUInt32()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a78f052529d39a18deaface5a0d47d0b0">xb::xbFile</a></li>
+<li>EnableMsgLogging()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a470e6eb0ed0be60338f9b40976d3ad48">xb::xbXBase</a></li>
+<li>ePutDouble()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a98b6ff533ae93f90c977a2ba23eeb105">xb::xbFile</a></li>
+<li>ePutInt16()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a29130f12739ac8fa837f4eaedf1338b2">xb::xbFile</a></li>
+<li>ePutInt32()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a19c37f76a2ccbb45019cb0fc373d3f46">xb::xbFile</a></li>
+<li>ePutUInt16()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a65e9839f92b96eac7b0d071fac3bbe40">xb::xbFile</a></li>
+<li>ePutUInt32()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#aa3f6ceae4b96f24875d86848bf13a173">xb::xbFile</a></li>
+<li>ExtractElement()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a77195fc4957952625cb33bb503517a3e">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_f.html b/docs/doxygen/html/functions_func_f.html
new file mode 100644
index 0000000..dfdd58b
--- /dev/null
+++ b/docs/doxygen/html/functions_func_f.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_f" name="index_f"></a>- f -</h3><ul>
+<li>FileExists()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a78bd8a11dce102647095baf3aff2b006">xb::xbFile</a></li>
+<li>FileIsOpen()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a7fa837938a32dc9ca3fbc81cbaf50f59">xb::xbFile</a></li>
+<li>FlushLog()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a5a5ecaed9777978344902446c9ae3b8e">xb::xbXBase</a></li>
+<li>FormatDate()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a01de44dc869f7db99f33046fc91f2c6a">xb::xbDate</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_g.html b/docs/doxygen/html/functions_func_g.html
new file mode 100644
index 0000000..b3cf069
--- /dev/null
+++ b/docs/doxygen/html/functions_func_g.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_g" name="index_g"></a>- g -</h3><ul>
+<li>GetAutoCommit()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ae0c00226fd2ea7a67f101e795467ed68">xb::xbDbf</a></li>
+<li>GetBlockSize()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a638e14262410a1627819f016a16cdce2">xb::xbFile</a></li>
+<li>GetCharacter()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a685187a5f8401b322fc61f3fbe56330d">xb::xbString</a></li>
+<li>GetCurRecNo()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a643a80a3792a52760c8e09ba18719503">xb::xbDbf</a></li>
+<li>GetDataDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">xb::xbSsv</a></li>
+<li>GetDateField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#af78ef1fba949463ff7f829d3cffc4555">xb::xbDbf</a></li>
+<li>GetDbfPtr()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#ad8a5d28a2ee6720a9aa74bcb45662cf5">xb::xbTblMgr</a></li>
+<li>GetDbfStatus()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ac1110d867ba297a52c8b0e83e88f05e6">xb::xbDbf</a></li>
+<li>GetDefaultAutoCommit()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">xb::xbSsv</a></li>
+<li>GetDefaultDateFormat()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">xb::xbSsv</a></li>
+<li>GetDefaultLogDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#abf3763faf6a8917a963213cd53af529c">xb::xbSsv</a></li>
+<li>GetDefaultLogFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a43878d4dc041f2a5e2398a118ccfaf79">xb::xbSsv</a></li>
+<li>GetDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#acd0fb2166b2bff7e8a1cf65a7bc8be1e">xb::xbFile</a></li>
+<li>GetDoubleField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4556041a7ff2f6b6f986729901c11f08">xb::xbDbf</a></li>
+<li>GetEndianType()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">xb::xbSsv</a></li>
+<li>GetErrorMessage()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">xb::xbSsv</a></li>
+<li>GetField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a9a0fcf7e2040ab483e3807927833cb26">xb::xbDbf</a></li>
+<li>GetFieldCnt()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#add27d8ef555a13b336b8c804165dc15e">xb::xbDbf</a></li>
+<li>GetFieldDecimal()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#abcb4defad2e1b6e67f63cc60737ad840">xb::xbDbf</a></li>
+<li>GetFieldLen()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#adda4302b58cc6109b048f19d9b68bbd4">xb::xbDbf</a></li>
+<li>GetFieldName()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a5e3e4368bfba1724c016b8859023e34c">xb::xbDbf</a></li>
+<li>GetFieldNo()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#aed9113b5095c6df1b9c854cbd0d8047b">xb::xbDbf</a></li>
+<li>GetFieldType()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a181db879f1a75f93a34c03513a0b2fea">xb::xbDbf</a></li>
+<li>GetFileDirPart()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a60c53998e3d1b694134b20a87bc9bf5a">xb::xbFile</a></li>
+<li>GetFileExtPart()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a57a9222e5cbb51019d4eeb2c3ac89fa2">xb::xbFile</a></li>
+<li>GetFileMtime()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a02df78f4c90313243f508fc56b95aba8">xb::xbFile</a></li>
+<li>GetFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ac95cb882ccbcdedc9a233c6ad9fed07a">xb::xbFile</a></li>
+<li>GetFileNamePart()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a81422b3dd52763d2cc6c77237ec9af0a">xb::xbFile</a></li>
+<li>GetFileSize()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a50b63c39e49d44e52078038027b24cc5">xb::xbFile</a></li>
+<li>GetFileType()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a5548236d38d43b89ae29b9a015b1f678">xb::xbFile</a></li>
+<li>GetFirstRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#acb78991e8435edd36318c653cb977c1a">xb::xbDbf</a></li>
+<li>GetFloatField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3443f646038ced14425f067a59c0f2da">xb::xbDbf</a></li>
+<li>GetFqFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a31b4e641f93206ba23e2a5a27491dcd4">xb::xbFile</a></li>
+<li>GetFunctionInfo()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#ae52e53340593b4253936c1372ec15ee1">xb::xbXBase</a></li>
+<li>GetLastPos()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#ac7698665f44413a5e99a5b5bc573c6df">xb::xbString</a></li>
+<li>GetLastRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a49e667f9c8ee55c36444702663fc5964">xb::xbDbf</a></li>
+<li>GetLogDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a51d49b4d699740194b28c6ec0d0ee07b">xb::xbXBase</a></li>
+<li>GetLogFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#ac0744edf9e4aa959d8cf2daa874376af">xb::xbXBase</a></li>
+<li>GetLogFqFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#ab5d63cd7d9137eba8a1d4d9c3df522b7">xb::xbXBase</a></li>
+<li>GetLogicalField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3254f091fc4a1404abed3dd2bcdd6ce6">xb::xbDbf</a></li>
+<li>GetLogStatus()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#ade34cd72c2a7e70fb55429a8a6f6c028">xb::xbXBase</a></li>
+<li>GetLongField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#abe525c0820640e0a9e169d0b7913cfa1">xb::xbDbf</a></li>
+<li>GetMultiUser()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">xb::xbSsv</a></li>
+<li>GetNextRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a18fdcb4ab15b36cd47fa6f6f7a540d1a">xb::xbDbf</a></li>
+<li>GetOpenMode()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a3c500dc9dac22c49496e4b29386b2dd3">xb::xbFile</a></li>
+<li>GetOpenTableCount()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#ad0d2d4adabc0dc0e761cfdee63c84069">xb::xbTblMgr</a></li>
+<li>GetPathSeparator()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#af8b8b808cf43cd352321b43f500142db">xb::xbString</a></li>
+<li>GetPhysicalIxCnt()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a13393704a8a191d4d6555ae31d3c3e92">xb::xbDbf</a></li>
+<li>GetPrevRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab3d248e5221b4f0809897cd43af17a1e">xb::xbDbf</a></li>
+<li>GetRawField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#aabd146c0e1054ab905ec96aedd84b02e">xb::xbDbf</a></li>
+<li>GetRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a26fba086b07caeab95066bf1c8d25161">xb::xbDbf</a></li>
+<li>GetRecordBuf()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#aa3e38c4057d726a28a27d07a1610d124">xb::xbDbf</a></li>
+<li>GetRecordCnt()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ac196ad55335e1f4789d698748434dc89">xb::xbDbf</a></li>
+<li>GetRecordLen()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab50d76c6e29e81e347a6feb04c2f62bb">xb::xbDbf</a></li>
+<li>GetShareMode()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a9b63e05b77f477ff6109ff7b9432c1b6">xb::xbFile</a></li>
+<li>GetSize()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a6c33e73659f8e98819289d2661c7271c">xb::xbString</a></li>
+<li>GetTblAlias()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a27758a325c097f204247908b65ba7fbd">xb::xbDbf</a></li>
+<li>GetULongField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a67e3a050f9090edf69eee75aef7f5d83">xb::xbDbf</a></li>
+<li>GetVersion()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a49212a9eb17f7fa9f303e08d5fc50fc6">xb::xbDbf</a></li>
+<li>GetXbaseFileTypeByte()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#aaf2e697751a0beff41432a66bb83fb5e">xb::xbFile</a></li>
+<li>GetXbasePtr()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab21ec23c076b0c9affdc0f6672bd133f">xb::xbDbf</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_h.html b/docs/doxygen/html/functions_func_h.html
new file mode 100644
index 0000000..16e9fbf
--- /dev/null
+++ b/docs/doxygen/html/functions_func_h.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_h" name="index_h"></a>- h -</h3><ul>
+<li>HasAlphaChars()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#aa13f6b72e5a529eab04545892bbc98b4">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_i.html b/docs/doxygen/html/functions_func_i.html
new file mode 100644
index 0000000..91a9531
--- /dev/null
+++ b/docs/doxygen/html/functions_func_i.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_i" name="index_i"></a>- i -</h3><ul>
+<li>InitVars()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ad06fe0f7975fb81125d27d82504e6829">xb::xbDbf</a></li>
+<li>IsEmpty()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a4a255a30d683acd62ea09c1617b53cb3">xb::xbString</a></li>
+<li>IsLeapYear()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#af2bd33a72448e2c5ee00d8b711dc5d95">xb::xbDate</a></li>
+<li>IsNull()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a3fa34fa31bcb7244ecb054ab628ad500">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_j.html b/docs/doxygen/html/functions_func_j.html
new file mode 100644
index 0000000..8624d83
--- /dev/null
+++ b/docs/doxygen/html/functions_func_j.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_j" name="index_j"></a>- j -</h3><ul>
+<li>JulianDays()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a1ee3377d4ead9d31099eee539d9b13a7">xb::xbDate</a></li>
+<li>JulToDate8()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a9d28b2a46d8aaa284b92f44eeb96b2ff">xb::xbDate</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_l.html b/docs/doxygen/html/functions_func_l.html
new file mode 100644
index 0000000..3e81352
--- /dev/null
+++ b/docs/doxygen/html/functions_func_l.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_l" name="index_l"></a>- l -</h3><ul>
+<li>LastDayOfMonth()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a15847866bb7642aa42bc254e0cf2038a">xb::xbDate</a></li>
+<li>Left()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#acdc3a6d6955b99f0a6b1d181fb3098b9">xb::xbString</a></li>
+<li>Len()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a998b240eedac311aea5843047f55649b">xb::xbString</a></li>
+<li>Ltrim()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a90e0d0be4fd0d82dd2ebbe689adf18ee">xb::xbString</a></li>
+<li>Ltrunc()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a656f5854f74064b7257ff96d96dfb68b">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_m.html b/docs/doxygen/html/functions_func_m.html
new file mode 100644
index 0000000..be44b4b
--- /dev/null
+++ b/docs/doxygen/html/functions_func_m.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_m" name="index_m"></a>- m -</h3><ul>
+<li>MemoFieldsExist()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ac856fc1b110b46aefa1b2f5c0f530aa2">xb::xbDbf</a></li>
+<li>Mid()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a0f9eefc836b24c4ee7c5a316c5d812b7">xb::xbString</a></li>
+<li>MonthOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a08bd84c67e1119d8c5c1748cd89d092e">xb::xbDate</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_n.html b/docs/doxygen/html/functions_func_n.html
new file mode 100644
index 0000000..d46a5b1
--- /dev/null
+++ b/docs/doxygen/html/functions_func_n.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_n" name="index_n"></a>- n -</h3><ul>
+<li>NameSuffixMissing()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a361e3cc318bbf1c4d10f069e0800a24e">xb::xbFile</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_o.html b/docs/doxygen/html/functions_func_o.html
new file mode 100644
index 0000000..059327b
--- /dev/null
+++ b/docs/doxygen/html/functions_func_o.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_o" name="index_o"></a>- o -</h3><ul>
+<li>Open()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ac658818bf9b8f8ff7467d8d80495b324">xb::xbDbf</a>, <a class="el" href="classxb_1_1xbXBase.html#aafb1abd6b6124cddf635adaf9f615a4a">xb::xbXBase</a></li>
+<li>OpenHighestVersion()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#aa957eb502ecd076e5df89e7415cb094b">xb::xbXBase</a></li>
+<li>operator const char *()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a545df0ae9590f0ea5844a165e38a6388">xb::xbString</a></li>
+<li>operator!=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ac3aaf8997fc0c36676085e7741f33a8a">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#acf89691607050b0505dc6af28d059c38">xb::xbString</a></li>
+<li>operator+()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ad09609bf78cf038886a4f9cd19423f9c">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#aab556e8c3cb478dd95643327d72a48bd">xb::xbString</a></li>
+<li>operator++()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a1c7d9e3718c43df18b21646072c8605e">xb::xbDate</a></li>
+<li>operator+=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a947ba156d04fe063aaa4c9964ae5d163">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a76a47af239797a266ada6141c150001c">xb::xbString</a></li>
+<li>operator-()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a3f3a8802c96098c85aa8d0e19717a979">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a06abec236b95f6933ba17bf67089f7cf">xb::xbString</a></li>
+<li>operator--()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ae2b33dfee60d324916d833b2098b5a6b">xb::xbDate</a></li>
+<li>operator-=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a4a8f207d759540114373f5e9d6d375f7">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#aa7f4db1b4eae9dfad46346db6e17ea15">xb::xbString</a></li>
+<li>operator&lt;()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a11f09d97ed527e7ef00ba6f17b9fb02c">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a71c7aafa0d523c72cbe58c474be2270a">xb::xbString</a></li>
+<li>operator&lt;=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a6d8fa4df4664f3fd8d4cc15e77f6d046">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a461f245e60cddfdf5f78a972a46e5880">xb::xbString</a></li>
+<li>operator=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a2e33ad9415c32e820e08fd8084198690">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a4f69d11cbd43edf71725a606d0ca8f40">xb::xbString</a></li>
+<li>operator==()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#aaaf98c1a672066021895f0953b6e94d0">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a2df3ed2fc9456214f5fd2fcf77b69bc1">xb::xbString</a></li>
+<li>operator&gt;()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a744031c4031d6ec4595d34acbd1c5860">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#ae46f6a45da5686b607a4edf2786a2fff">xb::xbString</a></li>
+<li>operator&gt;=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a1d81959ea55440588068ea7f82617c99">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a8f16643cb7ba3ee9cf685422c9ea0e67">xb::xbString</a></li>
+<li>operator[]()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#abe45e463226ac8e18550ced18c5a9df3">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_p.html b/docs/doxygen/html/functions_func_p.html
new file mode 100644
index 0000000..06b46c1
--- /dev/null
+++ b/docs/doxygen/html/functions_func_p.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_p" name="index_p"></a>- p -</h3><ul>
+<li>Pack()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a93bb14ad0451355bfa3379128120988a">xb::xbDbf</a></li>
+<li>PadLeft()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a6a09cfed22066b0c72432f26960f9e7b">xb::xbString</a></li>
+<li>PadRight()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#aba13f0c77eb6c4a22996039569fad284">xb::xbString</a></li>
+<li>Pos()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a3baf59d15099589ff631995f129e582b">xb::xbString</a></li>
+<li>PutAt()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a1bae6fa8f608261f6e889616482f6e39">xb::xbString</a></li>
+<li>PutDateField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a873f04af528a9d81e6a367a59d998ec5">xb::xbDbf</a></li>
+<li>PutDoubleField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4f34842d7e8ff1f16992c2ece2fc38a5">xb::xbDbf</a></li>
+<li>PutField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a142b0c0dc904917f3c68c5572c1237b5">xb::xbDbf</a></li>
+<li>PutFloatField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a64161eb50d72e424b11bf3732657ebd8">xb::xbDbf</a></li>
+<li>PutLogicalField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab39ac4269ac63bc7ea4f638733bb17f0">xb::xbDbf</a></li>
+<li>PutLongField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a56c8f924284bf88aabf90b7930b4eb47">xb::xbDbf</a></li>
+<li>PutRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3c36a5ffbc7067a1abbcb526dd3b981d">xb::xbDbf</a></li>
+<li>PutULongField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#af5dec5c9ff903efffdb0490a44d296d2">xb::xbDbf</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_r.html b/docs/doxygen/html/functions_func_r.html
new file mode 100644
index 0000000..59a8512
--- /dev/null
+++ b/docs/doxygen/html/functions_func_r.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_r" name="index_r"></a>- r -</h3><ul>
+<li>ReadBlock()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#aa1bb80340abc7a5c22f87f878e9dc825">xb::xbFile</a></li>
+<li>ReadHeader()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a060541addb5bb1f0fe12959ed6f66fb9">xb::xbDbf</a></li>
+<li>RecordDeleted()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a94d7d626ba691fd4b740c034673e6fc6">xb::xbDbf</a></li>
+<li>Remove()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#afaac65eaa6d9ef1596d6a0e7b91ed0f2">xb::xbString</a></li>
+<li>RemoveTblFromTblList()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#ac8eaef41acf08911b90f900aac8e70af">xb::xbTblMgr</a></li>
+<li>Resize()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#aa6d346ab04e5bb8852f0bb996163a35e">xb::xbString</a></li>
+<li>Rtrim()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#aaf330188d67c347ecae0d16f65b22077">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_s.html b/docs/doxygen/html/functions_func_s.html
new file mode 100644
index 0000000..2068078
--- /dev/null
+++ b/docs/doxygen/html/functions_func_s.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_s" name="index_s"></a>- s -</h3><ul>
+<li>Set()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a4b0cde152b5de0f7d26608d1445110b6">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#ab85753d2c39882e946a8468cbb587700">xb::xbString</a></li>
+<li>SetAutoCommit()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4cf7f0d423164f3cf074ae41f96f4e90">xb::xbDbf</a></li>
+<li>SetBlockSize()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a991c5676a6f38fa752435390989f413e">xb::xbFile</a></li>
+<li>SetDataDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">xb::xbSsv</a></li>
+<li>SetDefaultAutoCommit()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">xb::xbSsv</a></li>
+<li>SetDefaultDateFormat()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">xb::xbSsv</a></li>
+<li>SetDefaultLogDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a84343b8645790791512d6bc22ee6c8eb">xb::xbSsv</a></li>
+<li>SetDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ae78a85255488bc78964c16946dbaead3">xb::xbFile</a></li>
+<li>SetEndianType()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">xb::xbSsv</a></li>
+<li>SetFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a5419eb27e56822f828b2b88a9502a636">xb::xbFile</a></li>
+<li>SetFqFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#aee832fa11db2077a532f49e1329bd05a">xb::xbFile</a></li>
+<li>SetLogDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a48d82dbe298c6f4cf68a63ac82dd8292">xb::xbXBase</a></li>
+<li>SetLogFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a94010b88a309315ef980715eb581336c">xb::xbXBase</a></li>
+<li>SetLogSize()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a666a0cb5b76ec7a9a3677d339e0c6b42">xb::xbXBase</a></li>
+<li>SetMultiUser()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">xb::xbSsv</a></li>
+<li>SetNum()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a3af5b1f111f94b0667551fcbd1d97abd">xb::xbString</a></li>
+<li>SetVersion()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a7e63e852418f337eb7c44de5dcd50323">xb::xbDbf</a></li>
+<li>Sprintf()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a9e9bfa29d86377b915f1628aeb0e9195">xb::xbString</a></li>
+<li>Str()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ab43a5d8d929767c0ffdd722972bb8cc0">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a6715f4c0010f3ab487c9d787838a29b3">xb::xbString</a></li>
+<li>strncpy()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a3bc9e856c34f0c240a6e36e5b6e3ea7b">xb::xbString</a></li>
+<li>SwapChars()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a054683872e1f05d11c2cf8683a63a6fe">xb::xbString</a></li>
+<li>Sysdate()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a40ba54a58d64cf56266f020f91584192">xb::xbDate</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_t.html b/docs/doxygen/html/functions_func_t.html
new file mode 100644
index 0000000..f711fd7
--- /dev/null
+++ b/docs/doxygen/html/functions_func_t.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_t" name="index_t"></a>- t -</h3><ul>
+<li>ToLowerCase()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a602cac1a6ef3f6b52f587ac4c0ef4fb2">xb::xbString</a></li>
+<li>ToUpperCase()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a68001d0a44e6b4fe61e29a4e41ded9d4">xb::xbString</a></li>
+<li>Trim()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#abc9bd33687d4e03ca52d77885721d626">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_u.html b/docs/doxygen/html/functions_func_u.html
new file mode 100644
index 0000000..d607254
--- /dev/null
+++ b/docs/doxygen/html/functions_func_u.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_u" name="index_u"></a>- u -</h3><ul>
+<li>UndeleteAllRecords()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ae94cb1bf9f75184f39d9e1a80ab49d4a">xb::xbDbf</a></li>
+<li>UndeleteRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a255681976a04fc722538bb630507b3a0">xb::xbDbf</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_v.html b/docs/doxygen/html/functions_func_v.html
new file mode 100644
index 0000000..5be4554
--- /dev/null
+++ b/docs/doxygen/html/functions_func_v.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_v" name="index_v"></a>- v -</h3><ul>
+<li>ValidateSchema()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#aba5dcac3b4092261bc1669740cdd669d">xb::xbDbf</a></li>
+<li>ValidLogicalValue()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a72b16c15fd8822efaa5f158c34df7b1e">xb::xbString</a></li>
+<li>ValidNumericValue()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#aeed920d2a25111f776ddde2d530eb81b">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_w.html b/docs/doxygen/html/functions_func_w.html
new file mode 100644
index 0000000..05f56b1
--- /dev/null
+++ b/docs/doxygen/html/functions_func_w.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_w" name="index_w"></a>- w -</h3><ul>
+<li>WriteBlock()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a5d871dcfecc2b4338f7a13722aab766c">xb::xbFile</a></li>
+<li>WriteHeader()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a44e1410109ef7b3d11a6af4b704b62b2">xb::xbDbf</a></li>
+<li>WriteLogBytes()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a0dff00b9ee3c288841e137ca01168116">xb::xbXBase</a></li>
+<li>WriteLogMessage()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a9ca5be73abffd0fdd18bdc799877272a">xb::xbXBase</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_x.html b/docs/doxygen/html/functions_func_x.html
new file mode 100644
index 0000000..b5fe61e
--- /dev/null
+++ b/docs/doxygen/html/functions_func_x.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_x" name="index_x"></a>- x -</h3><ul>
+<li>xbDate()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ac8a4d9330221a3daee21b3c28c1d9719">xb::xbDate</a></li>
+<li>xbDbf()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a84a75f80bc0e9b8a22b728767949c204">xb::xbDbf</a></li>
+<li>xbFclose()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a18830b5755d74818f60d9c7ce38ddf2d">xb::xbFile</a></li>
+<li>xbFeof()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#af5b6356832d2a67212070a1aa605f170">xb::xbFile</a></li>
+<li>xbFflush()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ad205184d43409f04216540ae22f15009">xb::xbFile</a></li>
+<li>xbFgetc()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#afb1c584d2895ffb7834df80aea7eb1e4">xb::xbFile</a></li>
+<li>xbFgets()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ad245955ace26e5dde85fd4373b30d026">xb::xbFile</a></li>
+<li>xbFile()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a869eedd74c6eddc308852eb546c87176">xb::xbFile</a></li>
+<li>xbFopen()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a7cdfef5ede9ac98d44a28a6b7a70972c">xb::xbFile</a></li>
+<li>xbFputc()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#af2e940c78956e5cb6824f9a1bc404896">xb::xbFile</a></li>
+<li>xbFputs()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a698f3b40216778562e639e6ca1a47573">xb::xbFile</a></li>
+<li>xbFread()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ab4f6afaa1f77539f27a4f05c26e54e2f">xb::xbFile</a></li>
+<li>xbFseek()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a5337ab8918df240910c0d19b4f298e3d">xb::xbFile</a></li>
+<li>xbFtell()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a0e1c06aedfa7fbcb92e117f891edd13b">xb::xbFile</a></li>
+<li>xbFTurnOffFileBuffering()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a9891b792f585a696f38a5cf959e30918">xb::xbFile</a></li>
+<li>xbFwrite()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a6aadd871d1782944703fed773d44b85f">xb::xbFile</a></li>
+<li>xbMemcmp()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a1b239c021358476382942522911b5c66">xb::xbXBase</a></li>
+<li>xbReadUntil()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a08463f506f425c2385acbe1a561506e9">xb::xbFile</a></li>
+<li>xbRemove()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a6d919366c2ec95e529906bf8842cbf07">xb::xbFile</a></li>
+<li>xbRename()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#afc8ce113aa72611a278233f9bb170012">xb::xbFile</a></li>
+<li>xbRewind()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a7996b6e084665c37c3892faea64b3505">xb::xbFile</a></li>
+<li>xbSleep()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a0915aff7be4b2dd3e881f3c5d0da4baf">xb::xbXBase</a></li>
+<li>xbSsv()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a58f85692c3167af20b1a7c17c621523b">xb::xbSsv</a></li>
+<li>xbString()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a63f9313217e0ff3c9789ec59316216a1">xb::xbString</a></li>
+<li>xbTblMgr()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#aad83f5ecc184ca6cbdfc6f356b598d6c">xb::xbTblMgr</a></li>
+<li>xbTruncate()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a518bfcbfa3699d883cf89affee383296">xb::xbFile</a></li>
+<li>xbXBase()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a6c68588e33946fb5416af3f86fe83224">xb::xbXBase</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_y.html b/docs/doxygen/html/functions_func_y.html
new file mode 100644
index 0000000..7da0e45
--- /dev/null
+++ b/docs/doxygen/html/functions_func_y.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_y" name="index_y"></a>- y -</h3><ul>
+<li>YearOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a31057dfaa36389a16e40e3db82c46262">xb::xbDate</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_z.html b/docs/doxygen/html/functions_func_z.html
new file mode 100644
index 0000000..93817cc
--- /dev/null
+++ b/docs/doxygen/html/functions_func_z.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_z" name="index_z"></a>- z -</h3><ul>
+<li>Zap()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a8ed0693b10b95aaa4e46037758d160ed">xb::xbDbf</a></li>
+<li>ZapChar()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a2fd30956a26a260d1ef6fdbe73dd93f9">xb::xbString</a></li>
+<li>ZapLeadingChar()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#addc3a470f6cd85d4c21bf9da38cf5ac9">xb::xbString</a></li>
+<li>ZapTrailingChar()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#afe3415bfa2e1089b792aeda0462fb99e">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_func_~.html b/docs/doxygen/html/functions_func_~.html
new file mode 100644
index 0000000..27db43a
--- /dev/null
+++ b/docs/doxygen/html/functions_func_~.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index__7E" name="index__7E"></a>- ~ -</h3><ul>
+<li>~xbDate()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a05c9680c6eb9fe07ecf13a189b596c37">xb::xbDate</a></li>
+<li>~xbDbf()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a7eb87521fba8a939c613056d9918d880">xb::xbDbf</a></li>
+<li>~xbFile()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a491f6c48076e89da2e791a42b2727a90">xb::xbFile</a></li>
+<li>~xbString()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a10a6549efab02bc76ab33b15916b1eb1">xb::xbString</a></li>
+<li>~xbTblMgr()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#aad6be32d7b3378c71d47fa27ebfe6cbf">xb::xbTblMgr</a></li>
+<li>~xbXBase()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a204f8634894ac2066d3209117803306d">xb::xbXBase</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_g.html b/docs/doxygen/html/functions_g.html
new file mode 100644
index 0000000..0315594
--- /dev/null
+++ b/docs/doxygen/html/functions_g.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_g" name="index_g"></a>- g -</h3><ul>
+<li>GetAutoCommit()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ae0c00226fd2ea7a67f101e795467ed68">xb::xbDbf</a></li>
+<li>GetBlockSize()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a638e14262410a1627819f016a16cdce2">xb::xbFile</a></li>
+<li>GetCharacter()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a685187a5f8401b322fc61f3fbe56330d">xb::xbString</a></li>
+<li>GetCurRecNo()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a643a80a3792a52760c8e09ba18719503">xb::xbDbf</a></li>
+<li>GetDataDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9">xb::xbSsv</a></li>
+<li>GetDateField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#af78ef1fba949463ff7f829d3cffc4555">xb::xbDbf</a></li>
+<li>GetDbfPtr()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#ad8a5d28a2ee6720a9aa74bcb45662cf5">xb::xbTblMgr</a></li>
+<li>GetDbfStatus()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ac1110d867ba297a52c8b0e83e88f05e6">xb::xbDbf</a></li>
+<li>GetDefaultAutoCommit()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5">xb::xbSsv</a></li>
+<li>GetDefaultDateFormat()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2">xb::xbSsv</a></li>
+<li>GetDefaultLogDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#abf3763faf6a8917a963213cd53af529c">xb::xbSsv</a></li>
+<li>GetDefaultLogFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a43878d4dc041f2a5e2398a118ccfaf79">xb::xbSsv</a></li>
+<li>GetDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#acd0fb2166b2bff7e8a1cf65a7bc8be1e">xb::xbFile</a></li>
+<li>GetDoubleField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4556041a7ff2f6b6f986729901c11f08">xb::xbDbf</a></li>
+<li>GetEndianType()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243">xb::xbSsv</a></li>
+<li>GetErrorMessage()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4">xb::xbSsv</a></li>
+<li>GetField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a9a0fcf7e2040ab483e3807927833cb26">xb::xbDbf</a></li>
+<li>GetFieldCnt()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#add27d8ef555a13b336b8c804165dc15e">xb::xbDbf</a></li>
+<li>GetFieldDecimal()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#abcb4defad2e1b6e67f63cc60737ad840">xb::xbDbf</a></li>
+<li>GetFieldLen()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#adda4302b58cc6109b048f19d9b68bbd4">xb::xbDbf</a></li>
+<li>GetFieldName()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a5e3e4368bfba1724c016b8859023e34c">xb::xbDbf</a></li>
+<li>GetFieldNo()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#aed9113b5095c6df1b9c854cbd0d8047b">xb::xbDbf</a></li>
+<li>GetFieldType()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a181db879f1a75f93a34c03513a0b2fea">xb::xbDbf</a></li>
+<li>GetFileDirPart()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a60c53998e3d1b694134b20a87bc9bf5a">xb::xbFile</a></li>
+<li>GetFileExtPart()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a57a9222e5cbb51019d4eeb2c3ac89fa2">xb::xbFile</a></li>
+<li>GetFileMtime()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a02df78f4c90313243f508fc56b95aba8">xb::xbFile</a></li>
+<li>GetFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ac95cb882ccbcdedc9a233c6ad9fed07a">xb::xbFile</a></li>
+<li>GetFileNamePart()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a81422b3dd52763d2cc6c77237ec9af0a">xb::xbFile</a></li>
+<li>GetFileSize()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a50b63c39e49d44e52078038027b24cc5">xb::xbFile</a></li>
+<li>GetFileType()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a5548236d38d43b89ae29b9a015b1f678">xb::xbFile</a></li>
+<li>GetFirstRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#acb78991e8435edd36318c653cb977c1a">xb::xbDbf</a></li>
+<li>GetFloatField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3443f646038ced14425f067a59c0f2da">xb::xbDbf</a></li>
+<li>GetFqFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a31b4e641f93206ba23e2a5a27491dcd4">xb::xbFile</a></li>
+<li>GetFunctionInfo()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#ae52e53340593b4253936c1372ec15ee1">xb::xbXBase</a></li>
+<li>GetLastPos()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#ac7698665f44413a5e99a5b5bc573c6df">xb::xbString</a></li>
+<li>GetLastRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a49e667f9c8ee55c36444702663fc5964">xb::xbDbf</a></li>
+<li>GetLogDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a51d49b4d699740194b28c6ec0d0ee07b">xb::xbXBase</a></li>
+<li>GetLogFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#ac0744edf9e4aa959d8cf2daa874376af">xb::xbXBase</a></li>
+<li>GetLogFqFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#ab5d63cd7d9137eba8a1d4d9c3df522b7">xb::xbXBase</a></li>
+<li>GetLogicalField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3254f091fc4a1404abed3dd2bcdd6ce6">xb::xbDbf</a></li>
+<li>GetLogStatus()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#ade34cd72c2a7e70fb55429a8a6f6c028">xb::xbXBase</a></li>
+<li>GetLongField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#abe525c0820640e0a9e169d0b7913cfa1">xb::xbDbf</a></li>
+<li>GetMultiUser()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5">xb::xbSsv</a></li>
+<li>GetNextRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a18fdcb4ab15b36cd47fa6f6f7a540d1a">xb::xbDbf</a></li>
+<li>GetOpenMode()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a3c500dc9dac22c49496e4b29386b2dd3">xb::xbFile</a></li>
+<li>GetOpenTableCount()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#ad0d2d4adabc0dc0e761cfdee63c84069">xb::xbTblMgr</a></li>
+<li>GetPathSeparator()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#af8b8b808cf43cd352321b43f500142db">xb::xbString</a></li>
+<li>GetPhysicalIxCnt()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a13393704a8a191d4d6555ae31d3c3e92">xb::xbDbf</a></li>
+<li>GetPrevRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab3d248e5221b4f0809897cd43af17a1e">xb::xbDbf</a></li>
+<li>GetRawField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#aabd146c0e1054ab905ec96aedd84b02e">xb::xbDbf</a></li>
+<li>GetRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a26fba086b07caeab95066bf1c8d25161">xb::xbDbf</a></li>
+<li>GetRecordBuf()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#aa3e38c4057d726a28a27d07a1610d124">xb::xbDbf</a></li>
+<li>GetRecordCnt()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ac196ad55335e1f4789d698748434dc89">xb::xbDbf</a></li>
+<li>GetRecordLen()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab50d76c6e29e81e347a6feb04c2f62bb">xb::xbDbf</a></li>
+<li>GetShareMode()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a9b63e05b77f477ff6109ff7b9432c1b6">xb::xbFile</a></li>
+<li>GetSize()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a6c33e73659f8e98819289d2661c7271c">xb::xbString</a></li>
+<li>GetTblAlias()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a27758a325c097f204247908b65ba7fbd">xb::xbDbf</a></li>
+<li>GetULongField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a67e3a050f9090edf69eee75aef7f5d83">xb::xbDbf</a></li>
+<li>GetVersion()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a49212a9eb17f7fa9f303e08d5fc50fc6">xb::xbDbf</a></li>
+<li>GetXbaseFileTypeByte()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#aaf2e697751a0beff41432a66bb83fb5e">xb::xbFile</a></li>
+<li>GetXbasePtr()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab21ec23c076b0c9affdc0f6672bd133f">xb::xbDbf</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_h.html b/docs/doxygen/html/functions_h.html
new file mode 100644
index 0000000..f8c6626
--- /dev/null
+++ b/docs/doxygen/html/functions_h.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_h" name="index_h"></a>- h -</h3><ul>
+<li>HasAlphaChars()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#aa13f6b72e5a529eab04545892bbc98b4">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_i.html b/docs/doxygen/html/functions_i.html
new file mode 100644
index 0000000..3f935d6
--- /dev/null
+++ b/docs/doxygen/html/functions_i.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_i" name="index_i"></a>- i -</h3><ul>
+<li>iAutoCommit&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab506450954bc86e7bf1d7c4efe681f43">xb::xbDbf</a></li>
+<li>iDbfStatus&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a6d8e193da3ca414eef1e8866ec5ca81b">xb::xbDbf</a></li>
+<li>iEndianType&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3">xb::xbSsv</a></li>
+<li>iFieldLen&#160;:&#160;<a class="el" href="structxb_1_1xbSchema.html#a2da554af25ef628acf59bb52996056ac">xb::xbSchema</a></li>
+<li>iFileVersion&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a15f495446f0d75bcf2fa89e3b699d388">xb::xbDbf</a></li>
+<li>InitVars()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ad06fe0f7975fb81125d27d82504e6829">xb::xbDbf</a></li>
+<li>iNoOfDecs&#160;:&#160;<a class="el" href="structxb_1_1xbSchema.html#a55bab3bb69dee3508d168c93e182d4b9">xb::xbSchema</a></li>
+<li>iNoOfFields&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a5056757614c39f725cc775332494966a">xb::xbDbf</a></li>
+<li>IsEmpty()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a4a255a30d683acd62ea09c1617b53cb3">xb::xbString</a></li>
+<li>IsLeapYear()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#af2bd33a72448e2c5ee00d8b711dc5d95">xb::xbDate</a></li>
+<li>IsNull()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a3fa34fa31bcb7244ecb054ab628ad500">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_j.html b/docs/doxygen/html/functions_j.html
new file mode 100644
index 0000000..7c9cd00
--- /dev/null
+++ b/docs/doxygen/html/functions_j.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_j" name="index_j"></a>- j -</h3><ul>
+<li>JulianDays()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a1ee3377d4ead9d31099eee539d9b13a7">xb::xbDate</a></li>
+<li>JulToDate8()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a9d28b2a46d8aaa284b92f44eeb96b2ff">xb::xbDate</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_l.html b/docs/doxygen/html/functions_l.html
new file mode 100644
index 0000000..778f618
--- /dev/null
+++ b/docs/doxygen/html/functions_l.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_l" name="index_l"></a>- l -</h3><ul>
+<li>LastDayOfMonth()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a15847866bb7642aa42bc254e0cf2038a">xb::xbDate</a></li>
+<li>Left()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#acdc3a6d6955b99f0a6b1d181fb3098b9">xb::xbString</a></li>
+<li>Len()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a998b240eedac311aea5843047f55649b">xb::xbString</a></li>
+<li>Ltrim()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a90e0d0be4fd0d82dd2ebbe689adf18ee">xb::xbString</a></li>
+<li>Ltrunc()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a656f5854f74064b7257ff96d96dfb68b">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_m.html b/docs/doxygen/html/functions_m.html
new file mode 100644
index 0000000..03122f3
--- /dev/null
+++ b/docs/doxygen/html/functions_m.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_m" name="index_m"></a>- m -</h3><ul>
+<li>MemoFieldsExist()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ac856fc1b110b46aefa1b2f5c0f530aa2">xb::xbDbf</a></li>
+<li>Mid()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a0f9eefc836b24c4ee7c5a316c5d812b7">xb::xbString</a></li>
+<li>MonthOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a08bd84c67e1119d8c5c1748cd89d092e">xb::xbDate</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_n.html b/docs/doxygen/html/functions_n.html
new file mode 100644
index 0000000..5cb8df5
--- /dev/null
+++ b/docs/doxygen/html/functions_n.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_n" name="index_n"></a>- n -</h3><ul>
+<li>NameSuffixMissing()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a361e3cc318bbf1c4d10f069e0800a24e">xb::xbFile</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_o.html b/docs/doxygen/html/functions_o.html
new file mode 100644
index 0000000..6c5dcb0
--- /dev/null
+++ b/docs/doxygen/html/functions_o.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_o" name="index_o"></a>- o -</h3><ul>
+<li>Open()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ac658818bf9b8f8ff7467d8d80495b324">xb::xbDbf</a>, <a class="el" href="classxb_1_1xbXBase.html#aafb1abd6b6124cddf635adaf9f615a4a">xb::xbXBase</a></li>
+<li>OpenHighestVersion()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#aa957eb502ecd076e5df89e7415cb094b">xb::xbXBase</a></li>
+<li>operator const char *()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a545df0ae9590f0ea5844a165e38a6388">xb::xbString</a></li>
+<li>operator!=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ac3aaf8997fc0c36676085e7741f33a8a">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#acf89691607050b0505dc6af28d059c38">xb::xbString</a></li>
+<li>operator+()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ad09609bf78cf038886a4f9cd19423f9c">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#aab556e8c3cb478dd95643327d72a48bd">xb::xbString</a></li>
+<li>operator++()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a1c7d9e3718c43df18b21646072c8605e">xb::xbDate</a></li>
+<li>operator+=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a947ba156d04fe063aaa4c9964ae5d163">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a76a47af239797a266ada6141c150001c">xb::xbString</a></li>
+<li>operator-()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a3f3a8802c96098c85aa8d0e19717a979">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a06abec236b95f6933ba17bf67089f7cf">xb::xbString</a></li>
+<li>operator--()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ae2b33dfee60d324916d833b2098b5a6b">xb::xbDate</a></li>
+<li>operator-=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a4a8f207d759540114373f5e9d6d375f7">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#aa7f4db1b4eae9dfad46346db6e17ea15">xb::xbString</a></li>
+<li>operator&lt;()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a11f09d97ed527e7ef00ba6f17b9fb02c">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a71c7aafa0d523c72cbe58c474be2270a">xb::xbString</a></li>
+<li>operator&lt;&lt;&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a3fa915061156521e9dd772a8d7e5f8fb">xb::xbString</a></li>
+<li>operator&lt;=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a6d8fa4df4664f3fd8d4cc15e77f6d046">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a461f245e60cddfdf5f78a972a46e5880">xb::xbString</a></li>
+<li>operator=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a2e33ad9415c32e820e08fd8084198690">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a4f69d11cbd43edf71725a606d0ca8f40">xb::xbString</a></li>
+<li>operator==()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#aaaf98c1a672066021895f0953b6e94d0">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a2df3ed2fc9456214f5fd2fcf77b69bc1">xb::xbString</a></li>
+<li>operator&gt;()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a744031c4031d6ec4595d34acbd1c5860">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#ae46f6a45da5686b607a4edf2786a2fff">xb::xbString</a></li>
+<li>operator&gt;=()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a1d81959ea55440588068ea7f82617c99">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a8f16643cb7ba3ee9cf685422c9ea0e67">xb::xbString</a></li>
+<li>operator[]()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#abe45e463226ac8e18550ced18c5a9df3">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_p.html b/docs/doxygen/html/functions_p.html
new file mode 100644
index 0000000..b86c965
--- /dev/null
+++ b/docs/doxygen/html/functions_p.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_p" name="index_p"></a>- p -</h3><ul>
+<li>Pack()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a93bb14ad0451355bfa3379128120988a">xb::xbDbf</a></li>
+<li>PadLeft()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a6a09cfed22066b0c72432f26960f9e7b">xb::xbString</a></li>
+<li>PadRight()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#aba13f0c77eb6c4a22996039569fad284">xb::xbString</a></li>
+<li>pDbf&#160;:&#160;<a class="el" href="structxb_1_1xbTblList.html#a387d3f6bbf291a1fb96d276ed9bb96b6">xb::xbTblList</a></li>
+<li>pNext&#160;:&#160;<a class="el" href="structxb_1_1xbTblList.html#a3fd169fcf0fd4df927544e5342db583c">xb::xbTblList</a></li>
+<li>Pos()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a3baf59d15099589ff631995f129e582b">xb::xbString</a></li>
+<li>psTblAlias&#160;:&#160;<a class="el" href="structxb_1_1xbTblList.html#ac87742c8a6b1cf2e7e35218e96966a05">xb::xbTblList</a></li>
+<li>psTblName&#160;:&#160;<a class="el" href="structxb_1_1xbTblList.html#a02c3b0c47fd104ef9758b375ecdcfd0f">xb::xbTblList</a></li>
+<li>PutAt()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a1bae6fa8f608261f6e889616482f6e39">xb::xbString</a></li>
+<li>PutDateField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a873f04af528a9d81e6a367a59d998ec5">xb::xbDbf</a></li>
+<li>PutDoubleField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ae695bbc71c19abc71c0c5f2ff2e1f971">xb::xbDbf</a></li>
+<li>PutField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a7862215dd2f83a1c488e539cd1f9aec0">xb::xbDbf</a></li>
+<li>PutFloatField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a64161eb50d72e424b11bf3732657ebd8">xb::xbDbf</a></li>
+<li>PutLogicalField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab39ac4269ac63bc7ea4f638733bb17f0">xb::xbDbf</a></li>
+<li>PutLongField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a56c8f924284bf88aabf90b7930b4eb47">xb::xbDbf</a></li>
+<li>PutRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3c36a5ffbc7067a1abbcb526dd3b981d">xb::xbDbf</a></li>
+<li>PutULongField()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#af5dec5c9ff903efffdb0490a44d296d2">xb::xbDbf</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_r.html b/docs/doxygen/html/functions_r.html
new file mode 100644
index 0000000..f1e81b2
--- /dev/null
+++ b/docs/doxygen/html/functions_r.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_r" name="index_r"></a>- r -</h3><ul>
+<li>ReadBlock()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#aa1bb80340abc7a5c22f87f878e9dc825">xb::xbFile</a></li>
+<li>ReadHeader()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a060541addb5bb1f0fe12959ed6f66fb9">xb::xbDbf</a></li>
+<li>RecBuf&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a8a9b3bce0b741e73473d3ebbd6e6f1cd">xb::xbDbf</a></li>
+<li>RecBuf2&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a353ebfc8a2960ef827f429ec74025606">xb::xbDbf</a></li>
+<li>RecordDeleted()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a94d7d626ba691fd4b740c034673e6fc6">xb::xbDbf</a></li>
+<li>Remove()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#afaac65eaa6d9ef1596d6a0e7b91ed0f2">xb::xbString</a></li>
+<li>RemoveTblFromTblList()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#ac8eaef41acf08911b90f900aac8e70af">xb::xbTblMgr</a></li>
+<li>Resize()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#aa6d346ab04e5bb8852f0bb996163a35e">xb::xbString</a></li>
+<li>Rtrim()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#aaf330188d67c347ecae0d16f65b22077">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_rela.html b/docs/doxygen/html/functions_rela.html
new file mode 100644
index 0000000..332a716
--- /dev/null
+++ b/docs/doxygen/html/functions_rela.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Related Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>operator&lt;&lt;&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a3fa915061156521e9dd772a8d7e5f8fb">xb::xbString</a></li>
+<li>xbBcd&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a86a53ce3efbf910996df0f853f1c0add">xb::xbXBase</a></li>
+<li>xbExp&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a3c3e5617be811d732472fe2cc8fb18cc">xb::xbXBase</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_s.html b/docs/doxygen/html/functions_s.html
new file mode 100644
index 0000000..23c3f57
--- /dev/null
+++ b/docs/doxygen/html/functions_s.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_s" name="index_s"></a>- s -</h3><ul>
+<li>sAlias&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a73f9c792d0a769e2e604c1855245a276">xb::xbDbf</a></li>
+<li>SchemaPtr&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ad8c8b5eb12063bb898da1b2cc02cfce7">xb::xbDbf</a></li>
+<li>Set()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a4b0cde152b5de0f7d26608d1445110b6">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#ab85753d2c39882e946a8468cbb587700">xb::xbString</a></li>
+<li>SetAutoCommit()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4cf7f0d423164f3cf074ae41f96f4e90">xb::xbDbf</a></li>
+<li>SetBlockSize()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a991c5676a6f38fa752435390989f413e">xb::xbFile</a></li>
+<li>SetDataDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c">xb::xbSsv</a></li>
+<li>SetDefaultAutoCommit()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd">xb::xbSsv</a></li>
+<li>SetDefaultDateFormat()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c">xb::xbSsv</a></li>
+<li>SetDefaultLogDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a84343b8645790791512d6bc22ee6c8eb">xb::xbSsv</a></li>
+<li>SetDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ae78a85255488bc78964c16946dbaead3">xb::xbFile</a></li>
+<li>SetEndianType()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108">xb::xbSsv</a></li>
+<li>SetFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a5419eb27e56822f828b2b88a9502a636">xb::xbFile</a></li>
+<li>SetFqFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#aee832fa11db2077a532f49e1329bd05a">xb::xbFile</a></li>
+<li>SetLogDirectory()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a48d82dbe298c6f4cf68a63ac82dd8292">xb::xbXBase</a></li>
+<li>SetLogFileName()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a94010b88a309315ef980715eb581336c">xb::xbXBase</a></li>
+<li>SetLogSize()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a666a0cb5b76ec7a9a3677d339e0c6b42">xb::xbXBase</a></li>
+<li>SetMultiUser()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c">xb::xbSsv</a></li>
+<li>SetNum()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a3af5b1f111f94b0667551fcbd1d97abd">xb::xbString</a></li>
+<li>SetVersion()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a7e63e852418f337eb7c44de5dcd50323">xb::xbDbf</a></li>
+<li>sNullString&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da">xb::xbSsv</a></li>
+<li>Sprintf()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a9e9bfa29d86377b915f1628aeb0e9195">xb::xbString</a></li>
+<li>Str()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ab43a5d8d929767c0ffdd722972bb8cc0">xb::xbDate</a>, <a class="el" href="classxb_1_1xbString.html#a6715f4c0010f3ab487c9d787838a29b3">xb::xbString</a></li>
+<li>strncpy()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a3bc9e856c34f0c240a6e36e5b6e3ea7b">xb::xbString</a></li>
+<li>SwapChars()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a054683872e1f05d11c2cf8683a63a6fe">xb::xbString</a></li>
+<li>Sysdate()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a40ba54a58d64cf56266f020f91584192">xb::xbDate</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_t.html b/docs/doxygen/html/functions_t.html
new file mode 100644
index 0000000..a88f838
--- /dev/null
+++ b/docs/doxygen/html/functions_t.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_t" name="index_t"></a>- t -</h3><ul>
+<li>ToLowerCase()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a602cac1a6ef3f6b52f587ac4c0ef4fb2">xb::xbString</a></li>
+<li>ToUpperCase()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a68001d0a44e6b4fe61e29a4e41ded9d4">xb::xbString</a></li>
+<li>Trim()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#abc9bd33687d4e03ca52d77885721d626">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_u.html b/docs/doxygen/html/functions_u.html
new file mode 100644
index 0000000..90e93a2
--- /dev/null
+++ b/docs/doxygen/html/functions_u.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_u" name="index_u"></a>- u -</h3><ul>
+<li>uiHeaderLen&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a62f5fa9149ae0f6dc75642823de66918">xb::xbDbf</a></li>
+<li>uiRecordLen&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a1760e222567e2c849f9c799b9d896e91">xb::xbDbf</a></li>
+<li>ulCurRec&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#afcd99924606be0a9e1e25180bcd1abf8">xb::xbDbf</a></li>
+<li>ulNoOfRecs&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#acb594ab61dd35b17bdf28394083f8e87">xb::xbDbf</a></li>
+<li>UndeleteAllRecords()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ae94cb1bf9f75184f39d9e1a80ab49d4a">xb::xbDbf</a></li>
+<li>UndeleteRecord()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a255681976a04fc722538bb630507b3a0">xb::xbDbf</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_v.html b/docs/doxygen/html/functions_v.html
new file mode 100644
index 0000000..969ce10
--- /dev/null
+++ b/docs/doxygen/html/functions_v.html
@@ -0,0 +1,79 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_v" name="index_v"></a>- v -</h3><ul>
+<li>ValidateSchema()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#aba5dcac3b4092261bc1669740cdd669d">xb::xbDbf</a></li>
+<li>ValidLogicalValue()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a72b16c15fd8822efaa5f158c34df7b1e">xb::xbString</a></li>
+<li>ValidNumericValue()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#aeed920d2a25111f776ddde2d530eb81b">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_vars.html b/docs/doxygen/html/functions_vars.html
new file mode 100644
index 0000000..36172a1
--- /dev/null
+++ b/docs/doxygen/html/functions_vars.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
+<li>cEncryptionFlag&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a8734e799707582f022fc341d515650f4">xb::xbDbf</a></li>
+<li>cFieldName&#160;:&#160;<a class="el" href="structxb_1_1xbSchema.html#a514183856094123fd37df67885b4681e">xb::xbSchema</a></li>
+<li>cIndexFlag&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ad59074633641e03647e54d2b66c9102b">xb::xbDbf</a></li>
+<li>cLangDriver&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1">xb::xbDbf</a></li>
+<li>cTransactionFlag&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ac3c89fc3bc6a6abf385478a8adbed970">xb::xbDbf</a></li>
+<li>cType&#160;:&#160;<a class="el" href="structxb_1_1xbSchema.html#a1d612b2ed5dc0b0289c9e91b3cda3a25">xb::xbSchema</a></li>
+<li>cUpdateDD&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a6021789d314cd41488991e708fcd0df2">xb::xbDbf</a></li>
+<li>cUpdateMM&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a9340a5e8ee53eb0f3b6601eec2d71e1b">xb::xbDbf</a></li>
+<li>cUpdateYY&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a4fcd6a86ddd32d4a9d76a4074573440a">xb::xbDbf</a></li>
+<li>cVersion&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a3a262abf658e5fa968b57ef457a69470">xb::xbDbf</a></li>
+</ul>
+
+
+<h3><a id="index_e" name="index_e"></a>- e -</h3><ul>
+<li>ErrorCodeText&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e">xb::xbSsv</a></li>
+</ul>
+
+
+<h3><a id="index_i" name="index_i"></a>- i -</h3><ul>
+<li>iAutoCommit&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ab506450954bc86e7bf1d7c4efe681f43">xb::xbDbf</a></li>
+<li>iDbfStatus&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a6d8e193da3ca414eef1e8866ec5ca81b">xb::xbDbf</a></li>
+<li>iEndianType&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3">xb::xbSsv</a></li>
+<li>iFieldLen&#160;:&#160;<a class="el" href="structxb_1_1xbSchema.html#a2da554af25ef628acf59bb52996056ac">xb::xbSchema</a></li>
+<li>iFileVersion&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a15f495446f0d75bcf2fa89e3b699d388">xb::xbDbf</a></li>
+<li>iNoOfDecs&#160;:&#160;<a class="el" href="structxb_1_1xbSchema.html#a55bab3bb69dee3508d168c93e182d4b9">xb::xbSchema</a></li>
+<li>iNoOfFields&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a5056757614c39f725cc775332494966a">xb::xbDbf</a></li>
+</ul>
+
+
+<h3><a id="index_p" name="index_p"></a>- p -</h3><ul>
+<li>pDbf&#160;:&#160;<a class="el" href="structxb_1_1xbTblList.html#a387d3f6bbf291a1fb96d276ed9bb96b6">xb::xbTblList</a></li>
+<li>pNext&#160;:&#160;<a class="el" href="structxb_1_1xbTblList.html#a3fd169fcf0fd4df927544e5342db583c">xb::xbTblList</a></li>
+<li>psTblAlias&#160;:&#160;<a class="el" href="structxb_1_1xbTblList.html#ac87742c8a6b1cf2e7e35218e96966a05">xb::xbTblList</a></li>
+<li>psTblName&#160;:&#160;<a class="el" href="structxb_1_1xbTblList.html#a02c3b0c47fd104ef9758b375ecdcfd0f">xb::xbTblList</a></li>
+</ul>
+
+
+<h3><a id="index_r" name="index_r"></a>- r -</h3><ul>
+<li>RecBuf&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a8a9b3bce0b741e73473d3ebbd6e6f1cd">xb::xbDbf</a></li>
+<li>RecBuf2&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a353ebfc8a2960ef827f429ec74025606">xb::xbDbf</a></li>
+</ul>
+
+
+<h3><a id="index_s" name="index_s"></a>- s -</h3><ul>
+<li>sAlias&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a73f9c792d0a769e2e604c1855245a276">xb::xbDbf</a></li>
+<li>SchemaPtr&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#ad8c8b5eb12063bb898da1b2cc02cfce7">xb::xbDbf</a></li>
+<li>sNullString&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da">xb::xbSsv</a></li>
+</ul>
+
+
+<h3><a id="index_u" name="index_u"></a>- u -</h3><ul>
+<li>uiHeaderLen&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a62f5fa9149ae0f6dc75642823de66918">xb::xbDbf</a></li>
+<li>uiRecordLen&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a1760e222567e2c849f9c799b9d896e91">xb::xbDbf</a></li>
+<li>ulCurRec&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#afcd99924606be0a9e1e25180bcd1abf8">xb::xbDbf</a></li>
+<li>ulNoOfRecs&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#acb594ab61dd35b17bdf28394083f8e87">xb::xbDbf</a></li>
+</ul>
+
+
+<h3><a id="index_x" name="index_x"></a>- x -</h3><ul>
+<li>xbase&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ae39a67ea391b46055d4ca299cb222004">xb::xbFile</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_w.html b/docs/doxygen/html/functions_w.html
new file mode 100644
index 0000000..3d42dbb
--- /dev/null
+++ b/docs/doxygen/html/functions_w.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_w" name="index_w"></a>- w -</h3><ul>
+<li>WriteBlock()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a5d871dcfecc2b4338f7a13722aab766c">xb::xbFile</a></li>
+<li>WriteHeader()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a44e1410109ef7b3d11a6af4b704b62b2">xb::xbDbf</a></li>
+<li>WriteLogBytes()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a0dff00b9ee3c288841e137ca01168116">xb::xbXBase</a></li>
+<li>WriteLogMessage()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a9ca5be73abffd0fdd18bdc799877272a">xb::xbXBase</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_x.html b/docs/doxygen/html/functions_x.html
new file mode 100644
index 0000000..122a118
--- /dev/null
+++ b/docs/doxygen/html/functions_x.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_x" name="index_x"></a>- x -</h3><ul>
+<li>xbase&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ae39a67ea391b46055d4ca299cb222004">xb::xbFile</a></li>
+<li>xbBcd&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a86a53ce3efbf910996df0f853f1c0add">xb::xbXBase</a></li>
+<li>xbDate()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#ac8a4d9330221a3daee21b3c28c1d9719">xb::xbDate</a></li>
+<li>xbDbf()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a84a75f80bc0e9b8a22b728767949c204">xb::xbDbf</a></li>
+<li>xbExp&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a3c3e5617be811d732472fe2cc8fb18cc">xb::xbXBase</a></li>
+<li>xbFclose()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a18830b5755d74818f60d9c7ce38ddf2d">xb::xbFile</a></li>
+<li>xbFeof()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#af5b6356832d2a67212070a1aa605f170">xb::xbFile</a></li>
+<li>xbFflush()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ad205184d43409f04216540ae22f15009">xb::xbFile</a></li>
+<li>xbFgetc()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#afb1c584d2895ffb7834df80aea7eb1e4">xb::xbFile</a></li>
+<li>xbFgets()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ad245955ace26e5dde85fd4373b30d026">xb::xbFile</a></li>
+<li>xbFile()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a869eedd74c6eddc308852eb546c87176">xb::xbFile</a></li>
+<li>xbFopen()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a7cdfef5ede9ac98d44a28a6b7a70972c">xb::xbFile</a></li>
+<li>xbFputc()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#af2e940c78956e5cb6824f9a1bc404896">xb::xbFile</a></li>
+<li>xbFputs()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a698f3b40216778562e639e6ca1a47573">xb::xbFile</a></li>
+<li>xbFread()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#ab4f6afaa1f77539f27a4f05c26e54e2f">xb::xbFile</a></li>
+<li>xbFseek()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a5337ab8918df240910c0d19b4f298e3d">xb::xbFile</a></li>
+<li>xbFtell()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a0e1c06aedfa7fbcb92e117f891edd13b">xb::xbFile</a></li>
+<li>xbFTurnOffFileBuffering()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a9891b792f585a696f38a5cf959e30918">xb::xbFile</a></li>
+<li>xbFwrite()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a6aadd871d1782944703fed773d44b85f">xb::xbFile</a></li>
+<li>xbMemcmp()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a1b239c021358476382942522911b5c66">xb::xbXBase</a></li>
+<li>xbReadUntil()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a08463f506f425c2385acbe1a561506e9">xb::xbFile</a></li>
+<li>xbRemove()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a6d919366c2ec95e529906bf8842cbf07">xb::xbFile</a></li>
+<li>xbRename()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#afc8ce113aa72611a278233f9bb170012">xb::xbFile</a></li>
+<li>xbRewind()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a7996b6e084665c37c3892faea64b3505">xb::xbFile</a></li>
+<li>xbSleep()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a0915aff7be4b2dd3e881f3c5d0da4baf">xb::xbXBase</a></li>
+<li>xbSsv()&#160;:&#160;<a class="el" href="classxb_1_1xbSsv.html#a58f85692c3167af20b1a7c17c621523b">xb::xbSsv</a></li>
+<li>xbString()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a63f9313217e0ff3c9789ec59316216a1">xb::xbString</a></li>
+<li>xbTblMgr()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#aad83f5ecc184ca6cbdfc6f356b598d6c">xb::xbTblMgr</a></li>
+<li>xbTruncate()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a518bfcbfa3699d883cf89affee383296">xb::xbFile</a></li>
+<li>xbXBase()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a6c68588e33946fb5416af3f86fe83224">xb::xbXBase</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_y.html b/docs/doxygen/html/functions_y.html
new file mode 100644
index 0000000..0b6c266
--- /dev/null
+++ b/docs/doxygen/html/functions_y.html
@@ -0,0 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_y" name="index_y"></a>- y -</h3><ul>
+<li>YearOf()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a31057dfaa36389a16e40e3db82c46262">xb::xbDate</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_z.html b/docs/doxygen/html/functions_z.html
new file mode 100644
index 0000000..8ef0a42
--- /dev/null
+++ b/docs/doxygen/html/functions_z.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index_z" name="index_z"></a>- z -</h3><ul>
+<li>Zap()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a8ed0693b10b95aaa4e46037758d160ed">xb::xbDbf</a></li>
+<li>ZapChar()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a2fd30956a26a260d1ef6fdbe73dd93f9">xb::xbString</a></li>
+<li>ZapLeadingChar()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#addc3a470f6cd85d4c21bf9da38cf5ac9">xb::xbString</a></li>
+<li>ZapTrailingChar()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#afe3415bfa2e1089b792aeda0462fb99e">xb::xbString</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/functions_~.html b/docs/doxygen/html/functions_~.html
new file mode 100644
index 0000000..45300d3
--- /dev/null
+++ b/docs/doxygen/html/functions_~.html
@@ -0,0 +1,82 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Data Fields</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
+
+<h3><a id="index__7E" name="index__7E"></a>- ~ -</h3><ul>
+<li>~xbDate()&#160;:&#160;<a class="el" href="classxb_1_1xbDate.html#a05c9680c6eb9fe07ecf13a189b596c37">xb::xbDate</a></li>
+<li>~xbDbf()&#160;:&#160;<a class="el" href="classxb_1_1xbDbf.html#a7eb87521fba8a939c613056d9918d880">xb::xbDbf</a></li>
+<li>~xbFile()&#160;:&#160;<a class="el" href="classxb_1_1xbFile.html#a491f6c48076e89da2e791a42b2727a90">xb::xbFile</a></li>
+<li>~xbString()&#160;:&#160;<a class="el" href="classxb_1_1xbString.html#a10a6549efab02bc76ab33b15916b1eb1">xb::xbString</a></li>
+<li>~xbTblMgr()&#160;:&#160;<a class="el" href="classxb_1_1xbTblMgr.html#aad6be32d7b3378c71d47fa27ebfe6cbf">xb::xbTblMgr</a></li>
+<li>~xbXBase()&#160;:&#160;<a class="el" href="classxb_1_1xbXBase.html#a204f8634894ac2066d3209117803306d">xb::xbXBase</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/globals.html b/docs/doxygen/html/globals.html
new file mode 100644
index 0000000..91cbdf4
--- /dev/null
+++ b/docs/doxygen/html/globals.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
+
+<h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
+<li>ChronTime()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#af990eed1e43605771a5810196b4043f7">tstfuncs.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_d" name="index_d"></a>- d -</h3><ul>
+<li>dblEquals()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#a8b8e417213c57f2ea0bcb61a7fb28860">tstfuncs.cpp</a></li>
+<li>dblMax()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#a69a6e718e066af7f8392e5f1fea40d1b">tstfuncs.cpp</a></li>
+<li>dblMin()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#a4d7b8f3f1ce52c6c0a281f25419f4c93">tstfuncs.cpp</a></li>
+<li>DevTester()&#160;:&#160;<a class="el" href="xb__test__expression_8cpp.html#aee57237c5f5b9b4d80e84bf530eb42bc">xb_test_expression.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_f" name="index_f"></a>- f -</h3><ul>
+<li>FileCompare()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#aa5dbb64c6135ac01f79e5b6087270cf5">tstfuncs.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_g" name="index_g"></a>- g -</h3><ul>
+<li>GetNextSqlCmd()&#160;:&#160;<a class="el" href="xb__execsql_8cpp.html#af888ba5e7e94d92c2165362b87f1ea0e">xb_execsql.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_i" name="index_i"></a>- i -</h3><ul>
+<li>InitTime()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#ab1f17da15e67a8b2460d5a88b7a3db6e">tstfuncs.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_j" name="index_j"></a>- j -</h3><ul>
+<li>JUL_OFFSET&#160;:&#160;<a class="el" href="xbdate_8h.html#a119f32fda399e2ebc2d734012a130e8f">xbdate.h</a></li>
+</ul>
+
+
+<h3><a id="index_l" name="index_l"></a>- l -</h3><ul>
+<li>LK_CLIPPER&#160;:&#160;<a class="el" href="xbdbf_8h.html#a01d6d7910b0da2170eb904a97d864a41">xbdbf.h</a></li>
+<li>LK_DBASE&#160;:&#160;<a class="el" href="xbdbf_8h.html#a4c08d01bd69e295b001bd00a228d8106">xbdbf.h</a></li>
+<li>LK_FOX&#160;:&#160;<a class="el" href="xbdbf_8h.html#a65e29186276222f460a7171803e07adf">xbdbf.h</a></li>
+<li>LK_XBASE64&#160;:&#160;<a class="el" href="xbdbf_8h.html#a42aea0ccd94f7422c8e0d7422dce85a4">xbdbf.h</a></li>
+</ul>
+
+
+<h3><a id="index_m" name="index_m"></a>- m -</h3><ul>
+<li>main()&#160;:&#160;<a class="el" href="xb__dbfutil_8cpp.html#a57e6ea63b6f0a962708db29159629a6d">xb_dbfutil.cpp</a>, <a class="el" href="xb__test__ndx2_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_ndx2.cpp</a>, <a class="el" href="xb__test__sql_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_sql.cpp</a>, <a class="el" href="xb__test__string_8cpp.html#aabf71bc9adb6daf457b2ea8879ae537f">xb_test_string.cpp</a>, <a class="el" href="xb__test__tblmgr_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_tblmgr.cpp</a>, <a class="el" href="xb__test__uda_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_uda.cpp</a>, <a class="el" href="xb__test__xbase_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_xbase.cpp</a>, <a class="el" href="checkndx_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">checkndx.cpp</a>, <a class="el" href="dbfxtrct_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">dbfxtrct.cpp</a>, <a class="el" href="reindex_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">reindex.cpp</a>, <a class="el" href="xb__cfg__check_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_cfg_check.cpp</a>, <a class="el" href="xb__copydbf_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_copydbf.cpp</a>, <a class="el" href="xb__test__ndx_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_ndx.cpp</a>, <a class="el" href="xb__deletall_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_deletall.cpp</a>, <a class="el" href="xb__dumpdbt_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_dumpdbt.cpp</a>, <a class="el" href="xb__dumphdr_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_dumphdr.cpp</a>, <a class="el" href="xb__dumpix_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_dumpix.cpp</a>, <a class="el" href="xb__dumprecs_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_dumprecs.cpp</a>, <a class="el" href="xb__execsql_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_execsql.cpp</a>, <a class="el" href="xb__pack_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_pack.cpp</a>, <a class="el" href="xb__tblinfo_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_tblinfo.cpp</a>, <a class="el" href="xb__undelall_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_undelall.cpp</a>, <a class="el" href="xb__zap_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_zap.cpp</a>, <a class="el" href="xb__test__dbf__v4__nomemos_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_dbf_v4_nomemos.cpp</a>, <a class="el" href="xb__ex__sql_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_ex_sql.cpp</a>, <a class="el" href="xb__ex__string_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_string.cpp</a>, <a class="el" href="xb__ex__v3__create__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_v3_create_dbf.cpp</a>, <a class="el" href="xb__ex__v3__upd__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_v3_upd_dbf.cpp</a>, <a class="el" href="xb__ex__v4__create__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_v4_create_dbf.cpp</a>, <a class="el" href="xb__ex__v4__upd__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_v4_upd_dbf.cpp</a>, <a class="el" href="xb__test__bcd_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_bcd.cpp</a>, <a class="el" href="xb__test__date_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_date.cpp</a>, <a class="el" href="xb__test__dbf__v3__memos_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_dbf_v3_memos.cpp</a>, <a class="el" href="xb__test__dbf__v3__nomemos_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_dbf_v3_nomemos.cpp</a>, <a class="el" href="xb__test__dbf__v4__memos_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_dbf_v4_memos.cpp</a>, <a class="el" href="xb__ex__date_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_date.cpp</a>, <a class="el" href="xb__test__expnode_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_expnode.cpp</a>, <a class="el" href="xb__test__expression_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_expression.cpp</a>, <a class="el" href="xb__test__file_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_file.cpp</a>, <a class="el" href="xb__test__filter_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_filter.cpp</a>, <a class="el" href="xb__test__funcs_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_funcs.cpp</a>, <a class="el" href="xb__test__linklist_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_linklist.cpp</a>, <a class="el" href="xb__test__lock_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_lock.cpp</a>, <a class="el" href="xb__test__lock2_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_lock2.cpp</a>, <a class="el" href="xb__test__log_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_log.cpp</a>, <a class="el" href="xb__test__mdx_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_mdx.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_t" name="index_t"></a>- t -</h3><ul>
+<li>TestMethod()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#a265547b80a3aef5836952bede5288e2c">tstfuncs.cpp</a>, <a class="el" href="xb__test__expression_8cpp.html#ad52c27685018dda7c5c4b26fb445860e">xb_test_expression.cpp</a></li>
+<li>TestTokenMethod()&#160;:&#160;<a class="el" href="xb__test__expression_8cpp.html#a440d64b55abaa9e14e73ecc132d1084d">xb_test_expression.cpp</a></li>
+<li>TestWeight()&#160;:&#160;<a class="el" href="xb__test__expression_8cpp.html#af56b6dbc38e0d23caaf6531526315379">xb_test_expression.cpp</a></li>
+<li>timer&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#ae2281da6157495d69406c35f69a61f9f">tstfuncs.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_u" name="index_u"></a>- u -</h3><ul>
+<li>Usage()&#160;:&#160;<a class="el" href="dbfxtrct_8cpp.html#a5ae07f63d6b390e42068d941038dadf2">dbfxtrct.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_v" name="index_v"></a>- v -</h3><ul>
+<li>VERBOSE&#160;:&#160;<a class="el" href="xb__test__string_8cpp.html#a42f8c497a1968074f38bf5055c650dca">xb_test_string.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_x" name="index_x"></a>- x -</h3><ul>
+<li>XB_ACTIVE_RECS&#160;:&#160;<a class="el" href="xbdbf_8h.html#a1c44bb25bf2e23a3a9d3d2312df0b592">xbdbf.h</a></li>
+<li>XB_ALL_RECS&#160;:&#160;<a class="el" href="xbdbf_8h.html#a8bd17730da3ba5c55a6a07bc482dd0e4">xbdbf.h</a></li>
+<li>XB_ALREADY_OPEN&#160;:&#160;<a class="el" href="xbretcod_8h.html#aa2ff8301503f446c6a5f6510090e520f">xbretcod.h</a></li>
+<li>XB_BOF&#160;:&#160;<a class="el" href="xbretcod_8h.html#ade5f3a7cf1467d12761e4e21b5e4200f">xbretcod.h</a></li>
+<li>XB_CHAR_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#a20f739b9d9dc6a002a246a999e76aeaa">xbdbf.h</a></li>
+<li>XB_CHAREOF&#160;:&#160;<a class="el" href="xbdbf_8h.html#ada1115f596131888c04df61546b198c4">xbdbf.h</a></li>
+<li>XB_CHARHDR&#160;:&#160;<a class="el" href="xbdbf_8h.html#a35d56cac7959c1e5c761684ced3f1e17">xbdbf.h</a></li>
+<li>XB_CLOSE_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#a030684d5541cf6127a76d81b0684b235">xbretcod.h</a></li>
+<li>XB_CLOSED&#160;:&#160;<a class="el" href="xbdbf_8h.html#a843ca4569326dbd1d0647899b0eb512f">xbdbf.h</a></li>
+<li>XB_DATE_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#a7f685e6f5fe804b2174725a27ce73adc">xbdbf.h</a></li>
+<li>XB_DBF_FILE_NOT_OPEN&#160;:&#160;<a class="el" href="xbretcod_8h.html#a8104510b347c87998eadd0b27201e3c2">xbretcod.h</a></li>
+<li>XB_DELETE_FAILED&#160;:&#160;<a class="el" href="xbretcod_8h.html#ada15513935d5ede9216f07c0438f34d2">xbretcod.h</a></li>
+<li>XB_DELETED_RECS&#160;:&#160;<a class="el" href="xbdbf_8h.html#acc0a441854ed92b9d65d1181a97cad43">xbdbf.h</a></li>
+<li>XB_DONTOVERLAY&#160;:&#160;<a class="el" href="xbdbf_8h.html#a7b797840abdb3291373d15978103a778">xbdbf.h</a></li>
+<li>XB_DUP_TABLE_OR_ALIAS&#160;:&#160;<a class="el" href="xbretcod_8h.html#ac18036408d10e5eee1bf76cf92352b95">xbretcod.h</a></li>
+<li>XB_EMPTY&#160;:&#160;<a class="el" href="xbretcod_8h.html#a18068d0cbe0c7a1b4dd3176220180c29">xbretcod.h</a></li>
+<li>XB_EOF&#160;:&#160;<a class="el" href="xbretcod_8h.html#a8b47031e90c3f86306c7058e4490d3b7">xbretcod.h</a></li>
+<li>XB_FILE_EXISTS&#160;:&#160;<a class="el" href="xbretcod_8h.html#a54303a9677dbd5342233f33dd08c64d0">xbretcod.h</a></li>
+<li>XB_FILE_NOT_FOUND&#160;:&#160;<a class="el" href="xbretcod_8h.html#ad090af330c93111d12f6de35dbb065bc">xbretcod.h</a></li>
+<li>XB_FILE_TYPE_NOT_SUPPORTED&#160;:&#160;<a class="el" href="xbretcod_8h.html#ab7b9130a5f1df9975cfeaf6241933596">xbretcod.h</a></li>
+<li>XB_FLOAT_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#a96ab4218d70ab603b4866354ce8c18cd">xbdbf.h</a></li>
+<li>XB_FMT_MONTH&#160;:&#160;<a class="el" href="xbdate_8h.html#aeacf2f7cc897ab5bd64781c0fb52b75d">xbdate.h</a></li>
+<li>XB_FMT_WEEK&#160;:&#160;<a class="el" href="xbdate_8h.html#a8f22704d3fd93fa85dd93b6c699e8178">xbdate.h</a></li>
+<li>XB_FMT_YEAR&#160;:&#160;<a class="el" href="xbdate_8h.html#aa29d78982a9e007874af1c4f4e4d1aa4">xbdate.h</a></li>
+<li>XB_INCOMPATIBLE_OPERANDS&#160;:&#160;<a class="el" href="xbretcod_8h.html#af141ec58b7ca7360e0be6c61d015ea74">xbretcod.h</a></li>
+<li>XB_INCONSISTENT_PARM_LENS&#160;:&#160;<a class="el" href="xbretcod_8h.html#adc4b24bfffa202f8df25409894e547b9">xbretcod.h</a></li>
+<li>XB_INVALID_BLOCK_NO&#160;:&#160;<a class="el" href="xbretcod_8h.html#a4e13b529b486c43ca600ce7d8ddbf3c2">xbretcod.h</a></li>
+<li>XB_INVALID_BLOCK_SIZE&#160;:&#160;<a class="el" href="xbretcod_8h.html#a1bd22921612389c37f6b2eac438c62c5">xbretcod.h</a></li>
+<li>XB_INVALID_DATA&#160;:&#160;<a class="el" href="xbretcod_8h.html#afb40bbed323ecb369dd430a2e1242f9a">xbretcod.h</a></li>
+<li>XB_INVALID_DATE&#160;:&#160;<a class="el" href="xbretcod_8h.html#a702475500357a27b8a34463be3e11925">xbretcod.h</a></li>
+<li>XB_INVALID_EXPRESSION&#160;:&#160;<a class="el" href="xbretcod_8h.html#a54db562c3cae97581812b4fccd52b71a">xbretcod.h</a></li>
+<li>XB_INVALID_FIELD&#160;:&#160;<a class="el" href="xbretcod_8h.html#a34180b2e2bd350ba2ebcdd1335e15d7e">xbretcod.h</a></li>
+<li>XB_INVALID_FIELD_LEN&#160;:&#160;<a class="el" href="xbretcod_8h.html#a7bd322c0efbba17f68ccccd6cf624411">xbretcod.h</a></li>
+<li>XB_INVALID_FIELD_NAME&#160;:&#160;<a class="el" href="xbretcod_8h.html#a59403978784130834cf39434cb73f96e">xbretcod.h</a></li>
+<li>XB_INVALID_FIELD_NO&#160;:&#160;<a class="el" href="xbretcod_8h.html#a09d6c08a44316f551108a74003efd381">xbretcod.h</a></li>
+<li>XB_INVALID_FIELD_TYPE&#160;:&#160;<a class="el" href="xbretcod_8h.html#a79e2588f067d6e236c0e5a2c0728ba9f">xbretcod.h</a></li>
+<li>XB_INVALID_FUNCTION&#160;:&#160;<a class="el" href="xbretcod_8h.html#a2b7e5e440dbcf5e6dc885b24dbe28742">xbretcod.h</a></li>
+<li>XB_INVALID_INDEX&#160;:&#160;<a class="el" href="xbretcod_8h.html#acd175ef0541e2cad424791bd87619dd4">xbretcod.h</a></li>
+<li>XB_INVALID_KEYNO&#160;:&#160;<a class="el" href="xbretcod_8h.html#aec2c0ac2bd62e0329ef130e4fbda39f8">xbretcod.h</a></li>
+<li>XB_INVALID_LOCK_OPTION&#160;:&#160;<a class="el" href="xbretcod_8h.html#ab45735e63c208eb7e6d6df31fd527aec">xbretcod.h</a></li>
+<li>XB_INVALID_MEMO_FIELD&#160;:&#160;<a class="el" href="xbretcod_8h.html#a187c50745f51bfe4aa6f70a92f16c59f">xbretcod.h</a></li>
+<li>XB_INVALID_NODELINK&#160;:&#160;<a class="el" href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">xbretcod.h</a></li>
+<li>XB_INVALID_OBJECT&#160;:&#160;<a class="el" href="xbretcod_8h.html#a418c047353bc683d0fd6ecbbdd5b7885">xbretcod.h</a></li>
+<li>XB_INVALID_OPTION&#160;:&#160;<a class="el" href="xbretcod_8h.html#af1cd0baf346cad686fa4dd11f700012a">xbretcod.h</a></li>
+<li>XB_INVALID_PAGE&#160;:&#160;<a class="el" href="xbretcod_8h.html#ad0aba12b5ae2137f8d6abd28b47f95f0">xbretcod.h</a></li>
+<li>XB_INVALID_PARM&#160;:&#160;<a class="el" href="xbretcod_8h.html#a4cedf96581c9cbc9c14d07494143702d">xbretcod.h</a></li>
+<li>XB_INVALID_RECORD&#160;:&#160;<a class="el" href="xbretcod_8h.html#a0fd212f912b2e62700a66bae95bd73a1">xbretcod.h</a></li>
+<li>XB_INVALID_TABLE_NAME&#160;:&#160;<a class="el" href="xbretcod_8h.html#a53891c95a78483704d2a8e14c4499f92">xbretcod.h</a></li>
+<li>XB_INVALID_TAG&#160;:&#160;<a class="el" href="xbretcod_8h.html#a176d917912d3433f065483f905a4c50a">xbretcod.h</a></li>
+<li>XB_KEY_NOT_UNIQUE&#160;:&#160;<a class="el" href="xbretcod_8h.html#ad60dbb1862c0c1c2dc0464cfbfd93a34">xbretcod.h</a></li>
+<li>XB_LIMIT_REACHED&#160;:&#160;<a class="el" href="xbretcod_8h.html#a59f1a8a6aca19595c2d1804349a24850">xbretcod.h</a></li>
+<li>XB_LOCK&#160;:&#160;<a class="el" href="xbdbf_8h.html#a395a2e101a793bacabf6bc079d178e29">xbdbf.h</a></li>
+<li>XB_LOCK_FAILED&#160;:&#160;<a class="el" href="xbretcod_8h.html#a001e24b39e0f155fb1e892f5b1b9cff1">xbretcod.h</a></li>
+<li>XB_LOGICAL_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#a2f6d5073af761bc1a806a2c7b1c1d886">xbdbf.h</a></li>
+<li>XB_MAX_ERROR_NO&#160;:&#160;<a class="el" href="xbretcod_8h.html#a299419a9c80e000b74bf97a2d24d6a3d">xbretcod.h</a></li>
+<li>XB_MEMO_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#a23fa19b19cb43bd6dcc59a5a3f6c30ad">xbdbf.h</a></li>
+<li>XB_MULTI_USER&#160;:&#160;<a class="el" href="xbfile_8h.html#a05c0fc99ba71cf953d046d12f3f874bc">xbfile.h</a></li>
+<li>XB_NO_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">xbretcod.h</a></li>
+<li>XB_NO_MEMORY&#160;:&#160;<a class="el" href="xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54">xbretcod.h</a></li>
+<li>XB_NOT_FOUND&#160;:&#160;<a class="el" href="xbretcod_8h.html#ac2606659a54111334f5b02861e533700">xbretcod.h</a></li>
+<li>XB_NOT_OPEN&#160;:&#160;<a class="el" href="xbretcod_8h.html#a9474b400f647bdefbbb07e5177e8d7a1">xbretcod.h</a></li>
+<li>XB_NUMERIC_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#ae9fb6d69cc5edc94d36ae403c22ec1c6">xbdbf.h</a></li>
+<li>XB_OPEN&#160;:&#160;<a class="el" href="xbdbf_8h.html#a9a6dafbb07cac744eb14094efa739409">xbdbf.h</a></li>
+<li>XB_OPEN_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#aaab55236993a1d3acb29206252a904c8">xbretcod.h</a></li>
+<li>XB_OVERLAY&#160;:&#160;<a class="el" href="xbdbf_8h.html#a6fe10b307878b4612b04c2c876a4a592">xbdbf.h</a></li>
+<li>XB_PARSE_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#aec713cac2b03a0d536a2d16336ae7c0b">xbretcod.h</a></li>
+<li>XB_READ&#160;:&#160;<a class="el" href="xbfile_8h.html#ae58c73e0ba237fcf67ee20feea6c2743">xbfile.h</a></li>
+<li>XB_READ_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#adbd40585db8bb748d191f94a33bac710">xbretcod.h</a></li>
+<li>XB_READ_WRITE&#160;:&#160;<a class="el" href="xbfile_8h.html#af991a288c327f6857e90156ea734a633">xbfile.h</a></li>
+<li>XB_RENAME_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#a373f30b2efcbbab9f6d060fb3fe8cba3">xbretcod.h</a></li>
+<li>XB_SEEK_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#a0455ad8719e153b08ec68b10c81e9f41">xbretcod.h</a></li>
+<li>XB_SINGLE_USER&#160;:&#160;<a class="el" href="xbfile_8h.html#a9ec4d60a008c667d9861e3b3814f0232">xbfile.h</a></li>
+<li>XB_SYNTAX_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#a5db3a90f215534143bdde81253729c7f">xbretcod.h</a></li>
+<li>XB_TABLE_NOT_LOCKED&#160;:&#160;<a class="el" href="xbretcod_8h.html#af6aaf779fddecca521d785666f6dc56b">xbretcod.h</a></li>
+<li>XB_UNBALANCED_PARENS&#160;:&#160;<a class="el" href="xbretcod_8h.html#aff5646a6b0884ff81004de6961473ea6">xbretcod.h</a></li>
+<li>XB_UNBALANCED_QUOTES&#160;:&#160;<a class="el" href="xbretcod_8h.html#aedfa20a6c4eb9ba3063ba56be8280eac">xbretcod.h</a></li>
+<li>XB_UNLOCK&#160;:&#160;<a class="el" href="xbdbf_8h.html#a21389b73e7b4e7e185fa635b9e354c2e">xbdbf.h</a></li>
+<li>XB_UPDATED&#160;:&#160;<a class="el" href="xbdbf_8h.html#a26e7eeda69f32bc88b08a208ca9e7991">xbdbf.h</a></li>
+<li>XB_WRITE&#160;:&#160;<a class="el" href="xbfile_8h.html#abbf99e259c2f31572c886da6d85b1359">xbfile.h</a></li>
+<li>XB_WRITE_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#aef34ebe6726057f805d6063130280549">xbretcod.h</a></li>
+<li>xbFalse&#160;:&#160;<a class="el" href="xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc">xbtypes.h</a></li>
+<li>xbFileNo&#160;:&#160;<a class="el" href="xbtypes_8h.html#a2c65f692ac861990861575e18f72f6eb">xbtypes.h</a></li>
+<li>xbTrue&#160;:&#160;<a class="el" href="xbtypes_8h.html#ab0ae00665298fe7f5292691cb98ec2d9">xbtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/globals_defs.html b/docs/doxygen/html/globals_defs.html
new file mode 100644
index 0000000..9667a69
--- /dev/null
+++ b/docs/doxygen/html/globals_defs.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_j" name="index_j"></a>- j -</h3><ul>
+<li>JUL_OFFSET&#160;:&#160;<a class="el" href="xbdate_8h.html#a119f32fda399e2ebc2d734012a130e8f">xbdate.h</a></li>
+</ul>
+
+
+<h3><a id="index_l" name="index_l"></a>- l -</h3><ul>
+<li>LK_CLIPPER&#160;:&#160;<a class="el" href="xbdbf_8h.html#a01d6d7910b0da2170eb904a97d864a41">xbdbf.h</a></li>
+<li>LK_DBASE&#160;:&#160;<a class="el" href="xbdbf_8h.html#a4c08d01bd69e295b001bd00a228d8106">xbdbf.h</a></li>
+<li>LK_FOX&#160;:&#160;<a class="el" href="xbdbf_8h.html#a65e29186276222f460a7171803e07adf">xbdbf.h</a></li>
+<li>LK_XBASE64&#160;:&#160;<a class="el" href="xbdbf_8h.html#a42aea0ccd94f7422c8e0d7422dce85a4">xbdbf.h</a></li>
+</ul>
+
+
+<h3><a id="index_v" name="index_v"></a>- v -</h3><ul>
+<li>VERBOSE&#160;:&#160;<a class="el" href="xb__test__string_8cpp.html#a42f8c497a1968074f38bf5055c650dca">xb_test_string.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_x" name="index_x"></a>- x -</h3><ul>
+<li>XB_ACTIVE_RECS&#160;:&#160;<a class="el" href="xbdbf_8h.html#a1c44bb25bf2e23a3a9d3d2312df0b592">xbdbf.h</a></li>
+<li>XB_ALL_RECS&#160;:&#160;<a class="el" href="xbdbf_8h.html#a8bd17730da3ba5c55a6a07bc482dd0e4">xbdbf.h</a></li>
+<li>XB_ALREADY_OPEN&#160;:&#160;<a class="el" href="xbretcod_8h.html#aa2ff8301503f446c6a5f6510090e520f">xbretcod.h</a></li>
+<li>XB_BOF&#160;:&#160;<a class="el" href="xbretcod_8h.html#ade5f3a7cf1467d12761e4e21b5e4200f">xbretcod.h</a></li>
+<li>XB_CHAR_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#a20f739b9d9dc6a002a246a999e76aeaa">xbdbf.h</a></li>
+<li>XB_CHAREOF&#160;:&#160;<a class="el" href="xbdbf_8h.html#ada1115f596131888c04df61546b198c4">xbdbf.h</a></li>
+<li>XB_CHARHDR&#160;:&#160;<a class="el" href="xbdbf_8h.html#a35d56cac7959c1e5c761684ced3f1e17">xbdbf.h</a></li>
+<li>XB_CLOSE_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#a030684d5541cf6127a76d81b0684b235">xbretcod.h</a></li>
+<li>XB_CLOSED&#160;:&#160;<a class="el" href="xbdbf_8h.html#a843ca4569326dbd1d0647899b0eb512f">xbdbf.h</a></li>
+<li>XB_DATE_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#a7f685e6f5fe804b2174725a27ce73adc">xbdbf.h</a></li>
+<li>XB_DBF_FILE_NOT_OPEN&#160;:&#160;<a class="el" href="xbretcod_8h.html#a8104510b347c87998eadd0b27201e3c2">xbretcod.h</a></li>
+<li>XB_DELETE_FAILED&#160;:&#160;<a class="el" href="xbretcod_8h.html#ada15513935d5ede9216f07c0438f34d2">xbretcod.h</a></li>
+<li>XB_DELETED_RECS&#160;:&#160;<a class="el" href="xbdbf_8h.html#acc0a441854ed92b9d65d1181a97cad43">xbdbf.h</a></li>
+<li>XB_DONTOVERLAY&#160;:&#160;<a class="el" href="xbdbf_8h.html#a7b797840abdb3291373d15978103a778">xbdbf.h</a></li>
+<li>XB_DUP_TABLE_OR_ALIAS&#160;:&#160;<a class="el" href="xbretcod_8h.html#ac18036408d10e5eee1bf76cf92352b95">xbretcod.h</a></li>
+<li>XB_EMPTY&#160;:&#160;<a class="el" href="xbretcod_8h.html#a18068d0cbe0c7a1b4dd3176220180c29">xbretcod.h</a></li>
+<li>XB_EOF&#160;:&#160;<a class="el" href="xbretcod_8h.html#a8b47031e90c3f86306c7058e4490d3b7">xbretcod.h</a></li>
+<li>XB_FILE_EXISTS&#160;:&#160;<a class="el" href="xbretcod_8h.html#a54303a9677dbd5342233f33dd08c64d0">xbretcod.h</a></li>
+<li>XB_FILE_NOT_FOUND&#160;:&#160;<a class="el" href="xbretcod_8h.html#ad090af330c93111d12f6de35dbb065bc">xbretcod.h</a></li>
+<li>XB_FILE_TYPE_NOT_SUPPORTED&#160;:&#160;<a class="el" href="xbretcod_8h.html#ab7b9130a5f1df9975cfeaf6241933596">xbretcod.h</a></li>
+<li>XB_FLOAT_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#a96ab4218d70ab603b4866354ce8c18cd">xbdbf.h</a></li>
+<li>XB_FMT_MONTH&#160;:&#160;<a class="el" href="xbdate_8h.html#aeacf2f7cc897ab5bd64781c0fb52b75d">xbdate.h</a></li>
+<li>XB_FMT_WEEK&#160;:&#160;<a class="el" href="xbdate_8h.html#a8f22704d3fd93fa85dd93b6c699e8178">xbdate.h</a></li>
+<li>XB_FMT_YEAR&#160;:&#160;<a class="el" href="xbdate_8h.html#aa29d78982a9e007874af1c4f4e4d1aa4">xbdate.h</a></li>
+<li>XB_INCOMPATIBLE_OPERANDS&#160;:&#160;<a class="el" href="xbretcod_8h.html#af141ec58b7ca7360e0be6c61d015ea74">xbretcod.h</a></li>
+<li>XB_INCONSISTENT_PARM_LENS&#160;:&#160;<a class="el" href="xbretcod_8h.html#adc4b24bfffa202f8df25409894e547b9">xbretcod.h</a></li>
+<li>XB_INVALID_BLOCK_NO&#160;:&#160;<a class="el" href="xbretcod_8h.html#a4e13b529b486c43ca600ce7d8ddbf3c2">xbretcod.h</a></li>
+<li>XB_INVALID_BLOCK_SIZE&#160;:&#160;<a class="el" href="xbretcod_8h.html#a1bd22921612389c37f6b2eac438c62c5">xbretcod.h</a></li>
+<li>XB_INVALID_DATA&#160;:&#160;<a class="el" href="xbretcod_8h.html#afb40bbed323ecb369dd430a2e1242f9a">xbretcod.h</a></li>
+<li>XB_INVALID_DATE&#160;:&#160;<a class="el" href="xbretcod_8h.html#a702475500357a27b8a34463be3e11925">xbretcod.h</a></li>
+<li>XB_INVALID_EXPRESSION&#160;:&#160;<a class="el" href="xbretcod_8h.html#a54db562c3cae97581812b4fccd52b71a">xbretcod.h</a></li>
+<li>XB_INVALID_FIELD&#160;:&#160;<a class="el" href="xbretcod_8h.html#a34180b2e2bd350ba2ebcdd1335e15d7e">xbretcod.h</a></li>
+<li>XB_INVALID_FIELD_LEN&#160;:&#160;<a class="el" href="xbretcod_8h.html#a7bd322c0efbba17f68ccccd6cf624411">xbretcod.h</a></li>
+<li>XB_INVALID_FIELD_NAME&#160;:&#160;<a class="el" href="xbretcod_8h.html#a59403978784130834cf39434cb73f96e">xbretcod.h</a></li>
+<li>XB_INVALID_FIELD_NO&#160;:&#160;<a class="el" href="xbretcod_8h.html#a09d6c08a44316f551108a74003efd381">xbretcod.h</a></li>
+<li>XB_INVALID_FIELD_TYPE&#160;:&#160;<a class="el" href="xbretcod_8h.html#a79e2588f067d6e236c0e5a2c0728ba9f">xbretcod.h</a></li>
+<li>XB_INVALID_FUNCTION&#160;:&#160;<a class="el" href="xbretcod_8h.html#a2b7e5e440dbcf5e6dc885b24dbe28742">xbretcod.h</a></li>
+<li>XB_INVALID_INDEX&#160;:&#160;<a class="el" href="xbretcod_8h.html#acd175ef0541e2cad424791bd87619dd4">xbretcod.h</a></li>
+<li>XB_INVALID_KEYNO&#160;:&#160;<a class="el" href="xbretcod_8h.html#aec2c0ac2bd62e0329ef130e4fbda39f8">xbretcod.h</a></li>
+<li>XB_INVALID_LOCK_OPTION&#160;:&#160;<a class="el" href="xbretcod_8h.html#ab45735e63c208eb7e6d6df31fd527aec">xbretcod.h</a></li>
+<li>XB_INVALID_MEMO_FIELD&#160;:&#160;<a class="el" href="xbretcod_8h.html#a187c50745f51bfe4aa6f70a92f16c59f">xbretcod.h</a></li>
+<li>XB_INVALID_NODELINK&#160;:&#160;<a class="el" href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">xbretcod.h</a></li>
+<li>XB_INVALID_OBJECT&#160;:&#160;<a class="el" href="xbretcod_8h.html#a418c047353bc683d0fd6ecbbdd5b7885">xbretcod.h</a></li>
+<li>XB_INVALID_OPTION&#160;:&#160;<a class="el" href="xbretcod_8h.html#af1cd0baf346cad686fa4dd11f700012a">xbretcod.h</a></li>
+<li>XB_INVALID_PAGE&#160;:&#160;<a class="el" href="xbretcod_8h.html#ad0aba12b5ae2137f8d6abd28b47f95f0">xbretcod.h</a></li>
+<li>XB_INVALID_PARM&#160;:&#160;<a class="el" href="xbretcod_8h.html#a4cedf96581c9cbc9c14d07494143702d">xbretcod.h</a></li>
+<li>XB_INVALID_RECORD&#160;:&#160;<a class="el" href="xbretcod_8h.html#a0fd212f912b2e62700a66bae95bd73a1">xbretcod.h</a></li>
+<li>XB_INVALID_TABLE_NAME&#160;:&#160;<a class="el" href="xbretcod_8h.html#a53891c95a78483704d2a8e14c4499f92">xbretcod.h</a></li>
+<li>XB_INVALID_TAG&#160;:&#160;<a class="el" href="xbretcod_8h.html#a176d917912d3433f065483f905a4c50a">xbretcod.h</a></li>
+<li>XB_KEY_NOT_UNIQUE&#160;:&#160;<a class="el" href="xbretcod_8h.html#ad60dbb1862c0c1c2dc0464cfbfd93a34">xbretcod.h</a></li>
+<li>XB_LIMIT_REACHED&#160;:&#160;<a class="el" href="xbretcod_8h.html#a59f1a8a6aca19595c2d1804349a24850">xbretcod.h</a></li>
+<li>XB_LOCK&#160;:&#160;<a class="el" href="xbdbf_8h.html#a395a2e101a793bacabf6bc079d178e29">xbdbf.h</a></li>
+<li>XB_LOCK_FAILED&#160;:&#160;<a class="el" href="xbretcod_8h.html#a001e24b39e0f155fb1e892f5b1b9cff1">xbretcod.h</a></li>
+<li>XB_LOGICAL_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#a2f6d5073af761bc1a806a2c7b1c1d886">xbdbf.h</a></li>
+<li>XB_MAX_ERROR_NO&#160;:&#160;<a class="el" href="xbretcod_8h.html#a299419a9c80e000b74bf97a2d24d6a3d">xbretcod.h</a></li>
+<li>XB_MEMO_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#a23fa19b19cb43bd6dcc59a5a3f6c30ad">xbdbf.h</a></li>
+<li>XB_MULTI_USER&#160;:&#160;<a class="el" href="xbfile_8h.html#a05c0fc99ba71cf953d046d12f3f874bc">xbfile.h</a></li>
+<li>XB_NO_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">xbretcod.h</a></li>
+<li>XB_NO_MEMORY&#160;:&#160;<a class="el" href="xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54">xbretcod.h</a></li>
+<li>XB_NOT_FOUND&#160;:&#160;<a class="el" href="xbretcod_8h.html#ac2606659a54111334f5b02861e533700">xbretcod.h</a></li>
+<li>XB_NOT_OPEN&#160;:&#160;<a class="el" href="xbretcod_8h.html#a9474b400f647bdefbbb07e5177e8d7a1">xbretcod.h</a></li>
+<li>XB_NUMERIC_FLD&#160;:&#160;<a class="el" href="xbdbf_8h.html#ae9fb6d69cc5edc94d36ae403c22ec1c6">xbdbf.h</a></li>
+<li>XB_OPEN&#160;:&#160;<a class="el" href="xbdbf_8h.html#a9a6dafbb07cac744eb14094efa739409">xbdbf.h</a></li>
+<li>XB_OPEN_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#aaab55236993a1d3acb29206252a904c8">xbretcod.h</a></li>
+<li>XB_OVERLAY&#160;:&#160;<a class="el" href="xbdbf_8h.html#a6fe10b307878b4612b04c2c876a4a592">xbdbf.h</a></li>
+<li>XB_PARSE_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#aec713cac2b03a0d536a2d16336ae7c0b">xbretcod.h</a></li>
+<li>XB_READ&#160;:&#160;<a class="el" href="xbfile_8h.html#ae58c73e0ba237fcf67ee20feea6c2743">xbfile.h</a></li>
+<li>XB_READ_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#adbd40585db8bb748d191f94a33bac710">xbretcod.h</a></li>
+<li>XB_READ_WRITE&#160;:&#160;<a class="el" href="xbfile_8h.html#af991a288c327f6857e90156ea734a633">xbfile.h</a></li>
+<li>XB_RENAME_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#a373f30b2efcbbab9f6d060fb3fe8cba3">xbretcod.h</a></li>
+<li>XB_SEEK_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#a0455ad8719e153b08ec68b10c81e9f41">xbretcod.h</a></li>
+<li>XB_SINGLE_USER&#160;:&#160;<a class="el" href="xbfile_8h.html#a9ec4d60a008c667d9861e3b3814f0232">xbfile.h</a></li>
+<li>XB_SYNTAX_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#a5db3a90f215534143bdde81253729c7f">xbretcod.h</a></li>
+<li>XB_TABLE_NOT_LOCKED&#160;:&#160;<a class="el" href="xbretcod_8h.html#af6aaf779fddecca521d785666f6dc56b">xbretcod.h</a></li>
+<li>XB_UNBALANCED_PARENS&#160;:&#160;<a class="el" href="xbretcod_8h.html#aff5646a6b0884ff81004de6961473ea6">xbretcod.h</a></li>
+<li>XB_UNBALANCED_QUOTES&#160;:&#160;<a class="el" href="xbretcod_8h.html#aedfa20a6c4eb9ba3063ba56be8280eac">xbretcod.h</a></li>
+<li>XB_UNLOCK&#160;:&#160;<a class="el" href="xbdbf_8h.html#a21389b73e7b4e7e185fa635b9e354c2e">xbdbf.h</a></li>
+<li>XB_UPDATED&#160;:&#160;<a class="el" href="xbdbf_8h.html#a26e7eeda69f32bc88b08a208ca9e7991">xbdbf.h</a></li>
+<li>XB_WRITE&#160;:&#160;<a class="el" href="xbfile_8h.html#abbf99e259c2f31572c886da6d85b1359">xbfile.h</a></li>
+<li>XB_WRITE_ERROR&#160;:&#160;<a class="el" href="xbretcod_8h.html#aef34ebe6726057f805d6063130280549">xbretcod.h</a></li>
+<li>xbFalse&#160;:&#160;<a class="el" href="xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc">xbtypes.h</a></li>
+<li>xbFileNo&#160;:&#160;<a class="el" href="xbtypes_8h.html#a2c65f692ac861990861575e18f72f6eb">xbtypes.h</a></li>
+<li>xbTrue&#160;:&#160;<a class="el" href="xbtypes_8h.html#ab0ae00665298fe7f5292691cb98ec2d9">xbtypes.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/globals_func.html b/docs/doxygen/html/globals_func.html
new file mode 100644
index 0000000..3ecaa0b
--- /dev/null
+++ b/docs/doxygen/html/globals_func.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a id="index_c" name="index_c"></a>- c -</h3><ul>
+<li>ChronTime()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#af990eed1e43605771a5810196b4043f7">tstfuncs.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_d" name="index_d"></a>- d -</h3><ul>
+<li>dblEquals()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#a8b8e417213c57f2ea0bcb61a7fb28860">tstfuncs.cpp</a></li>
+<li>dblMax()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#a69a6e718e066af7f8392e5f1fea40d1b">tstfuncs.cpp</a></li>
+<li>dblMin()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#a4d7b8f3f1ce52c6c0a281f25419f4c93">tstfuncs.cpp</a></li>
+<li>DevTester()&#160;:&#160;<a class="el" href="xb__test__expression_8cpp.html#aee57237c5f5b9b4d80e84bf530eb42bc">xb_test_expression.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_f" name="index_f"></a>- f -</h3><ul>
+<li>FileCompare()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#aa5dbb64c6135ac01f79e5b6087270cf5">tstfuncs.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_g" name="index_g"></a>- g -</h3><ul>
+<li>GetNextSqlCmd()&#160;:&#160;<a class="el" href="xb__execsql_8cpp.html#af888ba5e7e94d92c2165362b87f1ea0e">xb_execsql.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_i" name="index_i"></a>- i -</h3><ul>
+<li>InitTime()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#ab1f17da15e67a8b2460d5a88b7a3db6e">tstfuncs.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_m" name="index_m"></a>- m -</h3><ul>
+<li>main()&#160;:&#160;<a class="el" href="xb__dbfutil_8cpp.html#a57e6ea63b6f0a962708db29159629a6d">xb_dbfutil.cpp</a>, <a class="el" href="xb__test__ndx2_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_ndx2.cpp</a>, <a class="el" href="xb__test__sql_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_sql.cpp</a>, <a class="el" href="xb__test__string_8cpp.html#aabf71bc9adb6daf457b2ea8879ae537f">xb_test_string.cpp</a>, <a class="el" href="xb__test__tblmgr_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_tblmgr.cpp</a>, <a class="el" href="xb__test__uda_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_uda.cpp</a>, <a class="el" href="xb__test__xbase_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_xbase.cpp</a>, <a class="el" href="checkndx_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">checkndx.cpp</a>, <a class="el" href="dbfxtrct_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">dbfxtrct.cpp</a>, <a class="el" href="reindex_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">reindex.cpp</a>, <a class="el" href="xb__cfg__check_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_cfg_check.cpp</a>, <a class="el" href="xb__copydbf_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_copydbf.cpp</a>, <a class="el" href="xb__test__ndx_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_ndx.cpp</a>, <a class="el" href="xb__deletall_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_deletall.cpp</a>, <a class="el" href="xb__dumpdbt_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_dumpdbt.cpp</a>, <a class="el" href="xb__dumphdr_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_dumphdr.cpp</a>, <a class="el" href="xb__dumpix_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_dumpix.cpp</a>, <a class="el" href="xb__dumprecs_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_dumprecs.cpp</a>, <a class="el" href="xb__execsql_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_execsql.cpp</a>, <a class="el" href="xb__pack_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_pack.cpp</a>, <a class="el" href="xb__tblinfo_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_tblinfo.cpp</a>, <a class="el" href="xb__undelall_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_undelall.cpp</a>, <a class="el" href="xb__zap_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">xb_zap.cpp</a>, <a class="el" href="xb__test__dbf__v4__nomemos_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_dbf_v4_nomemos.cpp</a>, <a class="el" href="xb__ex__sql_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_ex_sql.cpp</a>, <a class="el" href="xb__ex__string_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_string.cpp</a>, <a class="el" href="xb__ex__v3__create__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_v3_create_dbf.cpp</a>, <a class="el" href="xb__ex__v3__upd__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_v3_upd_dbf.cpp</a>, <a class="el" href="xb__ex__v4__create__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_v4_create_dbf.cpp</a>, <a class="el" href="xb__ex__v4__upd__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_v4_upd_dbf.cpp</a>, <a class="el" href="xb__test__bcd_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_bcd.cpp</a>, <a class="el" href="xb__test__date_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_date.cpp</a>, <a class="el" href="xb__test__dbf__v3__memos_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_dbf_v3_memos.cpp</a>, <a class="el" href="xb__test__dbf__v3__nomemos_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_dbf_v3_nomemos.cpp</a>, <a class="el" href="xb__test__dbf__v4__memos_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_dbf_v4_memos.cpp</a>, <a class="el" href="xb__ex__date_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">xb_ex_date.cpp</a>, <a class="el" href="xb__test__expnode_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_expnode.cpp</a>, <a class="el" href="xb__test__expression_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_expression.cpp</a>, <a class="el" href="xb__test__file_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_file.cpp</a>, <a class="el" href="xb__test__filter_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_filter.cpp</a>, <a class="el" href="xb__test__funcs_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_funcs.cpp</a>, <a class="el" href="xb__test__linklist_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_linklist.cpp</a>, <a class="el" href="xb__test__lock_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_lock.cpp</a>, <a class="el" href="xb__test__lock2_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_lock2.cpp</a>, <a class="el" href="xb__test__log_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_log.cpp</a>, <a class="el" href="xb__test__mdx_8cpp.html#a1470527971db41f828c26074cde7e15a">xb_test_mdx.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_t" name="index_t"></a>- t -</h3><ul>
+<li>TestMethod()&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#a265547b80a3aef5836952bede5288e2c">tstfuncs.cpp</a>, <a class="el" href="xb__test__expression_8cpp.html#ad52c27685018dda7c5c4b26fb445860e">xb_test_expression.cpp</a></li>
+<li>TestTokenMethod()&#160;:&#160;<a class="el" href="xb__test__expression_8cpp.html#a440d64b55abaa9e14e73ecc132d1084d">xb_test_expression.cpp</a></li>
+<li>TestWeight()&#160;:&#160;<a class="el" href="xb__test__expression_8cpp.html#af56b6dbc38e0d23caaf6531526315379">xb_test_expression.cpp</a></li>
+</ul>
+
+
+<h3><a id="index_u" name="index_u"></a>- u -</h3><ul>
+<li>Usage()&#160;:&#160;<a class="el" href="dbfxtrct_8cpp.html#a5ae07f63d6b390e42068d941038dadf2">dbfxtrct.cpp</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/globals_vars.html b/docs/doxygen/html/globals_vars.html
new file mode 100644
index 0000000..568ea5b
--- /dev/null
+++ b/docs/doxygen/html/globals_vars.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Globals</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>timer&#160;:&#160;<a class="el" href="tstfuncs_8cpp.html#ae2281da6157495d69406c35f69a61f9f">tstfuncs.cpp</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/hierarchy.html b/docs/doxygen/html/hierarchy.html
new file mode 100644
index 0000000..0644499
--- /dev/null
+++ b/docs/doxygen/html/hierarchy.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Class Hierarchy</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle"><div class="title">Class Hierarchy</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">This inheritance list is sorted roughly, but not completely, alphabetically:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structxb_1_1xbSchema.html" target="_self">xb::xbSchema</a></td><td class="desc">Schema used for defining tables with CreateTable methods </td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbSsv.html" target="_self">xb::xbSsv</a></td><td class="desc">Class for handling shared system variables </td></tr>
+<tr id="row_1_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbDate.html" target="_self">xb::xbDate</a></td><td class="desc">XbDate class </td></tr>
+<tr id="row_1_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_1_1_" class="arrow" onclick="toggleFolder('1_1_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbFile.html" target="_self">xb::xbFile</a></td><td class="desc">Class for handling low level file I/O </td></tr>
+<tr id="row_1_1_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbDbf.html" target="_self">xb::xbDbf</a></td><td class="desc">Base class for handling dbf files/tables </td></tr>
+<tr id="row_1_2_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_1_2_" class="arrow" onclick="toggleFolder('1_2_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbTblMgr.html" target="_self">xb::xbTblMgr</a></td><td class="desc"></td></tr>
+<tr id="row_1_2_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbXBase.html" target="_self">xb::xbXBase</a></td><td class="desc">XbXbase class </td></tr>
+<tr id="row_2_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbString.html" target="_self">xb::xbString</a></td><td class="desc">Class for handling string data </td></tr>
+<tr id="row_3_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structxb_1_1xbTblList.html" target="_self">xb::xbTblList</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/index.html b/docs/doxygen/html/index.html
new file mode 100644
index 0000000..8fd29ce
--- /dev/null
+++ b/docs/doxygen/html/index.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Main Page</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle"><div class="title">Xbase64 Documentation</div></div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/jquery.js b/docs/doxygen/html/jquery.js
new file mode 100644
index 0000000..c9ed3d9
--- /dev/null
+++ b/docs/doxygen/html/jquery.js
@@ -0,0 +1,35 @@
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery UI - v1.12.1 - 2019-01-27
+* http://jqueryui.com
+* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-1-7.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/resizable.js, widgets/mouse.js
+* Copyright jQuery Foundation and other contributors; Licensed MIT */
+
+(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){function e(t){for(var e=t.css("visibility");"inherit"===e;)t=t.parent(),e=t.css("visibility");return"hidden"!==e}t.ui=t.ui||{},t.ui.version="1.12.1";var i=0,s=Array.prototype.slice;t.cleanData=function(e){return function(i){var s,n,o;for(o=0;null!=(n=i[o]);o++)try{s=t._data(n,"events"),s&&s.remove&&t(n).triggerHandler("remove")}catch(a){}e(i)}}(t.cleanData),t.widget=function(e,i,s){var n,o,a,r={},h=e.split(".")[0];e=e.split(".")[1];var l=h+"-"+e;return s||(s=i,i=t.Widget),t.isArray(s)&&(s=t.extend.apply(null,[{}].concat(s))),t.expr[":"][l.toLowerCase()]=function(e){return!!t.data(e,l)},t[h]=t[h]||{},n=t[h][e],o=t[h][e]=function(t,e){return this._createWidget?(arguments.length&&this._createWidget(t,e),void 0):new o(t,e)},t.extend(o,n,{version:s.version,_proto:t.extend({},s),_childConstructors:[]}),a=new i,a.options=t.widget.extend({},a.options),t.each(s,function(e,s){return t.isFunction(s)?(r[e]=function(){function t(){return i.prototype[e].apply(this,arguments)}function n(t){return i.prototype[e].apply(this,t)}return function(){var e,i=this._super,o=this._superApply;return this._super=t,this._superApply=n,e=s.apply(this,arguments),this._super=i,this._superApply=o,e}}(),void 0):(r[e]=s,void 0)}),o.prototype=t.widget.extend(a,{widgetEventPrefix:n?a.widgetEventPrefix||e:e},r,{constructor:o,namespace:h,widgetName:e,widgetFullName:l}),n?(t.each(n._childConstructors,function(e,i){var s=i.prototype;t.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete n._childConstructors):i._childConstructors.push(o),t.widget.bridge(e,o),o},t.widget.extend=function(e){for(var i,n,o=s.call(arguments,1),a=0,r=o.length;r>a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.width<e.element[0].scrollWidth,o="scroll"===s||"auto"===s&&e.height<e.element[0].scrollHeight;return{width:o?t.position.scrollbarWidth():0,height:n?t.position.scrollbarWidth():0}},getWithinInfo:function(e){var i=t(e||window),s=t.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType,o=!s&&!n;return{element:i,isWindow:s,isDocument:n,offset:o?t(e).offset():{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:i.outerWidth(),height:i.outerHeight()}}},t.fn.position=function(n){if(!n||!n.of)return d.apply(this,arguments);n=t.extend({},n);var u,p,f,m,g,_,v=t(n.of),b=t.position.getWithinInfo(n.within),y=t.position.getScrollInfo(b),w=(n.collision||"flip").split(" "),x={};return _=s(v),v[0].preventDefault&&(n.at="left top"),p=_.width,f=_.height,m=_.offset,g=t.extend({},m),t.each(["my","at"],function(){var t,e,i=(n[this]||"").split(" ");1===i.length&&(i=r.test(i[0])?i.concat(["center"]):h.test(i[0])?["center"].concat(i):["center","center"]),i[0]=r.test(i[0])?i[0]:"center",i[1]=h.test(i[1])?i[1]:"center",t=l.exec(i[0]),e=l.exec(i[1]),x[this]=[t?t[0]:0,e?e[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===w.length&&(w[1]=w[0]),"right"===n.at[0]?g.left+=p:"center"===n.at[0]&&(g.left+=p/2),"bottom"===n.at[1]?g.top+=f:"center"===n.at[1]&&(g.top+=f/2),u=e(x.at,p,f),g.left+=u[0],g.top+=u[1],this.each(function(){var s,r,h=t(this),l=h.outerWidth(),c=h.outerHeight(),d=i(this,"marginLeft"),_=i(this,"marginTop"),k=l+d+i(this,"marginRight")+y.width,C=c+_+i(this,"marginBottom")+y.height,D=t.extend({},g),T=e(x.my,h.outerWidth(),h.outerHeight());"right"===n.my[0]?D.left-=l:"center"===n.my[0]&&(D.left-=l/2),"bottom"===n.my[1]?D.top-=c:"center"===n.my[1]&&(D.top-=c/2),D.left+=T[0],D.top+=T[1],s={marginLeft:d,marginTop:_},t.each(["left","top"],function(e,i){t.ui.position[w[e]]&&t.ui.position[w[e]][i](D,{targetWidth:p,targetHeight:f,elemWidth:l,elemHeight:c,collisionPosition:s,collisionWidth:k,collisionHeight:C,offset:[u[0]+T[0],u[1]+T[1]],my:n.my,at:n.at,within:b,elem:h})}),n.using&&(r=function(t){var e=m.left-D.left,i=e+p-l,s=m.top-D.top,r=s+f-c,u={target:{element:v,left:m.left,top:m.top,width:p,height:f},element:{element:h,left:D.left,top:D.top,width:l,height:c},horizontal:0>i?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("<div>"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidth<t.width,n=this._isNumber(t.height)&&e.maxHeight&&e.maxHeight<t.height,o=this._isNumber(t.width)&&e.minWidth&&e.minWidth>t.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("<div style='overflow:hidden;'></div>"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element
+},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/**
+ * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler
+ * Licensed under MIT
+ * @author Ariel Flesler
+ * @version 2.1.2
+ */
+;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1<b.axis.length;u&&(d/=2);b.offset=h(b.offset);b.over=h(b.over);return this.each(function(){function k(a){var k=$.extend({},b,{queue:!0,duration:d,complete:a&&function(){a.call(q,e,b)}});r.animate(f,k)}if(null!==a){var l=n(this),q=l?this.contentWindow||window:this,r=$(q),e=a,f={},t;switch(typeof e){case "number":case "string":if(/^([+-]=?)?\d+(\.\d+)?(px|%)?$/.test(e)){e= h(e);break}e=l?$(e):$(e,q);case "object":if(e.length===0)return;if(e.is||e.style)t=(e=$(e)).offset()}var v=$.isFunction(b.offset)&&b.offset(q,e)||b.offset;$.each(b.axis.split(""),function(a,c){var d="x"===c?"Left":"Top",m=d.toLowerCase(),g="scroll"+d,h=r[g](),n=p.max(q,c);t?(f[g]=t[m]+(l?0:h-r.offset()[m]),b.margin&&(f[g]-=parseInt(e.css("margin"+d),10)||0,f[g]-=parseInt(e.css("border"+d+"Width"),10)||0),f[g]+=v[m]||0,b.over[m]&&(f[g]+=e["x"===c?"width":"height"]()*b.over[m])):(d=e[m],f[g]=d.slice&& "%"===d.slice(-1)?parseFloat(d)/100*n:d);b.limit&&/^\d+$/.test(f[g])&&(f[g]=0>=f[g]?0:Math.min(f[g],n));!a&&1<b.axis.length&&(h===f[g]?f={}:u&&(k(b.onAfterFirst),f={}))});k(b.onAfter)}})};p.max=function(a,d){var b="x"===d?"Width":"Height",h="scroll"+b;if(!n(a))return a[h]-$(a)[b.toLowerCase()]();var b="client"+b,k=a.ownerDocument||a.document,l=k.documentElement,k=k.body;return Math.max(l[h],k[h])-Math.min(l[b],k[b])};$.Tween.propHooks.scrollLeft=$.Tween.propHooks.scrollTop={get:function(a){return $(a.elem)[a.prop]()}, set:function(a){var d=this.get(a);if(a.options.interrupt&&a._last&&a._last!==d)return $(a.elem).stop();var b=Math.round(a.now);d!==b&&($(a.elem)[a.prop](b),a._last=this.get(a))}};return p});
+/*!
+ PowerTip v1.3.1 (2018-04-15)
+ https://stevenbenner.github.io/jquery-powertip/
+ Copyright (c) 2018 Steven Benner (http://stevenbenner.com/).
+ Released under MIT license.
+ https://raw.github.com/stevenbenner/jquery-powertip/master/LICENSE.txt
+*/
+(function(root,factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else if(typeof module==="object"&&module.exports){module.exports=factory(require("jquery"))}else{factory(root.jQuery)}})(this,function($){var $document=$(document),$window=$(window),$body=$("body");var DATA_DISPLAYCONTROLLER="displayController",DATA_HASACTIVEHOVER="hasActiveHover",DATA_FORCEDOPEN="forcedOpen",DATA_HASMOUSEMOVE="hasMouseMove",DATA_MOUSEONTOTIP="mouseOnToPopup",DATA_ORIGINALTITLE="originalTitle",DATA_POWERTIP="powertip",DATA_POWERTIPJQ="powertipjq",DATA_POWERTIPTARGET="powertiptarget",EVENT_NAMESPACE=".powertip",RAD2DEG=180/Math.PI,MOUSE_EVENTS=["click","dblclick","mousedown","mouseup","mousemove","mouseover","mouseout","mouseenter","mouseleave","contextmenu"];var session={tooltips:null,isTipOpen:false,isFixedTipOpen:false,isClosing:false,tipOpenImminent:false,activeHover:null,currentX:0,currentY:0,previousX:0,previousY:0,desyncTimeout:null,closeDelayTimeout:null,mouseTrackingActive:false,delayInProgress:false,windowWidth:0,windowHeight:0,scrollTop:0,scrollLeft:0};var Collision={none:0,top:1,bottom:2,left:4,right:8};$.fn.powerTip=function(opts,arg){var targetElements=this,options,tipController;if(!targetElements.length){return targetElements}if($.type(opts)==="string"&&$.powerTip[opts]){return $.powerTip[opts].call(targetElements,targetElements,arg)}options=$.extend({},$.fn.powerTip.defaults,opts);tipController=new TooltipController(options);initTracking();targetElements.each(function elementSetup(){var $this=$(this),dataPowertip=$this.data(DATA_POWERTIP),dataElem=$this.data(DATA_POWERTIPJQ),dataTarget=$this.data(DATA_POWERTIPTARGET),title=$this.attr("title");if(!dataPowertip&&!dataTarget&&!dataElem&&title){$this.data(DATA_POWERTIP,title);$this.data(DATA_ORIGINALTITLE,title);$this.removeAttr("title")}$this.data(DATA_DISPLAYCONTROLLER,new DisplayController($this,options,tipController))});if(!options.manual){$.each(options.openEvents,function(idx,evt){if($.inArray(evt,options.closeEvents)>-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference<options.intentSensitivity){cancelClose();closeAnyDelayed();tipController.showTip(element)}else{session.previousX=session.currentX;session.previousY=session.currentY;openTooltip()}}function cancelTimer(stopClose){hoverTimer=clearTimeout(hoverTimer);if(session.closeDelayTimeout&&myCloseDelay===session.closeDelayTimeout||stopClose){cancelClose()}}function cancelClose(){session.closeDelayTimeout=clearTimeout(session.closeDelayTimeout);session.delayInProgress=false}function closeAnyDelayed(){if(session.delayInProgress&&session.activeHover&&!session.activeHover.is(element)){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide(true)}}function repositionTooltip(){tipController.resetPosition(element)}this.show=openTooltip;this.hide=closeTooltip;this.cancel=cancelTimer;this.resetPosition=repositionTooltip}function PlacementCalculator(){function computePlacementCoords(element,placement,tipWidth,tipHeight,offset){var placementBase=placement.split("-")[0],coords=new CSSCoordinates,position;if(isSvgElement(element)){position=getSvgPlacement(element,placementBase)}else{position=getHtmlPlacement(element,placementBase)}switch(placement){case"n":coords.set("left",position.left-tipWidth/2);coords.set("bottom",session.windowHeight-position.top+offset);break;case"e":coords.set("left",position.left+offset);coords.set("top",position.top-tipHeight/2);break;case"s":coords.set("left",position.left-tipWidth/2);coords.set("top",position.top+offset);break;case"w":coords.set("top",position.top-tipHeight/2);coords.set("right",session.windowWidth-position.left+offset);break;case"nw":coords.set("bottom",session.windowHeight-position.top+offset);coords.set("right",session.windowWidth-position.left-20);break;case"nw-alt":coords.set("left",position.left);coords.set("bottom",session.windowHeight-position.top+offset);break;case"ne":coords.set("left",position.left-20);coords.set("bottom",session.windowHeight-position.top+offset);break;case"ne-alt":coords.set("bottom",session.windowHeight-position.top+offset);coords.set("right",session.windowWidth-position.left);break;case"sw":coords.set("top",position.top+offset);coords.set("right",session.windowWidth-position.left-20);break;case"sw-alt":coords.set("left",position.left);coords.set("top",position.top+offset);break;case"se":coords.set("left",position.left-20);coords.set("top",position.top+offset);break;case"se-alt":coords.set("top",position.top+offset);coords.set("right",session.windowWidth-position.left);break}return coords}function getHtmlPlacement(element,placement){var objectOffset=element.offset(),objectWidth=element.outerWidth(),objectHeight=element.outerHeight(),left,top;switch(placement){case"n":left=objectOffset.left+objectWidth/2;top=objectOffset.top;break;case"e":left=objectOffset.left+objectWidth;top=objectOffset.top+objectHeight/2;break;case"s":left=objectOffset.left+objectWidth/2;top=objectOffset.top+objectHeight;break;case"w":left=objectOffset.left;top=objectOffset.top+objectHeight/2;break;case"nw":left=objectOffset.left;top=objectOffset.top;break;case"ne":left=objectOffset.left+objectWidth;top=objectOffset.top;break;case"sw":left=objectOffset.left;top=objectOffset.top+objectHeight;break;case"se":left=objectOffset.left+objectWidth;top=objectOffset.top+objectHeight;break}return{top:top,left:left}}function getSvgPlacement(element,placement){var svgElement=element.closest("svg")[0],domElement=element[0],point=svgElement.createSVGPoint(),boundingBox=domElement.getBBox(),matrix=domElement.getScreenCTM(),halfWidth=boundingBox.width/2,halfHeight=boundingBox.height/2,placements=[],placementKeys=["nw","n","ne","e","se","s","sw","w"],coords,rotation,steps,x;function pushPlacement(){placements.push(point.matrixTransform(matrix))}point.x=boundingBox.x;point.y=boundingBox.y;pushPlacement();point.x+=halfWidth;pushPlacement();point.x+=halfWidth;pushPlacement();point.y+=halfHeight;pushPlacement();point.y+=halfHeight;pushPlacement();point.x-=halfWidth;pushPlacement();point.x-=halfWidth;pushPlacement();point.y-=halfHeight;pushPlacement();if(placements[0].y!==placements[1].y||placements[0].x!==placements[7].x){rotation=Math.atan2(matrix.b,matrix.a)*RAD2DEG;steps=Math.ceil((rotation%360-22.5)/45);if(steps<1){steps+=8}while(steps--){placementKeys.push(placementKeys.shift())}}for(x=0;x<placements.length;x++){if(placementKeys[x]===placement){coords=placements[x];break}}return{top:coords.y+session.scrollTop,left:coords.x+session.scrollLeft}}this.compute=computePlacementCoords}function TooltipController(options){var placementCalculator=new PlacementCalculator,tipElement=$("#"+options.popupId);if(tipElement.length===0){tipElement=$("<div/>",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.top<viewportTop||Math.abs(coords.bottom-session.windowHeight)-elementHeight<viewportTop){collisions|=Collision.top}if(coords.top+elementHeight>viewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.left<viewportLeft||coords.right+elementWidth>viewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right<viewportLeft){collisions|=Collision.right}return collisions}function countFlags(value){var count=0;while(value){value&=value-1;count++}return count}return $.powerTip});/*!
+ * jQuery UI Touch Punch 0.2.3
+ *
+ * Copyright 2011–2014, Dave Furfero
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ * jquery.ui.mouse.js
+ */
+!function(a){function f(a,b){if(!(a.originalEvent.touches.length>1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017
+ * http://www.smartmenus.org/
+ * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("<span/>").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('<div class="sm-jquery-disable-overlay"/>').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('<span class="scroll-up"><span class="scroll-up-arrow"></span></span>')[0],$('<span class="scroll-down"><span class="scroll-down-arrow"></span></span>')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y<o.upEnd)&&a.eq(o.up?1:0).show(),o.y==n)mouse&&a.eq(o.up?0:1).hide(),this.menuScrollStop(t);else if(!e){this.opts.scrollAccelerate&&o.step<this.opts.scrollStep&&(o.step+=.2);var h=this;this.scrollTimeout=requestAnimationFrame(function(){h.menuScroll(t)})}},menuScrollMousewheel:function(t,e){if(this.getClosestMenu(e.target)==t[0]){e=e.originalEvent;var i=(e.wheelDelta||-e.detail)>0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file
diff --git a/docs/doxygen/html/menu.js b/docs/doxygen/html/menu.js
new file mode 100644
index 0000000..54e81cf
--- /dev/null
+++ b/docs/doxygen/html/menu.js
@@ -0,0 +1,127 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ 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.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+ */
+function initMenu(relPath,searchEnabled,serverSide,searchPage,search) {
+ function makeTree(data,relPath) {
+ var result='';
+ if ('children' in data) {
+ result+='<ul>';
+ for (var i in data.children) {
+ result+='<li><a href="'+relPath+data.children[i].url+'">'+
+ data.children[i].text+'</a>'+
+ makeTree(data.children[i],relPath)+'</li>';
+ }
+ result+='</ul>';
+ }
+ return result;
+ }
+ var searchBox;
+ if (searchEnabled) {
+ if (serverSide) {
+ searchBox='<div id="MSearchBox" class="MSearchBoxInactive">'+
+ '<div class="left">'+
+ '<form id="FSearchBox" action="'+relPath+searchPage+
+ '" method="get"><img id="MSearchSelect" src="'+
+ relPath+'search/mag.svg" alt=""/>'+
+ '<input type="text" id="MSearchField" name="query" value="'+search+
+ '" size="20" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)"'+
+ ' onblur="searchBox.OnSearchFieldFocus(false)">'+
+ '</form>'+
+ '</div>'+
+ '<div class="right"></div>'+
+ '</div>';
+ } else {
+ searchBox='<div id="MSearchBox" class="MSearchBoxInactive">'+
+ '<span class="left">'+
+ '<img id="MSearchSelect" src="'+relPath+
+ 'search/mag_sel.svg" onmouseover="return searchBox.OnSearchSelectShow()"'+
+ ' onmouseout="return searchBox.OnSearchSelectHide()" alt=""/>'+
+ '<input type="text" id="MSearchField" value="'+search+
+ '" accesskey="S" onfocus="searchBox.OnSearchFieldFocus(true)" '+
+ 'onblur="searchBox.OnSearchFieldFocus(false)" '+
+ 'onkeyup="searchBox.OnSearchFieldChange(event)"/>'+
+ '</span>'+
+ '<span class="right"><a id="MSearchClose" '+
+ 'href="javascript:searchBox.CloseResultsWindow()">'+
+ '<img id="MSearchCloseImg" border="0" src="'+relPath+
+ 'search/close.svg" alt=""/></a>'
+ '</span>'
+ '</div>';
+ }
+ }
+
+ $('#main-nav').before('<div class="sm sm-dox"><input id="main-menu-state" type="checkbox"/>'+
+ '<label class="main-menu-btn" for="main-menu-state">'+
+ '<span class="main-menu-btn-icon"></span> '+
+ 'Toggle main menu visibility</label>'+
+ '<span id="searchBoxPos1" style="position:absolute;right:8px;top:8px;height:36px;"></span>'+
+ '</div>');
+ $('#main-nav').append(makeTree(menudata,relPath));
+ $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu');
+ if (searchBox) {
+ $('#main-menu').append('<li id="searchBoxPos2" style="float:right"></li>');
+ }
+ var $mainMenuState = $('#main-menu-state');
+ var prevWidth = 0;
+ if ($mainMenuState.length) {
+ function initResizableIfExists() {
+ if (typeof initResizable==='function') initResizable();
+ }
+ // animate mobile menu
+ $mainMenuState.change(function(e) {
+ var $menu = $('#main-menu');
+ var options = { duration: 250, step: initResizableIfExists };
+ if (this.checked) {
+ options['complete'] = function() { $menu.css('display', 'block') };
+ $menu.hide().slideDown(options);
+ } else {
+ options['complete'] = function() { $menu.css('display', 'none') };
+ $menu.show().slideUp(options);
+ }
+ });
+ // set default menu visibility
+ function resetState() {
+ var $menu = $('#main-menu');
+ var $mainMenuState = $('#main-menu-state');
+ var newWidth = $(window).outerWidth();
+ if (newWidth!=prevWidth) {
+ if ($(window).outerWidth()<768) {
+ $mainMenuState.prop('checked',false); $menu.hide();
+ $('#searchBoxPos1').html(searchBox);
+ $('#searchBoxPos2').hide();
+ } else {
+ $menu.show();
+ $('#searchBoxPos1').empty();
+ $('#searchBoxPos2').html(searchBox);
+ $('#searchBoxPos2').show();
+ }
+ prevWidth = newWidth;
+ }
+ }
+ $(window).ready(function() { resetState(); initResizableIfExists(); });
+ $(window).resize(resetState);
+ }
+ $('#main-menu').smartmenus();
+}
+/* @license-end */
diff --git a/docs/doxygen/html/menudata.js b/docs/doxygen/html/menudata.js
new file mode 100644
index 0000000..5c6ed23
--- /dev/null
+++ b/docs/doxygen/html/menudata.js
@@ -0,0 +1,131 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ 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.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+*/
+var menudata={children:[
+{text:"Main Page",url:"index.html"},
+{text:"Namespaces",url:"namespaces.html",children:[
+{text:"Namespace List",url:"namespaces.html"},
+{text:"Namespace Members",url:"namespacemembers.html",children:[
+{text:"All",url:"namespacemembers.html"},
+{text:"Functions",url:"namespacemembers_func.html"},
+{text:"Variables",url:"namespacemembers_vars.html"},
+{text:"Typedefs",url:"namespacemembers_type.html"}]}]},
+{text:"Data Structures",url:"annotated.html",children:[
+{text:"Data Structures",url:"annotated.html"},
+{text:"Data Structure Index",url:"classes.html"},
+{text:"Class Hierarchy",url:"hierarchy.html"},
+{text:"Data Fields",url:"functions.html",children:[
+{text:"All",url:"functions.html",children:[
+{text:"a",url:"functions.html#index_a"},
+{text:"b",url:"functions_b.html#index_b"},
+{text:"c",url:"functions_c.html#index_c"},
+{text:"d",url:"functions_d.html#index_d"},
+{text:"e",url:"functions_e.html#index_e"},
+{text:"f",url:"functions_f.html#index_f"},
+{text:"g",url:"functions_g.html#index_g"},
+{text:"h",url:"functions_h.html#index_h"},
+{text:"i",url:"functions_i.html#index_i"},
+{text:"j",url:"functions_j.html#index_j"},
+{text:"l",url:"functions_l.html#index_l"},
+{text:"m",url:"functions_m.html#index_m"},
+{text:"n",url:"functions_n.html#index_n"},
+{text:"o",url:"functions_o.html#index_o"},
+{text:"p",url:"functions_p.html#index_p"},
+{text:"r",url:"functions_r.html#index_r"},
+{text:"s",url:"functions_s.html#index_s"},
+{text:"t",url:"functions_t.html#index_t"},
+{text:"u",url:"functions_u.html#index_u"},
+{text:"v",url:"functions_v.html#index_v"},
+{text:"w",url:"functions_w.html#index_w"},
+{text:"x",url:"functions_x.html#index_x"},
+{text:"y",url:"functions_y.html#index_y"},
+{text:"z",url:"functions_z.html#index_z"},
+{text:"~",url:"functions_~.html#index__7E"}]},
+{text:"Functions",url:"functions_func.html",children:[
+{text:"a",url:"functions_func.html#index_a"},
+{text:"b",url:"functions_func_b.html#index_b"},
+{text:"c",url:"functions_func_c.html#index_c"},
+{text:"d",url:"functions_func_d.html#index_d"},
+{text:"e",url:"functions_func_e.html#index_e"},
+{text:"f",url:"functions_func_f.html#index_f"},
+{text:"g",url:"functions_func_g.html#index_g"},
+{text:"h",url:"functions_func_h.html#index_h"},
+{text:"i",url:"functions_func_i.html#index_i"},
+{text:"j",url:"functions_func_j.html#index_j"},
+{text:"l",url:"functions_func_l.html#index_l"},
+{text:"m",url:"functions_func_m.html#index_m"},
+{text:"n",url:"functions_func_n.html#index_n"},
+{text:"o",url:"functions_func_o.html#index_o"},
+{text:"p",url:"functions_func_p.html#index_p"},
+{text:"r",url:"functions_func_r.html#index_r"},
+{text:"s",url:"functions_func_s.html#index_s"},
+{text:"t",url:"functions_func_t.html#index_t"},
+{text:"u",url:"functions_func_u.html#index_u"},
+{text:"v",url:"functions_func_v.html#index_v"},
+{text:"w",url:"functions_func_w.html#index_w"},
+{text:"x",url:"functions_func_x.html#index_x"},
+{text:"y",url:"functions_func_y.html#index_y"},
+{text:"z",url:"functions_func_z.html#index_z"},
+{text:"~",url:"functions_func_~.html#index__7E"}]},
+{text:"Variables",url:"functions_vars.html",children:[
+{text:"c",url:"functions_vars.html#index_c"},
+{text:"e",url:"functions_vars.html#index_e"},
+{text:"i",url:"functions_vars.html#index_i"},
+{text:"p",url:"functions_vars.html#index_p"},
+{text:"r",url:"functions_vars.html#index_r"},
+{text:"s",url:"functions_vars.html#index_s"},
+{text:"u",url:"functions_vars.html#index_u"},
+{text:"x",url:"functions_vars.html#index_x"}]},
+{text:"Related Functions",url:"functions_rela.html"}]}]},
+{text:"Files",url:"files.html",children:[
+{text:"File List",url:"files.html"},
+{text:"Globals",url:"globals.html",children:[
+{text:"All",url:"globals.html",children:[
+{text:"c",url:"globals.html#index_c"},
+{text:"d",url:"globals.html#index_d"},
+{text:"f",url:"globals.html#index_f"},
+{text:"g",url:"globals.html#index_g"},
+{text:"i",url:"globals.html#index_i"},
+{text:"j",url:"globals.html#index_j"},
+{text:"l",url:"globals.html#index_l"},
+{text:"m",url:"globals.html#index_m"},
+{text:"t",url:"globals.html#index_t"},
+{text:"u",url:"globals.html#index_u"},
+{text:"v",url:"globals.html#index_v"},
+{text:"x",url:"globals.html#index_x"}]},
+{text:"Functions",url:"globals_func.html",children:[
+{text:"c",url:"globals_func.html#index_c"},
+{text:"d",url:"globals_func.html#index_d"},
+{text:"f",url:"globals_func.html#index_f"},
+{text:"g",url:"globals_func.html#index_g"},
+{text:"i",url:"globals_func.html#index_i"},
+{text:"m",url:"globals_func.html#index_m"},
+{text:"t",url:"globals_func.html#index_t"},
+{text:"u",url:"globals_func.html#index_u"}]},
+{text:"Variables",url:"globals_vars.html"},
+{text:"Macros",url:"globals_defs.html",children:[
+{text:"j",url:"globals_defs.html#index_j"},
+{text:"l",url:"globals_defs.html#index_l"},
+{text:"v",url:"globals_defs.html#index_v"},
+{text:"x",url:"globals_defs.html#index_x"}]}]}]}]}
diff --git a/docs/doxygen/html/namespacemembers.html b/docs/doxygen/html/namespacemembers.html
new file mode 100644
index 0000000..31f72b3
--- /dev/null
+++ b/docs/doxygen/html/namespacemembers.html
@@ -0,0 +1,83 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all namespace members with links to the namespace documentation for each member:</div><ul>
+<li>operator&lt;&lt;()&#160;:&#160;<a class="el" href="namespacexb.html#ad27f348219e895c44f74addba8e1889a">xb</a></li>
+<li>xbBool&#160;:&#160;<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb</a></li>
+<li>xbDbf&#160;:&#160;<a class="el" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xb</a></li>
+<li>xbDouble&#160;:&#160;<a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb</a></li>
+<li>xbErrorMessages&#160;:&#160;<a class="el" href="namespacexb.html#a04be228a037d220dd5564f5ef618adcc">xb</a></li>
+<li>xbFloat&#160;:&#160;<a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xb</a></li>
+<li>xbLog&#160;:&#160;<a class="el" href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xb</a></li>
+<li>xbOffT&#160;:&#160;<a class="el" href="namespacexb.html#ac963d9fde6debb416303cfbed35fb793">xb</a></li>
+<li>xbXBase&#160;:&#160;<a class="el" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xb</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/namespacemembers_func.html b/docs/doxygen/html/namespacemembers_func.html
new file mode 100644
index 0000000..90acc35
--- /dev/null
+++ b/docs/doxygen/html/namespacemembers_func.html
@@ -0,0 +1,75 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>operator&lt;&lt;()&#160;:&#160;<a class="el" href="namespacexb.html#ad27f348219e895c44f74addba8e1889a">xb</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/namespacemembers_type.html b/docs/doxygen/html/namespacemembers_type.html
new file mode 100644
index 0000000..edd39cf
--- /dev/null
+++ b/docs/doxygen/html/namespacemembers_type.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>xbBool&#160;:&#160;<a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb</a></li>
+<li>xbDouble&#160;:&#160;<a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb</a></li>
+<li>xbFloat&#160;:&#160;<a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xb</a></li>
+<li>xbOffT&#160;:&#160;<a class="el" href="namespacexb.html#ac963d9fde6debb416303cfbed35fb793">xb</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/namespacemembers_vars.html b/docs/doxygen/html/namespacemembers_vars.html
new file mode 100644
index 0000000..caa02e5
--- /dev/null
+++ b/docs/doxygen/html/namespacemembers_vars.html
@@ -0,0 +1,78 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>xbDbf&#160;:&#160;<a class="el" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xb</a></li>
+<li>xbErrorMessages&#160;:&#160;<a class="el" href="namespacexb.html#a04be228a037d220dd5564f5ef618adcc">xb</a></li>
+<li>xbLog&#160;:&#160;<a class="el" href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xb</a></li>
+<li>xbXBase&#160;:&#160;<a class="el" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xb</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/namespaces.html b/docs/doxygen/html/namespaces.html
new file mode 100644
index 0000000..c77f658
--- /dev/null
+++ b/docs/doxygen/html/namespaces.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: Namespace List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+</div><!-- top -->
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle"><div class="title">Namespace List</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all namespaces with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><a class="el" href="namespacexb.html" target="_self">xb</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbDate.html" target="_self">xbDate</a></td><td class="desc">XbDate class </td></tr>
+<tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbDbf.html" target="_self">xbDbf</a></td><td class="desc">Base class for handling dbf files/tables </td></tr>
+<tr id="row_0_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbFile.html" target="_self">xbFile</a></td><td class="desc">Class for handling low level file I/O </td></tr>
+<tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structxb_1_1xbSchema.html" target="_self">xbSchema</a></td><td class="desc">Schema used for defining tables with CreateTable methods </td></tr>
+<tr id="row_0_4_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbSsv.html" target="_self">xbSsv</a></td><td class="desc">Class for handling shared system variables </td></tr>
+<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbString.html" target="_self">xbString</a></td><td class="desc">Class for handling string data </td></tr>
+<tr id="row_0_6_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="structxb_1_1xbTblList.html" target="_self">xbTblList</a></td><td class="desc"></td></tr>
+<tr id="row_0_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbTblMgr.html" target="_self">xbTblMgr</a></td><td class="desc"></td></tr>
+<tr id="row_0_8_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classxb_1_1xbXBase.html" target="_self">xbXBase</a></td><td class="desc">XbXbase class </td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/namespacexb.html b/docs/doxygen/html/namespacexb.html
new file mode 100644
index 0000000..38d1e7c
--- /dev/null
+++ b/docs/doxygen/html/namespacexb.html
@@ -0,0 +1,290 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: xb Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#typedef-members">Typedefs</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle"><div class="title">xb Namespace Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html">xbDate</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="classxb_1_1xbDate.html" title="xbDate class.">xbDate</a> class. <a href="classxb_1_1xbDate.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Base class for handling dbf files/tables. <a href="classxb_1_1xbDbf.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html">xbFile</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class for handling low level file I/O. <a href="classxb_1_1xbFile.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbSchema.html">xbSchema</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Schema used for defining tables with CreateTable methods. <a href="structxb_1_1xbSchema.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html">xbSsv</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class for handling shared system variables. <a href="classxb_1_1xbSsv.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html">xbString</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class for handling string data. <a href="classxb_1_1xbString.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbTblList.html">xbTblList</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html">xbTblMgr</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">xbXbase class. <a href="classxb_1_1xbXBase.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a83aa6a550398db55973aa9fb4257e66e"><td class="memItemLeft" align="right" valign="top">typedef float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a></td></tr>
+<tr class="separator:a83aa6a550398db55973aa9fb4257e66e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25f47b226ce924a5c78f97989b0744a2"><td class="memItemLeft" align="right" valign="top">typedef double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a></td></tr>
+<tr class="separator:a25f47b226ce924a5c78f97989b0744a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1a750481dd487f0d384aa1d200dff0f"><td class="memItemLeft" align="right" valign="top">typedef short int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a></td></tr>
+<tr class="separator:ab1a750481dd487f0d384aa1d200dff0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac963d9fde6debb416303cfbed35fb793"><td class="memItemLeft" align="right" valign="top">typedef xbUInt64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#ac963d9fde6debb416303cfbed35fb793">xbOffT</a></td></tr>
+<tr class="separator:ac963d9fde6debb416303cfbed35fb793"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad27f348219e895c44f74addba8e1889a"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#ad27f348219e895c44f74addba8e1889a">operator&lt;&lt;</a> (std::ostream &amp;os, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;s)</td></tr>
+<tr class="memdesc:ad27f348219e895c44f74addba8e1889a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stream insertion operator &lt;&lt;. <a href="namespacexb.html#ad27f348219e895c44f74addba8e1889a">More...</a><br /></td></tr>
+<tr class="separator:ad27f348219e895c44f74addba8e1889a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="var-members" name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a04be228a037d220dd5564f5ef618adcc"><td class="memItemLeft" align="right" valign="top">const xbErrorMessage&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#a04be228a037d220dd5564f5ef618adcc">xbErrorMessages</a> []</td></tr>
+<tr class="separator:a04be228a037d220dd5564f5ef618adcc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97858ddeb1c4b0100f3edc1a46d3a8b0"><td class="memItemLeft" align="right" valign="top">class XBDLLEXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a></td></tr>
+<tr class="separator:a97858ddeb1c4b0100f3edc1a46d3a8b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2eae4b4732466698a7fdd89d77ba53b"><td class="memItemLeft" align="right" valign="top">class XBDLLEXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a></td></tr>
+<tr class="separator:ab2eae4b4732466698a7fdd89d77ba53b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a31fbe9110c9e55495ce71e642d785c"><td class="memItemLeft" align="right" valign="top">class XBDLLEXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xbLog</a></td></tr>
+<tr class="separator:a4a31fbe9110c9e55495ce71e642d785c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Typedef Documentation</h2>
+<a id="ab1a750481dd487f0d384aa1d200dff0f" name="ab1a750481dd487f0d384aa1d200dff0f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab1a750481dd487f0d384aa1d200dff0f">&#9670;&nbsp;</a></span>xbBool</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef short int <a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a25f47b226ce924a5c78f97989b0744a2" name="a25f47b226ce924a5c78f97989b0744a2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a25f47b226ce924a5c78f97989b0744a2">&#9670;&nbsp;</a></span>xbDouble</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef double <a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a83aa6a550398db55973aa9fb4257e66e" name="a83aa6a550398db55973aa9fb4257e66e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a83aa6a550398db55973aa9fb4257e66e">&#9670;&nbsp;</a></span>xbFloat</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef float <a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xb::xbFloat</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac963d9fde6debb416303cfbed35fb793" name="ac963d9fde6debb416303cfbed35fb793"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac963d9fde6debb416303cfbed35fb793">&#9670;&nbsp;</a></span>xbOffT</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">typedef xbUInt64 <a class="el" href="namespacexb.html#ac963d9fde6debb416303cfbed35fb793">xb::xbOffT</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ad27f348219e895c44f74addba8e1889a" name="ad27f348219e895c44f74addba8e1889a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad27f348219e895c44f74addba8e1889a">&#9670;&nbsp;</a></span>operator&lt;&lt;()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">std::ostream &amp; xb::operator&lt;&lt; </td>
+ <td>(</td>
+ <td class="paramtype">std::ostream &amp;&#160;</td>
+ <td class="paramname"><em>os</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Stream insertion operator &lt;&lt;. </p>
+<p >std::cout &lt;&lt; MyString &lt;&lt; std::endl;</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">os</td><td>Output stream </td></tr>
+ <tr><td class="paramname">s</td><td>String to send to output stream </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="ab2eae4b4732466698a7fdd89d77ba53b" name="ab2eae4b4732466698a7fdd89d77ba53b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab2eae4b4732466698a7fdd89d77ba53b">&#9670;&nbsp;</a></span>xbDbf</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">class XBDLLEXPORT <a class="el" href="classxb_1_1xbDbf.html">xb::xbDbf</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a04be228a037d220dd5564f5ef618adcc" name="a04be228a037d220dd5564f5ef618adcc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a04be228a037d220dd5564f5ef618adcc">&#9670;&nbsp;</a></span>xbErrorMessages</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const xbErrorMessage xb::xbErrorMessages[]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a4a31fbe9110c9e55495ce71e642d785c" name="a4a31fbe9110c9e55495ce71e642d785c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4a31fbe9110c9e55495ce71e642d785c">&#9670;&nbsp;</a></span>xbLog</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">class XBDLLEXPORT xb::xbLog</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a97858ddeb1c4b0100f3edc1a46d3a8b0" name="a97858ddeb1c4b0100f3edc1a46d3a8b0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a97858ddeb1c4b0100f3edc1a46d3a8b0">&#9670;&nbsp;</a></span>xbXBase</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">class XBDLLEXPORT <a class="el" href="classxb_1_1xbXBase.html">xb::xbXBase</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/nav_f.png b/docs/doxygen/html/nav_f.png
new file mode 100644
index 0000000..72a58a5
--- /dev/null
+++ b/docs/doxygen/html/nav_f.png
Binary files differ
diff --git a/docs/doxygen/html/nav_g.png b/docs/doxygen/html/nav_g.png
new file mode 100644
index 0000000..2093a23
--- /dev/null
+++ b/docs/doxygen/html/nav_g.png
Binary files differ
diff --git a/docs/doxygen/html/nav_h.png b/docs/doxygen/html/nav_h.png
new file mode 100644
index 0000000..33389b1
--- /dev/null
+++ b/docs/doxygen/html/nav_h.png
Binary files differ
diff --git a/docs/doxygen/html/open.png b/docs/doxygen/html/open.png
new file mode 100644
index 0000000..30f75c7
--- /dev/null
+++ b/docs/doxygen/html/open.png
Binary files differ
diff --git a/docs/doxygen/html/reindex_8cpp.html b/docs/doxygen/html/reindex_8cpp.html
new file mode 100644
index 0000000..8560b2a
--- /dev/null
+++ b/docs/doxygen/html/reindex_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/reindex.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">reindex.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;xbase64/xbase64.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="reindex_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_0.html b/docs/doxygen/html/search/all_0.html
new file mode 100644
index 0000000..c36c9af
--- /dev/null
+++ b/docs/doxygen/html/search/all_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_0.js b/docs/doxygen/html/search/all_0.js
new file mode 100644
index 0000000..9e288ab
--- /dev/null
+++ b/docs/doxygen/html/search/all_0.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['abort_0',['Abort',['../classxb_1_1xbDbf.html#a4edcf31390fbdc8c3558004770fd9f2f',1,'xb::xbDbf']]],
+ ['addbackslash_1',['AddBackSlash',['../classxb_1_1xbString.html#a6c4fdb689d27a9d19a0b5b4236e1ca62',1,'xb::xbString']]],
+ ['addtbltotbllist_2',['AddTblToTblList',['../classxb_1_1xbTblMgr.html#a721f69ccc7893842422a043468ffccea',1,'xb::xbTblMgr::AddTblToTblList(xbDbf *d, const xbString &amp;sTblName)'],['../classxb_1_1xbTblMgr.html#a62f6841849dbe5c1768f7e90f1b7e766',1,'xb::xbTblMgr::AddTblToTblList(xbDbf *d, const xbString &amp;sTblName, const xbString &amp;sTblAlias)']]],
+ ['append_3',['Append',['../classxb_1_1xbString.html#a8f202e4798491f2ae9ce51ff58dd5815',1,'xb::xbString::Append(const xbString &amp;s)'],['../classxb_1_1xbString.html#a1922319303feb6da1f40b5994c5e8240',1,'xb::xbString::Append(const char *s)'],['../classxb_1_1xbString.html#a097453cb71fbf0b5511cf1259ddce4fb',1,'xb::xbString::Append(const char *s, xbUInt32 iByteCount)'],['../classxb_1_1xbString.html#a093c6ab5df375a2589755bb8f48fa5c7',1,'xb::xbString::Append(char c)']]],
+ ['appendrecord_4',['AppendRecord',['../classxb_1_1xbDbf.html#a5b412dd796241673eb1aa2c93513d69b',1,'xb::xbDbf']]],
+ ['assign_5',['Assign',['../classxb_1_1xbString.html#a85bef82dfa22122a1ab8dfe58a107d96',1,'xb::xbString::Assign(const char *srcStr, xbUInt32 lStartPos, xbUInt32 lCopyLen)'],['../classxb_1_1xbString.html#a08eb7ca6740423acab4e8bd7a6c8043d',1,'xb::xbString::Assign(const char *srcStr, xbUInt32 lStartPos)'],['../classxb_1_1xbString.html#a210707223fffc7b3ab31eca4ef29f731',1,'xb::xbString::Assign(const xbString &amp;s, xbUInt32 pos, xbUInt32 n)'],['../classxb_1_1xbString.html#ab9045442e57293843652dfce6522ff83',1,'xb::xbString::Assign(const xbString &amp;s, xbUInt32 n)']]]
+];
diff --git a/docs/doxygen/html/search/all_1.html b/docs/doxygen/html/search/all_1.html
new file mode 100644
index 0000000..91cfe8a
--- /dev/null
+++ b/docs/doxygen/html/search/all_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_1.js b/docs/doxygen/html/search/all_1.js
new file mode 100644
index 0000000..d9c0a9c
--- /dev/null
+++ b/docs/doxygen/html/search/all_1.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['bitset_0',['BitSet',['../classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72',1,'xb::xbSsv']]],
+ ['blankrecord_1',['BlankRecord',['../classxb_1_1xbDbf.html#a78da5a3d2011a3f2e7618cbdd3ba02d6',1,'xb::xbDbf']]]
+];
diff --git a/docs/doxygen/html/search/all_10.html b/docs/doxygen/html/search/all_10.html
new file mode 100644
index 0000000..765f584
--- /dev/null
+++ b/docs/doxygen/html/search/all_10.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_10.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_10.js b/docs/doxygen/html/search/all_10.js
new file mode 100644
index 0000000..aefc8ee
--- /dev/null
+++ b/docs/doxygen/html/search/all_10.js
@@ -0,0 +1,28 @@
+var searchData=
+[
+ ['salias_0',['sAlias',['../classxb_1_1xbDbf.html#a73f9c792d0a769e2e604c1855245a276',1,'xb::xbDbf']]],
+ ['schemaptr_1',['SchemaPtr',['../classxb_1_1xbDbf.html#ad8c8b5eb12063bb898da1b2cc02cfce7',1,'xb::xbDbf']]],
+ ['set_2',['Set',['../classxb_1_1xbDate.html#a4b0cde152b5de0f7d26608d1445110b6',1,'xb::xbDate::Set()'],['../classxb_1_1xbString.html#ab85753d2c39882e946a8468cbb587700',1,'xb::xbString::Set(const char *s)'],['../classxb_1_1xbString.html#ac0d08bd688fd0e3707e32886d0dfeb09',1,'xb::xbString::Set(const xbString &amp;s)'],['../classxb_1_1xbString.html#a6eba6ccd0c805a22516de2c18a30f8a3',1,'xb::xbString::Set(const char *s, xbUInt32 ulSize)']]],
+ ['setautocommit_3',['SetAutoCommit',['../classxb_1_1xbDbf.html#a4cf7f0d423164f3cf074ae41f96f4e90',1,'xb::xbDbf']]],
+ ['setblocksize_4',['SetBlockSize',['../classxb_1_1xbFile.html#a991c5676a6f38fa752435390989f413e',1,'xb::xbFile']]],
+ ['setdatadirectory_5',['SetDataDirectory',['../classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c',1,'xb::xbSsv']]],
+ ['setdefaultautocommit_6',['SetDefaultAutoCommit',['../classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd',1,'xb::xbSsv']]],
+ ['setdefaultdateformat_7',['SetDefaultDateFormat',['../classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c',1,'xb::xbSsv']]],
+ ['setdefaultlogdirectory_8',['SetDefaultLogDirectory',['../classxb_1_1xbSsv.html#a84343b8645790791512d6bc22ee6c8eb',1,'xb::xbSsv']]],
+ ['setdirectory_9',['SetDirectory',['../classxb_1_1xbFile.html#ae78a85255488bc78964c16946dbaead3',1,'xb::xbFile']]],
+ ['setendiantype_10',['SetEndianType',['../classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108',1,'xb::xbSsv']]],
+ ['setfilename_11',['SetFileName',['../classxb_1_1xbFile.html#a5419eb27e56822f828b2b88a9502a636',1,'xb::xbFile']]],
+ ['setfqfilename_12',['SetFqFileName',['../classxb_1_1xbFile.html#aee832fa11db2077a532f49e1329bd05a',1,'xb::xbFile']]],
+ ['setlogdirectory_13',['SetLogDirectory',['../classxb_1_1xbXBase.html#a48d82dbe298c6f4cf68a63ac82dd8292',1,'xb::xbXBase']]],
+ ['setlogfilename_14',['SetLogFileName',['../classxb_1_1xbXBase.html#a94010b88a309315ef980715eb581336c',1,'xb::xbXBase']]],
+ ['setlogsize_15',['SetLogSize',['../classxb_1_1xbXBase.html#a666a0cb5b76ec7a9a3677d339e0c6b42',1,'xb::xbXBase']]],
+ ['setmultiuser_16',['SetMultiUser',['../classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c',1,'xb::xbSsv']]],
+ ['setnum_17',['SetNum',['../classxb_1_1xbString.html#a3af5b1f111f94b0667551fcbd1d97abd',1,'xb::xbString']]],
+ ['setversion_18',['SetVersion',['../classxb_1_1xbDbf.html#a7e63e852418f337eb7c44de5dcd50323',1,'xb::xbDbf']]],
+ ['snullstring_19',['sNullString',['../classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da',1,'xb::xbSsv']]],
+ ['sprintf_20',['Sprintf',['../classxb_1_1xbString.html#a9e9bfa29d86377b915f1628aeb0e9195',1,'xb::xbString']]],
+ ['str_21',['Str',['../classxb_1_1xbDate.html#ab43a5d8d929767c0ffdd722972bb8cc0',1,'xb::xbDate::Str()'],['../classxb_1_1xbString.html#a6715f4c0010f3ab487c9d787838a29b3',1,'xb::xbString::Str() const']]],
+ ['strncpy_22',['strncpy',['../classxb_1_1xbString.html#a3bc9e856c34f0c240a6e36e5b6e3ea7b',1,'xb::xbString']]],
+ ['swapchars_23',['SwapChars',['../classxb_1_1xbString.html#a054683872e1f05d11c2cf8683a63a6fe',1,'xb::xbString']]],
+ ['sysdate_24',['Sysdate',['../classxb_1_1xbDate.html#a40ba54a58d64cf56266f020f91584192',1,'xb::xbDate']]]
+];
diff --git a/docs/doxygen/html/search/all_11.html b/docs/doxygen/html/search/all_11.html
new file mode 100644
index 0000000..e2183ee
--- /dev/null
+++ b/docs/doxygen/html/search/all_11.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_11.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_11.js b/docs/doxygen/html/search/all_11.js
new file mode 100644
index 0000000..06b6b3d
--- /dev/null
+++ b/docs/doxygen/html/search/all_11.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['testmethod_0',['TestMethod',['../xb__test__expression_8cpp.html#aa385c5f9fa8b4cfd63763b4a28852b64',1,'TestMethod(xbXBase *xb, xbDbf *d, xbInt16 PrintOption, const char *title, const xbString &amp;sExpression, xbBool bExpectedResult):&#160;xb_test_expression.cpp'],['../tstfuncs_8cpp.html#a265547b80a3aef5836952bede5288e2c',1,'TestMethod(xbInt16 PrintOption, const char *title, const xbString &amp;result, const char *expectedResult, size_t expectedLen):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#a9c27703ef863c9d29680844fc5124953',1,'TestMethod(xbInt16 PrintOption, const char *title, char result, char expectedResult):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#ae6536e920580382389126d5f66655f90',1,'TestMethod(xbInt16 PrintOption, const char *title, xbInt32 result, xbInt32 expectedResult):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#a000fca67bc0fffea3d3da7a5317a06e4',1,'TestMethod(xbInt16 PrintOption, const char *title, xbUInt64 result, xbUInt64 expectedResult):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#a663f3dd7bd8574a35c1b1b9a22081c6d',1,'TestMethod(xbInt16 PrintOption, const char *title, xbFloat result, xbFloat expectedResult):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#af1c78fb72bcd39eb86f11aa2887fe62c',1,'TestMethod(xbInt16 PrintOption, const char *title, xbDouble result, xbDouble expectedResult):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#ac64a0bed74ba10b638456709f128f893',1,'TestMethod(xbInt16 PrintOption, const char *title, xbDouble result, xbDouble expectedResult, xbDouble dEpsilon):&#160;tstfuncs.cpp'],['../xb__test__expression_8cpp.html#ad52c27685018dda7c5c4b26fb445860e',1,'TestMethod(xbXBase *xb, xbDbf *d, xbInt16 PrintOption, const char *title, const xbString &amp;sExpression, const char *sExpectedResult, xbInt16 iExpectedResultLen):&#160;xb_test_expression.cpp'],['../xb__test__expression_8cpp.html#a7030149316fe8d8195ffbb18132e0cf9',1,'TestMethod(xbXBase *xb, xbDbf *d, xbInt16 PrintOption, const char *title, const xbString &amp;sExpression, xbDouble dExpectedResult):&#160;xb_test_expression.cpp'],['../xb__test__expression_8cpp.html#a10e637a203841bd2b6a92e6217509e23',1,'TestMethod(xbXBase *xb, xbDbf *d, xbInt16 PrintOption, const char *title, const xbString &amp;sExpression, xbDate dtExpectedResult):&#160;xb_test_expression.cpp']]],
+ ['testtokenmethod_1',['TestTokenMethod',['../xb__test__expression_8cpp.html#a440d64b55abaa9e14e73ecc132d1084d',1,'xb_test_expression.cpp']]],
+ ['testweight_2',['TestWeight',['../xb__test__expression_8cpp.html#af56b6dbc38e0d23caaf6531526315379',1,'xb_test_expression.cpp']]],
+ ['timer_3',['timer',['../tstfuncs_8cpp.html#ae2281da6157495d69406c35f69a61f9f',1,'tstfuncs.cpp']]],
+ ['tolowercase_4',['ToLowerCase',['../classxb_1_1xbString.html#a602cac1a6ef3f6b52f587ac4c0ef4fb2',1,'xb::xbString']]],
+ ['touppercase_5',['ToUpperCase',['../classxb_1_1xbString.html#a68001d0a44e6b4fe61e29a4e41ded9d4',1,'xb::xbString']]],
+ ['trim_6',['Trim',['../classxb_1_1xbString.html#abc9bd33687d4e03ca52d77885721d626',1,'xb::xbString']]],
+ ['tstfuncs_2ecpp_7',['tstfuncs.cpp',['../tstfuncs_8cpp.html',1,'']]]
+];
diff --git a/docs/doxygen/html/search/all_12.html b/docs/doxygen/html/search/all_12.html
new file mode 100644
index 0000000..9b9621c
--- /dev/null
+++ b/docs/doxygen/html/search/all_12.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_12.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_12.js b/docs/doxygen/html/search/all_12.js
new file mode 100644
index 0000000..6c6cb3e
--- /dev/null
+++ b/docs/doxygen/html/search/all_12.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['uiheaderlen_0',['uiHeaderLen',['../classxb_1_1xbDbf.html#a62f5fa9149ae0f6dc75642823de66918',1,'xb::xbDbf']]],
+ ['uirecordlen_1',['uiRecordLen',['../classxb_1_1xbDbf.html#a1760e222567e2c849f9c799b9d896e91',1,'xb::xbDbf']]],
+ ['ulcurrec_2',['ulCurRec',['../classxb_1_1xbDbf.html#afcd99924606be0a9e1e25180bcd1abf8',1,'xb::xbDbf']]],
+ ['ulnoofrecs_3',['ulNoOfRecs',['../classxb_1_1xbDbf.html#acb594ab61dd35b17bdf28394083f8e87',1,'xb::xbDbf']]],
+ ['undeleteallrecords_4',['UndeleteAllRecords',['../classxb_1_1xbDbf.html#ae94cb1bf9f75184f39d9e1a80ab49d4a',1,'xb::xbDbf']]],
+ ['undeleterecord_5',['UndeleteRecord',['../classxb_1_1xbDbf.html#a255681976a04fc722538bb630507b3a0',1,'xb::xbDbf']]],
+ ['usage_6',['Usage',['../dbfxtrct_8cpp.html#a5ae07f63d6b390e42068d941038dadf2',1,'dbfxtrct.cpp']]]
+];
diff --git a/docs/doxygen/html/search/all_13.html b/docs/doxygen/html/search/all_13.html
new file mode 100644
index 0000000..4acb7f9
--- /dev/null
+++ b/docs/doxygen/html/search/all_13.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_13.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_13.js b/docs/doxygen/html/search/all_13.js
new file mode 100644
index 0000000..4ebd614
--- /dev/null
+++ b/docs/doxygen/html/search/all_13.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['validateschema_0',['ValidateSchema',['../classxb_1_1xbDbf.html#aba5dcac3b4092261bc1669740cdd669d',1,'xb::xbDbf']]],
+ ['validlogicalvalue_1',['ValidLogicalValue',['../classxb_1_1xbString.html#a72b16c15fd8822efaa5f158c34df7b1e',1,'xb::xbString']]],
+ ['validnumericvalue_2',['ValidNumericValue',['../classxb_1_1xbString.html#aeed920d2a25111f776ddde2d530eb81b',1,'xb::xbString']]],
+ ['verbose_3',['VERBOSE',['../xb__test__string_8cpp.html#a42f8c497a1968074f38bf5055c650dca',1,'xb_test_string.cpp']]]
+];
diff --git a/docs/doxygen/html/search/all_14.html b/docs/doxygen/html/search/all_14.html
new file mode 100644
index 0000000..abb790c
--- /dev/null
+++ b/docs/doxygen/html/search/all_14.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_14.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_14.js b/docs/doxygen/html/search/all_14.js
new file mode 100644
index 0000000..c9794d0
--- /dev/null
+++ b/docs/doxygen/html/search/all_14.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['writeblock_0',['WriteBlock',['../classxb_1_1xbFile.html#a5d871dcfecc2b4338f7a13722aab766c',1,'xb::xbFile']]],
+ ['writeheader_1',['WriteHeader',['../classxb_1_1xbDbf.html#a44e1410109ef7b3d11a6af4b704b62b2',1,'xb::xbDbf']]],
+ ['writelogbytes_2',['WriteLogBytes',['../classxb_1_1xbXBase.html#a0dff00b9ee3c288841e137ca01168116',1,'xb::xbXBase']]],
+ ['writelogmessage_3',['WriteLogMessage',['../classxb_1_1xbXBase.html#a9ca5be73abffd0fdd18bdc799877272a',1,'xb::xbXBase']]]
+];
diff --git a/docs/doxygen/html/search/all_15.html b/docs/doxygen/html/search/all_15.html
new file mode 100644
index 0000000..33e250b
--- /dev/null
+++ b/docs/doxygen/html/search/all_15.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_15.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_15.js b/docs/doxygen/html/search/all_15.js
new file mode 100644
index 0000000..eb08efa
--- /dev/null
+++ b/docs/doxygen/html/search/all_15.js
@@ -0,0 +1,222 @@
+var searchData=
+[
+ ['xb_0',['xb',['../namespacexb.html',1,'']]],
+ ['xb_5factive_5frecs_1',['XB_ACTIVE_RECS',['../xbdbf_8h.html#a1c44bb25bf2e23a3a9d3d2312df0b592',1,'xbdbf.h']]],
+ ['xb_5fall_5frecs_2',['XB_ALL_RECS',['../xbdbf_8h.html#a8bd17730da3ba5c55a6a07bc482dd0e4',1,'xbdbf.h']]],
+ ['xb_5falready_5fopen_3',['XB_ALREADY_OPEN',['../xbretcod_8h.html#aa2ff8301503f446c6a5f6510090e520f',1,'xbretcod.h']]],
+ ['xb_5fbof_4',['XB_BOF',['../xbretcod_8h.html#ade5f3a7cf1467d12761e4e21b5e4200f',1,'xbretcod.h']]],
+ ['xb_5fcfg_5fcheck_2ecpp_5',['xb_cfg_check.cpp',['../xb__cfg__check_8cpp.html',1,'']]],
+ ['xb_5fchar_5ffld_6',['XB_CHAR_FLD',['../xbdbf_8h.html#a20f739b9d9dc6a002a246a999e76aeaa',1,'xbdbf.h']]],
+ ['xb_5fchareof_7',['XB_CHAREOF',['../xbdbf_8h.html#ada1115f596131888c04df61546b198c4',1,'xbdbf.h']]],
+ ['xb_5fcharhdr_8',['XB_CHARHDR',['../xbdbf_8h.html#a35d56cac7959c1e5c761684ced3f1e17',1,'xbdbf.h']]],
+ ['xb_5fclose_5ferror_9',['XB_CLOSE_ERROR',['../xbretcod_8h.html#a030684d5541cf6127a76d81b0684b235',1,'xbretcod.h']]],
+ ['xb_5fclosed_10',['XB_CLOSED',['../xbdbf_8h.html#a843ca4569326dbd1d0647899b0eb512f',1,'xbdbf.h']]],
+ ['xb_5fcopydbf_2ecpp_11',['xb_copydbf.cpp',['../xb__copydbf_8cpp.html',1,'']]],
+ ['xb_5fdate_5ffld_12',['XB_DATE_FLD',['../xbdbf_8h.html#a7f685e6f5fe804b2174725a27ce73adc',1,'xbdbf.h']]],
+ ['xb_5fdbf_5ffile_5fnot_5fopen_13',['XB_DBF_FILE_NOT_OPEN',['../xbretcod_8h.html#a8104510b347c87998eadd0b27201e3c2',1,'xbretcod.h']]],
+ ['xb_5fdbfutil_2ecpp_14',['xb_dbfutil.cpp',['../xb__dbfutil_8cpp.html',1,'']]],
+ ['xb_5fdeletall_2ecpp_15',['xb_deletall.cpp',['../xb__deletall_8cpp.html',1,'']]],
+ ['xb_5fdelete_5ffailed_16',['XB_DELETE_FAILED',['../xbretcod_8h.html#ada15513935d5ede9216f07c0438f34d2',1,'xbretcod.h']]],
+ ['xb_5fdeleted_5frecs_17',['XB_DELETED_RECS',['../xbdbf_8h.html#acc0a441854ed92b9d65d1181a97cad43',1,'xbdbf.h']]],
+ ['xb_5fdontoverlay_18',['XB_DONTOVERLAY',['../xbdbf_8h.html#a7b797840abdb3291373d15978103a778',1,'xbdbf.h']]],
+ ['xb_5fdumpdbt_2ecpp_19',['xb_dumpdbt.cpp',['../xb__dumpdbt_8cpp.html',1,'']]],
+ ['xb_5fdumphdr_2ecpp_20',['xb_dumphdr.cpp',['../xb__dumphdr_8cpp.html',1,'']]],
+ ['xb_5fdumpix_2ecpp_21',['xb_dumpix.cpp',['../xb__dumpix_8cpp.html',1,'']]],
+ ['xb_5fdumprecs_2ecpp_22',['xb_dumprecs.cpp',['../xb__dumprecs_8cpp.html',1,'']]],
+ ['xb_5fdup_5ftable_5for_5falias_23',['XB_DUP_TABLE_OR_ALIAS',['../xbretcod_8h.html#ac18036408d10e5eee1bf76cf92352b95',1,'xbretcod.h']]],
+ ['xb_5fempty_24',['XB_EMPTY',['../xbretcod_8h.html#a18068d0cbe0c7a1b4dd3176220180c29',1,'xbretcod.h']]],
+ ['xb_5feof_25',['XB_EOF',['../xbretcod_8h.html#a8b47031e90c3f86306c7058e4490d3b7',1,'xbretcod.h']]],
+ ['xb_5fex_5fdate_2ecpp_26',['xb_ex_date.cpp',['../xb__ex__date_8cpp.html',1,'']]],
+ ['xb_5fex_5fsql_2ecpp_27',['xb_ex_sql.cpp',['../xb__ex__sql_8cpp.html',1,'']]],
+ ['xb_5fex_5fstring_2ecpp_28',['xb_ex_string.cpp',['../xb__ex__string_8cpp.html',1,'']]],
+ ['xb_5fex_5fv3_5fcreate_5fdbf_2ecpp_29',['xb_ex_v3_create_dbf.cpp',['../xb__ex__v3__create__dbf_8cpp.html',1,'']]],
+ ['xb_5fex_5fv3_5fupd_5fdbf_2ecpp_30',['xb_ex_v3_upd_dbf.cpp',['../xb__ex__v3__upd__dbf_8cpp.html',1,'']]],
+ ['xb_5fex_5fv4_5fcreate_5fdbf_2ecpp_31',['xb_ex_v4_create_dbf.cpp',['../xb__ex__v4__create__dbf_8cpp.html',1,'']]],
+ ['xb_5fex_5fv4_5fupd_5fdbf_2ecpp_32',['xb_ex_v4_upd_dbf.cpp',['../xb__ex__v4__upd__dbf_8cpp.html',1,'']]],
+ ['xb_5fexecsql_2ecpp_33',['xb_execsql.cpp',['../xb__execsql_8cpp.html',1,'']]],
+ ['xb_5ffile_5fexists_34',['XB_FILE_EXISTS',['../xbretcod_8h.html#a54303a9677dbd5342233f33dd08c64d0',1,'xbretcod.h']]],
+ ['xb_5ffile_5fnot_5ffound_35',['XB_FILE_NOT_FOUND',['../xbretcod_8h.html#ad090af330c93111d12f6de35dbb065bc',1,'xbretcod.h']]],
+ ['xb_5ffile_5ftype_5fnot_5fsupported_36',['XB_FILE_TYPE_NOT_SUPPORTED',['../xbretcod_8h.html#ab7b9130a5f1df9975cfeaf6241933596',1,'xbretcod.h']]],
+ ['xb_5ffloat_5ffld_37',['XB_FLOAT_FLD',['../xbdbf_8h.html#a96ab4218d70ab603b4866354ce8c18cd',1,'xbdbf.h']]],
+ ['xb_5ffmt_5fmonth_38',['XB_FMT_MONTH',['../xbdate_8h.html#aeacf2f7cc897ab5bd64781c0fb52b75d',1,'xbdate.h']]],
+ ['xb_5ffmt_5fweek_39',['XB_FMT_WEEK',['../xbdate_8h.html#a8f22704d3fd93fa85dd93b6c699e8178',1,'xbdate.h']]],
+ ['xb_5ffmt_5fyear_40',['XB_FMT_YEAR',['../xbdate_8h.html#aa29d78982a9e007874af1c4f4e4d1aa4',1,'xbdate.h']]],
+ ['xb_5fincompatible_5foperands_41',['XB_INCOMPATIBLE_OPERANDS',['../xbretcod_8h.html#af141ec58b7ca7360e0be6c61d015ea74',1,'xbretcod.h']]],
+ ['xb_5finconsistent_5fparm_5flens_42',['XB_INCONSISTENT_PARM_LENS',['../xbretcod_8h.html#adc4b24bfffa202f8df25409894e547b9',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fblock_5fno_43',['XB_INVALID_BLOCK_NO',['../xbretcod_8h.html#a4e13b529b486c43ca600ce7d8ddbf3c2',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fblock_5fsize_44',['XB_INVALID_BLOCK_SIZE',['../xbretcod_8h.html#a1bd22921612389c37f6b2eac438c62c5',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fdata_45',['XB_INVALID_DATA',['../xbretcod_8h.html#afb40bbed323ecb369dd430a2e1242f9a',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fdate_46',['XB_INVALID_DATE',['../xbretcod_8h.html#a702475500357a27b8a34463be3e11925',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fexpression_47',['XB_INVALID_EXPRESSION',['../xbretcod_8h.html#a54db562c3cae97581812b4fccd52b71a',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffield_48',['XB_INVALID_FIELD',['../xbretcod_8h.html#a34180b2e2bd350ba2ebcdd1335e15d7e',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffield_5flen_49',['XB_INVALID_FIELD_LEN',['../xbretcod_8h.html#a7bd322c0efbba17f68ccccd6cf624411',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffield_5fname_50',['XB_INVALID_FIELD_NAME',['../xbretcod_8h.html#a59403978784130834cf39434cb73f96e',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffield_5fno_51',['XB_INVALID_FIELD_NO',['../xbretcod_8h.html#a09d6c08a44316f551108a74003efd381',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffield_5ftype_52',['XB_INVALID_FIELD_TYPE',['../xbretcod_8h.html#a79e2588f067d6e236c0e5a2c0728ba9f',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffunction_53',['XB_INVALID_FUNCTION',['../xbretcod_8h.html#a2b7e5e440dbcf5e6dc885b24dbe28742',1,'xbretcod.h']]],
+ ['xb_5finvalid_5findex_54',['XB_INVALID_INDEX',['../xbretcod_8h.html#acd175ef0541e2cad424791bd87619dd4',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fkeyno_55',['XB_INVALID_KEYNO',['../xbretcod_8h.html#aec2c0ac2bd62e0329ef130e4fbda39f8',1,'xbretcod.h']]],
+ ['xb_5finvalid_5flock_5foption_56',['XB_INVALID_LOCK_OPTION',['../xbretcod_8h.html#ab45735e63c208eb7e6d6df31fd527aec',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fmemo_5ffield_57',['XB_INVALID_MEMO_FIELD',['../xbretcod_8h.html#a187c50745f51bfe4aa6f70a92f16c59f',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fnodelink_58',['XB_INVALID_NODELINK',['../xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fobject_59',['XB_INVALID_OBJECT',['../xbretcod_8h.html#a418c047353bc683d0fd6ecbbdd5b7885',1,'xbretcod.h']]],
+ ['xb_5finvalid_5foption_60',['XB_INVALID_OPTION',['../xbretcod_8h.html#af1cd0baf346cad686fa4dd11f700012a',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fpage_61',['XB_INVALID_PAGE',['../xbretcod_8h.html#ad0aba12b5ae2137f8d6abd28b47f95f0',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fparm_62',['XB_INVALID_PARM',['../xbretcod_8h.html#a4cedf96581c9cbc9c14d07494143702d',1,'xbretcod.h']]],
+ ['xb_5finvalid_5frecord_63',['XB_INVALID_RECORD',['../xbretcod_8h.html#a0fd212f912b2e62700a66bae95bd73a1',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ftable_5fname_64',['XB_INVALID_TABLE_NAME',['../xbretcod_8h.html#a53891c95a78483704d2a8e14c4499f92',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ftag_65',['XB_INVALID_TAG',['../xbretcod_8h.html#a176d917912d3433f065483f905a4c50a',1,'xbretcod.h']]],
+ ['xb_5fkey_5fnot_5funique_66',['XB_KEY_NOT_UNIQUE',['../xbretcod_8h.html#ad60dbb1862c0c1c2dc0464cfbfd93a34',1,'xbretcod.h']]],
+ ['xb_5flimit_5freached_67',['XB_LIMIT_REACHED',['../xbretcod_8h.html#a59f1a8a6aca19595c2d1804349a24850',1,'xbretcod.h']]],
+ ['xb_5flock_68',['XB_LOCK',['../xbdbf_8h.html#a395a2e101a793bacabf6bc079d178e29',1,'xbdbf.h']]],
+ ['xb_5flock_5ffailed_69',['XB_LOCK_FAILED',['../xbretcod_8h.html#a001e24b39e0f155fb1e892f5b1b9cff1',1,'xbretcod.h']]],
+ ['xb_5flogical_5ffld_70',['XB_LOGICAL_FLD',['../xbdbf_8h.html#a2f6d5073af761bc1a806a2c7b1c1d886',1,'xbdbf.h']]],
+ ['xb_5fmax_5ferror_5fno_71',['XB_MAX_ERROR_NO',['../xbretcod_8h.html#a299419a9c80e000b74bf97a2d24d6a3d',1,'xbretcod.h']]],
+ ['xb_5fmemo_5ffld_72',['XB_MEMO_FLD',['../xbdbf_8h.html#a23fa19b19cb43bd6dcc59a5a3f6c30ad',1,'xbdbf.h']]],
+ ['xb_5fmulti_5fuser_73',['XB_MULTI_USER',['../xbfile_8h.html#a05c0fc99ba71cf953d046d12f3f874bc',1,'xbfile.h']]],
+ ['xb_5fno_5ferror_74',['XB_NO_ERROR',['../xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23',1,'xbretcod.h']]],
+ ['xb_5fno_5fmemory_75',['XB_NO_MEMORY',['../xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54',1,'xbretcod.h']]],
+ ['xb_5fnot_5ffound_76',['XB_NOT_FOUND',['../xbretcod_8h.html#ac2606659a54111334f5b02861e533700',1,'xbretcod.h']]],
+ ['xb_5fnot_5fopen_77',['XB_NOT_OPEN',['../xbretcod_8h.html#a9474b400f647bdefbbb07e5177e8d7a1',1,'xbretcod.h']]],
+ ['xb_5fnumeric_5ffld_78',['XB_NUMERIC_FLD',['../xbdbf_8h.html#ae9fb6d69cc5edc94d36ae403c22ec1c6',1,'xbdbf.h']]],
+ ['xb_5fopen_79',['XB_OPEN',['../xbdbf_8h.html#a9a6dafbb07cac744eb14094efa739409',1,'xbdbf.h']]],
+ ['xb_5fopen_5ferror_80',['XB_OPEN_ERROR',['../xbretcod_8h.html#aaab55236993a1d3acb29206252a904c8',1,'xbretcod.h']]],
+ ['xb_5foverlay_81',['XB_OVERLAY',['../xbdbf_8h.html#a6fe10b307878b4612b04c2c876a4a592',1,'xbdbf.h']]],
+ ['xb_5fpack_2ecpp_82',['xb_pack.cpp',['../xb__pack_8cpp.html',1,'']]],
+ ['xb_5fparse_5ferror_83',['XB_PARSE_ERROR',['../xbretcod_8h.html#aec713cac2b03a0d536a2d16336ae7c0b',1,'xbretcod.h']]],
+ ['xb_5fread_84',['XB_READ',['../xbfile_8h.html#ae58c73e0ba237fcf67ee20feea6c2743',1,'xbfile.h']]],
+ ['xb_5fread_5ferror_85',['XB_READ_ERROR',['../xbretcod_8h.html#adbd40585db8bb748d191f94a33bac710',1,'xbretcod.h']]],
+ ['xb_5fread_5fwrite_86',['XB_READ_WRITE',['../xbfile_8h.html#af991a288c327f6857e90156ea734a633',1,'xbfile.h']]],
+ ['xb_5frename_5ferror_87',['XB_RENAME_ERROR',['../xbretcod_8h.html#a373f30b2efcbbab9f6d060fb3fe8cba3',1,'xbretcod.h']]],
+ ['xb_5fseek_5ferror_88',['XB_SEEK_ERROR',['../xbretcod_8h.html#a0455ad8719e153b08ec68b10c81e9f41',1,'xbretcod.h']]],
+ ['xb_5fsingle_5fuser_89',['XB_SINGLE_USER',['../xbfile_8h.html#a9ec4d60a008c667d9861e3b3814f0232',1,'xbfile.h']]],
+ ['xb_5fsyntax_5ferror_90',['XB_SYNTAX_ERROR',['../xbretcod_8h.html#a5db3a90f215534143bdde81253729c7f',1,'xbretcod.h']]],
+ ['xb_5ftable_5fnot_5flocked_91',['XB_TABLE_NOT_LOCKED',['../xbretcod_8h.html#af6aaf779fddecca521d785666f6dc56b',1,'xbretcod.h']]],
+ ['xb_5ftblinfo_2ecpp_92',['xb_tblinfo.cpp',['../xb__tblinfo_8cpp.html',1,'']]],
+ ['xb_5ftest_5fbcd_2ecpp_93',['xb_test_bcd.cpp',['../xb__test__bcd_8cpp.html',1,'']]],
+ ['xb_5ftest_5fdate_2ecpp_94',['xb_test_date.cpp',['../xb__test__date_8cpp.html',1,'']]],
+ ['xb_5ftest_5fdbf_5fv3_5fmemos_2ecpp_95',['xb_test_dbf_v3_memos.cpp',['../xb__test__dbf__v3__memos_8cpp.html',1,'']]],
+ ['xb_5ftest_5fdbf_5fv3_5fnomemos_2ecpp_96',['xb_test_dbf_v3_nomemos.cpp',['../xb__test__dbf__v3__nomemos_8cpp.html',1,'']]],
+ ['xb_5ftest_5fdbf_5fv4_5fmemos_2ecpp_97',['xb_test_dbf_v4_memos.cpp',['../xb__test__dbf__v4__memos_8cpp.html',1,'']]],
+ ['xb_5ftest_5fdbf_5fv4_5fnomemos_2ecpp_98',['xb_test_dbf_v4_nomemos.cpp',['../xb__test__dbf__v4__nomemos_8cpp.html',1,'']]],
+ ['xb_5ftest_5fexpnode_2ecpp_99',['xb_test_expnode.cpp',['../xb__test__expnode_8cpp.html',1,'']]],
+ ['xb_5ftest_5fexpression_2ecpp_100',['xb_test_expression.cpp',['../xb__test__expression_8cpp.html',1,'']]],
+ ['xb_5ftest_5ffile_2ecpp_101',['xb_test_file.cpp',['../xb__test__file_8cpp.html',1,'']]],
+ ['xb_5ftest_5ffilter_2ecpp_102',['xb_test_filter.cpp',['../xb__test__filter_8cpp.html',1,'']]],
+ ['xb_5ftest_5ffuncs_2ecpp_103',['xb_test_funcs.cpp',['../xb__test__funcs_8cpp.html',1,'']]],
+ ['xb_5ftest_5flinklist_2ecpp_104',['xb_test_linklist.cpp',['../xb__test__linklist_8cpp.html',1,'']]],
+ ['xb_5ftest_5flock_2ecpp_105',['xb_test_lock.cpp',['../xb__test__lock_8cpp.html',1,'']]],
+ ['xb_5ftest_5flock2_2ecpp_106',['xb_test_lock2.cpp',['../xb__test__lock2_8cpp.html',1,'']]],
+ ['xb_5ftest_5flog_2ecpp_107',['xb_test_log.cpp',['../xb__test__log_8cpp.html',1,'']]],
+ ['xb_5ftest_5fmdx_2ecpp_108',['xb_test_mdx.cpp',['../xb__test__mdx_8cpp.html',1,'']]],
+ ['xb_5ftest_5fndx_2ecpp_109',['xb_test_ndx.cpp',['../xb__test__ndx_8cpp.html',1,'']]],
+ ['xb_5ftest_5fndx2_2ecpp_110',['xb_test_ndx2.cpp',['../xb__test__ndx2_8cpp.html',1,'']]],
+ ['xb_5ftest_5fsql_2ecpp_111',['xb_test_sql.cpp',['../xb__test__sql_8cpp.html',1,'']]],
+ ['xb_5ftest_5fstring_2ecpp_112',['xb_test_string.cpp',['../xb__test__string_8cpp.html',1,'']]],
+ ['xb_5ftest_5ftblmgr_2ecpp_113',['xb_test_tblmgr.cpp',['../xb__test__tblmgr_8cpp.html',1,'']]],
+ ['xb_5ftest_5fuda_2ecpp_114',['xb_test_uda.cpp',['../xb__test__uda_8cpp.html',1,'']]],
+ ['xb_5ftest_5fxbase_2ecpp_115',['xb_test_xbase.cpp',['../xb__test__xbase_8cpp.html',1,'']]],
+ ['xb_5funbalanced_5fparens_116',['XB_UNBALANCED_PARENS',['../xbretcod_8h.html#aff5646a6b0884ff81004de6961473ea6',1,'xbretcod.h']]],
+ ['xb_5funbalanced_5fquotes_117',['XB_UNBALANCED_QUOTES',['../xbretcod_8h.html#aedfa20a6c4eb9ba3063ba56be8280eac',1,'xbretcod.h']]],
+ ['xb_5fundelall_2ecpp_118',['xb_undelall.cpp',['../xb__undelall_8cpp.html',1,'']]],
+ ['xb_5funlock_119',['XB_UNLOCK',['../xbdbf_8h.html#a21389b73e7b4e7e185fa635b9e354c2e',1,'xbdbf.h']]],
+ ['xb_5fupdated_120',['XB_UPDATED',['../xbdbf_8h.html#a26e7eeda69f32bc88b08a208ca9e7991',1,'xbdbf.h']]],
+ ['xb_5fwrite_121',['XB_WRITE',['../xbfile_8h.html#abbf99e259c2f31572c886da6d85b1359',1,'xbfile.h']]],
+ ['xb_5fwrite_5ferror_122',['XB_WRITE_ERROR',['../xbretcod_8h.html#aef34ebe6726057f805d6063130280549',1,'xbretcod.h']]],
+ ['xb_5fzap_2ecpp_123',['xb_zap.cpp',['../xb__zap_8cpp.html',1,'']]],
+ ['xbase_124',['xbase',['../classxb_1_1xbFile.html#ae39a67ea391b46055d4ca299cb222004',1,'xb::xbFile']]],
+ ['xbase_2eh_125',['xbase.h',['../xbase_8h.html',1,'']]],
+ ['xbbcd_126',['xbBcd',['../classxb_1_1xbXBase.html#a86a53ce3efbf910996df0f853f1c0add',1,'xb::xbXBase']]],
+ ['xbbcd_2ecpp_127',['xbbcd.cpp',['../xbbcd_8cpp.html',1,'']]],
+ ['xbbcd_2eh_128',['xbbcd.h',['../xbbcd_8h.html',1,'']]],
+ ['xbbool_129',['xbBool',['../namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f',1,'xb']]],
+ ['xbcrix_2ecpp_130',['xbcrix.cpp',['../xbcrix_8cpp.html',1,'']]],
+ ['xbcrtbl_2ecpp_131',['xbcrtbl.cpp',['../xbcrtbl_8cpp.html',1,'']]],
+ ['xbdate_132',['xbDate',['../classxb_1_1xbDate.html',1,'xb::xbDate'],['../classxb_1_1xbDate.html#ac8a4d9330221a3daee21b3c28c1d9719',1,'xb::xbDate::xbDate(const char *Date8)'],['../classxb_1_1xbDate.html#ab3150e7db0ab5db10a07d748b55465eb',1,'xb::xbDate::xbDate()'],['../classxb_1_1xbDate.html#a7ab727a7ec184a086ad36ef83b948170',1,'xb::xbDate::xbDate(xbInt32 lJulDate)'],['../classxb_1_1xbDate.html#acf4546f5681735ede18210f60bab68d4',1,'xb::xbDate::xbDate(const xbString &amp;Date8)']]],
+ ['xbdate_2ecpp_133',['xbdate.cpp',['../xbdate_8cpp.html',1,'']]],
+ ['xbdate_2eh_134',['xbdate.h',['../xbdate_8h.html',1,'']]],
+ ['xbdbf_135',['xbDbf',['../classxb_1_1xbDbf.html',1,'xb::xbDbf'],['../classxb_1_1xbDbf.html#a84a75f80bc0e9b8a22b728767949c204',1,'xb::xbDbf::xbDbf()'],['../namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b',1,'xb::xbDbf()']]],
+ ['xbdbf_2ecpp_136',['xbdbf.cpp',['../xbdbf_8cpp.html',1,'']]],
+ ['xbdbf_2eh_137',['xbdbf.h',['../xbdbf_8h.html',1,'']]],
+ ['xbdbf3_2ecpp_138',['xbdbf3.cpp',['../xbdbf3_8cpp.html',1,'']]],
+ ['xbdbf4_2ecpp_139',['xbdbf4.cpp',['../xbdbf4_8cpp.html',1,'']]],
+ ['xbdouble_140',['xbDouble',['../namespacexb.html#a25f47b226ce924a5c78f97989b0744a2',1,'xb']]],
+ ['xbdrpix_2ecpp_141',['xbdrpix.cpp',['../xbdrpix_8cpp.html',1,'']]],
+ ['xbdrptbl_2ecpp_142',['xbdrptbl.cpp',['../xbdrptbl_8cpp.html',1,'']]],
+ ['xberrormessages_143',['xbErrorMessages',['../namespacexb.html#a04be228a037d220dd5564f5ef618adcc',1,'xb']]],
+ ['xbexp_144',['xbExp',['../classxb_1_1xbXBase.html#a3c3e5617be811d732472fe2cc8fb18cc',1,'xb::xbXBase']]],
+ ['xbexp_2ecpp_145',['xbexp.cpp',['../xbexp_8cpp.html',1,'']]],
+ ['xbexp_2eh_146',['xbexp.h',['../xbexp_8h.html',1,'']]],
+ ['xbexpnode_2ecpp_147',['xbexpnode.cpp',['../xbexpnode_8cpp.html',1,'']]],
+ ['xbexpnode_2eh_148',['xbexpnode.h',['../xbexpnode_8h.html',1,'']]],
+ ['xbfalse_149',['xbFalse',['../xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc',1,'xbtypes.h']]],
+ ['xbfclose_150',['xbFclose',['../classxb_1_1xbFile.html#a18830b5755d74818f60d9c7ce38ddf2d',1,'xb::xbFile']]],
+ ['xbfeof_151',['xbFeof',['../classxb_1_1xbFile.html#af5b6356832d2a67212070a1aa605f170',1,'xb::xbFile']]],
+ ['xbfflush_152',['xbFflush',['../classxb_1_1xbFile.html#ad205184d43409f04216540ae22f15009',1,'xb::xbFile']]],
+ ['xbfgetc_153',['xbFgetc',['../classxb_1_1xbFile.html#afb1c584d2895ffb7834df80aea7eb1e4',1,'xb::xbFile::xbFgetc(xbInt32 &amp;c)'],['../classxb_1_1xbFile.html#a5ee229bda4d7d6695e122200e581e7a6',1,'xb::xbFile::xbFgetc(char &amp;c)']]],
+ ['xbfgets_154',['xbFgets',['../classxb_1_1xbFile.html#ad245955ace26e5dde85fd4373b30d026',1,'xb::xbFile']]],
+ ['xbfields_2ecpp_155',['xbfields.cpp',['../xbfields_8cpp.html',1,'']]],
+ ['xbfile_156',['xbFile',['../classxb_1_1xbFile.html',1,'xb::xbFile'],['../classxb_1_1xbFile.html#a869eedd74c6eddc308852eb546c87176',1,'xb::xbFile::xbFile()']]],
+ ['xbfile_2ecpp_157',['xbfile.cpp',['../xbfile_8cpp.html',1,'']]],
+ ['xbfile_2eh_158',['xbfile.h',['../xbfile_8h.html',1,'']]],
+ ['xbfileno_159',['xbFileNo',['../xbtypes_8h.html#a2c65f692ac861990861575e18f72f6eb',1,'xbtypes.h']]],
+ ['xbfilter_2ecpp_160',['xbfilter.cpp',['../xbfilter_8cpp.html',1,'']]],
+ ['xbfilter_2eh_161',['xbfilter.h',['../xbfilter_8h.html',1,'']]],
+ ['xbfloat_162',['xbFloat',['../namespacexb.html#a83aa6a550398db55973aa9fb4257e66e',1,'xb']]],
+ ['xbfopen_163',['xbFopen',['../classxb_1_1xbFile.html#a7cdfef5ede9ac98d44a28a6b7a70972c',1,'xb::xbFile::xbFopen(xbInt16 iOpenMode)'],['../classxb_1_1xbFile.html#a0548cedf0f26b7d8ac221f75b0cd048c',1,'xb::xbFile::xbFopen(const xbString &amp;sOpenMode, xbInt16 iShareMode)'],['../classxb_1_1xbFile.html#aabd113333b49c36cad23244b392baab4',1,'xb::xbFile::xbFopen(xbInt16 iOpenMode, xbInt16 iShareMode)'],['../classxb_1_1xbFile.html#ab0fa19686ca8953ff4b556fb5b249135',1,'xb::xbFile::xbFopen(const xbString &amp;sMode, const xbString &amp;sFileName, xbInt16 iShareMode)']]],
+ ['xbfputc_164',['xbFputc',['../classxb_1_1xbFile.html#af2e940c78956e5cb6824f9a1bc404896',1,'xb::xbFile::xbFputc(xbInt32 c)'],['../classxb_1_1xbFile.html#a863f74cf17df8186d88586b4d2a6441a',1,'xb::xbFile::xbFputc(xbInt32 c, xbInt32 iNoTimes)']]],
+ ['xbfputs_165',['xbFputs',['../classxb_1_1xbFile.html#a698f3b40216778562e639e6ca1a47573',1,'xb::xbFile']]],
+ ['xbfread_166',['xbFread',['../classxb_1_1xbFile.html#ab4f6afaa1f77539f27a4f05c26e54e2f',1,'xb::xbFile']]],
+ ['xbfseek_167',['xbFseek',['../classxb_1_1xbFile.html#a5337ab8918df240910c0d19b4f298e3d',1,'xb::xbFile']]],
+ ['xbftell_168',['xbFtell',['../classxb_1_1xbFile.html#a0e1c06aedfa7fbcb92e117f891edd13b',1,'xb::xbFile']]],
+ ['xbfturnofffilebuffering_169',['xbFTurnOffFileBuffering',['../classxb_1_1xbFile.html#a9891b792f585a696f38a5cf959e30918',1,'xb::xbFile']]],
+ ['xbfuncs_2ecpp_170',['xbfuncs.cpp',['../xbfuncs_8cpp.html',1,'']]],
+ ['xbfwrite_171',['xbFwrite',['../classxb_1_1xbFile.html#a6aadd871d1782944703fed773d44b85f',1,'xb::xbFile']]],
+ ['xbindex_2eh_172',['xbindex.h',['../xbindex_8h.html',1,'']]],
+ ['xbinsert_2ecpp_173',['xbinsert.cpp',['../xbinsert_8cpp.html',1,'']]],
+ ['xbixbase_2ecpp_174',['xbixbase.cpp',['../xbixbase_8cpp.html',1,'']]],
+ ['xbixmdx_2ecpp_175',['xbixmdx.cpp',['../xbixmdx_8cpp.html',1,'']]],
+ ['xbixndx_2ecpp_176',['xbixndx.cpp',['../xbixndx_8cpp.html',1,'']]],
+ ['xblnklst_2eh_177',['xblnklst.h',['../xblnklst_8h.html',1,'']]],
+ ['xblnklstord_2eh_178',['xblnklstord.h',['../xblnklstord_8h.html',1,'']]],
+ ['xblnknod_2eh_179',['xblnknod.h',['../xblnknod_8h.html',1,'']]],
+ ['xblog_180',['xbLog',['../namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c',1,'xb']]],
+ ['xblog_2ecpp_181',['xblog.cpp',['../xblog_8cpp.html',1,'']]],
+ ['xblog_2eh_182',['xblog.h',['../xblog_8h.html',1,'']]],
+ ['xbmemcmp_183',['xbMemcmp',['../classxb_1_1xbXBase.html#a1b239c021358476382942522911b5c66',1,'xb::xbXBase']]],
+ ['xbmemo_2ecpp_184',['xbmemo.cpp',['../xbmemo_8cpp.html',1,'']]],
+ ['xbmemo_2eh_185',['xbmemo.h',['../xbmemo_8h.html',1,'']]],
+ ['xbmemo3_2ecpp_186',['xbmemo3.cpp',['../xbmemo3_8cpp.html',1,'']]],
+ ['xbmemo4_2ecpp_187',['xbmemo4.cpp',['../xbmemo4_8cpp.html',1,'']]],
+ ['xbofft_188',['xbOffT',['../namespacexb.html#ac963d9fde6debb416303cfbed35fb793',1,'xb']]],
+ ['xbreaduntil_189',['xbReadUntil',['../classxb_1_1xbFile.html#a08463f506f425c2385acbe1a561506e9',1,'xb::xbFile']]],
+ ['xbremove_190',['xbRemove',['../classxb_1_1xbFile.html#ab3c668a8570433188382d31d7c60bd48',1,'xb::xbFile::xbRemove()'],['../classxb_1_1xbFile.html#a6d919366c2ec95e529906bf8842cbf07',1,'xb::xbFile::xbRemove(const xbString &amp;sFileName, xbInt16 iOption)'],['../classxb_1_1xbFile.html#a58f6a6751fdf7e9549c273bb75d93eb5',1,'xb::xbFile::xbRemove(const xbString &amp;sFileName)']]],
+ ['xbrename_191',['xbRename',['../classxb_1_1xbFile.html#afc8ce113aa72611a278233f9bb170012',1,'xb::xbFile::xbRename(const xbString &amp;sOldName, const xbString &amp;sNewName)'],['../classxb_1_1xbFile.html#ab0b2a2c88947921d98ebcb5b5ec34ed9',1,'xb::xbFile::xbRename(const xbString &amp;sOldName, const xbString &amp;sNewName, xbInt16 iOption)']]],
+ ['xbretcod_2eh_192',['xbretcod.h',['../xbretcod_8h.html',1,'']]],
+ ['xbrewind_193',['xbRewind',['../classxb_1_1xbFile.html#a7996b6e084665c37c3892faea64b3505',1,'xb::xbFile']]],
+ ['xbschema_194',['xbSchema',['../structxb_1_1xbSchema.html',1,'xb']]],
+ ['xbset_2ecpp_195',['xbset.cpp',['../xbset_8cpp.html',1,'']]],
+ ['xbsleep_196',['xbSleep',['../classxb_1_1xbXBase.html#a0915aff7be4b2dd3e881f3c5d0da4baf',1,'xb::xbXBase']]],
+ ['xbsql_2ecpp_197',['xbsql.cpp',['../xbsql_8cpp.html',1,'']]],
+ ['xbsql_2eh_198',['xbsql.h',['../xbsql_8h.html',1,'']]],
+ ['xbssv_199',['xbSsv',['../classxb_1_1xbSsv.html',1,'xb::xbSsv'],['../classxb_1_1xbSsv.html#a58f85692c3167af20b1a7c17c621523b',1,'xb::xbSsv::xbSsv()']]],
+ ['xbssv_2ecpp_200',['xbssv.cpp',['../xbssv_8cpp.html',1,'']]],
+ ['xbssv_2eh_201',['xbssv.h',['../xbssv_8h.html',1,'']]],
+ ['xbstring_202',['xbString',['../classxb_1_1xbString.html',1,'xb::xbString'],['../classxb_1_1xbString.html#a18f3598dcdf2ec5692274fc8ee769ad7',1,'xb::xbString::xbString(const char *s, xbUInt32 lMaxLen)'],['../classxb_1_1xbString.html#ad865b55e3b08dffd527afee8e7e8e3fe',1,'xb::xbString::xbString(xbDouble d)'],['../classxb_1_1xbString.html#a25856311106c5fb15d39017b63f0ddc7',1,'xb::xbString::xbString(const char *=&quot;&quot;)'],['../classxb_1_1xbString.html#a63f9313217e0ff3c9789ec59316216a1',1,'xb::xbString::xbString(xbUInt32 size)'],['../classxb_1_1xbString.html#a0d81016b93fc36ebbbafacf35c677f07',1,'xb::xbString::xbString(const xbString &amp;s)'],['../classxb_1_1xbString.html#a14bbaa293c8d40dd6c64332f2668a92e',1,'xb::xbString::xbString(char c)']]],
+ ['xbstring_2ecpp_203',['xbstring.cpp',['../xbstring_8cpp.html',1,'']]],
+ ['xbstring_2eh_204',['xbstring.h',['../xbstring_8h.html',1,'']]],
+ ['xbtag_2ecpp_205',['xbtag.cpp',['../xbtag_8cpp.html',1,'']]],
+ ['xbtag_2eh_206',['xbtag.h',['../xbtag_8h.html',1,'']]],
+ ['xbtbllist_207',['xbTblList',['../structxb_1_1xbTblList.html',1,'xb']]],
+ ['xbtblmgr_208',['xbTblMgr',['../classxb_1_1xbTblMgr.html',1,'xb::xbTblMgr'],['../classxb_1_1xbTblMgr.html#aad83f5ecc184ca6cbdfc6f356b598d6c',1,'xb::xbTblMgr::xbTblMgr()']]],
+ ['xbtblmgr_2ecpp_209',['xbtblmgr.cpp',['../xbtblmgr_8cpp.html',1,'']]],
+ ['xbtblmgr_2eh_210',['xbtblmgr.h',['../xbtblmgr_8h.html',1,'']]],
+ ['xbtrue_211',['xbTrue',['../xbtypes_8h.html#ab0ae00665298fe7f5292691cb98ec2d9',1,'xbtypes.h']]],
+ ['xbtruncate_212',['xbTruncate',['../classxb_1_1xbFile.html#a518bfcbfa3699d883cf89affee383296',1,'xb::xbFile']]],
+ ['xbtypes_2eh_213',['xbtypes.h',['../xbtypes_8h.html',1,'']]],
+ ['xbuda_2ecpp_214',['xbuda.cpp',['../xbuda_8cpp.html',1,'']]],
+ ['xbuda_2eh_215',['xbuda.h',['../xbuda_8h.html',1,'']]],
+ ['xbxbase_216',['xbXBase',['../classxb_1_1xbXBase.html',1,'xb::xbXBase'],['../classxb_1_1xbXBase.html#a6c68588e33946fb5416af3f86fe83224',1,'xb::xbXBase::xbXBase()'],['../namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0',1,'xb::xbXBase()']]],
+ ['xbxbase_2ecpp_217',['xbxbase.cpp',['../xbxbase_8cpp.html',1,'']]],
+ ['xbxbase_2eh_218',['xbxbase.h',['../xbxbase_8h.html',1,'']]]
+];
diff --git a/docs/doxygen/html/search/all_16.html b/docs/doxygen/html/search/all_16.html
new file mode 100644
index 0000000..de305d9
--- /dev/null
+++ b/docs/doxygen/html/search/all_16.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_16.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_16.js b/docs/doxygen/html/search/all_16.js
new file mode 100644
index 0000000..5979b24
--- /dev/null
+++ b/docs/doxygen/html/search/all_16.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['yearof_0',['YearOf',['../classxb_1_1xbDate.html#a31057dfaa36389a16e40e3db82c46262',1,'xb::xbDate']]]
+];
diff --git a/docs/doxygen/html/search/all_17.html b/docs/doxygen/html/search/all_17.html
new file mode 100644
index 0000000..48229a0
--- /dev/null
+++ b/docs/doxygen/html/search/all_17.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_17.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_17.js b/docs/doxygen/html/search/all_17.js
new file mode 100644
index 0000000..7108002
--- /dev/null
+++ b/docs/doxygen/html/search/all_17.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['zap_0',['Zap',['../classxb_1_1xbDbf.html#a8ed0693b10b95aaa4e46037758d160ed',1,'xb::xbDbf']]],
+ ['zapchar_1',['ZapChar',['../classxb_1_1xbString.html#a2fd30956a26a260d1ef6fdbe73dd93f9',1,'xb::xbString']]],
+ ['zapleadingchar_2',['ZapLeadingChar',['../classxb_1_1xbString.html#addc3a470f6cd85d4c21bf9da38cf5ac9',1,'xb::xbString']]],
+ ['zaptrailingchar_3',['ZapTrailingChar',['../classxb_1_1xbString.html#afe3415bfa2e1089b792aeda0462fb99e',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/all_18.html b/docs/doxygen/html/search/all_18.html
new file mode 100644
index 0000000..c153550
--- /dev/null
+++ b/docs/doxygen/html/search/all_18.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_18.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_18.js b/docs/doxygen/html/search/all_18.js
new file mode 100644
index 0000000..d44ee63
--- /dev/null
+++ b/docs/doxygen/html/search/all_18.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['_7exbdate_0',['~xbDate',['../classxb_1_1xbDate.html#a05c9680c6eb9fe07ecf13a189b596c37',1,'xb::xbDate']]],
+ ['_7exbdbf_1',['~xbDbf',['../classxb_1_1xbDbf.html#a7eb87521fba8a939c613056d9918d880',1,'xb::xbDbf']]],
+ ['_7exbfile_2',['~xbFile',['../classxb_1_1xbFile.html#a491f6c48076e89da2e791a42b2727a90',1,'xb::xbFile']]],
+ ['_7exbstring_3',['~xbString',['../classxb_1_1xbString.html#a10a6549efab02bc76ab33b15916b1eb1',1,'xb::xbString']]],
+ ['_7exbtblmgr_4',['~xbTblMgr',['../classxb_1_1xbTblMgr.html#aad6be32d7b3378c71d47fa27ebfe6cbf',1,'xb::xbTblMgr']]],
+ ['_7exbxbase_5',['~xbXBase',['../classxb_1_1xbXBase.html#a204f8634894ac2066d3209117803306d',1,'xb::xbXBase']]]
+];
diff --git a/docs/doxygen/html/search/all_2.html b/docs/doxygen/html/search/all_2.html
new file mode 100644
index 0000000..259dde4
--- /dev/null
+++ b/docs/doxygen/html/search/all_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_2.js b/docs/doxygen/html/search/all_2.js
new file mode 100644
index 0000000..d45c7fc
--- /dev/null
+++ b/docs/doxygen/html/search/all_2.js
@@ -0,0 +1,32 @@
+var searchData=
+[
+ ['calcrollingcenturyforyear_0',['CalcRollingCenturyForYear',['../classxb_1_1xbDate.html#a9df58caa54105c489c314785c457e8cb',1,'xb::xbDate']]],
+ ['cencryptionflag_1',['cEncryptionFlag',['../classxb_1_1xbDbf.html#a8734e799707582f022fc341d515650f4',1,'xb::xbDbf']]],
+ ['centuryof_2',['CenturyOf',['../classxb_1_1xbDate.html#a38b2c5285c69ed65e94ece6c22dafde0',1,'xb::xbDate']]],
+ ['cfieldname_3',['cFieldName',['../structxb_1_1xbSchema.html#a514183856094123fd37df67885b4681e',1,'xb::xbSchema']]],
+ ['chardayof_4',['CharDayOf',['../classxb_1_1xbDate.html#a9fc29730b66cddfbb58c69992a99cc7c',1,'xb::xbDate']]],
+ ['charmonthof_5',['CharMonthOf',['../classxb_1_1xbDate.html#afffc84f02bd421335ff8ebe9fb3db0ac',1,'xb::xbDate']]],
+ ['checkndx_2ecpp_6',['checkndx.cpp',['../checkndx_8cpp.html',1,'']]],
+ ['chrontime_7',['ChronTime',['../tstfuncs_8cpp.html#af990eed1e43605771a5810196b4043f7',1,'tstfuncs.cpp']]],
+ ['cindexflag_8',['cIndexFlag',['../classxb_1_1xbDbf.html#ad59074633641e03647e54d2b66c9102b',1,'xb::xbDbf']]],
+ ['clangdriver_9',['cLangDriver',['../classxb_1_1xbDbf.html#aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1',1,'xb::xbDbf']]],
+ ['close_10',['Close',['../classxb_1_1xbDbf.html#ad68d73113e54e1b5f326e90f45e9989d',1,'xb::xbDbf']]],
+ ['closealltables_11',['CloseAllTables',['../classxb_1_1xbXBase.html#afccb552ca0daff779c0500ff20d22c2b',1,'xb::xbXBase']]],
+ ['commit_12',['Commit',['../classxb_1_1xbDbf.html#abd69532c885ab72bcf3fb5066b318f4f',1,'xb::xbDbf']]],
+ ['copy_13',['Copy',['../classxb_1_1xbString.html#ac7a8466b03c04df838bd182ef244f792',1,'xb::xbString']]],
+ ['copydbfstructure_14',['CopyDbfStructure',['../classxb_1_1xbDbf.html#a829c615a130a1fdf609d93438d8a6264',1,'xb::xbDbf']]],
+ ['countchar_15',['CountChar',['../classxb_1_1xbString.html#adc0204bcfd1c052b9aea9229b10acf72',1,'xb::xbString::CountChar(char c, xbInt16 iOpt) const'],['../classxb_1_1xbString.html#a26bc14d92dc7ce1f2bf31cd74af0db0f',1,'xb::xbString::CountChar(char c) const']]],
+ ['createtable_16',['CreateTable',['../classxb_1_1xbDbf.html#a73e41bfe679dd06ab16c436652df93f1',1,'xb::xbDbf']]],
+ ['createuniquefilename_17',['CreateUniqueFileName',['../classxb_1_1xbFile.html#aae9a2ddb0adb8165b4ac2b6a28a932f7',1,'xb::xbFile::CreateUniqueFileName(const xbString &amp;sDirIn, const xbString &amp;sExtIn, xbString &amp;sFqnOut)'],['../classxb_1_1xbFile.html#ae5ffabde2c88ea58324f27e471f6bfc0',1,'xb::xbFile::CreateUniqueFileName(const xbString &amp;sDirIn, const xbString &amp;sExtIn, xbString &amp;sFqnOut, xbInt16 iOption)']]],
+ ['ctod_18',['CTOD',['../classxb_1_1xbDate.html#abb1eb4b0394e4a67aadab15779b1b8c5',1,'xb::xbDate']]],
+ ['ctransactionflag_19',['cTransactionFlag',['../classxb_1_1xbDbf.html#ac3c89fc3bc6a6abf385478a8adbed970',1,'xb::xbDbf']]],
+ ['ctype_20',['cType',['../structxb_1_1xbSchema.html#a1d612b2ed5dc0b0289c9e91b3cda3a25',1,'xb::xbSchema']]],
+ ['cupdatedd_21',['cUpdateDD',['../classxb_1_1xbDbf.html#a6021789d314cd41488991e708fcd0df2',1,'xb::xbDbf']]],
+ ['cupdatemm_22',['cUpdateMM',['../classxb_1_1xbDbf.html#a9340a5e8ee53eb0f3b6601eec2d71e1b',1,'xb::xbDbf']]],
+ ['cupdateyy_23',['cUpdateYY',['../classxb_1_1xbDbf.html#a4fcd6a86ddd32d4a9d76a4074573440a',1,'xb::xbDbf']]],
+ ['cversion_24',['cVersion',['../classxb_1_1xbDbf.html#a3a262abf658e5fa968b57ef457a69470',1,'xb::xbDbf']]],
+ ['cvthexchar_25',['CvtHexChar',['../classxb_1_1xbString.html#a0a737bd408a94903f214eb2879eb56de',1,'xb::xbString']]],
+ ['cvthexstring_26',['CvtHexString',['../classxb_1_1xbString.html#ab5eb6918a0ae9ab6c0e961318f3d1eb0',1,'xb::xbString']]],
+ ['cvtlonglong_27',['CvtLongLong',['../classxb_1_1xbString.html#ae3ab18365e132323f8ae4c99eb72181c',1,'xb::xbString']]],
+ ['cvtulonglong_28',['CvtULongLong',['../classxb_1_1xbString.html#a1528b30b84a41c3564ef31d1f4496b15',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/all_3.html b/docs/doxygen/html/search/all_3.html
new file mode 100644
index 0000000..1e60c94
--- /dev/null
+++ b/docs/doxygen/html/search/all_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_3.js b/docs/doxygen/html/search/all_3.js
new file mode 100644
index 0000000..1eef659
--- /dev/null
+++ b/docs/doxygen/html/search/all_3.js
@@ -0,0 +1,21 @@
+var searchData=
+[
+ ['dateisvalid_0',['DateIsValid',['../classxb_1_1xbDate.html#a367f66ef0c03c1747c12a18784554ccb',1,'xb::xbDate']]],
+ ['dayof_1',['DayOf',['../classxb_1_1xbDate.html#ad6417a900ce64a46f8909c0c7a2ddea2',1,'xb::xbDate']]],
+ ['dbfxtrct_2ecpp_2',['dbfxtrct.cpp',['../dbfxtrct_8cpp.html',1,'']]],
+ ['dblequals_3',['dblEquals',['../tstfuncs_8cpp.html#a8b8e417213c57f2ea0bcb61a7fb28860',1,'tstfuncs.cpp']]],
+ ['dblmax_4',['dblMax',['../tstfuncs_8cpp.html#a69a6e718e066af7f8392e5f1fea40d1b',1,'tstfuncs.cpp']]],
+ ['dblmin_5',['dblMin',['../tstfuncs_8cpp.html#a4d7b8f3f1ce52c6c0a281f25419f4c93',1,'tstfuncs.cpp']]],
+ ['deleteall_6',['DeleteAll',['../classxb_1_1xbDbf.html#a01c26b67e312be1e674b3da710e031b9',1,'xb::xbDbf']]],
+ ['deleteallrecords_7',['DeleteAllRecords',['../classxb_1_1xbDbf.html#a3067fdfa3a7a5c15651f6e89d1102176',1,'xb::xbDbf']]],
+ ['deleterecord_8',['DeleteRecord',['../classxb_1_1xbDbf.html#acd8c10579229f3a2e2c5fdb7fcef90db',1,'xb::xbDbf']]],
+ ['deletetable_9',['DeleteTable',['../classxb_1_1xbDbf.html#a4085ed4f049d976124d8edc3d3c56397',1,'xb::xbDbf']]],
+ ['determinexbasememoversion_10',['DetermineXbaseMemoVersion',['../classxb_1_1xbFile.html#a5a740033664c9ad2611c90e2a6d0c2d3',1,'xb::xbFile']]],
+ ['determinexbasetableversion_11',['DetermineXbaseTableVersion',['../classxb_1_1xbFile.html#ae2b6ac26018dc28f77afbb3f008c3f66',1,'xb::xbFile']]],
+ ['devtester_12',['DevTester',['../xb__test__expression_8cpp.html#aee57237c5f5b9b4d80e84bf530eb42bc',1,'xb_test_expression.cpp']]],
+ ['disablemsglogging_13',['DisableMsgLogging',['../classxb_1_1xbXBase.html#ae357fac4fdebdf49e46563cf611caf65',1,'xb::xbXBase']]],
+ ['displayerror_14',['DisplayError',['../classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d',1,'xb::xbSsv']]],
+ ['displaytablelist_15',['DisplayTableList',['../classxb_1_1xbTblMgr.html#a5eebffb9e8cc64141e35c2622045cb50',1,'xb::xbTblMgr']]],
+ ['dumpheader_16',['DumpHeader',['../classxb_1_1xbDbf.html#ab1f4a515533402f872cedcd0322aabd4',1,'xb::xbDbf']]],
+ ['dumprecord_17',['DumpRecord',['../classxb_1_1xbDbf.html#a3a6a068addffd06fc9a996639d6ca69e',1,'xb::xbDbf']]]
+];
diff --git a/docs/doxygen/html/search/all_4.html b/docs/doxygen/html/search/all_4.html
new file mode 100644
index 0000000..08f1aed
--- /dev/null
+++ b/docs/doxygen/html/search/all_4.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_4.js b/docs/doxygen/html/search/all_4.js
new file mode 100644
index 0000000..30781e1
--- /dev/null
+++ b/docs/doxygen/html/search/all_4.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+ ['egetdouble_0',['eGetDouble',['../classxb_1_1xbFile.html#ab14e4a11427f5efb81cba1dd32bd1aa1',1,'xb::xbFile']]],
+ ['egetint16_1',['eGetInt16',['../classxb_1_1xbFile.html#ac40c991110ddc6fb30a72d90f4652762',1,'xb::xbFile']]],
+ ['egetint32_2',['eGetInt32',['../classxb_1_1xbFile.html#a60b24a5afc984c586bf384c7e915ba0d',1,'xb::xbFile']]],
+ ['egetuint16_3',['eGetUInt16',['../classxb_1_1xbFile.html#a936ade458e6d5e6d29f9b5031888d189',1,'xb::xbFile']]],
+ ['egetuint32_4',['eGetUInt32',['../classxb_1_1xbFile.html#a78f052529d39a18deaface5a0d47d0b0',1,'xb::xbFile']]],
+ ['enablemsglogging_5',['EnableMsgLogging',['../classxb_1_1xbXBase.html#a470e6eb0ed0be60338f9b40976d3ad48',1,'xb::xbXBase']]],
+ ['eputdouble_6',['ePutDouble',['../classxb_1_1xbFile.html#a98b6ff533ae93f90c977a2ba23eeb105',1,'xb::xbFile']]],
+ ['eputint16_7',['ePutInt16',['../classxb_1_1xbFile.html#a29130f12739ac8fa837f4eaedf1338b2',1,'xb::xbFile']]],
+ ['eputint32_8',['ePutInt32',['../classxb_1_1xbFile.html#a19c37f76a2ccbb45019cb0fc373d3f46',1,'xb::xbFile']]],
+ ['eputuint16_9',['ePutUInt16',['../classxb_1_1xbFile.html#a65e9839f92b96eac7b0d071fac3bbe40',1,'xb::xbFile']]],
+ ['eputuint32_10',['ePutUInt32',['../classxb_1_1xbFile.html#aa3f6ceae4b96f24875d86848bf13a173',1,'xb::xbFile']]],
+ ['errorcodetext_11',['ErrorCodeText',['../classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e',1,'xb::xbSsv']]],
+ ['extractelement_12',['ExtractElement',['../classxb_1_1xbString.html#a77195fc4957952625cb33bb503517a3e',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/all_5.html b/docs/doxygen/html/search/all_5.html
new file mode 100644
index 0000000..0d85fcc
--- /dev/null
+++ b/docs/doxygen/html/search/all_5.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_5.js b/docs/doxygen/html/search/all_5.js
new file mode 100644
index 0000000..09a9029
--- /dev/null
+++ b/docs/doxygen/html/search/all_5.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['filecompare_0',['FileCompare',['../tstfuncs_8cpp.html#aa5dbb64c6135ac01f79e5b6087270cf5',1,'tstfuncs.cpp']]],
+ ['fileexists_1',['FileExists',['../classxb_1_1xbFile.html#a78bd8a11dce102647095baf3aff2b006',1,'xb::xbFile::FileExists() const'],['../classxb_1_1xbFile.html#a174d8a6aabc9cfcd32fedbd1e5b13ddd',1,'xb::xbFile::FileExists(xbInt16 iOption) const'],['../classxb_1_1xbFile.html#a61130b4fbf4cf9d5972dcb4993de2f94',1,'xb::xbFile::FileExists(const xbString &amp;sFileName) const'],['../classxb_1_1xbFile.html#a0592168f39a10f2a401a88ef781f6148',1,'xb::xbFile::FileExists(const xbString &amp;sFileName, xbInt16 iOption) const']]],
+ ['fileisopen_2',['FileIsOpen',['../classxb_1_1xbFile.html#a7fa837938a32dc9ca3fbc81cbaf50f59',1,'xb::xbFile']]],
+ ['flushlog_3',['FlushLog',['../classxb_1_1xbXBase.html#a5a5ecaed9777978344902446c9ae3b8e',1,'xb::xbXBase']]],
+ ['formatdate_4',['FormatDate',['../classxb_1_1xbDate.html#a01de44dc869f7db99f33046fc91f2c6a',1,'xb::xbDate']]]
+];
diff --git a/docs/doxygen/html/search/all_6.html b/docs/doxygen/html/search/all_6.html
new file mode 100644
index 0000000..7e088b8
--- /dev/null
+++ b/docs/doxygen/html/search/all_6.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_6.js b/docs/doxygen/html/search/all_6.js
new file mode 100644
index 0000000..e6c6187
--- /dev/null
+++ b/docs/doxygen/html/search/all_6.js
@@ -0,0 +1,65 @@
+var searchData=
+[
+ ['getautocommit_0',['GetAutoCommit',['../classxb_1_1xbDbf.html#ae0c00226fd2ea7a67f101e795467ed68',1,'xb::xbDbf::GetAutoCommit(xbInt16 iOption) const'],['../classxb_1_1xbDbf.html#abb9e20c5efacd4fea80f1515abbc6b55',1,'xb::xbDbf::GetAutoCommit() const']]],
+ ['getblocksize_1',['GetBlockSize',['../classxb_1_1xbFile.html#a638e14262410a1627819f016a16cdce2',1,'xb::xbFile']]],
+ ['getcharacter_2',['GetCharacter',['../classxb_1_1xbString.html#a685187a5f8401b322fc61f3fbe56330d',1,'xb::xbString']]],
+ ['getcurrecno_3',['GetCurRecNo',['../classxb_1_1xbDbf.html#a643a80a3792a52760c8e09ba18719503',1,'xb::xbDbf']]],
+ ['getdatadirectory_4',['GetDataDirectory',['../classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9',1,'xb::xbSsv']]],
+ ['getdatefield_5',['GetDateField',['../classxb_1_1xbDbf.html#af78ef1fba949463ff7f829d3cffc4555',1,'xb::xbDbf::GetDateField(xbInt16 iFieldNo, xbDate &amp;dt) const'],['../classxb_1_1xbDbf.html#ac624e06a97666bfd64b4f252b4548b36',1,'xb::xbDbf::GetDateField(const xbString &amp;sFieldName, xbDate &amp;dt) const']]],
+ ['getdbfptr_6',['GetDbfPtr',['../classxb_1_1xbTblMgr.html#ad8a5d28a2ee6720a9aa74bcb45662cf5',1,'xb::xbTblMgr::GetDbfPtr(const xbString &amp;sTblAlias) const'],['../classxb_1_1xbTblMgr.html#a801dfecf7fc216954b4197b2c31b25d6',1,'xb::xbTblMgr::GetDbfPtr(xbInt16 sItemNo) const']]],
+ ['getdbfstatus_7',['GetDbfStatus',['../classxb_1_1xbDbf.html#ac1110d867ba297a52c8b0e83e88f05e6',1,'xb::xbDbf']]],
+ ['getdefaultautocommit_8',['GetDefaultAutoCommit',['../classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5',1,'xb::xbSsv']]],
+ ['getdefaultdateformat_9',['GetDefaultDateFormat',['../classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2',1,'xb::xbSsv']]],
+ ['getdefaultlogdirectory_10',['GetDefaultLogDirectory',['../classxb_1_1xbSsv.html#abf3763faf6a8917a963213cd53af529c',1,'xb::xbSsv']]],
+ ['getdefaultlogfilename_11',['GetDefaultLogFileName',['../classxb_1_1xbSsv.html#a43878d4dc041f2a5e2398a118ccfaf79',1,'xb::xbSsv']]],
+ ['getdirectory_12',['GetDirectory',['../classxb_1_1xbFile.html#acd0fb2166b2bff7e8a1cf65a7bc8be1e',1,'xb::xbFile']]],
+ ['getdoublefield_13',['GetDoubleField',['../classxb_1_1xbDbf.html#a4556041a7ff2f6b6f986729901c11f08',1,'xb::xbDbf::GetDoubleField(xbInt16 FieldNo, xbDouble &amp;dFieldValue) const'],['../classxb_1_1xbDbf.html#a2370b5e736931441a5968649291b9ef4',1,'xb::xbDbf::GetDoubleField(xbInt16 FieldNo, xbDouble &amp;dFieldValue, xbInt16 iRecBufSw) const'],['../classxb_1_1xbDbf.html#a6e6774df0f2d7733f4b25a9989596d95',1,'xb::xbDbf::GetDoubleField(const xbString &amp;sFieldName, xbDouble &amp;dFieldValue) const']]],
+ ['getendiantype_14',['GetEndianType',['../classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243',1,'xb::xbSsv']]],
+ ['geterrormessage_15',['GetErrorMessage',['../classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4',1,'xb::xbSsv']]],
+ ['getfield_16',['GetField',['../classxb_1_1xbDbf.html#a9a0fcf7e2040ab483e3807927833cb26',1,'xb::xbDbf::GetField(const xbString &amp;sFieldName, xbString &amp;sFieldValue) const'],['../classxb_1_1xbDbf.html#ad245a26eb8b79610c9ae7bab19e05513',1,'xb::xbDbf::GetField(xbInt16 iFieldNo, xbString &amp;sFieldValue, xbInt16 iRecBufSw) const'],['../classxb_1_1xbDbf.html#ac81f078f3c932f0da60ad1fbdd848d3e',1,'xb::xbDbf::GetField(xbInt16 iFieldNo, xbString &amp;sFieldValue) const']]],
+ ['getfieldcnt_17',['GetFieldCnt',['../classxb_1_1xbDbf.html#add27d8ef555a13b336b8c804165dc15e',1,'xb::xbDbf']]],
+ ['getfielddecimal_18',['GetFieldDecimal',['../classxb_1_1xbDbf.html#abcb4defad2e1b6e67f63cc60737ad840',1,'xb::xbDbf::GetFieldDecimal(xbInt16 iFieldNo, xbInt16 &amp;iFieldDecimal) const'],['../classxb_1_1xbDbf.html#a607f774fcd6dc0b9913d7a7801b60db2',1,'xb::xbDbf::GetFieldDecimal(const xbString &amp;sFieldName, xbInt16 &amp;iFieldDecimal) const']]],
+ ['getfieldlen_19',['GetFieldLen',['../classxb_1_1xbDbf.html#adda4302b58cc6109b048f19d9b68bbd4',1,'xb::xbDbf::GetFieldLen(xbInt16 iFieldNo, xbInt16 &amp;iFieldLen) const'],['../classxb_1_1xbDbf.html#acf06dbccdba1a4bcd90fa0bea6cca59b',1,'xb::xbDbf::GetFieldLen(const xbString &amp;sFieldName, xbInt16 &amp;iFieldLen) const']]],
+ ['getfieldname_20',['GetFieldName',['../classxb_1_1xbDbf.html#a5e3e4368bfba1724c016b8859023e34c',1,'xb::xbDbf']]],
+ ['getfieldno_21',['GetFieldNo',['../classxb_1_1xbDbf.html#aed9113b5095c6df1b9c854cbd0d8047b',1,'xb::xbDbf::GetFieldNo(const xbString &amp;sFieldName, xbInt16 &amp;iFieldNo) const'],['../classxb_1_1xbDbf.html#aad9029e63909aeb77d8473256d88bea8',1,'xb::xbDbf::GetFieldNo(const xbString &amp;sFieldName) const']]],
+ ['getfieldtype_22',['GetFieldType',['../classxb_1_1xbDbf.html#a181db879f1a75f93a34c03513a0b2fea',1,'xb::xbDbf::GetFieldType(const xbString &amp;sFieldName, char &amp;cFieldType) const'],['../classxb_1_1xbDbf.html#a5143973e4f165651152aa13c8fd45f84',1,'xb::xbDbf::GetFieldType(xbInt16 iFieldNo, char &amp;cFieldType) const']]],
+ ['getfiledirpart_23',['GetFileDirPart',['../classxb_1_1xbFile.html#a60c53998e3d1b694134b20a87bc9bf5a',1,'xb::xbFile::GetFileDirPart(xbString &amp;sFileDirPartOut) const'],['../classxb_1_1xbFile.html#af5127c92892816e9bbc5c19653c4147a',1,'xb::xbFile::GetFileDirPart(const xbString &amp;sCompleteFileNameIn, xbString &amp;sFileDirPartOut) const']]],
+ ['getfileextpart_24',['GetFileExtPart',['../classxb_1_1xbFile.html#a57a9222e5cbb51019d4eeb2c3ac89fa2',1,'xb::xbFile::GetFileExtPart(xbString &amp;sFileExtPartOut) const'],['../classxb_1_1xbFile.html#ab289b6ffe955321160c1f90220c22e25',1,'xb::xbFile::GetFileExtPart(const xbString &amp;sCompleteFileNameIn, xbString &amp;sFileExtPartOut) const']]],
+ ['getfilemtime_25',['GetFileMtime',['../classxb_1_1xbFile.html#a02df78f4c90313243f508fc56b95aba8',1,'xb::xbFile']]],
+ ['getfilename_26',['GetFileName',['../classxb_1_1xbFile.html#ac95cb882ccbcdedc9a233c6ad9fed07a',1,'xb::xbFile']]],
+ ['getfilenamepart_27',['GetFileNamePart',['../classxb_1_1xbFile.html#a81422b3dd52763d2cc6c77237ec9af0a',1,'xb::xbFile::GetFileNamePart(xbString &amp;sFileNamePartOut) const'],['../classxb_1_1xbFile.html#a6110763c5ae996b72c7a62c15bdecc73',1,'xb::xbFile::GetFileNamePart(const xbString &amp;sCompleteFileNameIn, xbString &amp;sFileNamePartOut) const']]],
+ ['getfilesize_28',['GetFileSize',['../classxb_1_1xbFile.html#a50b63c39e49d44e52078038027b24cc5',1,'xb::xbFile']]],
+ ['getfiletype_29',['GetFileType',['../classxb_1_1xbFile.html#a5548236d38d43b89ae29b9a015b1f678',1,'xb::xbFile']]],
+ ['getfirstrecord_30',['GetFirstRecord',['../classxb_1_1xbDbf.html#acb78991e8435edd36318c653cb977c1a',1,'xb::xbDbf::GetFirstRecord(xbInt16 iOption)'],['../classxb_1_1xbDbf.html#a6fc5b8a3e2f177d5ceaf9d975cbb5226',1,'xb::xbDbf::GetFirstRecord()']]],
+ ['getfloatfield_31',['GetFloatField',['../classxb_1_1xbDbf.html#a3443f646038ced14425f067a59c0f2da',1,'xb::xbDbf::GetFloatField(xbInt16 iFieldNo, xbFloat &amp;fFieldValue) const'],['../classxb_1_1xbDbf.html#a81ef2f36f921d7ece066a592eb6393eb',1,'xb::xbDbf::GetFloatField(const xbString &amp;sFieldName, xbFloat &amp;fFieldValue) const']]],
+ ['getfqfilename_32',['GetFqFileName',['../classxb_1_1xbFile.html#a31b4e641f93206ba23e2a5a27491dcd4',1,'xb::xbFile']]],
+ ['getfunctioninfo_33',['GetFunctionInfo',['../classxb_1_1xbXBase.html#ae52e53340593b4253936c1372ec15ee1',1,'xb::xbXBase']]],
+ ['getlastpos_34',['GetLastPos',['../classxb_1_1xbString.html#ac7698665f44413a5e99a5b5bc573c6df',1,'xb::xbString::GetLastPos(char c) const'],['../classxb_1_1xbString.html#a1c55587904fe7e534290559d0ecb8646',1,'xb::xbString::GetLastPos(const char *s) const']]],
+ ['getlastrecord_35',['GetLastRecord',['../classxb_1_1xbDbf.html#a49e667f9c8ee55c36444702663fc5964',1,'xb::xbDbf::GetLastRecord()'],['../classxb_1_1xbDbf.html#a8ccfa2291417412b6894940d1b92f9a6',1,'xb::xbDbf::GetLastRecord(xbInt16 iOption)']]],
+ ['getlogdirectory_36',['GetLogDirectory',['../classxb_1_1xbXBase.html#a51d49b4d699740194b28c6ec0d0ee07b',1,'xb::xbXBase']]],
+ ['getlogfilename_37',['GetLogFileName',['../classxb_1_1xbXBase.html#ac0744edf9e4aa959d8cf2daa874376af',1,'xb::xbXBase']]],
+ ['getlogfqfilename_38',['GetLogFqFileName',['../classxb_1_1xbXBase.html#ab5d63cd7d9137eba8a1d4d9c3df522b7',1,'xb::xbXBase']]],
+ ['getlogicalfield_39',['GetLogicalField',['../classxb_1_1xbDbf.html#a3254f091fc4a1404abed3dd2bcdd6ce6',1,'xb::xbDbf::GetLogicalField(xbInt16 iFieldNo, xbString &amp;sFieldData) const'],['../classxb_1_1xbDbf.html#a943cea7fde1b06c1a05184193eff8d2d',1,'xb::xbDbf::GetLogicalField(const xbString &amp;sFieldName, xbBool &amp;bFieldData) const'],['../classxb_1_1xbDbf.html#ab28feef20c988b0a6f1c1911a45377b0',1,'xb::xbDbf::GetLogicalField(xbInt16 iFieldNo, xbBool &amp;bFieldData, xbInt16 iRecBufSw) const'],['../classxb_1_1xbDbf.html#aaf615ddcf08f8cd14efc713c2a8d7ae1',1,'xb::xbDbf::GetLogicalField(xbInt16 iFieldNo, xbBool &amp;bFieldData) const'],['../classxb_1_1xbDbf.html#a9cd6819bfd932ff8507e54d9cb9a624e',1,'xb::xbDbf::GetLogicalField(const xbString &amp;sFieldName, xbString &amp;sFieldData) const']]],
+ ['getlogstatus_40',['GetLogStatus',['../classxb_1_1xbXBase.html#ade34cd72c2a7e70fb55429a8a6f6c028',1,'xb::xbXBase']]],
+ ['getlongfield_41',['GetLongField',['../classxb_1_1xbDbf.html#abe525c0820640e0a9e169d0b7913cfa1',1,'xb::xbDbf::GetLongField(xbInt16 iFieldNo, xbInt32 &amp;lFieldValue) const'],['../classxb_1_1xbDbf.html#a7b8ef75b17941beac17e50e969b2d3db',1,'xb::xbDbf::GetLongField(const xbString &amp;sFieldName, xbInt32 &amp;lFieldValue) const']]],
+ ['getmultiuser_42',['GetMultiUser',['../classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5',1,'xb::xbSsv']]],
+ ['getnextrecord_43',['GetNextRecord',['../classxb_1_1xbDbf.html#a18fdcb4ab15b36cd47fa6f6f7a540d1a',1,'xb::xbDbf::GetNextRecord(xbInt16 iOption, xbUInt32 ulStartRec)'],['../classxb_1_1xbDbf.html#ab896fe3b734f556de578d30f92b18fe2',1,'xb::xbDbf::GetNextRecord()'],['../classxb_1_1xbDbf.html#a3191428a7a92d9107d8d42448884f2ac',1,'xb::xbDbf::GetNextRecord(xbInt16 iOption)']]],
+ ['getnextsqlcmd_44',['GetNextSqlCmd',['../xb__execsql_8cpp.html#af888ba5e7e94d92c2165362b87f1ea0e',1,'xb_execsql.cpp']]],
+ ['getopenmode_45',['GetOpenMode',['../classxb_1_1xbFile.html#a3c500dc9dac22c49496e4b29386b2dd3',1,'xb::xbFile']]],
+ ['getopentablecount_46',['GetOpenTableCount',['../classxb_1_1xbTblMgr.html#ad0d2d4adabc0dc0e761cfdee63c84069',1,'xb::xbTblMgr']]],
+ ['getpathseparator_47',['GetPathSeparator',['../classxb_1_1xbString.html#af8b8b808cf43cd352321b43f500142db',1,'xb::xbString']]],
+ ['getphysicalixcnt_48',['GetPhysicalIxCnt',['../classxb_1_1xbDbf.html#a13393704a8a191d4d6555ae31d3c3e92',1,'xb::xbDbf']]],
+ ['getprevrecord_49',['GetPrevRecord',['../classxb_1_1xbDbf.html#a7eadc7b08d73003802b90584f7b33387',1,'xb::xbDbf::GetPrevRecord(xbInt16 iOption)'],['../classxb_1_1xbDbf.html#ab3d248e5221b4f0809897cd43af17a1e',1,'xb::xbDbf::GetPrevRecord()']]],
+ ['getrawfield_50',['GetRawField',['../classxb_1_1xbDbf.html#aabd146c0e1054ab905ec96aedd84b02e',1,'xb::xbDbf']]],
+ ['getrecord_51',['GetRecord',['../classxb_1_1xbDbf.html#a26fba086b07caeab95066bf1c8d25161',1,'xb::xbDbf']]],
+ ['getrecordbuf_52',['GetRecordBuf',['../classxb_1_1xbDbf.html#aa3e38c4057d726a28a27d07a1610d124',1,'xb::xbDbf']]],
+ ['getrecordcnt_53',['GetRecordCnt',['../classxb_1_1xbDbf.html#ac196ad55335e1f4789d698748434dc89',1,'xb::xbDbf']]],
+ ['getrecordlen_54',['GetRecordLen',['../classxb_1_1xbDbf.html#ab50d76c6e29e81e347a6feb04c2f62bb',1,'xb::xbDbf']]],
+ ['getsharemode_55',['GetShareMode',['../classxb_1_1xbFile.html#a9b63e05b77f477ff6109ff7b9432c1b6',1,'xb::xbFile']]],
+ ['getsize_56',['GetSize',['../classxb_1_1xbString.html#a6c33e73659f8e98819289d2661c7271c',1,'xb::xbString']]],
+ ['gettblalias_57',['GetTblAlias',['../classxb_1_1xbDbf.html#a27758a325c097f204247908b65ba7fbd',1,'xb::xbDbf']]],
+ ['getulongfield_58',['GetULongField',['../classxb_1_1xbDbf.html#a67e3a050f9090edf69eee75aef7f5d83',1,'xb::xbDbf::GetULongField(xbInt16 iFieldNo, xbUInt32 &amp;lFieldValue) const'],['../classxb_1_1xbDbf.html#a039eb02418ec4ca862adbc0f95b9cbec',1,'xb::xbDbf::GetULongField(const xbString &amp;sFieldName, xbUInt32 &amp;lFieldValue) const']]],
+ ['getversion_59',['GetVersion',['../classxb_1_1xbDbf.html#a49212a9eb17f7fa9f303e08d5fc50fc6',1,'xb::xbDbf']]],
+ ['getxbasefiletypebyte_60',['GetXbaseFileTypeByte',['../classxb_1_1xbFile.html#aaf2e697751a0beff41432a66bb83fb5e',1,'xb::xbFile::GetXbaseFileTypeByte(const xbString &amp;sFileName, xbInt16 &amp;iVersion)'],['../classxb_1_1xbFile.html#a7af337808919680b90710ad5e8a99232',1,'xb::xbFile::GetXbaseFileTypeByte(const xbString &amp;sFileName, unsigned char &amp;cFileTypeByte)'],['../classxb_1_1xbFile.html#a78aebdd21d3de46a450d5f835e3027f6',1,'xb::xbFile::GetXbaseFileTypeByte(const xbString &amp;sFileName, unsigned char &amp;cFileTypeByte, xbInt16 &amp;iVersion)']]],
+ ['getxbaseptr_61',['GetXbasePtr',['../classxb_1_1xbDbf.html#ab21ec23c076b0c9affdc0f6672bd133f',1,'xb::xbDbf']]]
+];
diff --git a/docs/doxygen/html/search/all_7.html b/docs/doxygen/html/search/all_7.html
new file mode 100644
index 0000000..d2b1825
--- /dev/null
+++ b/docs/doxygen/html/search/all_7.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_7.js b/docs/doxygen/html/search/all_7.js
new file mode 100644
index 0000000..6a2cc28
--- /dev/null
+++ b/docs/doxygen/html/search/all_7.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['hasalphachars_0',['HasAlphaChars',['../classxb_1_1xbString.html#aa13f6b72e5a529eab04545892bbc98b4',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/all_8.html b/docs/doxygen/html/search/all_8.html
new file mode 100644
index 0000000..f4e3a2a
--- /dev/null
+++ b/docs/doxygen/html/search/all_8.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_8.js b/docs/doxygen/html/search/all_8.js
new file mode 100644
index 0000000..b9794d9
--- /dev/null
+++ b/docs/doxygen/html/search/all_8.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+ ['iautocommit_0',['iAutoCommit',['../classxb_1_1xbDbf.html#ab506450954bc86e7bf1d7c4efe681f43',1,'xb::xbDbf']]],
+ ['idbfstatus_1',['iDbfStatus',['../classxb_1_1xbDbf.html#a6d8e193da3ca414eef1e8866ec5ca81b',1,'xb::xbDbf']]],
+ ['iendiantype_2',['iEndianType',['../classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3',1,'xb::xbSsv']]],
+ ['ifieldlen_3',['iFieldLen',['../structxb_1_1xbSchema.html#a2da554af25ef628acf59bb52996056ac',1,'xb::xbSchema']]],
+ ['ifileversion_4',['iFileVersion',['../classxb_1_1xbDbf.html#a15f495446f0d75bcf2fa89e3b699d388',1,'xb::xbDbf']]],
+ ['inittime_5',['InitTime',['../tstfuncs_8cpp.html#ab1f17da15e67a8b2460d5a88b7a3db6e',1,'tstfuncs.cpp']]],
+ ['initvars_6',['InitVars',['../classxb_1_1xbDbf.html#ad06fe0f7975fb81125d27d82504e6829',1,'xb::xbDbf']]],
+ ['inoofdecs_7',['iNoOfDecs',['../structxb_1_1xbSchema.html#a55bab3bb69dee3508d168c93e182d4b9',1,'xb::xbSchema']]],
+ ['inooffields_8',['iNoOfFields',['../classxb_1_1xbDbf.html#a5056757614c39f725cc775332494966a',1,'xb::xbDbf']]],
+ ['isempty_9',['IsEmpty',['../classxb_1_1xbString.html#a4a255a30d683acd62ea09c1617b53cb3',1,'xb::xbString']]],
+ ['isleapyear_10',['IsLeapYear',['../classxb_1_1xbDate.html#af2bd33a72448e2c5ee00d8b711dc5d95',1,'xb::xbDate::IsLeapYear(xbInt16 iYear) const'],['../classxb_1_1xbDate.html#a5f8051c31b29244265e8f26ac3547b9b',1,'xb::xbDate::IsLeapYear() const']]],
+ ['isnull_11',['IsNull',['../classxb_1_1xbString.html#a3fa34fa31bcb7244ecb054ab628ad500',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/all_9.html b/docs/doxygen/html/search/all_9.html
new file mode 100644
index 0000000..89177a8
--- /dev/null
+++ b/docs/doxygen/html/search/all_9.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_9.js b/docs/doxygen/html/search/all_9.js
new file mode 100644
index 0000000..9143c4b
--- /dev/null
+++ b/docs/doxygen/html/search/all_9.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['jul_5foffset_0',['JUL_OFFSET',['../xbdate_8h.html#a119f32fda399e2ebc2d734012a130e8f',1,'xbdate.h']]],
+ ['juliandays_1',['JulianDays',['../classxb_1_1xbDate.html#a1ee3377d4ead9d31099eee539d9b13a7',1,'xb::xbDate']]],
+ ['jultodate8_2',['JulToDate8',['../classxb_1_1xbDate.html#a9d28b2a46d8aaa284b92f44eeb96b2ff',1,'xb::xbDate']]]
+];
diff --git a/docs/doxygen/html/search/all_a.html b/docs/doxygen/html/search/all_a.html
new file mode 100644
index 0000000..1f90b7a
--- /dev/null
+++ b/docs/doxygen/html/search/all_a.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_a.js b/docs/doxygen/html/search/all_a.js
new file mode 100644
index 0000000..ad825ae
--- /dev/null
+++ b/docs/doxygen/html/search/all_a.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['lastdayofmonth_0',['LastDayOfMonth',['../classxb_1_1xbDate.html#a15847866bb7642aa42bc254e0cf2038a',1,'xb::xbDate']]],
+ ['left_1',['Left',['../classxb_1_1xbString.html#acdc3a6d6955b99f0a6b1d181fb3098b9',1,'xb::xbString']]],
+ ['len_2',['Len',['../classxb_1_1xbString.html#a998b240eedac311aea5843047f55649b',1,'xb::xbString']]],
+ ['lk_5fclipper_3',['LK_CLIPPER',['../xbdbf_8h.html#a01d6d7910b0da2170eb904a97d864a41',1,'xbdbf.h']]],
+ ['lk_5fdbase_4',['LK_DBASE',['../xbdbf_8h.html#a4c08d01bd69e295b001bd00a228d8106',1,'xbdbf.h']]],
+ ['lk_5ffox_5',['LK_FOX',['../xbdbf_8h.html#a65e29186276222f460a7171803e07adf',1,'xbdbf.h']]],
+ ['lk_5fxbase64_6',['LK_XBASE64',['../xbdbf_8h.html#a42aea0ccd94f7422c8e0d7422dce85a4',1,'xbdbf.h']]],
+ ['ltrim_7',['Ltrim',['../classxb_1_1xbString.html#a90e0d0be4fd0d82dd2ebbe689adf18ee',1,'xb::xbString']]],
+ ['ltrunc_8',['Ltrunc',['../classxb_1_1xbString.html#a656f5854f74064b7257ff96d96dfb68b',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/all_b.html b/docs/doxygen/html/search/all_b.html
new file mode 100644
index 0000000..b7ad6e6
--- /dev/null
+++ b/docs/doxygen/html/search/all_b.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_b.js b/docs/doxygen/html/search/all_b.js
new file mode 100644
index 0000000..67213ee
--- /dev/null
+++ b/docs/doxygen/html/search/all_b.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['main_0',['main',['../xb__copydbf_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_copydbf.cpp'],['../xb__test__mdx_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_mdx.cpp'],['../xb__test__ndx_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_ndx.cpp'],['../xb__test__ndx2_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_ndx2.cpp'],['../xb__test__sql_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_sql.cpp'],['../xb__test__string_8cpp.html#aabf71bc9adb6daf457b2ea8879ae537f',1,'main(int argCnt, char **av=NULL):&#160;xb_test_string.cpp'],['../xb__test__tblmgr_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_tblmgr.cpp'],['../xb__test__uda_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_uda.cpp'],['../xb__test__xbase_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_xbase.cpp'],['../checkndx_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;checkndx.cpp'],['../dbfxtrct_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;dbfxtrct.cpp'],['../reindex_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;reindex.cpp'],['../xb__cfg__check_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_cfg_check.cpp'],['../xb__test__log_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_log.cpp'],['../xb__dbfutil_8cpp.html#a57e6ea63b6f0a962708db29159629a6d',1,'main(int, char **):&#160;xb_dbfutil.cpp'],['../xb__deletall_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_deletall.cpp'],['../xb__dumpdbt_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_dumpdbt.cpp'],['../xb__dumphdr_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_dumphdr.cpp'],['../xb__dumpix_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_dumpix.cpp'],['../xb__dumprecs_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_dumprecs.cpp'],['../xb__execsql_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_execsql.cpp'],['../xb__pack_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_pack.cpp'],['../xb__tblinfo_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_tblinfo.cpp'],['../xb__undelall_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_undelall.cpp'],['../xb__zap_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_zap.cpp'],['../xb__test__lock2_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_lock2.cpp'],['../xb__ex__date_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_date.cpp'],['../xb__ex__sql_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_ex_sql.cpp'],['../xb__ex__string_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_string.cpp'],['../xb__ex__v3__create__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_v3_create_dbf.cpp'],['../xb__ex__v3__upd__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_v3_upd_dbf.cpp'],['../xb__ex__v4__create__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_v4_create_dbf.cpp'],['../xb__ex__v4__upd__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_v4_upd_dbf.cpp'],['../xb__test__bcd_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_bcd.cpp'],['../xb__test__date_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_date.cpp'],['../xb__test__dbf__v3__memos_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_dbf_v3_memos.cpp'],['../xb__test__dbf__v3__nomemos_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_dbf_v3_nomemos.cpp'],['../xb__test__dbf__v4__memos_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_dbf_v4_memos.cpp'],['../xb__test__dbf__v4__nomemos_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_dbf_v4_nomemos.cpp'],['../xb__test__expnode_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_expnode.cpp'],['../xb__test__expression_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_expression.cpp'],['../xb__test__file_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_file.cpp'],['../xb__test__filter_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_filter.cpp'],['../xb__test__funcs_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_funcs.cpp'],['../xb__test__linklist_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_linklist.cpp'],['../xb__test__lock_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_lock.cpp']]],
+ ['memofieldsexist_1',['MemoFieldsExist',['../classxb_1_1xbDbf.html#ac856fc1b110b46aefa1b2f5c0f530aa2',1,'xb::xbDbf']]],
+ ['mid_2',['Mid',['../classxb_1_1xbString.html#a0f9eefc836b24c4ee7c5a316c5d812b7',1,'xb::xbString']]],
+ ['monthof_3',['MonthOf',['../classxb_1_1xbDate.html#a08bd84c67e1119d8c5c1748cd89d092e',1,'xb::xbDate']]]
+];
diff --git a/docs/doxygen/html/search/all_c.html b/docs/doxygen/html/search/all_c.html
new file mode 100644
index 0000000..829c917
--- /dev/null
+++ b/docs/doxygen/html/search/all_c.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_c.js b/docs/doxygen/html/search/all_c.js
new file mode 100644
index 0000000..973aa37
--- /dev/null
+++ b/docs/doxygen/html/search/all_c.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['namesuffixmissing_0',['NameSuffixMissing',['../classxb_1_1xbFile.html#a361e3cc318bbf1c4d10f069e0800a24e',1,'xb::xbFile']]]
+];
diff --git a/docs/doxygen/html/search/all_d.html b/docs/doxygen/html/search/all_d.html
new file mode 100644
index 0000000..d32b28e
--- /dev/null
+++ b/docs/doxygen/html/search/all_d.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_d.js b/docs/doxygen/html/search/all_d.js
new file mode 100644
index 0000000..604a447
--- /dev/null
+++ b/docs/doxygen/html/search/all_d.js
@@ -0,0 +1,21 @@
+var searchData=
+[
+ ['open_0',['Open',['../classxb_1_1xbDbf.html#ac658818bf9b8f8ff7467d8d80495b324',1,'xb::xbDbf::Open(const xbString &amp;sTableName, const xbString &amp;sAlias)'],['../classxb_1_1xbDbf.html#a97366c7362e409d7f09973a6aef8dad0',1,'xb::xbDbf::Open(const xbString &amp;sTableName)'],['../classxb_1_1xbXBase.html#ab35cec5ac8f0fa95f10653ca7ac817f6',1,'xb::xbXBase::Open()'],['../classxb_1_1xbDbf.html#a4d018cbf44d8d8b2145c9acab02c8adf',1,'xb::xbDbf::Open()'],['../classxb_1_1xbXBase.html#aafb1abd6b6124cddf635adaf9f615a4a',1,'xb::xbXBase::Open(const xbString &amp;sTableName, xbInt16 &amp;iRc)']]],
+ ['openhighestversion_1',['OpenHighestVersion',['../classxb_1_1xbXBase.html#aa957eb502ecd076e5df89e7415cb094b',1,'xb::xbXBase::OpenHighestVersion(const xbString &amp;sTableName, const xbString &amp;sAlias, xbDbf &amp;dbf, int dummy)'],['../classxb_1_1xbXBase.html#afa7bbac08a4601f49cd53b457196ee0e',1,'xb::xbXBase::OpenHighestVersion(const xbString &amp;sTableName, const xbString &amp;sAlias, xbDbf **dbf)']]],
+ ['operator_20const_20char_20_2a_2',['operator const char *',['../classxb_1_1xbString.html#a545df0ae9590f0ea5844a165e38a6388',1,'xb::xbString']]],
+ ['operator_21_3d_3',['operator!=',['../classxb_1_1xbDate.html#ac3aaf8997fc0c36676085e7741f33a8a',1,'xb::xbDate::operator!=()'],['../classxb_1_1xbString.html#acf89691607050b0505dc6af28d059c38',1,'xb::xbString::operator!=(const xbString &amp;) const'],['../classxb_1_1xbString.html#a822448f2a0ce653473d4c1de5763a3a6',1,'xb::xbString::operator!=(const char *) const']]],
+ ['operator_2b_4',['operator+',['../classxb_1_1xbString.html#a1f289d577ba90c500bc1be3ec7bb0206',1,'xb::xbString::operator+(const xbString &amp;s)'],['../classxb_1_1xbString.html#af559654baba81c3c0c19823c0b7a69d3',1,'xb::xbString::operator+(const char c)'],['../classxb_1_1xbString.html#aab556e8c3cb478dd95643327d72a48bd',1,'xb::xbString::operator+(const char *s)'],['../classxb_1_1xbDate.html#ad09609bf78cf038886a4f9cd19423f9c',1,'xb::xbDate::operator+(xbInt32 i)']]],
+ ['operator_2b_2b_5',['operator++',['../classxb_1_1xbDate.html#a1c7d9e3718c43df18b21646072c8605e',1,'xb::xbDate']]],
+ ['operator_2b_3d_6',['operator+=',['../classxb_1_1xbDate.html#a947ba156d04fe063aaa4c9964ae5d163',1,'xb::xbDate::operator+=()'],['../classxb_1_1xbString.html#a76a47af239797a266ada6141c150001c',1,'xb::xbString::operator+=(const xbString &amp;s)'],['../classxb_1_1xbString.html#ab319120dbad9107e1e7090139c956100',1,'xb::xbString::operator+=(const char *s)'],['../classxb_1_1xbString.html#ae12f45b8be84e438e032c0b860f985c6',1,'xb::xbString::operator+=(char c)']]],
+ ['operator_2d_7',['operator-',['../classxb_1_1xbDate.html#a3f3a8802c96098c85aa8d0e19717a979',1,'xb::xbDate::operator-(const xbDate &amp;) const'],['../classxb_1_1xbDate.html#a73ff5c037046ac0a0bb7d73f74e25cbb',1,'xb::xbDate::operator-(xbInt32 i)'],['../classxb_1_1xbString.html#a06abec236b95f6933ba17bf67089f7cf',1,'xb::xbString::operator-()']]],
+ ['operator_2d_2d_8',['operator--',['../classxb_1_1xbDate.html#ae2b33dfee60d324916d833b2098b5a6b',1,'xb::xbDate']]],
+ ['operator_2d_3d_9',['operator-=',['../classxb_1_1xbString.html#aa7f4db1b4eae9dfad46346db6e17ea15',1,'xb::xbString::operator-=(const xbString &amp;s)'],['../classxb_1_1xbString.html#aaae97e6eda3d18c9f463993ade985bf4',1,'xb::xbString::operator-=(const char *s)'],['../classxb_1_1xbString.html#adcafd019df23bb5724c46e34f3f31194',1,'xb::xbString::operator-=(char c)'],['../classxb_1_1xbDate.html#a4a8f207d759540114373f5e9d6d375f7',1,'xb::xbDate::operator-=(xbInt32 i)']]],
+ ['operator_3c_10',['operator&lt;',['../classxb_1_1xbDate.html#a11f09d97ed527e7ef00ba6f17b9fb02c',1,'xb::xbDate::operator&lt;()'],['../classxb_1_1xbString.html#a71c7aafa0d523c72cbe58c474be2270a',1,'xb::xbString::operator&lt;()']]],
+ ['operator_3c_3c_11',['operator&lt;&lt;',['../namespacexb.html#ad27f348219e895c44f74addba8e1889a',1,'xb::operator&lt;&lt;()'],['../classxb_1_1xbString.html#a3fa915061156521e9dd772a8d7e5f8fb',1,'xb::xbString::operator&lt;&lt;()']]],
+ ['operator_3c_3d_12',['operator&lt;=',['../classxb_1_1xbDate.html#a6d8fa4df4664f3fd8d4cc15e77f6d046',1,'xb::xbDate::operator&lt;=()'],['../classxb_1_1xbString.html#a461f245e60cddfdf5f78a972a46e5880',1,'xb::xbString::operator&lt;=()']]],
+ ['operator_3d_13',['operator=',['../classxb_1_1xbDate.html#a2e33ad9415c32e820e08fd8084198690',1,'xb::xbDate::operator=()'],['../classxb_1_1xbString.html#a4f69d11cbd43edf71725a606d0ca8f40',1,'xb::xbString::operator=(const xbString &amp;s)'],['../classxb_1_1xbString.html#a84ae7d16c5d73c5aa2270aa9895a7f7c',1,'xb::xbString::operator=(const char *s)']]],
+ ['operator_3d_3d_14',['operator==',['../classxb_1_1xbDate.html#aaaf98c1a672066021895f0953b6e94d0',1,'xb::xbDate::operator==()'],['../classxb_1_1xbString.html#a2df3ed2fc9456214f5fd2fcf77b69bc1',1,'xb::xbString::operator==(const xbString &amp;) const'],['../classxb_1_1xbString.html#a94031269af3c433393d4cf0ff9b4be38',1,'xb::xbString::operator==(const char *) const']]],
+ ['operator_3e_15',['operator&gt;',['../classxb_1_1xbDate.html#a744031c4031d6ec4595d34acbd1c5860',1,'xb::xbDate::operator&gt;()'],['../classxb_1_1xbString.html#ae46f6a45da5686b607a4edf2786a2fff',1,'xb::xbString::operator&gt;()']]],
+ ['operator_3e_3d_16',['operator&gt;=',['../classxb_1_1xbDate.html#a1d81959ea55440588068ea7f82617c99',1,'xb::xbDate::operator&gt;=()'],['../classxb_1_1xbString.html#a8f16643cb7ba3ee9cf685422c9ea0e67',1,'xb::xbString::operator&gt;=(const xbString &amp;) const']]],
+ ['operator_5b_5d_17',['operator[]',['../classxb_1_1xbString.html#abe45e463226ac8e18550ced18c5a9df3',1,'xb::xbString::operator[](xbUInt32 n) const'],['../classxb_1_1xbString.html#a4deaa68d9571753349c29baacb5613e8',1,'xb::xbString::operator[](xbInt32 n) const']]]
+];
diff --git a/docs/doxygen/html/search/all_e.html b/docs/doxygen/html/search/all_e.html
new file mode 100644
index 0000000..ce450a2
--- /dev/null
+++ b/docs/doxygen/html/search/all_e.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_e.js b/docs/doxygen/html/search/all_e.js
new file mode 100644
index 0000000..aa6ad3c
--- /dev/null
+++ b/docs/doxygen/html/search/all_e.js
@@ -0,0 +1,20 @@
+var searchData=
+[
+ ['pack_0',['Pack',['../classxb_1_1xbDbf.html#a93bb14ad0451355bfa3379128120988a',1,'xb::xbDbf::Pack(xbUInt32 &amp;ulDeletedRecCnt)'],['../classxb_1_1xbDbf.html#a8a52bf3ef2123c0d17e6b1f67bf0dc55',1,'xb::xbDbf::Pack()']]],
+ ['padleft_1',['PadLeft',['../classxb_1_1xbString.html#a6a09cfed22066b0c72432f26960f9e7b',1,'xb::xbString']]],
+ ['padright_2',['PadRight',['../classxb_1_1xbString.html#aba13f0c77eb6c4a22996039569fad284',1,'xb::xbString']]],
+ ['pdbf_3',['pDbf',['../structxb_1_1xbTblList.html#a387d3f6bbf291a1fb96d276ed9bb96b6',1,'xb::xbTblList']]],
+ ['pnext_4',['pNext',['../structxb_1_1xbTblList.html#a3fd169fcf0fd4df927544e5342db583c',1,'xb::xbTblList']]],
+ ['pos_5',['Pos',['../classxb_1_1xbString.html#a3baf59d15099589ff631995f129e582b',1,'xb::xbString::Pos(char c) const'],['../classxb_1_1xbString.html#a8705d7277b72f5aa98021e84438914da',1,'xb::xbString::Pos(const char *s) const']]],
+ ['pstblalias_6',['psTblAlias',['../structxb_1_1xbTblList.html#ac87742c8a6b1cf2e7e35218e96966a05',1,'xb::xbTblList']]],
+ ['pstblname_7',['psTblName',['../structxb_1_1xbTblList.html#a02c3b0c47fd104ef9758b375ecdcfd0f',1,'xb::xbTblList']]],
+ ['putat_8',['PutAt',['../classxb_1_1xbString.html#a1bae6fa8f608261f6e889616482f6e39',1,'xb::xbString']]],
+ ['putdatefield_9',['PutDateField',['../classxb_1_1xbDbf.html#a873f04af528a9d81e6a367a59d998ec5',1,'xb::xbDbf::PutDateField(xbInt16 iFieldNo, const xbDate &amp;dt)'],['../classxb_1_1xbDbf.html#a571b36b3a940b1a16d5e834f329b33b9',1,'xb::xbDbf::PutDateField(const xbString &amp;sFieldName, const xbDate &amp;dt)']]],
+ ['putdoublefield_10',['PutDoubleField',['../classxb_1_1xbDbf.html#ae695bbc71c19abc71c0c5f2ff2e1f971',1,'xb::xbDbf::PutDoubleField(const xbString &amp;FieldName, xbDouble dFieldValue)'],['../classxb_1_1xbDbf.html#a4f34842d7e8ff1f16992c2ece2fc38a5',1,'xb::xbDbf::PutDoubleField(xbInt16 FieldNo, xbDouble dFieldValue)']]],
+ ['putfield_11',['PutField',['../classxb_1_1xbDbf.html#a7862215dd2f83a1c488e539cd1f9aec0',1,'xb::xbDbf::PutField(const xbString &amp;sFieldName, const xbString &amp;sFieldData)'],['../classxb_1_1xbDbf.html#a142b0c0dc904917f3c68c5572c1237b5',1,'xb::xbDbf::PutField(xbInt16 iFieldNo, const xbString &amp;sFieldData)']]],
+ ['putfloatfield_12',['PutFloatField',['../classxb_1_1xbDbf.html#a64161eb50d72e424b11bf3732657ebd8',1,'xb::xbDbf::PutFloatField(xbInt16 iFieldNo, xbFloat fFieldValue)'],['../classxb_1_1xbDbf.html#a4ea3241bc710d57e5f755efda62288ad',1,'xb::xbDbf::PutFloatField(const xbString &amp;sFieldName, xbFloat fFieldValue)']]],
+ ['putlogicalfield_13',['PutLogicalField',['../classxb_1_1xbDbf.html#ab39ac4269ac63bc7ea4f638733bb17f0',1,'xb::xbDbf::PutLogicalField(xbInt16 iFieldNo, const xbString &amp;sFieldData)'],['../classxb_1_1xbDbf.html#a507e400ca6526a9e0391cf06dd6a014e',1,'xb::xbDbf::PutLogicalField(const xbString &amp;sFieldName, const xbString &amp;sFieldData)'],['../classxb_1_1xbDbf.html#a423a0cb7bd252cedf956ace4954f275d',1,'xb::xbDbf::PutLogicalField(xbInt16 iFieldNo, xbBool bFieldData)'],['../classxb_1_1xbDbf.html#a623ca3ef5520c42308c1a16b518e7ff3',1,'xb::xbDbf::PutLogicalField(const xbString &amp;sFieldName, xbBool bFieldData)']]],
+ ['putlongfield_14',['PutLongField',['../classxb_1_1xbDbf.html#a56c8f924284bf88aabf90b7930b4eb47',1,'xb::xbDbf::PutLongField(xbInt16 iFieldNo, xbInt32 lFieldValue)'],['../classxb_1_1xbDbf.html#ae7aad223119edb3d541e9f65e88c9f2f',1,'xb::xbDbf::PutLongField(const xbString &amp;sFieldNo, xbInt32 lFieldValue)']]],
+ ['putrecord_15',['PutRecord',['../classxb_1_1xbDbf.html#a3c36a5ffbc7067a1abbcb526dd3b981d',1,'xb::xbDbf::PutRecord()'],['../classxb_1_1xbDbf.html#aacbc7bac3ea0c502ee75b838f4f0fcbf',1,'xb::xbDbf::PutRecord(xbUInt32 ulRecNo)']]],
+ ['putulongfield_16',['PutULongField',['../classxb_1_1xbDbf.html#af5dec5c9ff903efffdb0490a44d296d2',1,'xb::xbDbf::PutULongField(xbInt16 iFieldNo, xbUInt32 lFieldValue)'],['../classxb_1_1xbDbf.html#ac62cb97c4e678c83f41788b1ae4d0381',1,'xb::xbDbf::PutULongField(const xbString &amp;sFieldNo, xbUInt32 lFieldValue)']]]
+];
diff --git a/docs/doxygen/html/search/all_f.html b/docs/doxygen/html/search/all_f.html
new file mode 100644
index 0000000..59cfe49
--- /dev/null
+++ b/docs/doxygen/html/search/all_f.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/all_f.js b/docs/doxygen/html/search/all_f.js
new file mode 100644
index 0000000..7766c97
--- /dev/null
+++ b/docs/doxygen/html/search/all_f.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['readblock_0',['ReadBlock',['../classxb_1_1xbFile.html#aa1bb80340abc7a5c22f87f878e9dc825',1,'xb::xbFile::ReadBlock(xbUInt32 ulBlockNo, size_t readSize, void *buf)'],['../classxb_1_1xbFile.html#aef696b1c4c0ef5338e818599f695d485',1,'xb::xbFile::ReadBlock(xbUInt32 ulBlockNo, xbUInt32 ulBlockSize, size_t readSize, void *buf)']]],
+ ['readheader_1',['ReadHeader',['../classxb_1_1xbDbf.html#a060541addb5bb1f0fe12959ed6f66fb9',1,'xb::xbDbf']]],
+ ['recbuf_2',['RecBuf',['../classxb_1_1xbDbf.html#a8a9b3bce0b741e73473d3ebbd6e6f1cd',1,'xb::xbDbf']]],
+ ['recbuf2_3',['RecBuf2',['../classxb_1_1xbDbf.html#a353ebfc8a2960ef827f429ec74025606',1,'xb::xbDbf']]],
+ ['recorddeleted_4',['RecordDeleted',['../classxb_1_1xbDbf.html#a94d7d626ba691fd4b740c034673e6fc6',1,'xb::xbDbf']]],
+ ['reindex_2ecpp_5',['reindex.cpp',['../reindex_8cpp.html',1,'']]],
+ ['remove_6',['Remove',['../classxb_1_1xbString.html#afaac65eaa6d9ef1596d6a0e7b91ed0f2',1,'xb::xbString']]],
+ ['removetblfromtbllist_7',['RemoveTblFromTblList',['../classxb_1_1xbTblMgr.html#ac8eaef41acf08911b90f900aac8e70af',1,'xb::xbTblMgr::RemoveTblFromTblList(const xbString &amp;sTblAlias)'],['../classxb_1_1xbTblMgr.html#a3d82b6e73d5c0bc8cac22b9a260389c1',1,'xb::xbTblMgr::RemoveTblFromTblList(xbDbf *d)']]],
+ ['resize_8',['Resize',['../classxb_1_1xbString.html#aa6d346ab04e5bb8852f0bb996163a35e',1,'xb::xbString']]],
+ ['rtrim_9',['Rtrim',['../classxb_1_1xbString.html#aaf330188d67c347ecae0d16f65b22077',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/classes_0.html b/docs/doxygen/html/search/classes_0.html
new file mode 100644
index 0000000..8361bcd
--- /dev/null
+++ b/docs/doxygen/html/search/classes_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/classes_0.js b/docs/doxygen/html/search/classes_0.js
new file mode 100644
index 0000000..b0f0a44
--- /dev/null
+++ b/docs/doxygen/html/search/classes_0.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['xbdate_0',['xbDate',['../classxb_1_1xbDate.html',1,'xb']]],
+ ['xbdbf_1',['xbDbf',['../classxb_1_1xbDbf.html',1,'xb']]],
+ ['xbfile_2',['xbFile',['../classxb_1_1xbFile.html',1,'xb']]],
+ ['xbschema_3',['xbSchema',['../structxb_1_1xbSchema.html',1,'xb']]],
+ ['xbssv_4',['xbSsv',['../classxb_1_1xbSsv.html',1,'xb']]],
+ ['xbstring_5',['xbString',['../classxb_1_1xbString.html',1,'xb']]],
+ ['xbtbllist_6',['xbTblList',['../structxb_1_1xbTblList.html',1,'xb']]],
+ ['xbtblmgr_7',['xbTblMgr',['../classxb_1_1xbTblMgr.html',1,'xb']]],
+ ['xbxbase_8',['xbXBase',['../classxb_1_1xbXBase.html',1,'xb']]]
+];
diff --git a/docs/doxygen/html/search/close.svg b/docs/doxygen/html/search/close.svg
new file mode 100644
index 0000000..a933eea
--- /dev/null
+++ b/docs/doxygen/html/search/close.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ viewBox="0 0 11 11"
+ height="11"
+ width="11"
+ id="svg2"
+ version="1.1">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <path
+ id="path12"
+ d="M 5.5 0.5 A 5 5 0 0 0 0.5 5.5 A 5 5 0 0 0 5.5 10.5 A 5 5 0 0 0 10.5 5.5 A 5 5 0 0 0 5.5 0.5 z M 3.5820312 3 A 0.58291923 0.58291923 0 0 1 4 3.1757812 L 5.5 4.6757812 L 7 3.1757812 A 0.58291923 0.58291923 0 0 1 7.4003906 3 A 0.58291923 0.58291923 0 0 1 7.8242188 4 L 6.3242188 5.5 L 7.8242188 7 A 0.58291923 0.58291923 0 1 1 7 7.8242188 L 5.5 6.3242188 L 4 7.8242188 A 0.58291923 0.58291923 0 1 1 3.1757812 7 L 4.6757812 5.5 L 3.1757812 4 A 0.58291923 0.58291923 0 0 1 3.5820312 3 z "
+ style="stroke-width:1.09870648;fill:#bababa;fill-opacity:1" />
+</svg>
diff --git a/docs/doxygen/html/search/defines_0.html b/docs/doxygen/html/search/defines_0.html
new file mode 100644
index 0000000..fd147db
--- /dev/null
+++ b/docs/doxygen/html/search/defines_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/defines_0.js b/docs/doxygen/html/search/defines_0.js
new file mode 100644
index 0000000..7e77a63
--- /dev/null
+++ b/docs/doxygen/html/search/defines_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['jul_5foffset_0',['JUL_OFFSET',['../xbdate_8h.html#a119f32fda399e2ebc2d734012a130e8f',1,'xbdate.h']]]
+];
diff --git a/docs/doxygen/html/search/defines_1.html b/docs/doxygen/html/search/defines_1.html
new file mode 100644
index 0000000..517e9fc
--- /dev/null
+++ b/docs/doxygen/html/search/defines_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/defines_1.js b/docs/doxygen/html/search/defines_1.js
new file mode 100644
index 0000000..7d95fad
--- /dev/null
+++ b/docs/doxygen/html/search/defines_1.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['lk_5fclipper_0',['LK_CLIPPER',['../xbdbf_8h.html#a01d6d7910b0da2170eb904a97d864a41',1,'xbdbf.h']]],
+ ['lk_5fdbase_1',['LK_DBASE',['../xbdbf_8h.html#a4c08d01bd69e295b001bd00a228d8106',1,'xbdbf.h']]],
+ ['lk_5ffox_2',['LK_FOX',['../xbdbf_8h.html#a65e29186276222f460a7171803e07adf',1,'xbdbf.h']]],
+ ['lk_5fxbase64_3',['LK_XBASE64',['../xbdbf_8h.html#a42aea0ccd94f7422c8e0d7422dce85a4',1,'xbdbf.h']]]
+];
diff --git a/docs/doxygen/html/search/defines_2.html b/docs/doxygen/html/search/defines_2.html
new file mode 100644
index 0000000..a4cbbba
--- /dev/null
+++ b/docs/doxygen/html/search/defines_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/defines_2.js b/docs/doxygen/html/search/defines_2.js
new file mode 100644
index 0000000..cbf9570
--- /dev/null
+++ b/docs/doxygen/html/search/defines_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['verbose_0',['VERBOSE',['../xb__test__string_8cpp.html#a42f8c497a1968074f38bf5055c650dca',1,'xb_test_string.cpp']]]
+];
diff --git a/docs/doxygen/html/search/defines_3.html b/docs/doxygen/html/search/defines_3.html
new file mode 100644
index 0000000..df9e6c2
--- /dev/null
+++ b/docs/doxygen/html/search/defines_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="defines_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/defines_3.js b/docs/doxygen/html/search/defines_3.js
new file mode 100644
index 0000000..b0be1a3
--- /dev/null
+++ b/docs/doxygen/html/search/defines_3.js
@@ -0,0 +1,86 @@
+var searchData=
+[
+ ['xb_5factive_5frecs_0',['XB_ACTIVE_RECS',['../xbdbf_8h.html#a1c44bb25bf2e23a3a9d3d2312df0b592',1,'xbdbf.h']]],
+ ['xb_5fall_5frecs_1',['XB_ALL_RECS',['../xbdbf_8h.html#a8bd17730da3ba5c55a6a07bc482dd0e4',1,'xbdbf.h']]],
+ ['xb_5falready_5fopen_2',['XB_ALREADY_OPEN',['../xbretcod_8h.html#aa2ff8301503f446c6a5f6510090e520f',1,'xbretcod.h']]],
+ ['xb_5fbof_3',['XB_BOF',['../xbretcod_8h.html#ade5f3a7cf1467d12761e4e21b5e4200f',1,'xbretcod.h']]],
+ ['xb_5fchar_5ffld_4',['XB_CHAR_FLD',['../xbdbf_8h.html#a20f739b9d9dc6a002a246a999e76aeaa',1,'xbdbf.h']]],
+ ['xb_5fchareof_5',['XB_CHAREOF',['../xbdbf_8h.html#ada1115f596131888c04df61546b198c4',1,'xbdbf.h']]],
+ ['xb_5fcharhdr_6',['XB_CHARHDR',['../xbdbf_8h.html#a35d56cac7959c1e5c761684ced3f1e17',1,'xbdbf.h']]],
+ ['xb_5fclose_5ferror_7',['XB_CLOSE_ERROR',['../xbretcod_8h.html#a030684d5541cf6127a76d81b0684b235',1,'xbretcod.h']]],
+ ['xb_5fclosed_8',['XB_CLOSED',['../xbdbf_8h.html#a843ca4569326dbd1d0647899b0eb512f',1,'xbdbf.h']]],
+ ['xb_5fdate_5ffld_9',['XB_DATE_FLD',['../xbdbf_8h.html#a7f685e6f5fe804b2174725a27ce73adc',1,'xbdbf.h']]],
+ ['xb_5fdbf_5ffile_5fnot_5fopen_10',['XB_DBF_FILE_NOT_OPEN',['../xbretcod_8h.html#a8104510b347c87998eadd0b27201e3c2',1,'xbretcod.h']]],
+ ['xb_5fdelete_5ffailed_11',['XB_DELETE_FAILED',['../xbretcod_8h.html#ada15513935d5ede9216f07c0438f34d2',1,'xbretcod.h']]],
+ ['xb_5fdeleted_5frecs_12',['XB_DELETED_RECS',['../xbdbf_8h.html#acc0a441854ed92b9d65d1181a97cad43',1,'xbdbf.h']]],
+ ['xb_5fdontoverlay_13',['XB_DONTOVERLAY',['../xbdbf_8h.html#a7b797840abdb3291373d15978103a778',1,'xbdbf.h']]],
+ ['xb_5fdup_5ftable_5for_5falias_14',['XB_DUP_TABLE_OR_ALIAS',['../xbretcod_8h.html#ac18036408d10e5eee1bf76cf92352b95',1,'xbretcod.h']]],
+ ['xb_5fempty_15',['XB_EMPTY',['../xbretcod_8h.html#a18068d0cbe0c7a1b4dd3176220180c29',1,'xbretcod.h']]],
+ ['xb_5feof_16',['XB_EOF',['../xbretcod_8h.html#a8b47031e90c3f86306c7058e4490d3b7',1,'xbretcod.h']]],
+ ['xb_5ffile_5fexists_17',['XB_FILE_EXISTS',['../xbretcod_8h.html#a54303a9677dbd5342233f33dd08c64d0',1,'xbretcod.h']]],
+ ['xb_5ffile_5fnot_5ffound_18',['XB_FILE_NOT_FOUND',['../xbretcod_8h.html#ad090af330c93111d12f6de35dbb065bc',1,'xbretcod.h']]],
+ ['xb_5ffile_5ftype_5fnot_5fsupported_19',['XB_FILE_TYPE_NOT_SUPPORTED',['../xbretcod_8h.html#ab7b9130a5f1df9975cfeaf6241933596',1,'xbretcod.h']]],
+ ['xb_5ffloat_5ffld_20',['XB_FLOAT_FLD',['../xbdbf_8h.html#a96ab4218d70ab603b4866354ce8c18cd',1,'xbdbf.h']]],
+ ['xb_5ffmt_5fmonth_21',['XB_FMT_MONTH',['../xbdate_8h.html#aeacf2f7cc897ab5bd64781c0fb52b75d',1,'xbdate.h']]],
+ ['xb_5ffmt_5fweek_22',['XB_FMT_WEEK',['../xbdate_8h.html#a8f22704d3fd93fa85dd93b6c699e8178',1,'xbdate.h']]],
+ ['xb_5ffmt_5fyear_23',['XB_FMT_YEAR',['../xbdate_8h.html#aa29d78982a9e007874af1c4f4e4d1aa4',1,'xbdate.h']]],
+ ['xb_5fincompatible_5foperands_24',['XB_INCOMPATIBLE_OPERANDS',['../xbretcod_8h.html#af141ec58b7ca7360e0be6c61d015ea74',1,'xbretcod.h']]],
+ ['xb_5finconsistent_5fparm_5flens_25',['XB_INCONSISTENT_PARM_LENS',['../xbretcod_8h.html#adc4b24bfffa202f8df25409894e547b9',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fblock_5fno_26',['XB_INVALID_BLOCK_NO',['../xbretcod_8h.html#a4e13b529b486c43ca600ce7d8ddbf3c2',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fblock_5fsize_27',['XB_INVALID_BLOCK_SIZE',['../xbretcod_8h.html#a1bd22921612389c37f6b2eac438c62c5',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fdata_28',['XB_INVALID_DATA',['../xbretcod_8h.html#afb40bbed323ecb369dd430a2e1242f9a',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fdate_29',['XB_INVALID_DATE',['../xbretcod_8h.html#a702475500357a27b8a34463be3e11925',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fexpression_30',['XB_INVALID_EXPRESSION',['../xbretcod_8h.html#a54db562c3cae97581812b4fccd52b71a',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffield_31',['XB_INVALID_FIELD',['../xbretcod_8h.html#a34180b2e2bd350ba2ebcdd1335e15d7e',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffield_5flen_32',['XB_INVALID_FIELD_LEN',['../xbretcod_8h.html#a7bd322c0efbba17f68ccccd6cf624411',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffield_5fname_33',['XB_INVALID_FIELD_NAME',['../xbretcod_8h.html#a59403978784130834cf39434cb73f96e',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffield_5fno_34',['XB_INVALID_FIELD_NO',['../xbretcod_8h.html#a09d6c08a44316f551108a74003efd381',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffield_5ftype_35',['XB_INVALID_FIELD_TYPE',['../xbretcod_8h.html#a79e2588f067d6e236c0e5a2c0728ba9f',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ffunction_36',['XB_INVALID_FUNCTION',['../xbretcod_8h.html#a2b7e5e440dbcf5e6dc885b24dbe28742',1,'xbretcod.h']]],
+ ['xb_5finvalid_5findex_37',['XB_INVALID_INDEX',['../xbretcod_8h.html#acd175ef0541e2cad424791bd87619dd4',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fkeyno_38',['XB_INVALID_KEYNO',['../xbretcod_8h.html#aec2c0ac2bd62e0329ef130e4fbda39f8',1,'xbretcod.h']]],
+ ['xb_5finvalid_5flock_5foption_39',['XB_INVALID_LOCK_OPTION',['../xbretcod_8h.html#ab45735e63c208eb7e6d6df31fd527aec',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fmemo_5ffield_40',['XB_INVALID_MEMO_FIELD',['../xbretcod_8h.html#a187c50745f51bfe4aa6f70a92f16c59f',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fnodelink_41',['XB_INVALID_NODELINK',['../xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fobject_42',['XB_INVALID_OBJECT',['../xbretcod_8h.html#a418c047353bc683d0fd6ecbbdd5b7885',1,'xbretcod.h']]],
+ ['xb_5finvalid_5foption_43',['XB_INVALID_OPTION',['../xbretcod_8h.html#af1cd0baf346cad686fa4dd11f700012a',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fpage_44',['XB_INVALID_PAGE',['../xbretcod_8h.html#ad0aba12b5ae2137f8d6abd28b47f95f0',1,'xbretcod.h']]],
+ ['xb_5finvalid_5fparm_45',['XB_INVALID_PARM',['../xbretcod_8h.html#a4cedf96581c9cbc9c14d07494143702d',1,'xbretcod.h']]],
+ ['xb_5finvalid_5frecord_46',['XB_INVALID_RECORD',['../xbretcod_8h.html#a0fd212f912b2e62700a66bae95bd73a1',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ftable_5fname_47',['XB_INVALID_TABLE_NAME',['../xbretcod_8h.html#a53891c95a78483704d2a8e14c4499f92',1,'xbretcod.h']]],
+ ['xb_5finvalid_5ftag_48',['XB_INVALID_TAG',['../xbretcod_8h.html#a176d917912d3433f065483f905a4c50a',1,'xbretcod.h']]],
+ ['xb_5fkey_5fnot_5funique_49',['XB_KEY_NOT_UNIQUE',['../xbretcod_8h.html#ad60dbb1862c0c1c2dc0464cfbfd93a34',1,'xbretcod.h']]],
+ ['xb_5flimit_5freached_50',['XB_LIMIT_REACHED',['../xbretcod_8h.html#a59f1a8a6aca19595c2d1804349a24850',1,'xbretcod.h']]],
+ ['xb_5flock_51',['XB_LOCK',['../xbdbf_8h.html#a395a2e101a793bacabf6bc079d178e29',1,'xbdbf.h']]],
+ ['xb_5flock_5ffailed_52',['XB_LOCK_FAILED',['../xbretcod_8h.html#a001e24b39e0f155fb1e892f5b1b9cff1',1,'xbretcod.h']]],
+ ['xb_5flogical_5ffld_53',['XB_LOGICAL_FLD',['../xbdbf_8h.html#a2f6d5073af761bc1a806a2c7b1c1d886',1,'xbdbf.h']]],
+ ['xb_5fmax_5ferror_5fno_54',['XB_MAX_ERROR_NO',['../xbretcod_8h.html#a299419a9c80e000b74bf97a2d24d6a3d',1,'xbretcod.h']]],
+ ['xb_5fmemo_5ffld_55',['XB_MEMO_FLD',['../xbdbf_8h.html#a23fa19b19cb43bd6dcc59a5a3f6c30ad',1,'xbdbf.h']]],
+ ['xb_5fmulti_5fuser_56',['XB_MULTI_USER',['../xbfile_8h.html#a05c0fc99ba71cf953d046d12f3f874bc',1,'xbfile.h']]],
+ ['xb_5fno_5ferror_57',['XB_NO_ERROR',['../xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23',1,'xbretcod.h']]],
+ ['xb_5fno_5fmemory_58',['XB_NO_MEMORY',['../xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54',1,'xbretcod.h']]],
+ ['xb_5fnot_5ffound_59',['XB_NOT_FOUND',['../xbretcod_8h.html#ac2606659a54111334f5b02861e533700',1,'xbretcod.h']]],
+ ['xb_5fnot_5fopen_60',['XB_NOT_OPEN',['../xbretcod_8h.html#a9474b400f647bdefbbb07e5177e8d7a1',1,'xbretcod.h']]],
+ ['xb_5fnumeric_5ffld_61',['XB_NUMERIC_FLD',['../xbdbf_8h.html#ae9fb6d69cc5edc94d36ae403c22ec1c6',1,'xbdbf.h']]],
+ ['xb_5fopen_62',['XB_OPEN',['../xbdbf_8h.html#a9a6dafbb07cac744eb14094efa739409',1,'xbdbf.h']]],
+ ['xb_5fopen_5ferror_63',['XB_OPEN_ERROR',['../xbretcod_8h.html#aaab55236993a1d3acb29206252a904c8',1,'xbretcod.h']]],
+ ['xb_5foverlay_64',['XB_OVERLAY',['../xbdbf_8h.html#a6fe10b307878b4612b04c2c876a4a592',1,'xbdbf.h']]],
+ ['xb_5fparse_5ferror_65',['XB_PARSE_ERROR',['../xbretcod_8h.html#aec713cac2b03a0d536a2d16336ae7c0b',1,'xbretcod.h']]],
+ ['xb_5fread_66',['XB_READ',['../xbfile_8h.html#ae58c73e0ba237fcf67ee20feea6c2743',1,'xbfile.h']]],
+ ['xb_5fread_5ferror_67',['XB_READ_ERROR',['../xbretcod_8h.html#adbd40585db8bb748d191f94a33bac710',1,'xbretcod.h']]],
+ ['xb_5fread_5fwrite_68',['XB_READ_WRITE',['../xbfile_8h.html#af991a288c327f6857e90156ea734a633',1,'xbfile.h']]],
+ ['xb_5frename_5ferror_69',['XB_RENAME_ERROR',['../xbretcod_8h.html#a373f30b2efcbbab9f6d060fb3fe8cba3',1,'xbretcod.h']]],
+ ['xb_5fseek_5ferror_70',['XB_SEEK_ERROR',['../xbretcod_8h.html#a0455ad8719e153b08ec68b10c81e9f41',1,'xbretcod.h']]],
+ ['xb_5fsingle_5fuser_71',['XB_SINGLE_USER',['../xbfile_8h.html#a9ec4d60a008c667d9861e3b3814f0232',1,'xbfile.h']]],
+ ['xb_5fsyntax_5ferror_72',['XB_SYNTAX_ERROR',['../xbretcod_8h.html#a5db3a90f215534143bdde81253729c7f',1,'xbretcod.h']]],
+ ['xb_5ftable_5fnot_5flocked_73',['XB_TABLE_NOT_LOCKED',['../xbretcod_8h.html#af6aaf779fddecca521d785666f6dc56b',1,'xbretcod.h']]],
+ ['xb_5funbalanced_5fparens_74',['XB_UNBALANCED_PARENS',['../xbretcod_8h.html#aff5646a6b0884ff81004de6961473ea6',1,'xbretcod.h']]],
+ ['xb_5funbalanced_5fquotes_75',['XB_UNBALANCED_QUOTES',['../xbretcod_8h.html#aedfa20a6c4eb9ba3063ba56be8280eac',1,'xbretcod.h']]],
+ ['xb_5funlock_76',['XB_UNLOCK',['../xbdbf_8h.html#a21389b73e7b4e7e185fa635b9e354c2e',1,'xbdbf.h']]],
+ ['xb_5fupdated_77',['XB_UPDATED',['../xbdbf_8h.html#a26e7eeda69f32bc88b08a208ca9e7991',1,'xbdbf.h']]],
+ ['xb_5fwrite_78',['XB_WRITE',['../xbfile_8h.html#abbf99e259c2f31572c886da6d85b1359',1,'xbfile.h']]],
+ ['xb_5fwrite_5ferror_79',['XB_WRITE_ERROR',['../xbretcod_8h.html#aef34ebe6726057f805d6063130280549',1,'xbretcod.h']]],
+ ['xbfalse_80',['xbFalse',['../xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc',1,'xbtypes.h']]],
+ ['xbfileno_81',['xbFileNo',['../xbtypes_8h.html#a2c65f692ac861990861575e18f72f6eb',1,'xbtypes.h']]],
+ ['xbtrue_82',['xbTrue',['../xbtypes_8h.html#ab0ae00665298fe7f5292691cb98ec2d9',1,'xbtypes.h']]]
+];
diff --git a/docs/doxygen/html/search/files_0.html b/docs/doxygen/html/search/files_0.html
new file mode 100644
index 0000000..da83704
--- /dev/null
+++ b/docs/doxygen/html/search/files_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/files_0.js b/docs/doxygen/html/search/files_0.js
new file mode 100644
index 0000000..e58e938
--- /dev/null
+++ b/docs/doxygen/html/search/files_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['checkndx_2ecpp_0',['checkndx.cpp',['../checkndx_8cpp.html',1,'']]]
+];
diff --git a/docs/doxygen/html/search/files_1.html b/docs/doxygen/html/search/files_1.html
new file mode 100644
index 0000000..f7e1582
--- /dev/null
+++ b/docs/doxygen/html/search/files_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/files_1.js b/docs/doxygen/html/search/files_1.js
new file mode 100644
index 0000000..828c76f
--- /dev/null
+++ b/docs/doxygen/html/search/files_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['dbfxtrct_2ecpp_0',['dbfxtrct.cpp',['../dbfxtrct_8cpp.html',1,'']]]
+];
diff --git a/docs/doxygen/html/search/files_2.html b/docs/doxygen/html/search/files_2.html
new file mode 100644
index 0000000..99aca62
--- /dev/null
+++ b/docs/doxygen/html/search/files_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/files_2.js b/docs/doxygen/html/search/files_2.js
new file mode 100644
index 0000000..c416fdd
--- /dev/null
+++ b/docs/doxygen/html/search/files_2.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['reindex_2ecpp_0',['reindex.cpp',['../reindex_8cpp.html',1,'']]]
+];
diff --git a/docs/doxygen/html/search/files_3.html b/docs/doxygen/html/search/files_3.html
new file mode 100644
index 0000000..25e128c
--- /dev/null
+++ b/docs/doxygen/html/search/files_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/files_3.js b/docs/doxygen/html/search/files_3.js
new file mode 100644
index 0000000..f577bf3
--- /dev/null
+++ b/docs/doxygen/html/search/files_3.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['tstfuncs_2ecpp_0',['tstfuncs.cpp',['../tstfuncs_8cpp.html',1,'']]]
+];
diff --git a/docs/doxygen/html/search/files_4.html b/docs/doxygen/html/search/files_4.html
new file mode 100644
index 0000000..3c8ba6e
--- /dev/null
+++ b/docs/doxygen/html/search/files_4.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/files_4.js b/docs/doxygen/html/search/files_4.js
new file mode 100644
index 0000000..e99e9ec
--- /dev/null
+++ b/docs/doxygen/html/search/files_4.js
@@ -0,0 +1,100 @@
+var searchData=
+[
+ ['xb_5fcfg_5fcheck_2ecpp_0',['xb_cfg_check.cpp',['../xb__cfg__check_8cpp.html',1,'']]],
+ ['xb_5fcopydbf_2ecpp_1',['xb_copydbf.cpp',['../xb__copydbf_8cpp.html',1,'']]],
+ ['xb_5fdbfutil_2ecpp_2',['xb_dbfutil.cpp',['../xb__dbfutil_8cpp.html',1,'']]],
+ ['xb_5fdeletall_2ecpp_3',['xb_deletall.cpp',['../xb__deletall_8cpp.html',1,'']]],
+ ['xb_5fdumpdbt_2ecpp_4',['xb_dumpdbt.cpp',['../xb__dumpdbt_8cpp.html',1,'']]],
+ ['xb_5fdumphdr_2ecpp_5',['xb_dumphdr.cpp',['../xb__dumphdr_8cpp.html',1,'']]],
+ ['xb_5fdumpix_2ecpp_6',['xb_dumpix.cpp',['../xb__dumpix_8cpp.html',1,'']]],
+ ['xb_5fdumprecs_2ecpp_7',['xb_dumprecs.cpp',['../xb__dumprecs_8cpp.html',1,'']]],
+ ['xb_5fex_5fdate_2ecpp_8',['xb_ex_date.cpp',['../xb__ex__date_8cpp.html',1,'']]],
+ ['xb_5fex_5fsql_2ecpp_9',['xb_ex_sql.cpp',['../xb__ex__sql_8cpp.html',1,'']]],
+ ['xb_5fex_5fstring_2ecpp_10',['xb_ex_string.cpp',['../xb__ex__string_8cpp.html',1,'']]],
+ ['xb_5fex_5fv3_5fcreate_5fdbf_2ecpp_11',['xb_ex_v3_create_dbf.cpp',['../xb__ex__v3__create__dbf_8cpp.html',1,'']]],
+ ['xb_5fex_5fv3_5fupd_5fdbf_2ecpp_12',['xb_ex_v3_upd_dbf.cpp',['../xb__ex__v3__upd__dbf_8cpp.html',1,'']]],
+ ['xb_5fex_5fv4_5fcreate_5fdbf_2ecpp_13',['xb_ex_v4_create_dbf.cpp',['../xb__ex__v4__create__dbf_8cpp.html',1,'']]],
+ ['xb_5fex_5fv4_5fupd_5fdbf_2ecpp_14',['xb_ex_v4_upd_dbf.cpp',['../xb__ex__v4__upd__dbf_8cpp.html',1,'']]],
+ ['xb_5fexecsql_2ecpp_15',['xb_execsql.cpp',['../xb__execsql_8cpp.html',1,'']]],
+ ['xb_5fpack_2ecpp_16',['xb_pack.cpp',['../xb__pack_8cpp.html',1,'']]],
+ ['xb_5ftblinfo_2ecpp_17',['xb_tblinfo.cpp',['../xb__tblinfo_8cpp.html',1,'']]],
+ ['xb_5ftest_5fbcd_2ecpp_18',['xb_test_bcd.cpp',['../xb__test__bcd_8cpp.html',1,'']]],
+ ['xb_5ftest_5fdate_2ecpp_19',['xb_test_date.cpp',['../xb__test__date_8cpp.html',1,'']]],
+ ['xb_5ftest_5fdbf_5fv3_5fmemos_2ecpp_20',['xb_test_dbf_v3_memos.cpp',['../xb__test__dbf__v3__memos_8cpp.html',1,'']]],
+ ['xb_5ftest_5fdbf_5fv3_5fnomemos_2ecpp_21',['xb_test_dbf_v3_nomemos.cpp',['../xb__test__dbf__v3__nomemos_8cpp.html',1,'']]],
+ ['xb_5ftest_5fdbf_5fv4_5fmemos_2ecpp_22',['xb_test_dbf_v4_memos.cpp',['../xb__test__dbf__v4__memos_8cpp.html',1,'']]],
+ ['xb_5ftest_5fdbf_5fv4_5fnomemos_2ecpp_23',['xb_test_dbf_v4_nomemos.cpp',['../xb__test__dbf__v4__nomemos_8cpp.html',1,'']]],
+ ['xb_5ftest_5fexpnode_2ecpp_24',['xb_test_expnode.cpp',['../xb__test__expnode_8cpp.html',1,'']]],
+ ['xb_5ftest_5fexpression_2ecpp_25',['xb_test_expression.cpp',['../xb__test__expression_8cpp.html',1,'']]],
+ ['xb_5ftest_5ffile_2ecpp_26',['xb_test_file.cpp',['../xb__test__file_8cpp.html',1,'']]],
+ ['xb_5ftest_5ffilter_2ecpp_27',['xb_test_filter.cpp',['../xb__test__filter_8cpp.html',1,'']]],
+ ['xb_5ftest_5ffuncs_2ecpp_28',['xb_test_funcs.cpp',['../xb__test__funcs_8cpp.html',1,'']]],
+ ['xb_5ftest_5flinklist_2ecpp_29',['xb_test_linklist.cpp',['../xb__test__linklist_8cpp.html',1,'']]],
+ ['xb_5ftest_5flock_2ecpp_30',['xb_test_lock.cpp',['../xb__test__lock_8cpp.html',1,'']]],
+ ['xb_5ftest_5flock2_2ecpp_31',['xb_test_lock2.cpp',['../xb__test__lock2_8cpp.html',1,'']]],
+ ['xb_5ftest_5flog_2ecpp_32',['xb_test_log.cpp',['../xb__test__log_8cpp.html',1,'']]],
+ ['xb_5ftest_5fmdx_2ecpp_33',['xb_test_mdx.cpp',['../xb__test__mdx_8cpp.html',1,'']]],
+ ['xb_5ftest_5fndx_2ecpp_34',['xb_test_ndx.cpp',['../xb__test__ndx_8cpp.html',1,'']]],
+ ['xb_5ftest_5fndx2_2ecpp_35',['xb_test_ndx2.cpp',['../xb__test__ndx2_8cpp.html',1,'']]],
+ ['xb_5ftest_5fsql_2ecpp_36',['xb_test_sql.cpp',['../xb__test__sql_8cpp.html',1,'']]],
+ ['xb_5ftest_5fstring_2ecpp_37',['xb_test_string.cpp',['../xb__test__string_8cpp.html',1,'']]],
+ ['xb_5ftest_5ftblmgr_2ecpp_38',['xb_test_tblmgr.cpp',['../xb__test__tblmgr_8cpp.html',1,'']]],
+ ['xb_5ftest_5fuda_2ecpp_39',['xb_test_uda.cpp',['../xb__test__uda_8cpp.html',1,'']]],
+ ['xb_5ftest_5fxbase_2ecpp_40',['xb_test_xbase.cpp',['../xb__test__xbase_8cpp.html',1,'']]],
+ ['xb_5fundelall_2ecpp_41',['xb_undelall.cpp',['../xb__undelall_8cpp.html',1,'']]],
+ ['xb_5fzap_2ecpp_42',['xb_zap.cpp',['../xb__zap_8cpp.html',1,'']]],
+ ['xbase_2eh_43',['xbase.h',['../xbase_8h.html',1,'']]],
+ ['xbbcd_2ecpp_44',['xbbcd.cpp',['../xbbcd_8cpp.html',1,'']]],
+ ['xbbcd_2eh_45',['xbbcd.h',['../xbbcd_8h.html',1,'']]],
+ ['xbcrix_2ecpp_46',['xbcrix.cpp',['../xbcrix_8cpp.html',1,'']]],
+ ['xbcrtbl_2ecpp_47',['xbcrtbl.cpp',['../xbcrtbl_8cpp.html',1,'']]],
+ ['xbdate_2ecpp_48',['xbdate.cpp',['../xbdate_8cpp.html',1,'']]],
+ ['xbdate_2eh_49',['xbdate.h',['../xbdate_8h.html',1,'']]],
+ ['xbdbf_2ecpp_50',['xbdbf.cpp',['../xbdbf_8cpp.html',1,'']]],
+ ['xbdbf_2eh_51',['xbdbf.h',['../xbdbf_8h.html',1,'']]],
+ ['xbdbf3_2ecpp_52',['xbdbf3.cpp',['../xbdbf3_8cpp.html',1,'']]],
+ ['xbdbf4_2ecpp_53',['xbdbf4.cpp',['../xbdbf4_8cpp.html',1,'']]],
+ ['xbdrpix_2ecpp_54',['xbdrpix.cpp',['../xbdrpix_8cpp.html',1,'']]],
+ ['xbdrptbl_2ecpp_55',['xbdrptbl.cpp',['../xbdrptbl_8cpp.html',1,'']]],
+ ['xbexp_2ecpp_56',['xbexp.cpp',['../xbexp_8cpp.html',1,'']]],
+ ['xbexp_2eh_57',['xbexp.h',['../xbexp_8h.html',1,'']]],
+ ['xbexpnode_2ecpp_58',['xbexpnode.cpp',['../xbexpnode_8cpp.html',1,'']]],
+ ['xbexpnode_2eh_59',['xbexpnode.h',['../xbexpnode_8h.html',1,'']]],
+ ['xbfields_2ecpp_60',['xbfields.cpp',['../xbfields_8cpp.html',1,'']]],
+ ['xbfile_2ecpp_61',['xbfile.cpp',['../xbfile_8cpp.html',1,'']]],
+ ['xbfile_2eh_62',['xbfile.h',['../xbfile_8h.html',1,'']]],
+ ['xbfilter_2ecpp_63',['xbfilter.cpp',['../xbfilter_8cpp.html',1,'']]],
+ ['xbfilter_2eh_64',['xbfilter.h',['../xbfilter_8h.html',1,'']]],
+ ['xbfuncs_2ecpp_65',['xbfuncs.cpp',['../xbfuncs_8cpp.html',1,'']]],
+ ['xbindex_2eh_66',['xbindex.h',['../xbindex_8h.html',1,'']]],
+ ['xbinsert_2ecpp_67',['xbinsert.cpp',['../xbinsert_8cpp.html',1,'']]],
+ ['xbixbase_2ecpp_68',['xbixbase.cpp',['../xbixbase_8cpp.html',1,'']]],
+ ['xbixmdx_2ecpp_69',['xbixmdx.cpp',['../xbixmdx_8cpp.html',1,'']]],
+ ['xbixndx_2ecpp_70',['xbixndx.cpp',['../xbixndx_8cpp.html',1,'']]],
+ ['xblnklst_2eh_71',['xblnklst.h',['../xblnklst_8h.html',1,'']]],
+ ['xblnklstord_2eh_72',['xblnklstord.h',['../xblnklstord_8h.html',1,'']]],
+ ['xblnknod_2eh_73',['xblnknod.h',['../xblnknod_8h.html',1,'']]],
+ ['xblog_2ecpp_74',['xblog.cpp',['../xblog_8cpp.html',1,'']]],
+ ['xblog_2eh_75',['xblog.h',['../xblog_8h.html',1,'']]],
+ ['xbmemo_2ecpp_76',['xbmemo.cpp',['../xbmemo_8cpp.html',1,'']]],
+ ['xbmemo_2eh_77',['xbmemo.h',['../xbmemo_8h.html',1,'']]],
+ ['xbmemo3_2ecpp_78',['xbmemo3.cpp',['../xbmemo3_8cpp.html',1,'']]],
+ ['xbmemo4_2ecpp_79',['xbmemo4.cpp',['../xbmemo4_8cpp.html',1,'']]],
+ ['xbretcod_2eh_80',['xbretcod.h',['../xbretcod_8h.html',1,'']]],
+ ['xbset_2ecpp_81',['xbset.cpp',['../xbset_8cpp.html',1,'']]],
+ ['xbsql_2ecpp_82',['xbsql.cpp',['../xbsql_8cpp.html',1,'']]],
+ ['xbsql_2eh_83',['xbsql.h',['../xbsql_8h.html',1,'']]],
+ ['xbssv_2ecpp_84',['xbssv.cpp',['../xbssv_8cpp.html',1,'']]],
+ ['xbssv_2eh_85',['xbssv.h',['../xbssv_8h.html',1,'']]],
+ ['xbstring_2ecpp_86',['xbstring.cpp',['../xbstring_8cpp.html',1,'']]],
+ ['xbstring_2eh_87',['xbstring.h',['../xbstring_8h.html',1,'']]],
+ ['xbtag_2ecpp_88',['xbtag.cpp',['../xbtag_8cpp.html',1,'']]],
+ ['xbtag_2eh_89',['xbtag.h',['../xbtag_8h.html',1,'']]],
+ ['xbtblmgr_2ecpp_90',['xbtblmgr.cpp',['../xbtblmgr_8cpp.html',1,'']]],
+ ['xbtblmgr_2eh_91',['xbtblmgr.h',['../xbtblmgr_8h.html',1,'']]],
+ ['xbtypes_2eh_92',['xbtypes.h',['../xbtypes_8h.html',1,'']]],
+ ['xbuda_2ecpp_93',['xbuda.cpp',['../xbuda_8cpp.html',1,'']]],
+ ['xbuda_2eh_94',['xbuda.h',['../xbuda_8h.html',1,'']]],
+ ['xbxbase_2ecpp_95',['xbxbase.cpp',['../xbxbase_8cpp.html',1,'']]],
+ ['xbxbase_2eh_96',['xbxbase.h',['../xbxbase_8h.html',1,'']]]
+];
diff --git a/docs/doxygen/html/search/functions_0.html b/docs/doxygen/html/search/functions_0.html
new file mode 100644
index 0000000..2d2d950
--- /dev/null
+++ b/docs/doxygen/html/search/functions_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_0.js b/docs/doxygen/html/search/functions_0.js
new file mode 100644
index 0000000..9e288ab
--- /dev/null
+++ b/docs/doxygen/html/search/functions_0.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['abort_0',['Abort',['../classxb_1_1xbDbf.html#a4edcf31390fbdc8c3558004770fd9f2f',1,'xb::xbDbf']]],
+ ['addbackslash_1',['AddBackSlash',['../classxb_1_1xbString.html#a6c4fdb689d27a9d19a0b5b4236e1ca62',1,'xb::xbString']]],
+ ['addtbltotbllist_2',['AddTblToTblList',['../classxb_1_1xbTblMgr.html#a721f69ccc7893842422a043468ffccea',1,'xb::xbTblMgr::AddTblToTblList(xbDbf *d, const xbString &amp;sTblName)'],['../classxb_1_1xbTblMgr.html#a62f6841849dbe5c1768f7e90f1b7e766',1,'xb::xbTblMgr::AddTblToTblList(xbDbf *d, const xbString &amp;sTblName, const xbString &amp;sTblAlias)']]],
+ ['append_3',['Append',['../classxb_1_1xbString.html#a8f202e4798491f2ae9ce51ff58dd5815',1,'xb::xbString::Append(const xbString &amp;s)'],['../classxb_1_1xbString.html#a1922319303feb6da1f40b5994c5e8240',1,'xb::xbString::Append(const char *s)'],['../classxb_1_1xbString.html#a097453cb71fbf0b5511cf1259ddce4fb',1,'xb::xbString::Append(const char *s, xbUInt32 iByteCount)'],['../classxb_1_1xbString.html#a093c6ab5df375a2589755bb8f48fa5c7',1,'xb::xbString::Append(char c)']]],
+ ['appendrecord_4',['AppendRecord',['../classxb_1_1xbDbf.html#a5b412dd796241673eb1aa2c93513d69b',1,'xb::xbDbf']]],
+ ['assign_5',['Assign',['../classxb_1_1xbString.html#a85bef82dfa22122a1ab8dfe58a107d96',1,'xb::xbString::Assign(const char *srcStr, xbUInt32 lStartPos, xbUInt32 lCopyLen)'],['../classxb_1_1xbString.html#a08eb7ca6740423acab4e8bd7a6c8043d',1,'xb::xbString::Assign(const char *srcStr, xbUInt32 lStartPos)'],['../classxb_1_1xbString.html#a210707223fffc7b3ab31eca4ef29f731',1,'xb::xbString::Assign(const xbString &amp;s, xbUInt32 pos, xbUInt32 n)'],['../classxb_1_1xbString.html#ab9045442e57293843652dfce6522ff83',1,'xb::xbString::Assign(const xbString &amp;s, xbUInt32 n)']]]
+];
diff --git a/docs/doxygen/html/search/functions_1.html b/docs/doxygen/html/search/functions_1.html
new file mode 100644
index 0000000..3b96b90
--- /dev/null
+++ b/docs/doxygen/html/search/functions_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_1.js b/docs/doxygen/html/search/functions_1.js
new file mode 100644
index 0000000..d9c0a9c
--- /dev/null
+++ b/docs/doxygen/html/search/functions_1.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['bitset_0',['BitSet',['../classxb_1_1xbSsv.html#a62e4fd0a5888665c76bbbad962794e72',1,'xb::xbSsv']]],
+ ['blankrecord_1',['BlankRecord',['../classxb_1_1xbDbf.html#a78da5a3d2011a3f2e7618cbdd3ba02d6',1,'xb::xbDbf']]]
+];
diff --git a/docs/doxygen/html/search/functions_10.html b/docs/doxygen/html/search/functions_10.html
new file mode 100644
index 0000000..f0fe489
--- /dev/null
+++ b/docs/doxygen/html/search/functions_10.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_10.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_10.js b/docs/doxygen/html/search/functions_10.js
new file mode 100644
index 0000000..7973353
--- /dev/null
+++ b/docs/doxygen/html/search/functions_10.js
@@ -0,0 +1,25 @@
+var searchData=
+[
+ ['set_0',['Set',['../classxb_1_1xbString.html#ab85753d2c39882e946a8468cbb587700',1,'xb::xbString::Set(const char *s)'],['../classxb_1_1xbString.html#ac0d08bd688fd0e3707e32886d0dfeb09',1,'xb::xbString::Set(const xbString &amp;s)'],['../classxb_1_1xbString.html#a6eba6ccd0c805a22516de2c18a30f8a3',1,'xb::xbString::Set(const char *s, xbUInt32 ulSize)'],['../classxb_1_1xbDate.html#a4b0cde152b5de0f7d26608d1445110b6',1,'xb::xbDate::Set()']]],
+ ['setautocommit_1',['SetAutoCommit',['../classxb_1_1xbDbf.html#a4cf7f0d423164f3cf074ae41f96f4e90',1,'xb::xbDbf']]],
+ ['setblocksize_2',['SetBlockSize',['../classxb_1_1xbFile.html#a991c5676a6f38fa752435390989f413e',1,'xb::xbFile']]],
+ ['setdatadirectory_3',['SetDataDirectory',['../classxb_1_1xbSsv.html#a57caaaadfbd089d9a58ecfcb50c88a6c',1,'xb::xbSsv']]],
+ ['setdefaultautocommit_4',['SetDefaultAutoCommit',['../classxb_1_1xbSsv.html#a25542afadaaf39b4fb5a1772a29cc0bd',1,'xb::xbSsv']]],
+ ['setdefaultdateformat_5',['SetDefaultDateFormat',['../classxb_1_1xbSsv.html#a5f74db23f8902846d581935c7db73f9c',1,'xb::xbSsv']]],
+ ['setdefaultlogdirectory_6',['SetDefaultLogDirectory',['../classxb_1_1xbSsv.html#a84343b8645790791512d6bc22ee6c8eb',1,'xb::xbSsv']]],
+ ['setdirectory_7',['SetDirectory',['../classxb_1_1xbFile.html#ae78a85255488bc78964c16946dbaead3',1,'xb::xbFile']]],
+ ['setendiantype_8',['SetEndianType',['../classxb_1_1xbSsv.html#a904ec348fd029d4a76e72b8fde636108',1,'xb::xbSsv']]],
+ ['setfilename_9',['SetFileName',['../classxb_1_1xbFile.html#a5419eb27e56822f828b2b88a9502a636',1,'xb::xbFile']]],
+ ['setfqfilename_10',['SetFqFileName',['../classxb_1_1xbFile.html#aee832fa11db2077a532f49e1329bd05a',1,'xb::xbFile']]],
+ ['setlogdirectory_11',['SetLogDirectory',['../classxb_1_1xbXBase.html#a48d82dbe298c6f4cf68a63ac82dd8292',1,'xb::xbXBase']]],
+ ['setlogfilename_12',['SetLogFileName',['../classxb_1_1xbXBase.html#a94010b88a309315ef980715eb581336c',1,'xb::xbXBase']]],
+ ['setlogsize_13',['SetLogSize',['../classxb_1_1xbXBase.html#a666a0cb5b76ec7a9a3677d339e0c6b42',1,'xb::xbXBase']]],
+ ['setmultiuser_14',['SetMultiUser',['../classxb_1_1xbSsv.html#aba6e59512f7172dd55dcf92059e5928c',1,'xb::xbSsv']]],
+ ['setnum_15',['SetNum',['../classxb_1_1xbString.html#a3af5b1f111f94b0667551fcbd1d97abd',1,'xb::xbString']]],
+ ['setversion_16',['SetVersion',['../classxb_1_1xbDbf.html#a7e63e852418f337eb7c44de5dcd50323',1,'xb::xbDbf']]],
+ ['sprintf_17',['Sprintf',['../classxb_1_1xbString.html#a9e9bfa29d86377b915f1628aeb0e9195',1,'xb::xbString']]],
+ ['str_18',['Str',['../classxb_1_1xbDate.html#ab43a5d8d929767c0ffdd722972bb8cc0',1,'xb::xbDate::Str()'],['../classxb_1_1xbString.html#a6715f4c0010f3ab487c9d787838a29b3',1,'xb::xbString::Str() const']]],
+ ['strncpy_19',['strncpy',['../classxb_1_1xbString.html#a3bc9e856c34f0c240a6e36e5b6e3ea7b',1,'xb::xbString']]],
+ ['swapchars_20',['SwapChars',['../classxb_1_1xbString.html#a054683872e1f05d11c2cf8683a63a6fe',1,'xb::xbString']]],
+ ['sysdate_21',['Sysdate',['../classxb_1_1xbDate.html#a40ba54a58d64cf56266f020f91584192',1,'xb::xbDate']]]
+];
diff --git a/docs/doxygen/html/search/functions_11.html b/docs/doxygen/html/search/functions_11.html
new file mode 100644
index 0000000..fb95b05
--- /dev/null
+++ b/docs/doxygen/html/search/functions_11.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_11.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_11.js b/docs/doxygen/html/search/functions_11.js
new file mode 100644
index 0000000..02f57b9
--- /dev/null
+++ b/docs/doxygen/html/search/functions_11.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['testmethod_0',['TestMethod',['../tstfuncs_8cpp.html#a265547b80a3aef5836952bede5288e2c',1,'TestMethod(xbInt16 PrintOption, const char *title, const xbString &amp;result, const char *expectedResult, size_t expectedLen):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#a9c27703ef863c9d29680844fc5124953',1,'TestMethod(xbInt16 PrintOption, const char *title, char result, char expectedResult):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#ae6536e920580382389126d5f66655f90',1,'TestMethod(xbInt16 PrintOption, const char *title, xbInt32 result, xbInt32 expectedResult):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#a000fca67bc0fffea3d3da7a5317a06e4',1,'TestMethod(xbInt16 PrintOption, const char *title, xbUInt64 result, xbUInt64 expectedResult):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#a663f3dd7bd8574a35c1b1b9a22081c6d',1,'TestMethod(xbInt16 PrintOption, const char *title, xbFloat result, xbFloat expectedResult):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#af1c78fb72bcd39eb86f11aa2887fe62c',1,'TestMethod(xbInt16 PrintOption, const char *title, xbDouble result, xbDouble expectedResult):&#160;tstfuncs.cpp'],['../tstfuncs_8cpp.html#ac64a0bed74ba10b638456709f128f893',1,'TestMethod(xbInt16 PrintOption, const char *title, xbDouble result, xbDouble expectedResult, xbDouble dEpsilon):&#160;tstfuncs.cpp'],['../xb__test__expression_8cpp.html#ad52c27685018dda7c5c4b26fb445860e',1,'TestMethod(xbXBase *xb, xbDbf *d, xbInt16 PrintOption, const char *title, const xbString &amp;sExpression, const char *sExpectedResult, xbInt16 iExpectedResultLen):&#160;xb_test_expression.cpp'],['../xb__test__expression_8cpp.html#a7030149316fe8d8195ffbb18132e0cf9',1,'TestMethod(xbXBase *xb, xbDbf *d, xbInt16 PrintOption, const char *title, const xbString &amp;sExpression, xbDouble dExpectedResult):&#160;xb_test_expression.cpp'],['../xb__test__expression_8cpp.html#a10e637a203841bd2b6a92e6217509e23',1,'TestMethod(xbXBase *xb, xbDbf *d, xbInt16 PrintOption, const char *title, const xbString &amp;sExpression, xbDate dtExpectedResult):&#160;xb_test_expression.cpp'],['../xb__test__expression_8cpp.html#aa385c5f9fa8b4cfd63763b4a28852b64',1,'TestMethod(xbXBase *xb, xbDbf *d, xbInt16 PrintOption, const char *title, const xbString &amp;sExpression, xbBool bExpectedResult):&#160;xb_test_expression.cpp']]],
+ ['testtokenmethod_1',['TestTokenMethod',['../xb__test__expression_8cpp.html#a440d64b55abaa9e14e73ecc132d1084d',1,'xb_test_expression.cpp']]],
+ ['testweight_2',['TestWeight',['../xb__test__expression_8cpp.html#af56b6dbc38e0d23caaf6531526315379',1,'xb_test_expression.cpp']]],
+ ['tolowercase_3',['ToLowerCase',['../classxb_1_1xbString.html#a602cac1a6ef3f6b52f587ac4c0ef4fb2',1,'xb::xbString']]],
+ ['touppercase_4',['ToUpperCase',['../classxb_1_1xbString.html#a68001d0a44e6b4fe61e29a4e41ded9d4',1,'xb::xbString']]],
+ ['trim_5',['Trim',['../classxb_1_1xbString.html#abc9bd33687d4e03ca52d77885721d626',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/functions_12.html b/docs/doxygen/html/search/functions_12.html
new file mode 100644
index 0000000..292fd4a
--- /dev/null
+++ b/docs/doxygen/html/search/functions_12.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_12.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_12.js b/docs/doxygen/html/search/functions_12.js
new file mode 100644
index 0000000..b31073e
--- /dev/null
+++ b/docs/doxygen/html/search/functions_12.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['undeleteallrecords_0',['UndeleteAllRecords',['../classxb_1_1xbDbf.html#ae94cb1bf9f75184f39d9e1a80ab49d4a',1,'xb::xbDbf']]],
+ ['undeleterecord_1',['UndeleteRecord',['../classxb_1_1xbDbf.html#a255681976a04fc722538bb630507b3a0',1,'xb::xbDbf']]],
+ ['usage_2',['Usage',['../dbfxtrct_8cpp.html#a5ae07f63d6b390e42068d941038dadf2',1,'dbfxtrct.cpp']]]
+];
diff --git a/docs/doxygen/html/search/functions_13.html b/docs/doxygen/html/search/functions_13.html
new file mode 100644
index 0000000..5fcdf9c
--- /dev/null
+++ b/docs/doxygen/html/search/functions_13.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_13.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_13.js b/docs/doxygen/html/search/functions_13.js
new file mode 100644
index 0000000..9ea4de7
--- /dev/null
+++ b/docs/doxygen/html/search/functions_13.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['validateschema_0',['ValidateSchema',['../classxb_1_1xbDbf.html#aba5dcac3b4092261bc1669740cdd669d',1,'xb::xbDbf']]],
+ ['validlogicalvalue_1',['ValidLogicalValue',['../classxb_1_1xbString.html#a72b16c15fd8822efaa5f158c34df7b1e',1,'xb::xbString']]],
+ ['validnumericvalue_2',['ValidNumericValue',['../classxb_1_1xbString.html#aeed920d2a25111f776ddde2d530eb81b',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/functions_14.html b/docs/doxygen/html/search/functions_14.html
new file mode 100644
index 0000000..82c70b0
--- /dev/null
+++ b/docs/doxygen/html/search/functions_14.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_14.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_14.js b/docs/doxygen/html/search/functions_14.js
new file mode 100644
index 0000000..c9794d0
--- /dev/null
+++ b/docs/doxygen/html/search/functions_14.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['writeblock_0',['WriteBlock',['../classxb_1_1xbFile.html#a5d871dcfecc2b4338f7a13722aab766c',1,'xb::xbFile']]],
+ ['writeheader_1',['WriteHeader',['../classxb_1_1xbDbf.html#a44e1410109ef7b3d11a6af4b704b62b2',1,'xb::xbDbf']]],
+ ['writelogbytes_2',['WriteLogBytes',['../classxb_1_1xbXBase.html#a0dff00b9ee3c288841e137ca01168116',1,'xb::xbXBase']]],
+ ['writelogmessage_3',['WriteLogMessage',['../classxb_1_1xbXBase.html#a9ca5be73abffd0fdd18bdc799877272a',1,'xb::xbXBase']]]
+];
diff --git a/docs/doxygen/html/search/functions_15.html b/docs/doxygen/html/search/functions_15.html
new file mode 100644
index 0000000..050aa25
--- /dev/null
+++ b/docs/doxygen/html/search/functions_15.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_15.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_15.js b/docs/doxygen/html/search/functions_15.js
new file mode 100644
index 0000000..e09deb0
--- /dev/null
+++ b/docs/doxygen/html/search/functions_15.js
@@ -0,0 +1,30 @@
+var searchData=
+[
+ ['xbdate_0',['xbDate',['../classxb_1_1xbDate.html#ac8a4d9330221a3daee21b3c28c1d9719',1,'xb::xbDate::xbDate(const char *Date8)'],['../classxb_1_1xbDate.html#ab3150e7db0ab5db10a07d748b55465eb',1,'xb::xbDate::xbDate()'],['../classxb_1_1xbDate.html#a7ab727a7ec184a086ad36ef83b948170',1,'xb::xbDate::xbDate(xbInt32 lJulDate)'],['../classxb_1_1xbDate.html#acf4546f5681735ede18210f60bab68d4',1,'xb::xbDate::xbDate(const xbString &amp;Date8)']]],
+ ['xbdbf_1',['xbDbf',['../classxb_1_1xbDbf.html#a84a75f80bc0e9b8a22b728767949c204',1,'xb::xbDbf']]],
+ ['xbfclose_2',['xbFclose',['../classxb_1_1xbFile.html#a18830b5755d74818f60d9c7ce38ddf2d',1,'xb::xbFile']]],
+ ['xbfeof_3',['xbFeof',['../classxb_1_1xbFile.html#af5b6356832d2a67212070a1aa605f170',1,'xb::xbFile']]],
+ ['xbfflush_4',['xbFflush',['../classxb_1_1xbFile.html#ad205184d43409f04216540ae22f15009',1,'xb::xbFile']]],
+ ['xbfgetc_5',['xbFgetc',['../classxb_1_1xbFile.html#afb1c584d2895ffb7834df80aea7eb1e4',1,'xb::xbFile::xbFgetc(xbInt32 &amp;c)'],['../classxb_1_1xbFile.html#a5ee229bda4d7d6695e122200e581e7a6',1,'xb::xbFile::xbFgetc(char &amp;c)']]],
+ ['xbfgets_6',['xbFgets',['../classxb_1_1xbFile.html#ad245955ace26e5dde85fd4373b30d026',1,'xb::xbFile']]],
+ ['xbfile_7',['xbFile',['../classxb_1_1xbFile.html#a869eedd74c6eddc308852eb546c87176',1,'xb::xbFile']]],
+ ['xbfopen_8',['xbFopen',['../classxb_1_1xbFile.html#a7cdfef5ede9ac98d44a28a6b7a70972c',1,'xb::xbFile::xbFopen(xbInt16 iOpenMode)'],['../classxb_1_1xbFile.html#ab0fa19686ca8953ff4b556fb5b249135',1,'xb::xbFile::xbFopen(const xbString &amp;sMode, const xbString &amp;sFileName, xbInt16 iShareMode)'],['../classxb_1_1xbFile.html#aabd113333b49c36cad23244b392baab4',1,'xb::xbFile::xbFopen(xbInt16 iOpenMode, xbInt16 iShareMode)'],['../classxb_1_1xbFile.html#a0548cedf0f26b7d8ac221f75b0cd048c',1,'xb::xbFile::xbFopen(const xbString &amp;sOpenMode, xbInt16 iShareMode)']]],
+ ['xbfputc_9',['xbFputc',['../classxb_1_1xbFile.html#af2e940c78956e5cb6824f9a1bc404896',1,'xb::xbFile::xbFputc(xbInt32 c)'],['../classxb_1_1xbFile.html#a863f74cf17df8186d88586b4d2a6441a',1,'xb::xbFile::xbFputc(xbInt32 c, xbInt32 iNoTimes)']]],
+ ['xbfputs_10',['xbFputs',['../classxb_1_1xbFile.html#a698f3b40216778562e639e6ca1a47573',1,'xb::xbFile']]],
+ ['xbfread_11',['xbFread',['../classxb_1_1xbFile.html#ab4f6afaa1f77539f27a4f05c26e54e2f',1,'xb::xbFile']]],
+ ['xbfseek_12',['xbFseek',['../classxb_1_1xbFile.html#a5337ab8918df240910c0d19b4f298e3d',1,'xb::xbFile']]],
+ ['xbftell_13',['xbFtell',['../classxb_1_1xbFile.html#a0e1c06aedfa7fbcb92e117f891edd13b',1,'xb::xbFile']]],
+ ['xbfturnofffilebuffering_14',['xbFTurnOffFileBuffering',['../classxb_1_1xbFile.html#a9891b792f585a696f38a5cf959e30918',1,'xb::xbFile']]],
+ ['xbfwrite_15',['xbFwrite',['../classxb_1_1xbFile.html#a6aadd871d1782944703fed773d44b85f',1,'xb::xbFile']]],
+ ['xbmemcmp_16',['xbMemcmp',['../classxb_1_1xbXBase.html#a1b239c021358476382942522911b5c66',1,'xb::xbXBase']]],
+ ['xbreaduntil_17',['xbReadUntil',['../classxb_1_1xbFile.html#a08463f506f425c2385acbe1a561506e9',1,'xb::xbFile']]],
+ ['xbremove_18',['xbRemove',['../classxb_1_1xbFile.html#a6d919366c2ec95e529906bf8842cbf07',1,'xb::xbFile::xbRemove(const xbString &amp;sFileName, xbInt16 iOption)'],['../classxb_1_1xbFile.html#a58f6a6751fdf7e9549c273bb75d93eb5',1,'xb::xbFile::xbRemove(const xbString &amp;sFileName)'],['../classxb_1_1xbFile.html#ab3c668a8570433188382d31d7c60bd48',1,'xb::xbFile::xbRemove()']]],
+ ['xbrename_19',['xbRename',['../classxb_1_1xbFile.html#afc8ce113aa72611a278233f9bb170012',1,'xb::xbFile::xbRename(const xbString &amp;sOldName, const xbString &amp;sNewName)'],['../classxb_1_1xbFile.html#ab0b2a2c88947921d98ebcb5b5ec34ed9',1,'xb::xbFile::xbRename(const xbString &amp;sOldName, const xbString &amp;sNewName, xbInt16 iOption)']]],
+ ['xbrewind_20',['xbRewind',['../classxb_1_1xbFile.html#a7996b6e084665c37c3892faea64b3505',1,'xb::xbFile']]],
+ ['xbsleep_21',['xbSleep',['../classxb_1_1xbXBase.html#a0915aff7be4b2dd3e881f3c5d0da4baf',1,'xb::xbXBase']]],
+ ['xbssv_22',['xbSsv',['../classxb_1_1xbSsv.html#a58f85692c3167af20b1a7c17c621523b',1,'xb::xbSsv']]],
+ ['xbstring_23',['xbString',['../classxb_1_1xbString.html#a63f9313217e0ff3c9789ec59316216a1',1,'xb::xbString::xbString(xbUInt32 size)'],['../classxb_1_1xbString.html#a14bbaa293c8d40dd6c64332f2668a92e',1,'xb::xbString::xbString(char c)'],['../classxb_1_1xbString.html#a18f3598dcdf2ec5692274fc8ee769ad7',1,'xb::xbString::xbString(const char *s, xbUInt32 lMaxLen)'],['../classxb_1_1xbString.html#a0d81016b93fc36ebbbafacf35c677f07',1,'xb::xbString::xbString(const xbString &amp;s)'],['../classxb_1_1xbString.html#a25856311106c5fb15d39017b63f0ddc7',1,'xb::xbString::xbString(const char *=&quot;&quot;)'],['../classxb_1_1xbString.html#ad865b55e3b08dffd527afee8e7e8e3fe',1,'xb::xbString::xbString(xbDouble d)']]],
+ ['xbtblmgr_24',['xbTblMgr',['../classxb_1_1xbTblMgr.html#aad83f5ecc184ca6cbdfc6f356b598d6c',1,'xb::xbTblMgr']]],
+ ['xbtruncate_25',['xbTruncate',['../classxb_1_1xbFile.html#a518bfcbfa3699d883cf89affee383296',1,'xb::xbFile']]],
+ ['xbxbase_26',['xbXBase',['../classxb_1_1xbXBase.html#a6c68588e33946fb5416af3f86fe83224',1,'xb::xbXBase']]]
+];
diff --git a/docs/doxygen/html/search/functions_16.html b/docs/doxygen/html/search/functions_16.html
new file mode 100644
index 0000000..1d75c78
--- /dev/null
+++ b/docs/doxygen/html/search/functions_16.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_16.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_16.js b/docs/doxygen/html/search/functions_16.js
new file mode 100644
index 0000000..5979b24
--- /dev/null
+++ b/docs/doxygen/html/search/functions_16.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['yearof_0',['YearOf',['../classxb_1_1xbDate.html#a31057dfaa36389a16e40e3db82c46262',1,'xb::xbDate']]]
+];
diff --git a/docs/doxygen/html/search/functions_17.html b/docs/doxygen/html/search/functions_17.html
new file mode 100644
index 0000000..c099015
--- /dev/null
+++ b/docs/doxygen/html/search/functions_17.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_17.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_17.js b/docs/doxygen/html/search/functions_17.js
new file mode 100644
index 0000000..7108002
--- /dev/null
+++ b/docs/doxygen/html/search/functions_17.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['zap_0',['Zap',['../classxb_1_1xbDbf.html#a8ed0693b10b95aaa4e46037758d160ed',1,'xb::xbDbf']]],
+ ['zapchar_1',['ZapChar',['../classxb_1_1xbString.html#a2fd30956a26a260d1ef6fdbe73dd93f9',1,'xb::xbString']]],
+ ['zapleadingchar_2',['ZapLeadingChar',['../classxb_1_1xbString.html#addc3a470f6cd85d4c21bf9da38cf5ac9',1,'xb::xbString']]],
+ ['zaptrailingchar_3',['ZapTrailingChar',['../classxb_1_1xbString.html#afe3415bfa2e1089b792aeda0462fb99e',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/functions_18.html b/docs/doxygen/html/search/functions_18.html
new file mode 100644
index 0000000..bc92634
--- /dev/null
+++ b/docs/doxygen/html/search/functions_18.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_18.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_18.js b/docs/doxygen/html/search/functions_18.js
new file mode 100644
index 0000000..d44ee63
--- /dev/null
+++ b/docs/doxygen/html/search/functions_18.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['_7exbdate_0',['~xbDate',['../classxb_1_1xbDate.html#a05c9680c6eb9fe07ecf13a189b596c37',1,'xb::xbDate']]],
+ ['_7exbdbf_1',['~xbDbf',['../classxb_1_1xbDbf.html#a7eb87521fba8a939c613056d9918d880',1,'xb::xbDbf']]],
+ ['_7exbfile_2',['~xbFile',['../classxb_1_1xbFile.html#a491f6c48076e89da2e791a42b2727a90',1,'xb::xbFile']]],
+ ['_7exbstring_3',['~xbString',['../classxb_1_1xbString.html#a10a6549efab02bc76ab33b15916b1eb1',1,'xb::xbString']]],
+ ['_7exbtblmgr_4',['~xbTblMgr',['../classxb_1_1xbTblMgr.html#aad6be32d7b3378c71d47fa27ebfe6cbf',1,'xb::xbTblMgr']]],
+ ['_7exbxbase_5',['~xbXBase',['../classxb_1_1xbXBase.html#a204f8634894ac2066d3209117803306d',1,'xb::xbXBase']]]
+];
diff --git a/docs/doxygen/html/search/functions_2.html b/docs/doxygen/html/search/functions_2.html
new file mode 100644
index 0000000..1f16d2a
--- /dev/null
+++ b/docs/doxygen/html/search/functions_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_2.js b/docs/doxygen/html/search/functions_2.js
new file mode 100644
index 0000000..4a1e70d
--- /dev/null
+++ b/docs/doxygen/html/search/functions_2.js
@@ -0,0 +1,21 @@
+var searchData=
+[
+ ['calcrollingcenturyforyear_0',['CalcRollingCenturyForYear',['../classxb_1_1xbDate.html#a9df58caa54105c489c314785c457e8cb',1,'xb::xbDate']]],
+ ['centuryof_1',['CenturyOf',['../classxb_1_1xbDate.html#a38b2c5285c69ed65e94ece6c22dafde0',1,'xb::xbDate']]],
+ ['chardayof_2',['CharDayOf',['../classxb_1_1xbDate.html#a9fc29730b66cddfbb58c69992a99cc7c',1,'xb::xbDate']]],
+ ['charmonthof_3',['CharMonthOf',['../classxb_1_1xbDate.html#afffc84f02bd421335ff8ebe9fb3db0ac',1,'xb::xbDate']]],
+ ['chrontime_4',['ChronTime',['../tstfuncs_8cpp.html#af990eed1e43605771a5810196b4043f7',1,'tstfuncs.cpp']]],
+ ['close_5',['Close',['../classxb_1_1xbDbf.html#ad68d73113e54e1b5f326e90f45e9989d',1,'xb::xbDbf']]],
+ ['closealltables_6',['CloseAllTables',['../classxb_1_1xbXBase.html#afccb552ca0daff779c0500ff20d22c2b',1,'xb::xbXBase']]],
+ ['commit_7',['Commit',['../classxb_1_1xbDbf.html#abd69532c885ab72bcf3fb5066b318f4f',1,'xb::xbDbf']]],
+ ['copy_8',['Copy',['../classxb_1_1xbString.html#ac7a8466b03c04df838bd182ef244f792',1,'xb::xbString']]],
+ ['copydbfstructure_9',['CopyDbfStructure',['../classxb_1_1xbDbf.html#a829c615a130a1fdf609d93438d8a6264',1,'xb::xbDbf']]],
+ ['countchar_10',['CountChar',['../classxb_1_1xbString.html#a26bc14d92dc7ce1f2bf31cd74af0db0f',1,'xb::xbString::CountChar(char c) const'],['../classxb_1_1xbString.html#adc0204bcfd1c052b9aea9229b10acf72',1,'xb::xbString::CountChar(char c, xbInt16 iOpt) const']]],
+ ['createtable_11',['CreateTable',['../classxb_1_1xbDbf.html#a73e41bfe679dd06ab16c436652df93f1',1,'xb::xbDbf']]],
+ ['createuniquefilename_12',['CreateUniqueFileName',['../classxb_1_1xbFile.html#aae9a2ddb0adb8165b4ac2b6a28a932f7',1,'xb::xbFile::CreateUniqueFileName(const xbString &amp;sDirIn, const xbString &amp;sExtIn, xbString &amp;sFqnOut)'],['../classxb_1_1xbFile.html#ae5ffabde2c88ea58324f27e471f6bfc0',1,'xb::xbFile::CreateUniqueFileName(const xbString &amp;sDirIn, const xbString &amp;sExtIn, xbString &amp;sFqnOut, xbInt16 iOption)']]],
+ ['ctod_13',['CTOD',['../classxb_1_1xbDate.html#abb1eb4b0394e4a67aadab15779b1b8c5',1,'xb::xbDate']]],
+ ['cvthexchar_14',['CvtHexChar',['../classxb_1_1xbString.html#a0a737bd408a94903f214eb2879eb56de',1,'xb::xbString']]],
+ ['cvthexstring_15',['CvtHexString',['../classxb_1_1xbString.html#ab5eb6918a0ae9ab6c0e961318f3d1eb0',1,'xb::xbString']]],
+ ['cvtlonglong_16',['CvtLongLong',['../classxb_1_1xbString.html#ae3ab18365e132323f8ae4c99eb72181c',1,'xb::xbString']]],
+ ['cvtulonglong_17',['CvtULongLong',['../classxb_1_1xbString.html#a1528b30b84a41c3564ef31d1f4496b15',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/functions_3.html b/docs/doxygen/html/search/functions_3.html
new file mode 100644
index 0000000..0b37ee2
--- /dev/null
+++ b/docs/doxygen/html/search/functions_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_3.js b/docs/doxygen/html/search/functions_3.js
new file mode 100644
index 0000000..c4c09c9
--- /dev/null
+++ b/docs/doxygen/html/search/functions_3.js
@@ -0,0 +1,20 @@
+var searchData=
+[
+ ['dateisvalid_0',['DateIsValid',['../classxb_1_1xbDate.html#a367f66ef0c03c1747c12a18784554ccb',1,'xb::xbDate']]],
+ ['dayof_1',['DayOf',['../classxb_1_1xbDate.html#ad6417a900ce64a46f8909c0c7a2ddea2',1,'xb::xbDate']]],
+ ['dblequals_2',['dblEquals',['../tstfuncs_8cpp.html#a8b8e417213c57f2ea0bcb61a7fb28860',1,'tstfuncs.cpp']]],
+ ['dblmax_3',['dblMax',['../tstfuncs_8cpp.html#a69a6e718e066af7f8392e5f1fea40d1b',1,'tstfuncs.cpp']]],
+ ['dblmin_4',['dblMin',['../tstfuncs_8cpp.html#a4d7b8f3f1ce52c6c0a281f25419f4c93',1,'tstfuncs.cpp']]],
+ ['deleteall_5',['DeleteAll',['../classxb_1_1xbDbf.html#a01c26b67e312be1e674b3da710e031b9',1,'xb::xbDbf']]],
+ ['deleteallrecords_6',['DeleteAllRecords',['../classxb_1_1xbDbf.html#a3067fdfa3a7a5c15651f6e89d1102176',1,'xb::xbDbf']]],
+ ['deleterecord_7',['DeleteRecord',['../classxb_1_1xbDbf.html#acd8c10579229f3a2e2c5fdb7fcef90db',1,'xb::xbDbf']]],
+ ['deletetable_8',['DeleteTable',['../classxb_1_1xbDbf.html#a4085ed4f049d976124d8edc3d3c56397',1,'xb::xbDbf']]],
+ ['determinexbasememoversion_9',['DetermineXbaseMemoVersion',['../classxb_1_1xbFile.html#a5a740033664c9ad2611c90e2a6d0c2d3',1,'xb::xbFile']]],
+ ['determinexbasetableversion_10',['DetermineXbaseTableVersion',['../classxb_1_1xbFile.html#ae2b6ac26018dc28f77afbb3f008c3f66',1,'xb::xbFile']]],
+ ['devtester_11',['DevTester',['../xb__test__expression_8cpp.html#aee57237c5f5b9b4d80e84bf530eb42bc',1,'xb_test_expression.cpp']]],
+ ['disablemsglogging_12',['DisableMsgLogging',['../classxb_1_1xbXBase.html#ae357fac4fdebdf49e46563cf611caf65',1,'xb::xbXBase']]],
+ ['displayerror_13',['DisplayError',['../classxb_1_1xbSsv.html#a97dfa59ab9a8e9f17454da0faceb023d',1,'xb::xbSsv']]],
+ ['displaytablelist_14',['DisplayTableList',['../classxb_1_1xbTblMgr.html#a5eebffb9e8cc64141e35c2622045cb50',1,'xb::xbTblMgr']]],
+ ['dumpheader_15',['DumpHeader',['../classxb_1_1xbDbf.html#ab1f4a515533402f872cedcd0322aabd4',1,'xb::xbDbf']]],
+ ['dumprecord_16',['DumpRecord',['../classxb_1_1xbDbf.html#a3a6a068addffd06fc9a996639d6ca69e',1,'xb::xbDbf']]]
+];
diff --git a/docs/doxygen/html/search/functions_4.html b/docs/doxygen/html/search/functions_4.html
new file mode 100644
index 0000000..0eaf2b4
--- /dev/null
+++ b/docs/doxygen/html/search/functions_4.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_4.js b/docs/doxygen/html/search/functions_4.js
new file mode 100644
index 0000000..a90081e
--- /dev/null
+++ b/docs/doxygen/html/search/functions_4.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+ ['egetdouble_0',['eGetDouble',['../classxb_1_1xbFile.html#ab14e4a11427f5efb81cba1dd32bd1aa1',1,'xb::xbFile']]],
+ ['egetint16_1',['eGetInt16',['../classxb_1_1xbFile.html#ac40c991110ddc6fb30a72d90f4652762',1,'xb::xbFile']]],
+ ['egetint32_2',['eGetInt32',['../classxb_1_1xbFile.html#a60b24a5afc984c586bf384c7e915ba0d',1,'xb::xbFile']]],
+ ['egetuint16_3',['eGetUInt16',['../classxb_1_1xbFile.html#a936ade458e6d5e6d29f9b5031888d189',1,'xb::xbFile']]],
+ ['egetuint32_4',['eGetUInt32',['../classxb_1_1xbFile.html#a78f052529d39a18deaface5a0d47d0b0',1,'xb::xbFile']]],
+ ['enablemsglogging_5',['EnableMsgLogging',['../classxb_1_1xbXBase.html#a470e6eb0ed0be60338f9b40976d3ad48',1,'xb::xbXBase']]],
+ ['eputdouble_6',['ePutDouble',['../classxb_1_1xbFile.html#a98b6ff533ae93f90c977a2ba23eeb105',1,'xb::xbFile']]],
+ ['eputint16_7',['ePutInt16',['../classxb_1_1xbFile.html#a29130f12739ac8fa837f4eaedf1338b2',1,'xb::xbFile']]],
+ ['eputint32_8',['ePutInt32',['../classxb_1_1xbFile.html#a19c37f76a2ccbb45019cb0fc373d3f46',1,'xb::xbFile']]],
+ ['eputuint16_9',['ePutUInt16',['../classxb_1_1xbFile.html#a65e9839f92b96eac7b0d071fac3bbe40',1,'xb::xbFile']]],
+ ['eputuint32_10',['ePutUInt32',['../classxb_1_1xbFile.html#aa3f6ceae4b96f24875d86848bf13a173',1,'xb::xbFile']]],
+ ['extractelement_11',['ExtractElement',['../classxb_1_1xbString.html#a77195fc4957952625cb33bb503517a3e',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/functions_5.html b/docs/doxygen/html/search/functions_5.html
new file mode 100644
index 0000000..eaa2769
--- /dev/null
+++ b/docs/doxygen/html/search/functions_5.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_5.js b/docs/doxygen/html/search/functions_5.js
new file mode 100644
index 0000000..09a9029
--- /dev/null
+++ b/docs/doxygen/html/search/functions_5.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['filecompare_0',['FileCompare',['../tstfuncs_8cpp.html#aa5dbb64c6135ac01f79e5b6087270cf5',1,'tstfuncs.cpp']]],
+ ['fileexists_1',['FileExists',['../classxb_1_1xbFile.html#a78bd8a11dce102647095baf3aff2b006',1,'xb::xbFile::FileExists() const'],['../classxb_1_1xbFile.html#a174d8a6aabc9cfcd32fedbd1e5b13ddd',1,'xb::xbFile::FileExists(xbInt16 iOption) const'],['../classxb_1_1xbFile.html#a61130b4fbf4cf9d5972dcb4993de2f94',1,'xb::xbFile::FileExists(const xbString &amp;sFileName) const'],['../classxb_1_1xbFile.html#a0592168f39a10f2a401a88ef781f6148',1,'xb::xbFile::FileExists(const xbString &amp;sFileName, xbInt16 iOption) const']]],
+ ['fileisopen_2',['FileIsOpen',['../classxb_1_1xbFile.html#a7fa837938a32dc9ca3fbc81cbaf50f59',1,'xb::xbFile']]],
+ ['flushlog_3',['FlushLog',['../classxb_1_1xbXBase.html#a5a5ecaed9777978344902446c9ae3b8e',1,'xb::xbXBase']]],
+ ['formatdate_4',['FormatDate',['../classxb_1_1xbDate.html#a01de44dc869f7db99f33046fc91f2c6a',1,'xb::xbDate']]]
+];
diff --git a/docs/doxygen/html/search/functions_6.html b/docs/doxygen/html/search/functions_6.html
new file mode 100644
index 0000000..25d1cc8
--- /dev/null
+++ b/docs/doxygen/html/search/functions_6.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_6.js b/docs/doxygen/html/search/functions_6.js
new file mode 100644
index 0000000..e6c6187
--- /dev/null
+++ b/docs/doxygen/html/search/functions_6.js
@@ -0,0 +1,65 @@
+var searchData=
+[
+ ['getautocommit_0',['GetAutoCommit',['../classxb_1_1xbDbf.html#ae0c00226fd2ea7a67f101e795467ed68',1,'xb::xbDbf::GetAutoCommit(xbInt16 iOption) const'],['../classxb_1_1xbDbf.html#abb9e20c5efacd4fea80f1515abbc6b55',1,'xb::xbDbf::GetAutoCommit() const']]],
+ ['getblocksize_1',['GetBlockSize',['../classxb_1_1xbFile.html#a638e14262410a1627819f016a16cdce2',1,'xb::xbFile']]],
+ ['getcharacter_2',['GetCharacter',['../classxb_1_1xbString.html#a685187a5f8401b322fc61f3fbe56330d',1,'xb::xbString']]],
+ ['getcurrecno_3',['GetCurRecNo',['../classxb_1_1xbDbf.html#a643a80a3792a52760c8e09ba18719503',1,'xb::xbDbf']]],
+ ['getdatadirectory_4',['GetDataDirectory',['../classxb_1_1xbSsv.html#a1d803a4bfc8ba0561267a0bf9e51f7d9',1,'xb::xbSsv']]],
+ ['getdatefield_5',['GetDateField',['../classxb_1_1xbDbf.html#af78ef1fba949463ff7f829d3cffc4555',1,'xb::xbDbf::GetDateField(xbInt16 iFieldNo, xbDate &amp;dt) const'],['../classxb_1_1xbDbf.html#ac624e06a97666bfd64b4f252b4548b36',1,'xb::xbDbf::GetDateField(const xbString &amp;sFieldName, xbDate &amp;dt) const']]],
+ ['getdbfptr_6',['GetDbfPtr',['../classxb_1_1xbTblMgr.html#ad8a5d28a2ee6720a9aa74bcb45662cf5',1,'xb::xbTblMgr::GetDbfPtr(const xbString &amp;sTblAlias) const'],['../classxb_1_1xbTblMgr.html#a801dfecf7fc216954b4197b2c31b25d6',1,'xb::xbTblMgr::GetDbfPtr(xbInt16 sItemNo) const']]],
+ ['getdbfstatus_7',['GetDbfStatus',['../classxb_1_1xbDbf.html#ac1110d867ba297a52c8b0e83e88f05e6',1,'xb::xbDbf']]],
+ ['getdefaultautocommit_8',['GetDefaultAutoCommit',['../classxb_1_1xbSsv.html#a6982f973e81587b04916f4509746aaf5',1,'xb::xbSsv']]],
+ ['getdefaultdateformat_9',['GetDefaultDateFormat',['../classxb_1_1xbSsv.html#a6fbb9c3a550ab0b3378f9586a57791d2',1,'xb::xbSsv']]],
+ ['getdefaultlogdirectory_10',['GetDefaultLogDirectory',['../classxb_1_1xbSsv.html#abf3763faf6a8917a963213cd53af529c',1,'xb::xbSsv']]],
+ ['getdefaultlogfilename_11',['GetDefaultLogFileName',['../classxb_1_1xbSsv.html#a43878d4dc041f2a5e2398a118ccfaf79',1,'xb::xbSsv']]],
+ ['getdirectory_12',['GetDirectory',['../classxb_1_1xbFile.html#acd0fb2166b2bff7e8a1cf65a7bc8be1e',1,'xb::xbFile']]],
+ ['getdoublefield_13',['GetDoubleField',['../classxb_1_1xbDbf.html#a4556041a7ff2f6b6f986729901c11f08',1,'xb::xbDbf::GetDoubleField(xbInt16 FieldNo, xbDouble &amp;dFieldValue) const'],['../classxb_1_1xbDbf.html#a2370b5e736931441a5968649291b9ef4',1,'xb::xbDbf::GetDoubleField(xbInt16 FieldNo, xbDouble &amp;dFieldValue, xbInt16 iRecBufSw) const'],['../classxb_1_1xbDbf.html#a6e6774df0f2d7733f4b25a9989596d95',1,'xb::xbDbf::GetDoubleField(const xbString &amp;sFieldName, xbDouble &amp;dFieldValue) const']]],
+ ['getendiantype_14',['GetEndianType',['../classxb_1_1xbSsv.html#a49cd162f066eef2b829ba7c9f6620243',1,'xb::xbSsv']]],
+ ['geterrormessage_15',['GetErrorMessage',['../classxb_1_1xbSsv.html#a56961d2a67b8e7470098626ac4dac7e4',1,'xb::xbSsv']]],
+ ['getfield_16',['GetField',['../classxb_1_1xbDbf.html#a9a0fcf7e2040ab483e3807927833cb26',1,'xb::xbDbf::GetField(const xbString &amp;sFieldName, xbString &amp;sFieldValue) const'],['../classxb_1_1xbDbf.html#ad245a26eb8b79610c9ae7bab19e05513',1,'xb::xbDbf::GetField(xbInt16 iFieldNo, xbString &amp;sFieldValue, xbInt16 iRecBufSw) const'],['../classxb_1_1xbDbf.html#ac81f078f3c932f0da60ad1fbdd848d3e',1,'xb::xbDbf::GetField(xbInt16 iFieldNo, xbString &amp;sFieldValue) const']]],
+ ['getfieldcnt_17',['GetFieldCnt',['../classxb_1_1xbDbf.html#add27d8ef555a13b336b8c804165dc15e',1,'xb::xbDbf']]],
+ ['getfielddecimal_18',['GetFieldDecimal',['../classxb_1_1xbDbf.html#abcb4defad2e1b6e67f63cc60737ad840',1,'xb::xbDbf::GetFieldDecimal(xbInt16 iFieldNo, xbInt16 &amp;iFieldDecimal) const'],['../classxb_1_1xbDbf.html#a607f774fcd6dc0b9913d7a7801b60db2',1,'xb::xbDbf::GetFieldDecimal(const xbString &amp;sFieldName, xbInt16 &amp;iFieldDecimal) const']]],
+ ['getfieldlen_19',['GetFieldLen',['../classxb_1_1xbDbf.html#adda4302b58cc6109b048f19d9b68bbd4',1,'xb::xbDbf::GetFieldLen(xbInt16 iFieldNo, xbInt16 &amp;iFieldLen) const'],['../classxb_1_1xbDbf.html#acf06dbccdba1a4bcd90fa0bea6cca59b',1,'xb::xbDbf::GetFieldLen(const xbString &amp;sFieldName, xbInt16 &amp;iFieldLen) const']]],
+ ['getfieldname_20',['GetFieldName',['../classxb_1_1xbDbf.html#a5e3e4368bfba1724c016b8859023e34c',1,'xb::xbDbf']]],
+ ['getfieldno_21',['GetFieldNo',['../classxb_1_1xbDbf.html#aed9113b5095c6df1b9c854cbd0d8047b',1,'xb::xbDbf::GetFieldNo(const xbString &amp;sFieldName, xbInt16 &amp;iFieldNo) const'],['../classxb_1_1xbDbf.html#aad9029e63909aeb77d8473256d88bea8',1,'xb::xbDbf::GetFieldNo(const xbString &amp;sFieldName) const']]],
+ ['getfieldtype_22',['GetFieldType',['../classxb_1_1xbDbf.html#a181db879f1a75f93a34c03513a0b2fea',1,'xb::xbDbf::GetFieldType(const xbString &amp;sFieldName, char &amp;cFieldType) const'],['../classxb_1_1xbDbf.html#a5143973e4f165651152aa13c8fd45f84',1,'xb::xbDbf::GetFieldType(xbInt16 iFieldNo, char &amp;cFieldType) const']]],
+ ['getfiledirpart_23',['GetFileDirPart',['../classxb_1_1xbFile.html#a60c53998e3d1b694134b20a87bc9bf5a',1,'xb::xbFile::GetFileDirPart(xbString &amp;sFileDirPartOut) const'],['../classxb_1_1xbFile.html#af5127c92892816e9bbc5c19653c4147a',1,'xb::xbFile::GetFileDirPart(const xbString &amp;sCompleteFileNameIn, xbString &amp;sFileDirPartOut) const']]],
+ ['getfileextpart_24',['GetFileExtPart',['../classxb_1_1xbFile.html#a57a9222e5cbb51019d4eeb2c3ac89fa2',1,'xb::xbFile::GetFileExtPart(xbString &amp;sFileExtPartOut) const'],['../classxb_1_1xbFile.html#ab289b6ffe955321160c1f90220c22e25',1,'xb::xbFile::GetFileExtPart(const xbString &amp;sCompleteFileNameIn, xbString &amp;sFileExtPartOut) const']]],
+ ['getfilemtime_25',['GetFileMtime',['../classxb_1_1xbFile.html#a02df78f4c90313243f508fc56b95aba8',1,'xb::xbFile']]],
+ ['getfilename_26',['GetFileName',['../classxb_1_1xbFile.html#ac95cb882ccbcdedc9a233c6ad9fed07a',1,'xb::xbFile']]],
+ ['getfilenamepart_27',['GetFileNamePart',['../classxb_1_1xbFile.html#a81422b3dd52763d2cc6c77237ec9af0a',1,'xb::xbFile::GetFileNamePart(xbString &amp;sFileNamePartOut) const'],['../classxb_1_1xbFile.html#a6110763c5ae996b72c7a62c15bdecc73',1,'xb::xbFile::GetFileNamePart(const xbString &amp;sCompleteFileNameIn, xbString &amp;sFileNamePartOut) const']]],
+ ['getfilesize_28',['GetFileSize',['../classxb_1_1xbFile.html#a50b63c39e49d44e52078038027b24cc5',1,'xb::xbFile']]],
+ ['getfiletype_29',['GetFileType',['../classxb_1_1xbFile.html#a5548236d38d43b89ae29b9a015b1f678',1,'xb::xbFile']]],
+ ['getfirstrecord_30',['GetFirstRecord',['../classxb_1_1xbDbf.html#acb78991e8435edd36318c653cb977c1a',1,'xb::xbDbf::GetFirstRecord(xbInt16 iOption)'],['../classxb_1_1xbDbf.html#a6fc5b8a3e2f177d5ceaf9d975cbb5226',1,'xb::xbDbf::GetFirstRecord()']]],
+ ['getfloatfield_31',['GetFloatField',['../classxb_1_1xbDbf.html#a3443f646038ced14425f067a59c0f2da',1,'xb::xbDbf::GetFloatField(xbInt16 iFieldNo, xbFloat &amp;fFieldValue) const'],['../classxb_1_1xbDbf.html#a81ef2f36f921d7ece066a592eb6393eb',1,'xb::xbDbf::GetFloatField(const xbString &amp;sFieldName, xbFloat &amp;fFieldValue) const']]],
+ ['getfqfilename_32',['GetFqFileName',['../classxb_1_1xbFile.html#a31b4e641f93206ba23e2a5a27491dcd4',1,'xb::xbFile']]],
+ ['getfunctioninfo_33',['GetFunctionInfo',['../classxb_1_1xbXBase.html#ae52e53340593b4253936c1372ec15ee1',1,'xb::xbXBase']]],
+ ['getlastpos_34',['GetLastPos',['../classxb_1_1xbString.html#ac7698665f44413a5e99a5b5bc573c6df',1,'xb::xbString::GetLastPos(char c) const'],['../classxb_1_1xbString.html#a1c55587904fe7e534290559d0ecb8646',1,'xb::xbString::GetLastPos(const char *s) const']]],
+ ['getlastrecord_35',['GetLastRecord',['../classxb_1_1xbDbf.html#a49e667f9c8ee55c36444702663fc5964',1,'xb::xbDbf::GetLastRecord()'],['../classxb_1_1xbDbf.html#a8ccfa2291417412b6894940d1b92f9a6',1,'xb::xbDbf::GetLastRecord(xbInt16 iOption)']]],
+ ['getlogdirectory_36',['GetLogDirectory',['../classxb_1_1xbXBase.html#a51d49b4d699740194b28c6ec0d0ee07b',1,'xb::xbXBase']]],
+ ['getlogfilename_37',['GetLogFileName',['../classxb_1_1xbXBase.html#ac0744edf9e4aa959d8cf2daa874376af',1,'xb::xbXBase']]],
+ ['getlogfqfilename_38',['GetLogFqFileName',['../classxb_1_1xbXBase.html#ab5d63cd7d9137eba8a1d4d9c3df522b7',1,'xb::xbXBase']]],
+ ['getlogicalfield_39',['GetLogicalField',['../classxb_1_1xbDbf.html#a3254f091fc4a1404abed3dd2bcdd6ce6',1,'xb::xbDbf::GetLogicalField(xbInt16 iFieldNo, xbString &amp;sFieldData) const'],['../classxb_1_1xbDbf.html#a943cea7fde1b06c1a05184193eff8d2d',1,'xb::xbDbf::GetLogicalField(const xbString &amp;sFieldName, xbBool &amp;bFieldData) const'],['../classxb_1_1xbDbf.html#ab28feef20c988b0a6f1c1911a45377b0',1,'xb::xbDbf::GetLogicalField(xbInt16 iFieldNo, xbBool &amp;bFieldData, xbInt16 iRecBufSw) const'],['../classxb_1_1xbDbf.html#aaf615ddcf08f8cd14efc713c2a8d7ae1',1,'xb::xbDbf::GetLogicalField(xbInt16 iFieldNo, xbBool &amp;bFieldData) const'],['../classxb_1_1xbDbf.html#a9cd6819bfd932ff8507e54d9cb9a624e',1,'xb::xbDbf::GetLogicalField(const xbString &amp;sFieldName, xbString &amp;sFieldData) const']]],
+ ['getlogstatus_40',['GetLogStatus',['../classxb_1_1xbXBase.html#ade34cd72c2a7e70fb55429a8a6f6c028',1,'xb::xbXBase']]],
+ ['getlongfield_41',['GetLongField',['../classxb_1_1xbDbf.html#abe525c0820640e0a9e169d0b7913cfa1',1,'xb::xbDbf::GetLongField(xbInt16 iFieldNo, xbInt32 &amp;lFieldValue) const'],['../classxb_1_1xbDbf.html#a7b8ef75b17941beac17e50e969b2d3db',1,'xb::xbDbf::GetLongField(const xbString &amp;sFieldName, xbInt32 &amp;lFieldValue) const']]],
+ ['getmultiuser_42',['GetMultiUser',['../classxb_1_1xbSsv.html#abd58031c5f1c3766c24d47a82e6fd9c5',1,'xb::xbSsv']]],
+ ['getnextrecord_43',['GetNextRecord',['../classxb_1_1xbDbf.html#a18fdcb4ab15b36cd47fa6f6f7a540d1a',1,'xb::xbDbf::GetNextRecord(xbInt16 iOption, xbUInt32 ulStartRec)'],['../classxb_1_1xbDbf.html#ab896fe3b734f556de578d30f92b18fe2',1,'xb::xbDbf::GetNextRecord()'],['../classxb_1_1xbDbf.html#a3191428a7a92d9107d8d42448884f2ac',1,'xb::xbDbf::GetNextRecord(xbInt16 iOption)']]],
+ ['getnextsqlcmd_44',['GetNextSqlCmd',['../xb__execsql_8cpp.html#af888ba5e7e94d92c2165362b87f1ea0e',1,'xb_execsql.cpp']]],
+ ['getopenmode_45',['GetOpenMode',['../classxb_1_1xbFile.html#a3c500dc9dac22c49496e4b29386b2dd3',1,'xb::xbFile']]],
+ ['getopentablecount_46',['GetOpenTableCount',['../classxb_1_1xbTblMgr.html#ad0d2d4adabc0dc0e761cfdee63c84069',1,'xb::xbTblMgr']]],
+ ['getpathseparator_47',['GetPathSeparator',['../classxb_1_1xbString.html#af8b8b808cf43cd352321b43f500142db',1,'xb::xbString']]],
+ ['getphysicalixcnt_48',['GetPhysicalIxCnt',['../classxb_1_1xbDbf.html#a13393704a8a191d4d6555ae31d3c3e92',1,'xb::xbDbf']]],
+ ['getprevrecord_49',['GetPrevRecord',['../classxb_1_1xbDbf.html#a7eadc7b08d73003802b90584f7b33387',1,'xb::xbDbf::GetPrevRecord(xbInt16 iOption)'],['../classxb_1_1xbDbf.html#ab3d248e5221b4f0809897cd43af17a1e',1,'xb::xbDbf::GetPrevRecord()']]],
+ ['getrawfield_50',['GetRawField',['../classxb_1_1xbDbf.html#aabd146c0e1054ab905ec96aedd84b02e',1,'xb::xbDbf']]],
+ ['getrecord_51',['GetRecord',['../classxb_1_1xbDbf.html#a26fba086b07caeab95066bf1c8d25161',1,'xb::xbDbf']]],
+ ['getrecordbuf_52',['GetRecordBuf',['../classxb_1_1xbDbf.html#aa3e38c4057d726a28a27d07a1610d124',1,'xb::xbDbf']]],
+ ['getrecordcnt_53',['GetRecordCnt',['../classxb_1_1xbDbf.html#ac196ad55335e1f4789d698748434dc89',1,'xb::xbDbf']]],
+ ['getrecordlen_54',['GetRecordLen',['../classxb_1_1xbDbf.html#ab50d76c6e29e81e347a6feb04c2f62bb',1,'xb::xbDbf']]],
+ ['getsharemode_55',['GetShareMode',['../classxb_1_1xbFile.html#a9b63e05b77f477ff6109ff7b9432c1b6',1,'xb::xbFile']]],
+ ['getsize_56',['GetSize',['../classxb_1_1xbString.html#a6c33e73659f8e98819289d2661c7271c',1,'xb::xbString']]],
+ ['gettblalias_57',['GetTblAlias',['../classxb_1_1xbDbf.html#a27758a325c097f204247908b65ba7fbd',1,'xb::xbDbf']]],
+ ['getulongfield_58',['GetULongField',['../classxb_1_1xbDbf.html#a67e3a050f9090edf69eee75aef7f5d83',1,'xb::xbDbf::GetULongField(xbInt16 iFieldNo, xbUInt32 &amp;lFieldValue) const'],['../classxb_1_1xbDbf.html#a039eb02418ec4ca862adbc0f95b9cbec',1,'xb::xbDbf::GetULongField(const xbString &amp;sFieldName, xbUInt32 &amp;lFieldValue) const']]],
+ ['getversion_59',['GetVersion',['../classxb_1_1xbDbf.html#a49212a9eb17f7fa9f303e08d5fc50fc6',1,'xb::xbDbf']]],
+ ['getxbasefiletypebyte_60',['GetXbaseFileTypeByte',['../classxb_1_1xbFile.html#aaf2e697751a0beff41432a66bb83fb5e',1,'xb::xbFile::GetXbaseFileTypeByte(const xbString &amp;sFileName, xbInt16 &amp;iVersion)'],['../classxb_1_1xbFile.html#a7af337808919680b90710ad5e8a99232',1,'xb::xbFile::GetXbaseFileTypeByte(const xbString &amp;sFileName, unsigned char &amp;cFileTypeByte)'],['../classxb_1_1xbFile.html#a78aebdd21d3de46a450d5f835e3027f6',1,'xb::xbFile::GetXbaseFileTypeByte(const xbString &amp;sFileName, unsigned char &amp;cFileTypeByte, xbInt16 &amp;iVersion)']]],
+ ['getxbaseptr_61',['GetXbasePtr',['../classxb_1_1xbDbf.html#ab21ec23c076b0c9affdc0f6672bd133f',1,'xb::xbDbf']]]
+];
diff --git a/docs/doxygen/html/search/functions_7.html b/docs/doxygen/html/search/functions_7.html
new file mode 100644
index 0000000..b6392ea
--- /dev/null
+++ b/docs/doxygen/html/search/functions_7.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_7.js b/docs/doxygen/html/search/functions_7.js
new file mode 100644
index 0000000..6a2cc28
--- /dev/null
+++ b/docs/doxygen/html/search/functions_7.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['hasalphachars_0',['HasAlphaChars',['../classxb_1_1xbString.html#aa13f6b72e5a529eab04545892bbc98b4',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/functions_8.html b/docs/doxygen/html/search/functions_8.html
new file mode 100644
index 0000000..ecf6a89
--- /dev/null
+++ b/docs/doxygen/html/search/functions_8.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_8.js b/docs/doxygen/html/search/functions_8.js
new file mode 100644
index 0000000..6d8ba73
--- /dev/null
+++ b/docs/doxygen/html/search/functions_8.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['inittime_0',['InitTime',['../tstfuncs_8cpp.html#ab1f17da15e67a8b2460d5a88b7a3db6e',1,'tstfuncs.cpp']]],
+ ['initvars_1',['InitVars',['../classxb_1_1xbDbf.html#ad06fe0f7975fb81125d27d82504e6829',1,'xb::xbDbf']]],
+ ['isempty_2',['IsEmpty',['../classxb_1_1xbString.html#a4a255a30d683acd62ea09c1617b53cb3',1,'xb::xbString']]],
+ ['isleapyear_3',['IsLeapYear',['../classxb_1_1xbDate.html#af2bd33a72448e2c5ee00d8b711dc5d95',1,'xb::xbDate::IsLeapYear(xbInt16 iYear) const'],['../classxb_1_1xbDate.html#a5f8051c31b29244265e8f26ac3547b9b',1,'xb::xbDate::IsLeapYear() const']]],
+ ['isnull_4',['IsNull',['../classxb_1_1xbString.html#a3fa34fa31bcb7244ecb054ab628ad500',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/functions_9.html b/docs/doxygen/html/search/functions_9.html
new file mode 100644
index 0000000..cd70e2b
--- /dev/null
+++ b/docs/doxygen/html/search/functions_9.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_9.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_9.js b/docs/doxygen/html/search/functions_9.js
new file mode 100644
index 0000000..bd77163
--- /dev/null
+++ b/docs/doxygen/html/search/functions_9.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['juliandays_0',['JulianDays',['../classxb_1_1xbDate.html#a1ee3377d4ead9d31099eee539d9b13a7',1,'xb::xbDate']]],
+ ['jultodate8_1',['JulToDate8',['../classxb_1_1xbDate.html#a9d28b2a46d8aaa284b92f44eeb96b2ff',1,'xb::xbDate']]]
+];
diff --git a/docs/doxygen/html/search/functions_a.html b/docs/doxygen/html/search/functions_a.html
new file mode 100644
index 0000000..d2a3de9
--- /dev/null
+++ b/docs/doxygen/html/search/functions_a.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_a.js b/docs/doxygen/html/search/functions_a.js
new file mode 100644
index 0000000..2d4005e
--- /dev/null
+++ b/docs/doxygen/html/search/functions_a.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['lastdayofmonth_0',['LastDayOfMonth',['../classxb_1_1xbDate.html#a15847866bb7642aa42bc254e0cf2038a',1,'xb::xbDate']]],
+ ['left_1',['Left',['../classxb_1_1xbString.html#acdc3a6d6955b99f0a6b1d181fb3098b9',1,'xb::xbString']]],
+ ['len_2',['Len',['../classxb_1_1xbString.html#a998b240eedac311aea5843047f55649b',1,'xb::xbString']]],
+ ['ltrim_3',['Ltrim',['../classxb_1_1xbString.html#a90e0d0be4fd0d82dd2ebbe689adf18ee',1,'xb::xbString']]],
+ ['ltrunc_4',['Ltrunc',['../classxb_1_1xbString.html#a656f5854f74064b7257ff96d96dfb68b',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/functions_b.html b/docs/doxygen/html/search/functions_b.html
new file mode 100644
index 0000000..e6f34bb
--- /dev/null
+++ b/docs/doxygen/html/search/functions_b.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_b.js b/docs/doxygen/html/search/functions_b.js
new file mode 100644
index 0000000..67213ee
--- /dev/null
+++ b/docs/doxygen/html/search/functions_b.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['main_0',['main',['../xb__copydbf_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_copydbf.cpp'],['../xb__test__mdx_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_mdx.cpp'],['../xb__test__ndx_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_ndx.cpp'],['../xb__test__ndx2_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_ndx2.cpp'],['../xb__test__sql_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_sql.cpp'],['../xb__test__string_8cpp.html#aabf71bc9adb6daf457b2ea8879ae537f',1,'main(int argCnt, char **av=NULL):&#160;xb_test_string.cpp'],['../xb__test__tblmgr_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_tblmgr.cpp'],['../xb__test__uda_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_uda.cpp'],['../xb__test__xbase_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_xbase.cpp'],['../checkndx_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;checkndx.cpp'],['../dbfxtrct_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;dbfxtrct.cpp'],['../reindex_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;reindex.cpp'],['../xb__cfg__check_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_cfg_check.cpp'],['../xb__test__log_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_log.cpp'],['../xb__dbfutil_8cpp.html#a57e6ea63b6f0a962708db29159629a6d',1,'main(int, char **):&#160;xb_dbfutil.cpp'],['../xb__deletall_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_deletall.cpp'],['../xb__dumpdbt_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_dumpdbt.cpp'],['../xb__dumphdr_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_dumphdr.cpp'],['../xb__dumpix_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_dumpix.cpp'],['../xb__dumprecs_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_dumprecs.cpp'],['../xb__execsql_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_execsql.cpp'],['../xb__pack_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_pack.cpp'],['../xb__tblinfo_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_tblinfo.cpp'],['../xb__undelall_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_undelall.cpp'],['../xb__zap_8cpp.html#a0c99d968a34e803d378692bde2e3f18f',1,'main(int ac, char **av):&#160;xb_zap.cpp'],['../xb__test__lock2_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_lock2.cpp'],['../xb__ex__date_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_date.cpp'],['../xb__ex__sql_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_ex_sql.cpp'],['../xb__ex__string_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_string.cpp'],['../xb__ex__v3__create__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_v3_create_dbf.cpp'],['../xb__ex__v3__upd__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_v3_upd_dbf.cpp'],['../xb__ex__v4__create__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_v4_create_dbf.cpp'],['../xb__ex__v4__upd__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4',1,'main():&#160;xb_ex_v4_upd_dbf.cpp'],['../xb__test__bcd_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_bcd.cpp'],['../xb__test__date_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_date.cpp'],['../xb__test__dbf__v3__memos_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_dbf_v3_memos.cpp'],['../xb__test__dbf__v3__nomemos_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_dbf_v3_nomemos.cpp'],['../xb__test__dbf__v4__memos_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_dbf_v4_memos.cpp'],['../xb__test__dbf__v4__nomemos_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_dbf_v4_nomemos.cpp'],['../xb__test__expnode_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_expnode.cpp'],['../xb__test__expression_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_expression.cpp'],['../xb__test__file_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_file.cpp'],['../xb__test__filter_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_filter.cpp'],['../xb__test__funcs_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_funcs.cpp'],['../xb__test__linklist_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_linklist.cpp'],['../xb__test__lock_8cpp.html#a1470527971db41f828c26074cde7e15a',1,'main(int argCnt, char **av):&#160;xb_test_lock.cpp']]],
+ ['memofieldsexist_1',['MemoFieldsExist',['../classxb_1_1xbDbf.html#ac856fc1b110b46aefa1b2f5c0f530aa2',1,'xb::xbDbf']]],
+ ['mid_2',['Mid',['../classxb_1_1xbString.html#a0f9eefc836b24c4ee7c5a316c5d812b7',1,'xb::xbString']]],
+ ['monthof_3',['MonthOf',['../classxb_1_1xbDate.html#a08bd84c67e1119d8c5c1748cd89d092e',1,'xb::xbDate']]]
+];
diff --git a/docs/doxygen/html/search/functions_c.html b/docs/doxygen/html/search/functions_c.html
new file mode 100644
index 0000000..87b4ce2
--- /dev/null
+++ b/docs/doxygen/html/search/functions_c.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_c.js b/docs/doxygen/html/search/functions_c.js
new file mode 100644
index 0000000..973aa37
--- /dev/null
+++ b/docs/doxygen/html/search/functions_c.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['namesuffixmissing_0',['NameSuffixMissing',['../classxb_1_1xbFile.html#a361e3cc318bbf1c4d10f069e0800a24e',1,'xb::xbFile']]]
+];
diff --git a/docs/doxygen/html/search/functions_d.html b/docs/doxygen/html/search/functions_d.html
new file mode 100644
index 0000000..ada2b81
--- /dev/null
+++ b/docs/doxygen/html/search/functions_d.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_d.js b/docs/doxygen/html/search/functions_d.js
new file mode 100644
index 0000000..d967cbe
--- /dev/null
+++ b/docs/doxygen/html/search/functions_d.js
@@ -0,0 +1,21 @@
+var searchData=
+[
+ ['open_0',['Open',['../classxb_1_1xbDbf.html#ac658818bf9b8f8ff7467d8d80495b324',1,'xb::xbDbf::Open(const xbString &amp;sTableName, const xbString &amp;sAlias)'],['../classxb_1_1xbDbf.html#a97366c7362e409d7f09973a6aef8dad0',1,'xb::xbDbf::Open(const xbString &amp;sTableName)'],['../classxb_1_1xbXBase.html#ab35cec5ac8f0fa95f10653ca7ac817f6',1,'xb::xbXBase::Open()'],['../classxb_1_1xbDbf.html#a4d018cbf44d8d8b2145c9acab02c8adf',1,'xb::xbDbf::Open()'],['../classxb_1_1xbXBase.html#aafb1abd6b6124cddf635adaf9f615a4a',1,'xb::xbXBase::Open(const xbString &amp;sTableName, xbInt16 &amp;iRc)']]],
+ ['openhighestversion_1',['OpenHighestVersion',['../classxb_1_1xbXBase.html#aa957eb502ecd076e5df89e7415cb094b',1,'xb::xbXBase::OpenHighestVersion(const xbString &amp;sTableName, const xbString &amp;sAlias, xbDbf &amp;dbf, int dummy)'],['../classxb_1_1xbXBase.html#afa7bbac08a4601f49cd53b457196ee0e',1,'xb::xbXBase::OpenHighestVersion(const xbString &amp;sTableName, const xbString &amp;sAlias, xbDbf **dbf)']]],
+ ['operator_20const_20char_20_2a_2',['operator const char *',['../classxb_1_1xbString.html#a545df0ae9590f0ea5844a165e38a6388',1,'xb::xbString']]],
+ ['operator_21_3d_3',['operator!=',['../classxb_1_1xbDate.html#ac3aaf8997fc0c36676085e7741f33a8a',1,'xb::xbDate::operator!=()'],['../classxb_1_1xbString.html#acf89691607050b0505dc6af28d059c38',1,'xb::xbString::operator!=(const xbString &amp;) const'],['../classxb_1_1xbString.html#a822448f2a0ce653473d4c1de5763a3a6',1,'xb::xbString::operator!=(const char *) const']]],
+ ['operator_2b_4',['operator+',['../classxb_1_1xbString.html#aab556e8c3cb478dd95643327d72a48bd',1,'xb::xbString::operator+(const char *s)'],['../classxb_1_1xbString.html#af559654baba81c3c0c19823c0b7a69d3',1,'xb::xbString::operator+(const char c)'],['../classxb_1_1xbString.html#a1f289d577ba90c500bc1be3ec7bb0206',1,'xb::xbString::operator+(const xbString &amp;s)'],['../classxb_1_1xbDate.html#ad09609bf78cf038886a4f9cd19423f9c',1,'xb::xbDate::operator+(xbInt32 i)']]],
+ ['operator_2b_2b_5',['operator++',['../classxb_1_1xbDate.html#a1c7d9e3718c43df18b21646072c8605e',1,'xb::xbDate']]],
+ ['operator_2b_3d_6',['operator+=',['../classxb_1_1xbDate.html#a947ba156d04fe063aaa4c9964ae5d163',1,'xb::xbDate::operator+=()'],['../classxb_1_1xbString.html#a76a47af239797a266ada6141c150001c',1,'xb::xbString::operator+=(const xbString &amp;s)'],['../classxb_1_1xbString.html#ab319120dbad9107e1e7090139c956100',1,'xb::xbString::operator+=(const char *s)'],['../classxb_1_1xbString.html#ae12f45b8be84e438e032c0b860f985c6',1,'xb::xbString::operator+=(char c)']]],
+ ['operator_2d_7',['operator-',['../classxb_1_1xbString.html#a06abec236b95f6933ba17bf67089f7cf',1,'xb::xbString::operator-()'],['../classxb_1_1xbDate.html#a3f3a8802c96098c85aa8d0e19717a979',1,'xb::xbDate::operator-(const xbDate &amp;) const'],['../classxb_1_1xbDate.html#a73ff5c037046ac0a0bb7d73f74e25cbb',1,'xb::xbDate::operator-(xbInt32 i)']]],
+ ['operator_2d_2d_8',['operator--',['../classxb_1_1xbDate.html#ae2b33dfee60d324916d833b2098b5a6b',1,'xb::xbDate']]],
+ ['operator_2d_3d_9',['operator-=',['../classxb_1_1xbDate.html#a4a8f207d759540114373f5e9d6d375f7',1,'xb::xbDate::operator-=()'],['../classxb_1_1xbString.html#aa7f4db1b4eae9dfad46346db6e17ea15',1,'xb::xbString::operator-=(const xbString &amp;s)'],['../classxb_1_1xbString.html#aaae97e6eda3d18c9f463993ade985bf4',1,'xb::xbString::operator-=(const char *s)'],['../classxb_1_1xbString.html#adcafd019df23bb5724c46e34f3f31194',1,'xb::xbString::operator-=(char c)']]],
+ ['operator_3c_10',['operator&lt;',['../classxb_1_1xbDate.html#a11f09d97ed527e7ef00ba6f17b9fb02c',1,'xb::xbDate::operator&lt;()'],['../classxb_1_1xbString.html#a71c7aafa0d523c72cbe58c474be2270a',1,'xb::xbString::operator&lt;()']]],
+ ['operator_3c_3c_11',['operator&lt;&lt;',['../namespacexb.html#ad27f348219e895c44f74addba8e1889a',1,'xb']]],
+ ['operator_3c_3d_12',['operator&lt;=',['../classxb_1_1xbString.html#a461f245e60cddfdf5f78a972a46e5880',1,'xb::xbString::operator&lt;=()'],['../classxb_1_1xbDate.html#a6d8fa4df4664f3fd8d4cc15e77f6d046',1,'xb::xbDate::operator&lt;=(const xbDate &amp;) const']]],
+ ['operator_3d_13',['operator=',['../classxb_1_1xbDate.html#a2e33ad9415c32e820e08fd8084198690',1,'xb::xbDate::operator=()'],['../classxb_1_1xbString.html#a4f69d11cbd43edf71725a606d0ca8f40',1,'xb::xbString::operator=(const xbString &amp;s)'],['../classxb_1_1xbString.html#a84ae7d16c5d73c5aa2270aa9895a7f7c',1,'xb::xbString::operator=(const char *s)']]],
+ ['operator_3d_3d_14',['operator==',['../classxb_1_1xbDate.html#aaaf98c1a672066021895f0953b6e94d0',1,'xb::xbDate::operator==()'],['../classxb_1_1xbString.html#a2df3ed2fc9456214f5fd2fcf77b69bc1',1,'xb::xbString::operator==(const xbString &amp;) const'],['../classxb_1_1xbString.html#a94031269af3c433393d4cf0ff9b4be38',1,'xb::xbString::operator==(const char *) const']]],
+ ['operator_3e_15',['operator&gt;',['../classxb_1_1xbDate.html#a744031c4031d6ec4595d34acbd1c5860',1,'xb::xbDate::operator&gt;()'],['../classxb_1_1xbString.html#ae46f6a45da5686b607a4edf2786a2fff',1,'xb::xbString::operator&gt;()']]],
+ ['operator_3e_3d_16',['operator&gt;=',['../classxb_1_1xbDate.html#a1d81959ea55440588068ea7f82617c99',1,'xb::xbDate::operator&gt;=()'],['../classxb_1_1xbString.html#a8f16643cb7ba3ee9cf685422c9ea0e67',1,'xb::xbString::operator&gt;=(const xbString &amp;) const']]],
+ ['operator_5b_5d_17',['operator[]',['../classxb_1_1xbString.html#abe45e463226ac8e18550ced18c5a9df3',1,'xb::xbString::operator[](xbUInt32 n) const'],['../classxb_1_1xbString.html#a4deaa68d9571753349c29baacb5613e8',1,'xb::xbString::operator[](xbInt32 n) const']]]
+];
diff --git a/docs/doxygen/html/search/functions_e.html b/docs/doxygen/html/search/functions_e.html
new file mode 100644
index 0000000..1297715
--- /dev/null
+++ b/docs/doxygen/html/search/functions_e.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_e.js b/docs/doxygen/html/search/functions_e.js
new file mode 100644
index 0000000..99045b4
--- /dev/null
+++ b/docs/doxygen/html/search/functions_e.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+ ['pack_0',['Pack',['../classxb_1_1xbDbf.html#a93bb14ad0451355bfa3379128120988a',1,'xb::xbDbf::Pack(xbUInt32 &amp;ulDeletedRecCnt)'],['../classxb_1_1xbDbf.html#a8a52bf3ef2123c0d17e6b1f67bf0dc55',1,'xb::xbDbf::Pack()']]],
+ ['padleft_1',['PadLeft',['../classxb_1_1xbString.html#a6a09cfed22066b0c72432f26960f9e7b',1,'xb::xbString']]],
+ ['padright_2',['PadRight',['../classxb_1_1xbString.html#aba13f0c77eb6c4a22996039569fad284',1,'xb::xbString']]],
+ ['pos_3',['Pos',['../classxb_1_1xbString.html#a3baf59d15099589ff631995f129e582b',1,'xb::xbString::Pos(char c) const'],['../classxb_1_1xbString.html#a8705d7277b72f5aa98021e84438914da',1,'xb::xbString::Pos(const char *s) const']]],
+ ['putat_4',['PutAt',['../classxb_1_1xbString.html#a1bae6fa8f608261f6e889616482f6e39',1,'xb::xbString']]],
+ ['putdatefield_5',['PutDateField',['../classxb_1_1xbDbf.html#a873f04af528a9d81e6a367a59d998ec5',1,'xb::xbDbf::PutDateField(xbInt16 iFieldNo, const xbDate &amp;dt)'],['../classxb_1_1xbDbf.html#a571b36b3a940b1a16d5e834f329b33b9',1,'xb::xbDbf::PutDateField(const xbString &amp;sFieldName, const xbDate &amp;dt)']]],
+ ['putdoublefield_6',['PutDoubleField',['../classxb_1_1xbDbf.html#a4f34842d7e8ff1f16992c2ece2fc38a5',1,'xb::xbDbf::PutDoubleField(xbInt16 FieldNo, xbDouble dFieldValue)'],['../classxb_1_1xbDbf.html#ae695bbc71c19abc71c0c5f2ff2e1f971',1,'xb::xbDbf::PutDoubleField(const xbString &amp;FieldName, xbDouble dFieldValue)']]],
+ ['putfield_7',['PutField',['../classxb_1_1xbDbf.html#a142b0c0dc904917f3c68c5572c1237b5',1,'xb::xbDbf::PutField(xbInt16 iFieldNo, const xbString &amp;sFieldData)'],['../classxb_1_1xbDbf.html#a7862215dd2f83a1c488e539cd1f9aec0',1,'xb::xbDbf::PutField(const xbString &amp;sFieldName, const xbString &amp;sFieldData)']]],
+ ['putfloatfield_8',['PutFloatField',['../classxb_1_1xbDbf.html#a64161eb50d72e424b11bf3732657ebd8',1,'xb::xbDbf::PutFloatField(xbInt16 iFieldNo, xbFloat fFieldValue)'],['../classxb_1_1xbDbf.html#a4ea3241bc710d57e5f755efda62288ad',1,'xb::xbDbf::PutFloatField(const xbString &amp;sFieldName, xbFloat fFieldValue)']]],
+ ['putlogicalfield_9',['PutLogicalField',['../classxb_1_1xbDbf.html#ab39ac4269ac63bc7ea4f638733bb17f0',1,'xb::xbDbf::PutLogicalField(xbInt16 iFieldNo, const xbString &amp;sFieldData)'],['../classxb_1_1xbDbf.html#a507e400ca6526a9e0391cf06dd6a014e',1,'xb::xbDbf::PutLogicalField(const xbString &amp;sFieldName, const xbString &amp;sFieldData)'],['../classxb_1_1xbDbf.html#a423a0cb7bd252cedf956ace4954f275d',1,'xb::xbDbf::PutLogicalField(xbInt16 iFieldNo, xbBool bFieldData)'],['../classxb_1_1xbDbf.html#a623ca3ef5520c42308c1a16b518e7ff3',1,'xb::xbDbf::PutLogicalField(const xbString &amp;sFieldName, xbBool bFieldData)']]],
+ ['putlongfield_10',['PutLongField',['../classxb_1_1xbDbf.html#a56c8f924284bf88aabf90b7930b4eb47',1,'xb::xbDbf::PutLongField(xbInt16 iFieldNo, xbInt32 lFieldValue)'],['../classxb_1_1xbDbf.html#ae7aad223119edb3d541e9f65e88c9f2f',1,'xb::xbDbf::PutLongField(const xbString &amp;sFieldNo, xbInt32 lFieldValue)']]],
+ ['putrecord_11',['PutRecord',['../classxb_1_1xbDbf.html#a3c36a5ffbc7067a1abbcb526dd3b981d',1,'xb::xbDbf::PutRecord()'],['../classxb_1_1xbDbf.html#aacbc7bac3ea0c502ee75b838f4f0fcbf',1,'xb::xbDbf::PutRecord(xbUInt32 ulRecNo)']]],
+ ['putulongfield_12',['PutULongField',['../classxb_1_1xbDbf.html#af5dec5c9ff903efffdb0490a44d296d2',1,'xb::xbDbf::PutULongField(xbInt16 iFieldNo, xbUInt32 lFieldValue)'],['../classxb_1_1xbDbf.html#ac62cb97c4e678c83f41788b1ae4d0381',1,'xb::xbDbf::PutULongField(const xbString &amp;sFieldNo, xbUInt32 lFieldValue)']]]
+];
diff --git a/docs/doxygen/html/search/functions_f.html b/docs/doxygen/html/search/functions_f.html
new file mode 100644
index 0000000..d2ae3cf
--- /dev/null
+++ b/docs/doxygen/html/search/functions_f.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/functions_f.js b/docs/doxygen/html/search/functions_f.js
new file mode 100644
index 0000000..cc0cfb1
--- /dev/null
+++ b/docs/doxygen/html/search/functions_f.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['readblock_0',['ReadBlock',['../classxb_1_1xbFile.html#aa1bb80340abc7a5c22f87f878e9dc825',1,'xb::xbFile::ReadBlock(xbUInt32 ulBlockNo, size_t readSize, void *buf)'],['../classxb_1_1xbFile.html#aef696b1c4c0ef5338e818599f695d485',1,'xb::xbFile::ReadBlock(xbUInt32 ulBlockNo, xbUInt32 ulBlockSize, size_t readSize, void *buf)']]],
+ ['readheader_1',['ReadHeader',['../classxb_1_1xbDbf.html#a060541addb5bb1f0fe12959ed6f66fb9',1,'xb::xbDbf']]],
+ ['recorddeleted_2',['RecordDeleted',['../classxb_1_1xbDbf.html#a94d7d626ba691fd4b740c034673e6fc6',1,'xb::xbDbf']]],
+ ['remove_3',['Remove',['../classxb_1_1xbString.html#afaac65eaa6d9ef1596d6a0e7b91ed0f2',1,'xb::xbString']]],
+ ['removetblfromtbllist_4',['RemoveTblFromTblList',['../classxb_1_1xbTblMgr.html#ac8eaef41acf08911b90f900aac8e70af',1,'xb::xbTblMgr::RemoveTblFromTblList(const xbString &amp;sTblAlias)'],['../classxb_1_1xbTblMgr.html#a3d82b6e73d5c0bc8cac22b9a260389c1',1,'xb::xbTblMgr::RemoveTblFromTblList(xbDbf *d)']]],
+ ['resize_5',['Resize',['../classxb_1_1xbString.html#aa6d346ab04e5bb8852f0bb996163a35e',1,'xb::xbString']]],
+ ['rtrim_6',['Rtrim',['../classxb_1_1xbString.html#aaf330188d67c347ecae0d16f65b22077',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/mag_sel.svg b/docs/doxygen/html/search/mag_sel.svg
new file mode 100644
index 0000000..03626f6
--- /dev/null
+++ b/docs/doxygen/html/search/mag_sel.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="svg2"
+ width="20"
+ height="19"
+ viewBox="0 0 20 19"
+ sodipodi:docname="mag_sel.svg"
+ inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1920"
+ inkscape:window-height="2096"
+ id="namedview4"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:zoom="32"
+ inkscape:cx="5.9792688"
+ inkscape:cy="1.1436277"
+ inkscape:window-x="1920"
+ inkscape:window-y="27"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <circle
+ style="fill:#000000;fill-opacity:0;stroke:#656565;stroke-width:1.4;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ id="path4611"
+ cx="5.5"
+ cy="8.5"
+ r="3.5" />
+ <path
+ style="fill:#656565;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="M 11,7 13.5,10 16,7 Z"
+ id="path4609"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;stroke:#656565;stroke-width:1.4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 8.1085854,11.109059 2.7823556,2.782356"
+ id="path4630"
+ inkscape:connector-curvature="0" />
+</svg>
diff --git a/docs/doxygen/html/search/namespaces_0.html b/docs/doxygen/html/search/namespaces_0.html
new file mode 100644
index 0000000..c6a0d24
--- /dev/null
+++ b/docs/doxygen/html/search/namespaces_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="namespaces_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/namespaces_0.js b/docs/doxygen/html/search/namespaces_0.js
new file mode 100644
index 0000000..e3c1eff
--- /dev/null
+++ b/docs/doxygen/html/search/namespaces_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['xb_0',['xb',['../namespacexb.html',1,'']]]
+];
diff --git a/docs/doxygen/html/search/nomatches.html b/docs/doxygen/html/search/nomatches.html
new file mode 100644
index 0000000..2b9360b
--- /dev/null
+++ b/docs/doxygen/html/search/nomatches.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/related_0.html b/docs/doxygen/html/search/related_0.html
new file mode 100644
index 0000000..28d304b
--- /dev/null
+++ b/docs/doxygen/html/search/related_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="related_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/related_0.js b/docs/doxygen/html/search/related_0.js
new file mode 100644
index 0000000..ff26086
--- /dev/null
+++ b/docs/doxygen/html/search/related_0.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['operator_3c_3c_0',['operator&lt;&lt;',['../classxb_1_1xbString.html#a3fa915061156521e9dd772a8d7e5f8fb',1,'xb::xbString']]]
+];
diff --git a/docs/doxygen/html/search/related_1.html b/docs/doxygen/html/search/related_1.html
new file mode 100644
index 0000000..64586cd
--- /dev/null
+++ b/docs/doxygen/html/search/related_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="related_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/related_1.js b/docs/doxygen/html/search/related_1.js
new file mode 100644
index 0000000..ffc5eef
--- /dev/null
+++ b/docs/doxygen/html/search/related_1.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['xbbcd_0',['xbBcd',['../classxb_1_1xbXBase.html#a86a53ce3efbf910996df0f853f1c0add',1,'xb::xbXBase']]],
+ ['xbexp_1',['xbExp',['../classxb_1_1xbXBase.html#a3c3e5617be811d732472fe2cc8fb18cc',1,'xb::xbXBase']]]
+];
diff --git a/docs/doxygen/html/search/search.css b/docs/doxygen/html/search/search.css
new file mode 100644
index 0000000..648a792
--- /dev/null
+++ b/docs/doxygen/html/search/search.css
@@ -0,0 +1,263 @@
+/*---------------- Search Box */
+
+#MSearchBox {
+ white-space : nowrap;
+ background: white;
+ border-radius: 0.65em;
+ box-shadow: inset 0.5px 0.5px 3px 0px #555;
+ z-index: 102;
+}
+
+#MSearchBox .left {
+ display: inline-block;
+ vertical-align: middle;
+ height: 1.4em;
+}
+
+#MSearchSelect {
+ display: inline-block;
+ vertical-align: middle;
+ height: 19px;
+ padding: 0 0 0 0.3em;
+ margin: 0;
+}
+
+#MSearchField {
+ display: inline-block;
+ vertical-align: middle;
+ width: 7.5em;
+ height: 19px;
+ margin: 0 0.15em;
+ padding: 0;
+ line-height: 1em;
+ border:none;
+ color: #909090;
+ outline: none;
+ font-family: Arial, Verdana, sans-serif;
+ -webkit-border-radius: 0px;
+ border-radius: 0px;
+ background: none;
+}
+
+@media(hover: none) {
+ /* to avoid zooming on iOS */
+ #MSearchField {
+ font-size: 16px;
+ }
+}
+
+#MSearchBox .right {
+ display: inline-block;
+ vertical-align: middle;
+ width: 1.4em;
+ height: 1.4em;
+}
+
+#MSearchClose {
+ display: none;
+ font-size: inherit;
+ background : none;
+ border: none;
+ margin: 0;
+ padding: 0;
+ outline: none;
+
+}
+
+#MSearchCloseImg {
+ height: 1.4em;
+ padding: 0.3em;
+ margin: 0;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: #000000;
+}
+
+#main-menu > li:last-child {
+ /* This <li> object is the parent of the search bar */
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 36px;
+ margin-right: 1em;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #90A5CE;
+ background-color: #F9FAFC;
+ z-index: 10001;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+ font: 8pt Arial, Verdana, sans-serif;
+ padding-left: 2px;
+ padding-right: 12px;
+ border: 0px;
+}
+
+span.SelectionMark {
+ margin-right: 4px;
+ font-family: monospace;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem {
+ display: block;
+ outline-style: none;
+ color: #000000;
+ text-decoration: none;
+ padding-left: 6px;
+ padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+ color: #000000;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem:hover {
+ color: #FFFFFF;
+ background-color: #3D578C;
+ outline-style: none;
+ text-decoration: none;
+ cursor: pointer;
+ display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+ /*width: 60ex;*/
+ height: 15em;
+}
+
+#MSearchResultsWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #000;
+ background-color: #EEF1F7;
+ z-index:10000;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+ clear:both;
+ padding-bottom: 15px;
+}
+
+.SREntry {
+ font-size: 10pt;
+ padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+ font-size: 8pt;
+ padding: 1px 5px;
+}
+
+body.SRPage {
+ margin: 5px 2px;
+}
+
+.SRChildren {
+ padding-left: 3ex; padding-bottom: .5em
+}
+
+.SRPage .SRChildren {
+ display: none;
+}
+
+.SRSymbol {
+ font-weight: bold;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRScope {
+ display: block;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+ text-decoration: underline;
+}
+
+span.SRScope {
+ padding-left: 4px;
+ font-family: Arial, Verdana, sans-serif;
+}
+
+.SRPage .SRStatus {
+ padding: 2px 5px;
+ font-size: 8pt;
+ font-style: italic;
+ font-family: Arial, Verdana, sans-serif;
+}
+
+.SRResult {
+ display: none;
+}
+
+div.searchresults {
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+/*---------------- External search page results */
+
+.searchresult {
+ background-color: #F0F3F8;
+}
+
+.pages b {
+ color: white;
+ padding: 5px 5px 3px 5px;
+ background-image: url("../tab_a.png");
+ background-repeat: repeat-x;
+ text-shadow: 0 1px 1px #000000;
+}
+
+.pages {
+ line-height: 17px;
+ margin-left: 4px;
+ text-decoration: none;
+}
+
+.hl {
+ font-weight: bold;
+}
+
+#searchresults {
+ margin-bottom: 20px;
+}
+
+.searchpages {
+ margin-top: 10px;
+}
+
diff --git a/docs/doxygen/html/search/search.js b/docs/doxygen/html/search/search.js
new file mode 100644
index 0000000..ac8055d
--- /dev/null
+++ b/docs/doxygen/html/search/search.js
@@ -0,0 +1,794 @@
+/*
+ @licstart The following is the entire license notice for the JavaScript code in this file.
+
+ The MIT License (MIT)
+
+ Copyright (C) 1997-2020 by Dimitri van Heesch
+
+ 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.
+
+ @licend The above is the entire license notice for the JavaScript code in this file
+ */
+function convertToId(search)
+{
+ var result = '';
+ for (i=0;i<search.length;i++)
+ {
+ var c = search.charAt(i);
+ var cn = c.charCodeAt(0);
+ if (c.match(/[a-z0-9\u0080-\uFFFF]/))
+ {
+ result+=c;
+ }
+ else if (cn<16)
+ {
+ result+="_0"+cn.toString(16);
+ }
+ else
+ {
+ result+="_"+cn.toString(16);
+ }
+ }
+ return result;
+}
+
+function getXPos(item)
+{
+ var x = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ x += item.offsetLeft;
+ item = item.offsetParent;
+ }
+ }
+ return x;
+}
+
+function getYPos(item)
+{
+ var y = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ y += item.offsetTop;
+ item = item.offsetParent;
+ }
+ }
+ return y;
+}
+
+/* A class handling everything associated with the search panel.
+
+ Parameters:
+ name - The name of the global variable that will be
+ storing this instance. Is needed to be able to set timeouts.
+ resultPath - path to use for external files
+*/
+function SearchBox(name, resultsPath, label, extension)
+{
+ if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
+ if (!extension || extension == "") { extension = ".html"; }
+
+ // ---------- Instance variables
+ this.name = name;
+ this.resultsPath = resultsPath;
+ this.keyTimeout = 0;
+ this.keyTimeoutLength = 500;
+ this.closeSelectionTimeout = 300;
+ this.lastSearchValue = "";
+ this.lastResultsPage = "";
+ this.hideTimeout = 0;
+ this.searchIndex = 0;
+ this.searchActive = false;
+ this.searchLabel = label;
+ this.extension = extension;
+
+ // ----------- DOM Elements
+
+ this.DOMSearchField = function()
+ { return document.getElementById("MSearchField"); }
+
+ this.DOMSearchSelect = function()
+ { return document.getElementById("MSearchSelect"); }
+
+ this.DOMSearchSelectWindow = function()
+ { return document.getElementById("MSearchSelectWindow"); }
+
+ this.DOMPopupSearchResults = function()
+ { return document.getElementById("MSearchResults"); }
+
+ this.DOMPopupSearchResultsWindow = function()
+ { return document.getElementById("MSearchResultsWindow"); }
+
+ this.DOMSearchClose = function()
+ { return document.getElementById("MSearchClose"); }
+
+ this.DOMSearchBox = function()
+ { return document.getElementById("MSearchBox"); }
+
+ // ------------ Event Handlers
+
+ // Called when focus is added or removed from the search field.
+ this.OnSearchFieldFocus = function(isActive)
+ {
+ this.Activate(isActive);
+ }
+
+ this.OnSearchSelectShow = function()
+ {
+ var searchSelectWindow = this.DOMSearchSelectWindow();
+ var searchField = this.DOMSearchSelect();
+
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+
+ // stop selection hide timer
+ if (this.hideTimeout)
+ {
+ clearTimeout(this.hideTimeout);
+ this.hideTimeout=0;
+ }
+ return false; // to avoid "image drag" default event
+ }
+
+ this.OnSearchSelectHide = function()
+ {
+ this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
+ this.closeSelectionTimeout);
+ }
+
+ // Called when the content of the search field is changed.
+ this.OnSearchFieldChange = function(evt)
+ {
+ if (this.keyTimeout) // kill running timer
+ {
+ clearTimeout(this.keyTimeout);
+ this.keyTimeout = 0;
+ }
+
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 || e.keyCode==13)
+ {
+ if (e.shiftKey==1)
+ {
+ this.OnSearchSelectShow();
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ child.focus();
+ return;
+ }
+ }
+ return;
+ }
+ else
+ {
+ window.frames.MSearchResults.postMessage("take_focus", "*");
+ }
+ }
+ else if (e.keyCode==27) // Escape out of the search field
+ {
+ this.DOMSearchField().blur();
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ this.Activate(false);
+ return;
+ }
+
+ // strip whitespaces
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+ if (searchValue != this.lastSearchValue) // search value has changed
+ {
+ if (searchValue != "") // non-empty search
+ {
+ // set timer for search update
+ this.keyTimeout = setTimeout(this.name + '.Search()',
+ this.keyTimeoutLength);
+ }
+ else // empty search field
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ }
+ }
+ }
+
+ this.SelectItemCount = function(id)
+ {
+ var count=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ this.SelectItemSet = function(id)
+ {
+ var i,j=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ var node = child.firstChild;
+ if (j==id)
+ {
+ node.innerHTML='&#8226;';
+ }
+ else
+ {
+ node.innerHTML='&#160;';
+ }
+ j++;
+ }
+ }
+ }
+
+ // Called when an search filter selection is made.
+ // set item with index id as the active item
+ this.OnSelectItem = function(id)
+ {
+ this.searchIndex = id;
+ this.SelectItemSet(id);
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+ if (searchValue!="" && this.searchActive) // something was found -> do a search
+ {
+ this.Search();
+ }
+ }
+
+ this.OnSearchSelectKey = function(evt)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
+ {
+ this.searchIndex++;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==38 && this.searchIndex>0) // Up
+ {
+ this.searchIndex--;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==13 || e.keyCode==27)
+ {
+ this.OnSelectItem(this.searchIndex);
+ this.CloseSelectionWindow();
+ this.DOMSearchField().focus();
+ }
+ return false;
+ }
+
+ // --------- Actions
+
+ // Closes the results window.
+ this.CloseResultsWindow = function()
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.Activate(false);
+ }
+
+ this.CloseSelectionWindow = function()
+ {
+ this.DOMSearchSelectWindow().style.display = 'none';
+ }
+
+ // Performs a search.
+ this.Search = function()
+ {
+ this.keyTimeout = 0;
+
+ // strip leading whitespace
+ var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+ var code = searchValue.toLowerCase().charCodeAt(0);
+ var idxChar = searchValue.substr(0, 1).toLowerCase();
+ if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair
+ {
+ idxChar = searchValue.substr(0, 2);
+ }
+
+ var resultsPage;
+ var resultsPageWithSearch;
+ var hasResultsPage;
+
+ var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar);
+ if (idx!=-1)
+ {
+ var hexCode=idx.toString(16);
+ resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension;
+ resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+ hasResultsPage = true;
+ }
+ else // nothing available for this search term
+ {
+ resultsPage = this.resultsPath + '/nomatches' + this.extension;
+ resultsPageWithSearch = resultsPage;
+ hasResultsPage = false;
+ }
+
+ window.frames.MSearchResults.location = resultsPageWithSearch;
+ var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ var domSearchBox = this.DOMSearchBox();
+ this.DOMSearchClose().style.display = 'inline-block';
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+ var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ var maxWidth = document.body.clientWidth;
+ var width = 400;
+ if (left<10) left=10;
+ if (width+left+8>maxWidth) width=maxWidth-left-8;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ }
+
+ this.lastSearchValue = searchValue;
+ this.lastResultsPage = resultsPage;
+ }
+
+ // -------- Activation Functions
+
+ // Activates or deactivates the search panel, resetting things to
+ // their default values if necessary.
+ this.Activate = function(isActive)
+ {
+ if (isActive || // open it
+ this.DOMPopupSearchResultsWindow().style.display == 'block'
+ )
+ {
+ this.DOMSearchBox().className = 'MSearchBoxActive';
+
+ var searchField = this.DOMSearchField();
+
+ if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+ {
+ searchField.value = '';
+ this.searchActive = true;
+ }
+ }
+ else if (!isActive) // directly remove the panel
+ {
+ this.DOMSearchBox().className = 'MSearchBoxInactive';
+ this.DOMSearchField().value = this.searchLabel;
+ this.searchActive = false;
+ this.lastSearchValue = ''
+ this.lastResultsPage = '';
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+ // The number of matches from the last run of <Search()>.
+ this.lastMatchCount = 0;
+ this.lastKey = 0;
+ this.repeatOn = false;
+
+ // Toggles the visibility of the passed element ID.
+ this.FindChildElement = function(id)
+ {
+ var parentElement = document.getElementById(id);
+ var element = parentElement.firstChild;
+
+ while (element && element!=parentElement)
+ {
+ if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren')
+ {
+ return element;
+ }
+
+ if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes())
+ {
+ element = element.firstChild;
+ }
+ else if (element.nextSibling)
+ {
+ element = element.nextSibling;
+ }
+ else
+ {
+ do
+ {
+ element = element.parentNode;
+ }
+ while (element && element!=parentElement && !element.nextSibling);
+
+ if (element && element!=parentElement)
+ {
+ element = element.nextSibling;
+ }
+ }
+ }
+ }
+
+ this.Toggle = function(id)
+ {
+ var element = this.FindChildElement(id);
+ if (element)
+ {
+ if (element.style.display == 'block')
+ {
+ element.style.display = 'none';
+ }
+ else
+ {
+ element.style.display = 'block';
+ }
+ }
+ }
+
+ // Searches for the passed string. If there is no parameter,
+ // it takes it from the URL query.
+ //
+ // Always returns true, since other documents may try to call it
+ // and that may or may not be possible.
+ this.Search = function(search)
+ {
+ if (!search) // get search word from URL
+ {
+ search = window.location.search;
+ search = search.substring(1); // Remove the leading '?'
+ search = unescape(search);
+ }
+
+ search = search.replace(/^ +/, ""); // strip leading spaces
+ search = search.replace(/ +$/, ""); // strip trailing spaces
+ search = search.toLowerCase();
+ search = convertToId(search);
+
+ var resultRows = document.getElementsByTagName("div");
+ var matches = 0;
+
+ var i = 0;
+ while (i < resultRows.length)
+ {
+ var row = resultRows.item(i);
+ if (row.className == "SRResult")
+ {
+ var rowMatchName = row.id.toLowerCase();
+ rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+ if (search.length<=rowMatchName.length &&
+ rowMatchName.substr(0, search.length)==search)
+ {
+ row.style.display = 'block';
+ matches++;
+ }
+ else
+ {
+ row.style.display = 'none';
+ }
+ }
+ i++;
+ }
+ document.getElementById("Searching").style.display='none';
+ if (matches == 0) // no results
+ {
+ document.getElementById("NoMatches").style.display='block';
+ }
+ else // at least one result
+ {
+ document.getElementById("NoMatches").style.display='none';
+ }
+ this.lastMatchCount = matches;
+ return true;
+ }
+
+ // return the first item with index index or higher that is visible
+ this.NavNext = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index++;
+ }
+ return focusItem;
+ }
+
+ this.NavPrev = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index--;
+ }
+ return focusItem;
+ }
+
+ this.ProcessKeys = function(e)
+ {
+ if (e.type == "keydown")
+ {
+ this.repeatOn = false;
+ this.lastKey = e.keyCode;
+ }
+ else if (e.type == "keypress")
+ {
+ if (!this.repeatOn)
+ {
+ if (this.lastKey) this.repeatOn = true;
+ return false; // ignore first keypress after keydown
+ }
+ }
+ else if (e.type == "keyup")
+ {
+ this.lastKey = 0;
+ this.repeatOn = false;
+ }
+ return this.lastKey!=0;
+ }
+
+ this.Nav = function(evt,itemIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ var newIndex = itemIndex-1;
+ var focusItem = this.NavPrev(newIndex);
+ if (focusItem)
+ {
+ var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+ if (child && child.style.display == 'block') // children visible
+ {
+ var n=0;
+ var tmpElem;
+ while (1) // search for last child
+ {
+ tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+ if (tmpElem)
+ {
+ focusItem = tmpElem;
+ }
+ else // found it!
+ {
+ break;
+ }
+ n++;
+ }
+ }
+ }
+ if (focusItem)
+ {
+ focusItem.focus();
+ }
+ else // return focus to search field
+ {
+ parent.document.getElementById("MSearchField").focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = itemIndex+1;
+ var focusItem;
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem && elem.style.display == 'block') // children visible
+ {
+ focusItem = document.getElementById('Item'+itemIndex+'_c0');
+ }
+ if (!focusItem) focusItem = this.NavNext(newIndex);
+ if (focusItem) focusItem.focus();
+ }
+ else if (this.lastKey==39) // Right
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'block';
+ }
+ else if (this.lastKey==37) // Left
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'none';
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+
+ this.NavChild = function(evt,itemIndex,childIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ if (childIndex>0)
+ {
+ var newIndex = childIndex-1;
+ document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+ }
+ else // already at first child, jump to parent
+ {
+ document.getElementById('Item'+itemIndex).focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = childIndex+1;
+ var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+ if (!elem) // last child, jump to parent next parent
+ {
+ elem = this.NavNext(itemIndex+1);
+ }
+ if (elem)
+ {
+ elem.focus();
+ }
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+}
+
+function setKeyActions(elem,action)
+{
+ elem.setAttribute('onkeydown',action);
+ elem.setAttribute('onkeypress',action);
+ elem.setAttribute('onkeyup',action);
+}
+
+function setClassAttr(elem,attr)
+{
+ elem.setAttribute('class',attr);
+ elem.setAttribute('className',attr);
+}
+
+function createResults()
+{
+ var results = document.getElementById("SRResults");
+ for (var e=0; e<searchData.length; e++)
+ {
+ var id = searchData[e][0];
+ var srResult = document.createElement('div');
+ srResult.setAttribute('id','SR_'+id);
+ setClassAttr(srResult,'SRResult');
+ var srEntry = document.createElement('div');
+ setClassAttr(srEntry,'SREntry');
+ var srLink = document.createElement('a');
+ srLink.setAttribute('id','Item'+e);
+ setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
+ setClassAttr(srLink,'SRSymbol');
+ srLink.innerHTML = searchData[e][1][0];
+ srEntry.appendChild(srLink);
+ if (searchData[e][1].length==2) // single result
+ {
+ srLink.setAttribute('href',searchData[e][1][1][0]);
+ srLink.setAttribute('onclick','parent.searchBox.CloseResultsWindow()');
+ if (searchData[e][1][1][1])
+ {
+ srLink.setAttribute('target','_parent');
+ }
+ var srScope = document.createElement('span');
+ setClassAttr(srScope,'SRScope');
+ srScope.innerHTML = searchData[e][1][1][2];
+ srEntry.appendChild(srScope);
+ }
+ else // multiple results
+ {
+ srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
+ var srChildren = document.createElement('div');
+ setClassAttr(srChildren,'SRChildren');
+ for (var c=0; c<searchData[e][1].length-1; c++)
+ {
+ var srChild = document.createElement('a');
+ srChild.setAttribute('id','Item'+e+'_c'+c);
+ setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
+ setClassAttr(srChild,'SRScope');
+ srChild.setAttribute('href',searchData[e][1][c+1][0]);
+ srChild.setAttribute('onclick','parent.searchBox.CloseResultsWindow()');
+ if (searchData[e][1][c+1][1])
+ {
+ srChild.setAttribute('target','_parent');
+ }
+ srChild.innerHTML = searchData[e][1][c+1][2];
+ srChildren.appendChild(srChild);
+ }
+ srEntry.appendChild(srChildren);
+ }
+ srResult.appendChild(srEntry);
+ results.appendChild(srResult);
+ }
+}
+
+function init_search()
+{
+ var results = document.getElementById("MSearchSelectWindow");
+ for (var key in indexSectionLabels)
+ {
+ var link = document.createElement('a');
+ link.setAttribute('class','SelectItem');
+ link.setAttribute('onclick','searchBox.OnSelectItem('+key+')');
+ link.href='javascript:void(0)';
+ link.innerHTML='<span class="SelectionMark">&#160;</span>'+indexSectionLabels[key];
+ results.appendChild(link);
+ }
+ searchBox.OnSelectItem(0);
+}
+/* @license-end */
diff --git a/docs/doxygen/html/search/search_l.png b/docs/doxygen/html/search/search_l.png
new file mode 100644
index 0000000..fd5f7da
--- /dev/null
+++ b/docs/doxygen/html/search/search_l.png
Binary files differ
diff --git a/docs/doxygen/html/search/search_m.png b/docs/doxygen/html/search/search_m.png
new file mode 100644
index 0000000..b429a16
--- /dev/null
+++ b/docs/doxygen/html/search/search_m.png
Binary files differ
diff --git a/docs/doxygen/html/search/search_r.png b/docs/doxygen/html/search/search_r.png
new file mode 100644
index 0000000..1af5d21
--- /dev/null
+++ b/docs/doxygen/html/search/search_r.png
Binary files differ
diff --git a/docs/doxygen/html/search/searchdata.js b/docs/doxygen/html/search/searchdata.js
new file mode 100644
index 0000000..5f125dd
--- /dev/null
+++ b/docs/doxygen/html/search/searchdata.js
@@ -0,0 +1,39 @@
+var indexSectionsWithContent =
+{
+ 0: "abcdefghijlmnoprstuvwxyz~",
+ 1: "x",
+ 2: "x",
+ 3: "cdrtx",
+ 4: "abcdefghijlmnoprstuvwxyz~",
+ 5: "ceiprstux",
+ 6: "x",
+ 7: "ox",
+ 8: "jlvx"
+};
+
+var indexSectionNames =
+{
+ 0: "all",
+ 1: "classes",
+ 2: "namespaces",
+ 3: "files",
+ 4: "functions",
+ 5: "variables",
+ 6: "typedefs",
+ 7: "related",
+ 8: "defines"
+};
+
+var indexSectionLabels =
+{
+ 0: "All",
+ 1: "Data Structures",
+ 2: "Namespaces",
+ 3: "Files",
+ 4: "Functions",
+ 5: "Variables",
+ 6: "Typedefs",
+ 7: "Friends",
+ 8: "Macros"
+};
+
diff --git a/docs/doxygen/html/search/typedefs_0.html b/docs/doxygen/html/search/typedefs_0.html
new file mode 100644
index 0000000..882b2a1
--- /dev/null
+++ b/docs/doxygen/html/search/typedefs_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="typedefs_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/typedefs_0.js b/docs/doxygen/html/search/typedefs_0.js
new file mode 100644
index 0000000..ab1907c
--- /dev/null
+++ b/docs/doxygen/html/search/typedefs_0.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['xbbool_0',['xbBool',['../namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f',1,'xb']]],
+ ['xbdouble_1',['xbDouble',['../namespacexb.html#a25f47b226ce924a5c78f97989b0744a2',1,'xb']]],
+ ['xbfloat_2',['xbFloat',['../namespacexb.html#a83aa6a550398db55973aa9fb4257e66e',1,'xb']]],
+ ['xbofft_3',['xbOffT',['../namespacexb.html#ac963d9fde6debb416303cfbed35fb793',1,'xb']]]
+];
diff --git a/docs/doxygen/html/search/variables_0.html b/docs/doxygen/html/search/variables_0.html
new file mode 100644
index 0000000..950bfc5
--- /dev/null
+++ b/docs/doxygen/html/search/variables_0.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_0.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/variables_0.js b/docs/doxygen/html/search/variables_0.js
new file mode 100644
index 0000000..c24d67c
--- /dev/null
+++ b/docs/doxygen/html/search/variables_0.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['cencryptionflag_0',['cEncryptionFlag',['../classxb_1_1xbDbf.html#a8734e799707582f022fc341d515650f4',1,'xb::xbDbf']]],
+ ['cfieldname_1',['cFieldName',['../structxb_1_1xbSchema.html#a514183856094123fd37df67885b4681e',1,'xb::xbSchema']]],
+ ['cindexflag_2',['cIndexFlag',['../classxb_1_1xbDbf.html#ad59074633641e03647e54d2b66c9102b',1,'xb::xbDbf']]],
+ ['clangdriver_3',['cLangDriver',['../classxb_1_1xbDbf.html#aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1',1,'xb::xbDbf']]],
+ ['ctransactionflag_4',['cTransactionFlag',['../classxb_1_1xbDbf.html#ac3c89fc3bc6a6abf385478a8adbed970',1,'xb::xbDbf']]],
+ ['ctype_5',['cType',['../structxb_1_1xbSchema.html#a1d612b2ed5dc0b0289c9e91b3cda3a25',1,'xb::xbSchema']]],
+ ['cupdatedd_6',['cUpdateDD',['../classxb_1_1xbDbf.html#a6021789d314cd41488991e708fcd0df2',1,'xb::xbDbf']]],
+ ['cupdatemm_7',['cUpdateMM',['../classxb_1_1xbDbf.html#a9340a5e8ee53eb0f3b6601eec2d71e1b',1,'xb::xbDbf']]],
+ ['cupdateyy_8',['cUpdateYY',['../classxb_1_1xbDbf.html#a4fcd6a86ddd32d4a9d76a4074573440a',1,'xb::xbDbf']]],
+ ['cversion_9',['cVersion',['../classxb_1_1xbDbf.html#a3a262abf658e5fa968b57ef457a69470',1,'xb::xbDbf']]]
+];
diff --git a/docs/doxygen/html/search/variables_1.html b/docs/doxygen/html/search/variables_1.html
new file mode 100644
index 0000000..fed58a5
--- /dev/null
+++ b/docs/doxygen/html/search/variables_1.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_1.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/variables_1.js b/docs/doxygen/html/search/variables_1.js
new file mode 100644
index 0000000..02ce92e
--- /dev/null
+++ b/docs/doxygen/html/search/variables_1.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['errorcodetext_0',['ErrorCodeText',['../classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e',1,'xb::xbSsv']]]
+];
diff --git a/docs/doxygen/html/search/variables_2.html b/docs/doxygen/html/search/variables_2.html
new file mode 100644
index 0000000..761c194
--- /dev/null
+++ b/docs/doxygen/html/search/variables_2.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_2.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/variables_2.js b/docs/doxygen/html/search/variables_2.js
new file mode 100644
index 0000000..97adab8
--- /dev/null
+++ b/docs/doxygen/html/search/variables_2.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['iautocommit_0',['iAutoCommit',['../classxb_1_1xbDbf.html#ab506450954bc86e7bf1d7c4efe681f43',1,'xb::xbDbf']]],
+ ['idbfstatus_1',['iDbfStatus',['../classxb_1_1xbDbf.html#a6d8e193da3ca414eef1e8866ec5ca81b',1,'xb::xbDbf']]],
+ ['iendiantype_2',['iEndianType',['../classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3',1,'xb::xbSsv']]],
+ ['ifieldlen_3',['iFieldLen',['../structxb_1_1xbSchema.html#a2da554af25ef628acf59bb52996056ac',1,'xb::xbSchema']]],
+ ['ifileversion_4',['iFileVersion',['../classxb_1_1xbDbf.html#a15f495446f0d75bcf2fa89e3b699d388',1,'xb::xbDbf']]],
+ ['inoofdecs_5',['iNoOfDecs',['../structxb_1_1xbSchema.html#a55bab3bb69dee3508d168c93e182d4b9',1,'xb::xbSchema']]],
+ ['inooffields_6',['iNoOfFields',['../classxb_1_1xbDbf.html#a5056757614c39f725cc775332494966a',1,'xb::xbDbf']]]
+];
diff --git a/docs/doxygen/html/search/variables_3.html b/docs/doxygen/html/search/variables_3.html
new file mode 100644
index 0000000..78bfe03
--- /dev/null
+++ b/docs/doxygen/html/search/variables_3.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_3.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/variables_3.js b/docs/doxygen/html/search/variables_3.js
new file mode 100644
index 0000000..d024da4
--- /dev/null
+++ b/docs/doxygen/html/search/variables_3.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['pdbf_0',['pDbf',['../structxb_1_1xbTblList.html#a387d3f6bbf291a1fb96d276ed9bb96b6',1,'xb::xbTblList']]],
+ ['pnext_1',['pNext',['../structxb_1_1xbTblList.html#a3fd169fcf0fd4df927544e5342db583c',1,'xb::xbTblList']]],
+ ['pstblalias_2',['psTblAlias',['../structxb_1_1xbTblList.html#ac87742c8a6b1cf2e7e35218e96966a05',1,'xb::xbTblList']]],
+ ['pstblname_3',['psTblName',['../structxb_1_1xbTblList.html#a02c3b0c47fd104ef9758b375ecdcfd0f',1,'xb::xbTblList']]]
+];
diff --git a/docs/doxygen/html/search/variables_4.html b/docs/doxygen/html/search/variables_4.html
new file mode 100644
index 0000000..4d608da
--- /dev/null
+++ b/docs/doxygen/html/search/variables_4.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_4.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/variables_4.js b/docs/doxygen/html/search/variables_4.js
new file mode 100644
index 0000000..9dde579
--- /dev/null
+++ b/docs/doxygen/html/search/variables_4.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['recbuf_0',['RecBuf',['../classxb_1_1xbDbf.html#a8a9b3bce0b741e73473d3ebbd6e6f1cd',1,'xb::xbDbf']]],
+ ['recbuf2_1',['RecBuf2',['../classxb_1_1xbDbf.html#a353ebfc8a2960ef827f429ec74025606',1,'xb::xbDbf']]]
+];
diff --git a/docs/doxygen/html/search/variables_5.html b/docs/doxygen/html/search/variables_5.html
new file mode 100644
index 0000000..6342402
--- /dev/null
+++ b/docs/doxygen/html/search/variables_5.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_5.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/variables_5.js b/docs/doxygen/html/search/variables_5.js
new file mode 100644
index 0000000..f1b6b71
--- /dev/null
+++ b/docs/doxygen/html/search/variables_5.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['salias_0',['sAlias',['../classxb_1_1xbDbf.html#a73f9c792d0a769e2e604c1855245a276',1,'xb::xbDbf']]],
+ ['schemaptr_1',['SchemaPtr',['../classxb_1_1xbDbf.html#ad8c8b5eb12063bb898da1b2cc02cfce7',1,'xb::xbDbf']]],
+ ['snullstring_2',['sNullString',['../classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da',1,'xb::xbSsv']]]
+];
diff --git a/docs/doxygen/html/search/variables_6.html b/docs/doxygen/html/search/variables_6.html
new file mode 100644
index 0000000..80db039
--- /dev/null
+++ b/docs/doxygen/html/search/variables_6.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/variables_6.js b/docs/doxygen/html/search/variables_6.js
new file mode 100644
index 0000000..2369f5c
--- /dev/null
+++ b/docs/doxygen/html/search/variables_6.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['timer_0',['timer',['../tstfuncs_8cpp.html#ae2281da6157495d69406c35f69a61f9f',1,'tstfuncs.cpp']]]
+];
diff --git a/docs/doxygen/html/search/variables_7.html b/docs/doxygen/html/search/variables_7.html
new file mode 100644
index 0000000..bf8eb38
--- /dev/null
+++ b/docs/doxygen/html/search/variables_7.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_7.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/variables_7.js b/docs/doxygen/html/search/variables_7.js
new file mode 100644
index 0000000..5eb7a13
--- /dev/null
+++ b/docs/doxygen/html/search/variables_7.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['uiheaderlen_0',['uiHeaderLen',['../classxb_1_1xbDbf.html#a62f5fa9149ae0f6dc75642823de66918',1,'xb::xbDbf']]],
+ ['uirecordlen_1',['uiRecordLen',['../classxb_1_1xbDbf.html#a1760e222567e2c849f9c799b9d896e91',1,'xb::xbDbf']]],
+ ['ulcurrec_2',['ulCurRec',['../classxb_1_1xbDbf.html#afcd99924606be0a9e1e25180bcd1abf8',1,'xb::xbDbf']]],
+ ['ulnoofrecs_3',['ulNoOfRecs',['../classxb_1_1xbDbf.html#acb594ab61dd35b17bdf28394083f8e87',1,'xb::xbDbf']]]
+];
diff --git a/docs/doxygen/html/search/variables_8.html b/docs/doxygen/html/search/variables_8.html
new file mode 100644
index 0000000..92a55e9
--- /dev/null
+++ b/docs/doxygen/html/search/variables_8.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_8.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+createResults();
+/* @license-end */
+</script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+window.addEventListener("message", function(event) {
+ if (event.data == "take_focus") {
+ var elem = searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+});
+/* @license-end */
+</script>
+</div>
+</body>
+</html>
diff --git a/docs/doxygen/html/search/variables_8.js b/docs/doxygen/html/search/variables_8.js
new file mode 100644
index 0000000..8367676
--- /dev/null
+++ b/docs/doxygen/html/search/variables_8.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['xbase_0',['xbase',['../classxb_1_1xbFile.html#ae39a67ea391b46055d4ca299cb222004',1,'xb::xbFile']]],
+ ['xbdbf_1',['xbDbf',['../namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b',1,'xb']]],
+ ['xberrormessages_2',['xbErrorMessages',['../namespacexb.html#a04be228a037d220dd5564f5ef618adcc',1,'xb']]],
+ ['xblog_3',['xbLog',['../namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c',1,'xb']]],
+ ['xbxbase_4',['xbXBase',['../namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0',1,'xb']]]
+];
diff --git a/docs/doxygen/html/splitbar.png b/docs/doxygen/html/splitbar.png
new file mode 100644
index 0000000..fe895f2
--- /dev/null
+++ b/docs/doxygen/html/splitbar.png
Binary files differ
diff --git a/docs/doxygen/html/structxb_1_1xbSchema.html b/docs/doxygen/html/structxb_1_1xbSchema.html
new file mode 100644
index 0000000..2e404a8
--- /dev/null
+++ b/docs/doxygen/html/structxb_1_1xbSchema.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: xb::xbSchema Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacexb.html">xb</a></li><li class="navelem"><a class="el" href="structxb_1_1xbSchema.html">xbSchema</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle"><div class="title">xb::xbSchema Struct Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p>Schema used for defining tables with CreateTable methods.
+ <a href="structxb_1_1xbSchema.html#details">More...</a></p>
+
+<p><code>#include &lt;<a class="el" href="xbdbf_8h_source.html">xbdbf.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a514183856094123fd37df67885b4681e"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbSchema.html#a514183856094123fd37df67885b4681e">cFieldName</a> [11]</td></tr>
+<tr class="separator:a514183856094123fd37df67885b4681e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d612b2ed5dc0b0289c9e91b3cda3a25"><td class="memItemLeft" align="right" valign="top">char&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbSchema.html#a1d612b2ed5dc0b0289c9e91b3cda3a25">cType</a></td></tr>
+<tr class="separator:a1d612b2ed5dc0b0289c9e91b3cda3a25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2da554af25ef628acf59bb52996056ac"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbSchema.html#a2da554af25ef628acf59bb52996056ac">iFieldLen</a></td></tr>
+<tr class="separator:a2da554af25ef628acf59bb52996056ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55bab3bb69dee3508d168c93e182d4b9"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbSchema.html#a55bab3bb69dee3508d168c93e182d4b9">iNoOfDecs</a></td></tr>
+<tr class="separator:a55bab3bb69dee3508d168c93e182d4b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p >Schema used for defining tables with CreateTable methods. </p>
+<p >See program <a class="el" href="xb__ex__v3__create__dbf_8cpp.html">xb_ex_v3_create_dbf.cpp</a> or <a class="el" href="xb__ex__v4__create__dbf_8cpp.html">xb_ex_v4_create_dbf.cpp</a> as examples on how to use.</p>
+<div class="fragment"><div class="line">xbSchema MyRecord[] = {</div>
+<div class="line"><span class="comment">// FieldName, Type, Len, Dec</span></div>
+<div class="line"> { <span class="stringliteral">&quot;FIRSTNAME&quot;</span>, <a class="code hl_define" href="xbdbf_8h.html#a20f739b9d9dc6a002a246a999e76aeaa">XB_CHAR_FLD</a>, 15, 0 },</div>
+<div class="line"> { <span class="stringliteral">&quot;LASTNAME&quot;</span>, <a class="code hl_define" href="xbdbf_8h.html#a20f739b9d9dc6a002a246a999e76aeaa">XB_CHAR_FLD</a>, 20, 0 },</div>
+<div class="line"> { <span class="stringliteral">&quot;BIRTHDATE&quot;</span>, <a class="code hl_define" href="xbdbf_8h.html#a7f685e6f5fe804b2174725a27ce73adc">XB_DATE_FLD</a>, 8, 0 },</div>
+<div class="line"> { <span class="stringliteral">&quot;AMOUNT&quot;</span>, <a class="code hl_define" href="xbdbf_8h.html#ae9fb6d69cc5edc94d36ae403c22ec1c6">XB_NUMERIC_FLD</a>, 9, 2 },</div>
+<div class="line"> { <span class="stringliteral">&quot;RETIRED?&quot;</span>, <a class="code hl_define" href="xbdbf_8h.html#a2f6d5073af761bc1a806a2c7b1c1d886">XB_LOGICAL_FLD</a>, 1, 0 },</div>
+<div class="line"> { <span class="stringliteral">&quot;ZIPCODE&quot;</span>, <a class="code hl_define" href="xbdbf_8h.html#ae9fb6d69cc5edc94d36ae403c22ec1c6">XB_NUMERIC_FLD</a>, 5, 0 },</div>
+<div class="line"> { <span class="stringliteral">&quot;NUMFLD1&quot;</span>, <a class="code hl_define" href="xbdbf_8h.html#a96ab4218d70ab603b4866354ce8c18cd">XB_FLOAT_FLD</a>, 12, 2 },</div>
+<div class="line"> { <span class="stringliteral">&quot;NUMFLD2&quot;</span>, <a class="code hl_define" href="xbdbf_8h.html#a96ab4218d70ab603b4866354ce8c18cd">XB_FLOAT_FLD</a>, 14, 2 },</div>
+<div class="line"> { <span class="stringliteral">&quot;MEMO1&quot;</span>, <a class="code hl_define" href="xbdbf_8h.html#a23fa19b19cb43bd6dcc59a5a3f6c30ad">XB_MEMO_FLD</a>, 10, 0 },</div>
+<div class="line"> { <span class="stringliteral">&quot;&quot;</span>,0,0,0 }};</div>
+<div class="ttc" id="axbdbf_8h_html_a20f739b9d9dc6a002a246a999e76aeaa"><div class="ttname"><a href="xbdbf_8h.html#a20f739b9d9dc6a002a246a999e76aeaa">XB_CHAR_FLD</a></div><div class="ttdeci">#define XB_CHAR_FLD</div><div class="ttdef"><b>Definition:</b> xbdbf.h:29</div></div>
+<div class="ttc" id="axbdbf_8h_html_a23fa19b19cb43bd6dcc59a5a3f6c30ad"><div class="ttname"><a href="xbdbf_8h.html#a23fa19b19cb43bd6dcc59a5a3f6c30ad">XB_MEMO_FLD</a></div><div class="ttdeci">#define XB_MEMO_FLD</div><div class="ttdef"><b>Definition:</b> xbdbf.h:33</div></div>
+<div class="ttc" id="axbdbf_8h_html_a2f6d5073af761bc1a806a2c7b1c1d886"><div class="ttname"><a href="xbdbf_8h.html#a2f6d5073af761bc1a806a2c7b1c1d886">XB_LOGICAL_FLD</a></div><div class="ttdeci">#define XB_LOGICAL_FLD</div><div class="ttdef"><b>Definition:</b> xbdbf.h:30</div></div>
+<div class="ttc" id="axbdbf_8h_html_a7f685e6f5fe804b2174725a27ce73adc"><div class="ttname"><a href="xbdbf_8h.html#a7f685e6f5fe804b2174725a27ce73adc">XB_DATE_FLD</a></div><div class="ttdeci">#define XB_DATE_FLD</div><div class="ttdef"><b>Definition:</b> xbdbf.h:32</div></div>
+<div class="ttc" id="axbdbf_8h_html_a96ab4218d70ab603b4866354ce8c18cd"><div class="ttname"><a href="xbdbf_8h.html#a96ab4218d70ab603b4866354ce8c18cd">XB_FLOAT_FLD</a></div><div class="ttdeci">#define XB_FLOAT_FLD</div><div class="ttdef"><b>Definition:</b> xbdbf.h:34</div></div>
+<div class="ttc" id="axbdbf_8h_html_ae9fb6d69cc5edc94d36ae403c22ec1c6"><div class="ttname"><a href="xbdbf_8h.html#ae9fb6d69cc5edc94d36ae403c22ec1c6">XB_NUMERIC_FLD</a></div><div class="ttdeci">#define XB_NUMERIC_FLD</div><div class="ttdef"><b>Definition:</b> xbdbf.h:31</div></div>
+</div><!-- fragment --> </div><h2 class="groupheader">Field Documentation</h2>
+<a id="a514183856094123fd37df67885b4681e" name="a514183856094123fd37df67885b4681e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a514183856094123fd37df67885b4681e">&#9670;&nbsp;</a></span>cFieldName</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbSchema::cFieldName[11]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1d612b2ed5dc0b0289c9e91b3cda3a25" name="a1d612b2ed5dc0b0289c9e91b3cda3a25"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1d612b2ed5dc0b0289c9e91b3cda3a25">&#9670;&nbsp;</a></span>cType</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">char xb::xbSchema::cType</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a2da554af25ef628acf59bb52996056ac" name="a2da554af25ef628acf59bb52996056ac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2da554af25ef628acf59bb52996056ac">&#9670;&nbsp;</a></span>iFieldLen</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSchema::iFieldLen</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a55bab3bb69dee3508d168c93e182d4b9" name="a55bab3bb69dee3508d168c93e182d4b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a55bab3bb69dee3508d168c93e182d4b9">&#9670;&nbsp;</a></span>iNoOfDecs</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 xb::xbSchema::iNoOfDecs</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/include/<a class="el" href="xbdbf_8h_source.html">xbdbf.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/structxb_1_1xbTblList.html b/docs/doxygen/html/structxb_1_1xbTblList.html
new file mode 100644
index 0000000..0589131
--- /dev/null
+++ b/docs/doxygen/html/structxb_1_1xbTblList.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: xb::xbTblList Struct Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="namespacexb.html">xb</a></li><li class="navelem"><a class="el" href="structxb_1_1xbTblList.html">xbTblList</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#pub-attribs">Data Fields</a> </div>
+ <div class="headertitle"><div class="title">xb::xbTblList Struct Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><code>#include &lt;<a class="el" href="xbtblmgr_8h_source.html">xbtblmgr.h</a>&gt;</code></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-attribs" name="pub-attribs"></a>
+Data Fields</h2></td></tr>
+<tr class="memitem:a3fd169fcf0fd4df927544e5342db583c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="structxb_1_1xbTblList.html">xbTblList</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbTblList.html#a3fd169fcf0fd4df927544e5342db583c">pNext</a></td></tr>
+<tr class="separator:a3fd169fcf0fd4df927544e5342db583c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02c3b0c47fd104ef9758b375ecdcfd0f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbTblList.html#a02c3b0c47fd104ef9758b375ecdcfd0f">psTblName</a></td></tr>
+<tr class="separator:a02c3b0c47fd104ef9758b375ecdcfd0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac87742c8a6b1cf2e7e35218e96966a05"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbString.html">xbString</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbTblList.html#ac87742c8a6b1cf2e7e35218e96966a05">psTblAlias</a></td></tr>
+<tr class="separator:ac87742c8a6b1cf2e7e35218e96966a05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a387d3f6bbf291a1fb96d276ed9bb96b6"><td class="memItemLeft" align="right" valign="top"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbTblList.html#a387d3f6bbf291a1fb96d276ed9bb96b6">pDbf</a></td></tr>
+<tr class="separator:a387d3f6bbf291a1fb96d276ed9bb96b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Field Documentation</h2>
+<a id="a387d3f6bbf291a1fb96d276ed9bb96b6" name="a387d3f6bbf291a1fb96d276ed9bb96b6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a387d3f6bbf291a1fb96d276ed9bb96b6">&#9670;&nbsp;</a></span>pDbf</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a>* xb::xbTblList::pDbf</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a3fd169fcf0fd4df927544e5342db583c" name="a3fd169fcf0fd4df927544e5342db583c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a3fd169fcf0fd4df927544e5342db583c">&#9670;&nbsp;</a></span>pNext</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="structxb_1_1xbTblList.html">xbTblList</a>* xb::xbTblList::pNext</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac87742c8a6b1cf2e7e35218e96966a05" name="ac87742c8a6b1cf2e7e35218e96966a05"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac87742c8a6b1cf2e7e35218e96966a05">&#9670;&nbsp;</a></span>psTblAlias</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a>* xb::xbTblList::psTblAlias</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a02c3b0c47fd104ef9758b375ecdcfd0f" name="a02c3b0c47fd104ef9758b375ecdcfd0f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a02c3b0c47fd104ef9758b375ecdcfd0f">&#9670;&nbsp;</a></span>psTblName</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="classxb_1_1xbString.html">xbString</a>* xb::xbTblList::psTblName</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this struct was generated from the following file:<ul>
+<li>/mnt/1Tdata/xbase/xbase64-4.0.2/src/include/<a class="el" href="xbtblmgr_8h_source.html">xbtblmgr.h</a></li>
+</ul>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/sync_off.png b/docs/doxygen/html/sync_off.png
new file mode 100644
index 0000000..3b443fc
--- /dev/null
+++ b/docs/doxygen/html/sync_off.png
Binary files differ
diff --git a/docs/doxygen/html/sync_on.png b/docs/doxygen/html/sync_on.png
new file mode 100644
index 0000000..e08320f
--- /dev/null
+++ b/docs/doxygen/html/sync_on.png
Binary files differ
diff --git a/docs/doxygen/html/tab_a.png b/docs/doxygen/html/tab_a.png
new file mode 100644
index 0000000..3b725c4
--- /dev/null
+++ b/docs/doxygen/html/tab_a.png
Binary files differ
diff --git a/docs/doxygen/html/tab_b.png b/docs/doxygen/html/tab_b.png
new file mode 100644
index 0000000..e2b4a86
--- /dev/null
+++ b/docs/doxygen/html/tab_b.png
Binary files differ
diff --git a/docs/doxygen/html/tab_h.png b/docs/doxygen/html/tab_h.png
new file mode 100644
index 0000000..fd5cb70
--- /dev/null
+++ b/docs/doxygen/html/tab_h.png
Binary files differ
diff --git a/docs/doxygen/html/tab_s.png b/docs/doxygen/html/tab_s.png
new file mode 100644
index 0000000..ab478c9
--- /dev/null
+++ b/docs/doxygen/html/tab_s.png
Binary files differ
diff --git a/docs/doxygen/html/tabs.css b/docs/doxygen/html/tabs.css
new file mode 100644
index 0000000..00d1c60
--- /dev/null
+++ b/docs/doxygen/html/tabs.css
@@ -0,0 +1 @@
+.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:#666;-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0 !important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file
diff --git a/docs/doxygen/html/tstfuncs_8cpp.html b/docs/doxygen/html/tstfuncs_8cpp.html
new file mode 100644
index 0000000..58eb044
--- /dev/null
+++ b/docs/doxygen/html/tstfuncs_8cpp.html
@@ -0,0 +1,595 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/tstfuncs.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle"><div class="title">tstfuncs.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af990eed1e43605771a5810196b4043f7"><td class="memItemLeft" align="right" valign="top">xbDouble&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#af990eed1e43605771a5810196b4043f7">ChronTime</a> ()</td></tr>
+<tr class="separator:af990eed1e43605771a5810196b4043f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1f17da15e67a8b2460d5a88b7a3db6e"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#ab1f17da15e67a8b2460d5a88b7a3db6e">InitTime</a> ()</td></tr>
+<tr class="separator:ab1f17da15e67a8b2460d5a88b7a3db6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b8e417213c57f2ea0bcb61a7fb28860"><td class="memItemLeft" align="right" valign="top">xbBool&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#a8b8e417213c57f2ea0bcb61a7fb28860">dblEquals</a> (xbDouble a, xbDouble b, xbDouble epsilon)</td></tr>
+<tr class="separator:a8b8e417213c57f2ea0bcb61a7fb28860"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a265547b80a3aef5836952bede5288e2c"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#a265547b80a3aef5836952bede5288e2c">TestMethod</a> (xbInt16 PrintOption, const char *title, const xbString &amp;result, const char *expectedResult, size_t expectedLen)</td></tr>
+<tr class="separator:a265547b80a3aef5836952bede5288e2c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c27703ef863c9d29680844fc5124953"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#a9c27703ef863c9d29680844fc5124953">TestMethod</a> (xbInt16 PrintOption, const char *title, char result, char expectedResult)</td></tr>
+<tr class="separator:a9c27703ef863c9d29680844fc5124953"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae6536e920580382389126d5f66655f90"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#ae6536e920580382389126d5f66655f90">TestMethod</a> (xbInt16 PrintOption, const char *title, xbInt32 result, xbInt32 expectedResult)</td></tr>
+<tr class="separator:ae6536e920580382389126d5f66655f90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a000fca67bc0fffea3d3da7a5317a06e4"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#a000fca67bc0fffea3d3da7a5317a06e4">TestMethod</a> (xbInt16 PrintOption, const char *title, xbUInt64 result, xbUInt64 expectedResult)</td></tr>
+<tr class="separator:a000fca67bc0fffea3d3da7a5317a06e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a663f3dd7bd8574a35c1b1b9a22081c6d"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#a663f3dd7bd8574a35c1b1b9a22081c6d">TestMethod</a> (xbInt16 PrintOption, const char *title, xbFloat result, xbFloat expectedResult)</td></tr>
+<tr class="separator:a663f3dd7bd8574a35c1b1b9a22081c6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1c78fb72bcd39eb86f11aa2887fe62c"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#af1c78fb72bcd39eb86f11aa2887fe62c">TestMethod</a> (xbInt16 PrintOption, const char *title, xbDouble result, xbDouble expectedResult)</td></tr>
+<tr class="separator:af1c78fb72bcd39eb86f11aa2887fe62c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac64a0bed74ba10b638456709f128f893"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#ac64a0bed74ba10b638456709f128f893">TestMethod</a> (xbInt16 PrintOption, const char *title, xbDouble result, xbDouble expectedResult, xbDouble dEpsilon)</td></tr>
+<tr class="separator:ac64a0bed74ba10b638456709f128f893"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5dbb64c6135ac01f79e5b6087270cf5"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#aa5dbb64c6135ac01f79e5b6087270cf5">FileCompare</a> (xbXBase &amp;x, xbInt16 iPo, const xbString &amp;sFile1, const xbString &amp;sFile2, const xbString &amp;sSkipBytes)</td></tr>
+<tr class="separator:aa5dbb64c6135ac01f79e5b6087270cf5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a69a6e718e066af7f8392e5f1fea40d1b"><td class="memItemLeft" align="right" valign="top">xbDouble&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#a69a6e718e066af7f8392e5f1fea40d1b">dblMax</a> (xbDouble a, xbDouble b)</td></tr>
+<tr class="separator:a69a6e718e066af7f8392e5f1fea40d1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4d7b8f3f1ce52c6c0a281f25419f4c93"><td class="memItemLeft" align="right" valign="top">xbDouble&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#a4d7b8f3f1ce52c6c0a281f25419f4c93">dblMin</a> (xbDouble a, xbDouble b)</td></tr>
+<tr class="separator:a4d7b8f3f1ce52c6c0a281f25419f4c93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="var-members" name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ae2281da6157495d69406c35f69a61f9f"><td class="memItemLeft" align="right" valign="top">time_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tstfuncs_8cpp.html#ae2281da6157495d69406c35f69a61f9f">timer</a></td></tr>
+<tr class="separator:ae2281da6157495d69406c35f69a61f9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="af990eed1e43605771a5810196b4043f7" name="af990eed1e43605771a5810196b4043f7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af990eed1e43605771a5810196b4043f7">&#9670;&nbsp;</a></span>ChronTime()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbDouble ChronTime </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8b8e417213c57f2ea0bcb61a7fb28860" name="a8b8e417213c57f2ea0bcb61a7fb28860"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8b8e417213c57f2ea0bcb61a7fb28860">&#9670;&nbsp;</a></span>dblEquals()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbBool dblEquals </td>
+ <td>(</td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>b</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>epsilon</em> = <code>0.0001</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a69a6e718e066af7f8392e5f1fea40d1b" name="a69a6e718e066af7f8392e5f1fea40d1b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a69a6e718e066af7f8392e5f1fea40d1b">&#9670;&nbsp;</a></span>dblMax()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbDouble dblMax </td>
+ <td>(</td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a4d7b8f3f1ce52c6c0a281f25419f4c93" name="a4d7b8f3f1ce52c6c0a281f25419f4c93"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4d7b8f3f1ce52c6c0a281f25419f4c93">&#9670;&nbsp;</a></span>dblMin()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbDouble dblMin </td>
+ <td>(</td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aa5dbb64c6135ac01f79e5b6087270cf5" name="aa5dbb64c6135ac01f79e5b6087270cf5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa5dbb64c6135ac01f79e5b6087270cf5">&#9670;&nbsp;</a></span>FileCompare()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 FileCompare </td>
+ <td>(</td>
+ <td class="paramtype">xbXBase &amp;&#160;</td>
+ <td class="paramname"><em>x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iPo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const xbString &amp;&#160;</td>
+ <td class="paramname"><em>sFile1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const xbString &amp;&#160;</td>
+ <td class="paramname"><em>sFile2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const xbString &amp;&#160;</td>
+ <td class="paramname"><em>sSkipBytes</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab1f17da15e67a8b2460d5a88b7a3db6e" name="ab1f17da15e67a8b2460d5a88b7a3db6e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab1f17da15e67a8b2460d5a88b7a3db6e">&#9670;&nbsp;</a></span>InitTime()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">void InitTime </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9c27703ef863c9d29680844fc5124953" name="a9c27703ef863c9d29680844fc5124953"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9c27703ef863c9d29680844fc5124953">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[1/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>expectedResult</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a265547b80a3aef5836952bede5288e2c" name="a265547b80a3aef5836952bede5288e2c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a265547b80a3aef5836952bede5288e2c">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[2/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const xbString &amp;&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>expectedResult</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">size_t&#160;</td>
+ <td class="paramname"><em>expectedLen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="af1c78fb72bcd39eb86f11aa2887fe62c" name="af1c78fb72bcd39eb86f11aa2887fe62c"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af1c78fb72bcd39eb86f11aa2887fe62c">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[3/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>expectedResult</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac64a0bed74ba10b638456709f128f893" name="ac64a0bed74ba10b638456709f128f893"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac64a0bed74ba10b638456709f128f893">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[4/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>expectedResult</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbDouble&#160;</td>
+ <td class="paramname"><em>dEpsilon</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a663f3dd7bd8574a35c1b1b9a22081c6d" name="a663f3dd7bd8574a35c1b1b9a22081c6d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a663f3dd7bd8574a35c1b1b9a22081c6d">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[5/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbFloat&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbFloat&#160;</td>
+ <td class="paramname"><em>expectedResult</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae6536e920580382389126d5f66655f90" name="ae6536e920580382389126d5f66655f90"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae6536e920580382389126d5f66655f90">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[6/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt32&#160;</td>
+ <td class="paramname"><em>expectedResult</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a000fca67bc0fffea3d3da7a5317a06e4" name="a000fca67bc0fffea3d3da7a5317a06e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a000fca67bc0fffea3d3da7a5317a06e4">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[7/7]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt64&#160;</td>
+ <td class="paramname"><em>result</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbUInt64&#160;</td>
+ <td class="paramname"><em>expectedResult</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a id="ae2281da6157495d69406c35f69a61f9f" name="ae2281da6157495d69406c35f69a61f9f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae2281da6157495d69406c35f69a61f9f">&#9670;&nbsp;</a></span>timer</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">time_t timer</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__cfg__check_8cpp.html b/docs/doxygen/html/xb__cfg__check_8cpp.html
new file mode 100644
index 0000000..913828b
--- /dev/null
+++ b/docs/doxygen/html/xb__cfg__check_8cpp.html
@@ -0,0 +1,108 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_cfg_check.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_cfg_check.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;stdio.h&gt;</code><br />
+<code>#include &lt;stdlib.h&gt;</code><br />
+<code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__cfg__check_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a> ()</td></tr>
+<tr class="separator:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae66f6b31b5ad750f1fe042a706a4e3d4" name="ae66f6b31b5ad750f1fe042a706a4e3d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae66f6b31b5ad750f1fe042a706a4e3d4">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__copydbf_8cpp.html b/docs/doxygen/html/xb__copydbf_8cpp.html
new file mode 100644
index 0000000..9391377
--- /dev/null
+++ b/docs/doxygen/html/xb__copydbf_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_copydbf.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_copydbf.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__copydbf_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__dbfutil_8cpp.html b/docs/doxygen/html/xb__dbfutil_8cpp.html
new file mode 100644
index 0000000..98a55e1
--- /dev/null
+++ b/docs/doxygen/html/xb__dbfutil_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dbfutil.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_dbfutil.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a57e6ea63b6f0a962708db29159629a6d"><td class="memItemLeft" align="right" valign="top">DOXYOFF int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__dbfutil_8cpp.html#a57e6ea63b6f0a962708db29159629a6d">main</a> (int, char **)</td></tr>
+<tr class="separator:a57e6ea63b6f0a962708db29159629a6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a57e6ea63b6f0a962708db29159629a6d" name="a57e6ea63b6f0a962708db29159629a6d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a57e6ea63b6f0a962708db29159629a6d">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">DOXYOFF int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname">, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname">&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__deletall_8cpp.html b/docs/doxygen/html/xb__deletall_8cpp.html
new file mode 100644
index 0000000..97e9d8e
--- /dev/null
+++ b/docs/doxygen/html/xb__deletall_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_deletall.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_deletall.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__deletall_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__dumpdbt_8cpp.html b/docs/doxygen/html/xb__dumpdbt_8cpp.html
new file mode 100644
index 0000000..cc3c21a
--- /dev/null
+++ b/docs/doxygen/html/xb__dumpdbt_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumpdbt.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_dumpdbt.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__dumpdbt_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__dumphdr_8cpp.html b/docs/doxygen/html/xb__dumphdr_8cpp.html
new file mode 100644
index 0000000..9649b34
--- /dev/null
+++ b/docs/doxygen/html/xb__dumphdr_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumphdr.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_dumphdr.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__dumphdr_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__dumpix_8cpp.html b/docs/doxygen/html/xb__dumpix_8cpp.html
new file mode 100644
index 0000000..5703fcf
--- /dev/null
+++ b/docs/doxygen/html/xb__dumpix_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumpix.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_dumpix.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__dumpix_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__dumprecs_8cpp.html b/docs/doxygen/html/xb__dumprecs_8cpp.html
new file mode 100644
index 0000000..26ac153
--- /dev/null
+++ b/docs/doxygen/html/xb__dumprecs_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_dumprecs.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_dumprecs.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__dumprecs_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__ex__date_8cpp.html b/docs/doxygen/html/xb__ex__date_8cpp.html
new file mode 100644
index 0000000..26a022c
--- /dev/null
+++ b/docs/doxygen/html/xb__ex__date_8cpp.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_date.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_e931c1a3f0014e624d0645a271726ad2.html">examples</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_ex_date.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__date_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a> ()</td></tr>
+<tr class="separator:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae66f6b31b5ad750f1fe042a706a4e3d4" name="ae66f6b31b5ad750f1fe042a706a4e3d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae66f6b31b5ad750f1fe042a706a4e3d4">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__ex__sql_8cpp.html b/docs/doxygen/html/xb__ex__sql_8cpp.html
new file mode 100644
index 0000000..8235a6e
--- /dev/null
+++ b/docs/doxygen/html/xb__ex__sql_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_sql.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_e931c1a3f0014e624d0645a271726ad2.html">examples</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_ex_sql.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__sql_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__ex__string_8cpp.html b/docs/doxygen/html/xb__ex__string_8cpp.html
new file mode 100644
index 0000000..ac23b81
--- /dev/null
+++ b/docs/doxygen/html/xb__ex__string_8cpp.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_string.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_e931c1a3f0014e624d0645a271726ad2.html">examples</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_ex_string.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__string_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a> ()</td></tr>
+<tr class="separator:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae66f6b31b5ad750f1fe042a706a4e3d4" name="ae66f6b31b5ad750f1fe042a706a4e3d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae66f6b31b5ad750f1fe042a706a4e3d4">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__ex__v3__create__dbf_8cpp.html b/docs/doxygen/html/xb__ex__v3__create__dbf_8cpp.html
new file mode 100644
index 0000000..7e94726
--- /dev/null
+++ b/docs/doxygen/html/xb__ex__v3__create__dbf_8cpp.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v3_create_dbf.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_e931c1a3f0014e624d0645a271726ad2.html">examples</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_ex_v3_create_dbf.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__v3__create__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a> ()</td></tr>
+<tr class="separator:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae66f6b31b5ad750f1fe042a706a4e3d4" name="ae66f6b31b5ad750f1fe042a706a4e3d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae66f6b31b5ad750f1fe042a706a4e3d4">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__ex__v3__upd__dbf_8cpp.html b/docs/doxygen/html/xb__ex__v3__upd__dbf_8cpp.html
new file mode 100644
index 0000000..c4c8d7c
--- /dev/null
+++ b/docs/doxygen/html/xb__ex__v3__upd__dbf_8cpp.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v3_upd_dbf.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_e931c1a3f0014e624d0645a271726ad2.html">examples</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_ex_v3_upd_dbf.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__v3__upd__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a> ()</td></tr>
+<tr class="separator:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae66f6b31b5ad750f1fe042a706a4e3d4" name="ae66f6b31b5ad750f1fe042a706a4e3d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae66f6b31b5ad750f1fe042a706a4e3d4">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__ex__v4__create__dbf_8cpp.html b/docs/doxygen/html/xb__ex__v4__create__dbf_8cpp.html
new file mode 100644
index 0000000..cfc9c5a
--- /dev/null
+++ b/docs/doxygen/html/xb__ex__v4__create__dbf_8cpp.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v4_create_dbf.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_e931c1a3f0014e624d0645a271726ad2.html">examples</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_ex_v4_create_dbf.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__v4__create__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a> ()</td></tr>
+<tr class="separator:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae66f6b31b5ad750f1fe042a706a4e3d4" name="ae66f6b31b5ad750f1fe042a706a4e3d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae66f6b31b5ad750f1fe042a706a4e3d4">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__ex__v4__upd__dbf_8cpp.html b/docs/doxygen/html/xb__ex__v4__upd__dbf_8cpp.html
new file mode 100644
index 0000000..4bdf988
--- /dev/null
+++ b/docs/doxygen/html/xb__ex__v4__upd__dbf_8cpp.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/examples/xb_ex_v4_upd_dbf.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_e931c1a3f0014e624d0645a271726ad2.html">examples</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_ex_v4_upd_dbf.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__ex__v4__upd__dbf_8cpp.html#ae66f6b31b5ad750f1fe042a706a4e3d4">main</a> ()</td></tr>
+<tr class="separator:ae66f6b31b5ad750f1fe042a706a4e3d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="ae66f6b31b5ad750f1fe042a706a4e3d4" name="ae66f6b31b5ad750f1fe042a706a4e3d4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae66f6b31b5ad750f1fe042a706a4e3d4">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__execsql_8cpp.html b/docs/doxygen/html/xb__execsql_8cpp.html
new file mode 100644
index 0000000..d356015
--- /dev/null
+++ b/docs/doxygen/html/xb__execsql_8cpp.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_execsql.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_execsql.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af888ba5e7e94d92c2165362b87f1ea0e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__execsql_8cpp.html#af888ba5e7e94d92c2165362b87f1ea0e">GetNextSqlCmd</a> (<a class="el" href="classxb_1_1xbFile.html">xbFile</a> &amp;f, <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sCmd)</td></tr>
+<tr class="separator:af888ba5e7e94d92c2165362b87f1ea0e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__execsql_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="af888ba5e7e94d92c2165362b87f1ea0e" name="af888ba5e7e94d92c2165362b87f1ea0e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af888ba5e7e94d92c2165362b87f1ea0e">&#9670;&nbsp;</a></span>GetNextSqlCmd()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 GetNextSqlCmd </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbFile.html">xbFile</a> &amp;&#160;</td>
+ <td class="paramname"><em>f</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sCmd</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__pack_8cpp.html b/docs/doxygen/html/xb__pack_8cpp.html
new file mode 100644
index 0000000..c6ef049
--- /dev/null
+++ b/docs/doxygen/html/xb__pack_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_pack.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_pack.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__pack_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__tblinfo_8cpp.html b/docs/doxygen/html/xb__tblinfo_8cpp.html
new file mode 100644
index 0000000..5f42fec
--- /dev/null
+++ b/docs/doxygen/html/xb__tblinfo_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_tblinfo.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_tblinfo.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__tblinfo_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__bcd_8cpp.html b/docs/doxygen/html/xb__test__bcd_8cpp.html
new file mode 100644
index 0000000..e0e5235
--- /dev/null
+++ b/docs/doxygen/html/xb__test__bcd_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_bcd.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_bcd.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__bcd_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__date_8cpp.html b/docs/doxygen/html/xb__test__date_8cpp.html
new file mode 100644
index 0000000..8fe8cc1
--- /dev/null
+++ b/docs/doxygen/html/xb__test__date_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_date.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_date.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__date_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__dbf__v3__memos_8cpp.html b/docs/doxygen/html/xb__test__dbf__v3__memos_8cpp.html
new file mode 100644
index 0000000..54ca301
--- /dev/null
+++ b/docs/doxygen/html/xb__test__dbf__v3__memos_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v3_memos.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_dbf_v3_memos.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__dbf__v3__memos_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__dbf__v3__nomemos_8cpp.html b/docs/doxygen/html/xb__test__dbf__v3__nomemos_8cpp.html
new file mode 100644
index 0000000..2b8913d
--- /dev/null
+++ b/docs/doxygen/html/xb__test__dbf__v3__nomemos_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v3_nomemos.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_dbf_v3_nomemos.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__dbf__v3__nomemos_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__dbf__v4__memos_8cpp.html b/docs/doxygen/html/xb__test__dbf__v4__memos_8cpp.html
new file mode 100644
index 0000000..def7aeb
--- /dev/null
+++ b/docs/doxygen/html/xb__test__dbf__v4__memos_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v4_memos.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_dbf_v4_memos.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__dbf__v4__memos_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__dbf__v4__nomemos_8cpp.html b/docs/doxygen/html/xb__test__dbf__v4__nomemos_8cpp.html
new file mode 100644
index 0000000..bedb3b2
--- /dev/null
+++ b/docs/doxygen/html/xb__test__dbf__v4__nomemos_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_dbf_v4_nomemos.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_dbf_v4_nomemos.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__dbf__v4__nomemos_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__expnode_8cpp.html b/docs/doxygen/html/xb__test__expnode_8cpp.html
new file mode 100644
index 0000000..97fb5b9
--- /dev/null
+++ b/docs/doxygen/html/xb__test__expnode_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_expnode.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_expnode.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expnode_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__expression_8cpp.html b/docs/doxygen/html/xb__test__expression_8cpp.html
new file mode 100644
index 0000000..1ea1429
--- /dev/null
+++ b/docs/doxygen/html/xb__test__expression_8cpp.html
@@ -0,0 +1,502 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_expression.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_expression.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aee57237c5f5b9b4d80e84bf530eb42bc"><td class="memItemLeft" align="right" valign="top">DOXYOFF xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expression_8cpp.html#aee57237c5f5b9b4d80e84bf530eb42bc">DevTester</a> (<a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *xb, <a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *dbf, const char *sExpIn)</td></tr>
+<tr class="separator:aee57237c5f5b9b4d80e84bf530eb42bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af56b6dbc38e0d23caaf6531526315379"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expression_8cpp.html#af56b6dbc38e0d23caaf6531526315379">TestWeight</a> (<a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *xb, xbInt16 iPrintOption, const char *title, const char *sOperator, xbInt16 iExpectedWeight)</td></tr>
+<tr class="separator:af56b6dbc38e0d23caaf6531526315379"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a440d64b55abaa9e14e73ecc132d1084d"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expression_8cpp.html#a440d64b55abaa9e14e73ecc132d1084d">TestTokenMethod</a> (<a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *xb, xbInt16 iPrintOption, const char *title, const char *sExpression, const char *sExpectedToken, const char *sExpectedRemainder, char cExpectedNodeType, char cExpectedReturnType, xbInt16 iErc, xbInt16 iTrc)</td></tr>
+<tr class="separator:a440d64b55abaa9e14e73ecc132d1084d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad52c27685018dda7c5c4b26fb445860e"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expression_8cpp.html#ad52c27685018dda7c5c4b26fb445860e">TestMethod</a> (<a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *xb, <a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *d, xbInt16 PrintOption, const char *title, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sExpression, const char *sExpectedResult, xbInt16 iExpectedResultLen)</td></tr>
+<tr class="separator:ad52c27685018dda7c5c4b26fb445860e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7030149316fe8d8195ffbb18132e0cf9"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expression_8cpp.html#a7030149316fe8d8195ffbb18132e0cf9">TestMethod</a> (<a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *xb, <a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *d, xbInt16 PrintOption, const char *title, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sExpression, <a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dExpectedResult)</td></tr>
+<tr class="separator:a7030149316fe8d8195ffbb18132e0cf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a10e637a203841bd2b6a92e6217509e23"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expression_8cpp.html#a10e637a203841bd2b6a92e6217509e23">TestMethod</a> (<a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *xb, <a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *d, xbInt16 PrintOption, const char *title, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sExpression, <a class="el" href="classxb_1_1xbDate.html">xbDate</a> dtExpectedResult)</td></tr>
+<tr class="separator:a10e637a203841bd2b6a92e6217509e23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa385c5f9fa8b4cfd63763b4a28852b64"><td class="memItemLeft" align="right" valign="top">xbInt16&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expression_8cpp.html#aa385c5f9fa8b4cfd63763b4a28852b64">TestMethod</a> (<a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *xb, <a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *d, xbInt16 PrintOption, const char *title, const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;sExpression, <a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bExpectedResult)</td></tr>
+<tr class="separator:aa385c5f9fa8b4cfd63763b4a28852b64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__expression_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="aee57237c5f5b9b4d80e84bf530eb42bc" name="aee57237c5f5b9b4d80e84bf530eb42bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aee57237c5f5b9b4d80e84bf530eb42bc">&#9670;&nbsp;</a></span>DevTester()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">DOXYOFF xbInt16 DevTester </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td>
+ <td class="paramname"><em>xb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>dbf</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>sExpIn</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ad52c27685018dda7c5c4b26fb445860e" name="ad52c27685018dda7c5c4b26fb445860e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad52c27685018dda7c5c4b26fb445860e">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[1/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td>
+ <td class="paramname"><em>xb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sExpression</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>sExpectedResult</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iExpectedResultLen</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aa385c5f9fa8b4cfd63763b4a28852b64" name="aa385c5f9fa8b4cfd63763b4a28852b64"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa385c5f9fa8b4cfd63763b4a28852b64">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[2/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td>
+ <td class="paramname"><em>xb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sExpression</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>&#160;</td>
+ <td class="paramname"><em>bExpectedResult</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a10e637a203841bd2b6a92e6217509e23" name="a10e637a203841bd2b6a92e6217509e23"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a10e637a203841bd2b6a92e6217509e23">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[3/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td>
+ <td class="paramname"><em>xb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sExpression</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDate.html">xbDate</a>&#160;</td>
+ <td class="paramname"><em>dtExpectedResult</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a7030149316fe8d8195ffbb18132e0cf9" name="a7030149316fe8d8195ffbb18132e0cf9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7030149316fe8d8195ffbb18132e0cf9">&#9670;&nbsp;</a></span>TestMethod() <span class="overload">[4/4]</span></h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestMethod </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td>
+ <td class="paramname"><em>xb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbDbf.html">xbDbf</a> *&#160;</td>
+ <td class="paramname"><em>d</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>PrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const <a class="el" href="classxb_1_1xbString.html">xbString</a> &amp;&#160;</td>
+ <td class="paramname"><em>sExpression</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a>&#160;</td>
+ <td class="paramname"><em>dExpectedResult</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a440d64b55abaa9e14e73ecc132d1084d" name="a440d64b55abaa9e14e73ecc132d1084d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a440d64b55abaa9e14e73ecc132d1084d">&#9670;&nbsp;</a></span>TestTokenMethod()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestTokenMethod </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td>
+ <td class="paramname"><em>xb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iPrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>sExpression</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>sExpectedToken</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>sExpectedRemainder</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>cExpectedNodeType</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char&#160;</td>
+ <td class="paramname"><em>cExpectedReturnType</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iErc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iTrc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="af56b6dbc38e0d23caaf6531526315379" name="af56b6dbc38e0d23caaf6531526315379"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af56b6dbc38e0d23caaf6531526315379">&#9670;&nbsp;</a></span>TestWeight()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xbInt16 TestWeight </td>
+ <td>(</td>
+ <td class="paramtype"><a class="el" href="classxb_1_1xbXBase.html">xbXBase</a> *&#160;</td>
+ <td class="paramname"><em>xb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iPrintOption</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">const char *&#160;</td>
+ <td class="paramname"><em>sOperator</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">xbInt16&#160;</td>
+ <td class="paramname"><em>iExpectedWeight</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__file_8cpp.html b/docs/doxygen/html/xb__test__file_8cpp.html
new file mode 100644
index 0000000..0b33a8b
--- /dev/null
+++ b/docs/doxygen/html/xb__test__file_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_file.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_file.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__file_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__filter_8cpp.html b/docs/doxygen/html/xb__test__filter_8cpp.html
new file mode 100644
index 0000000..e3b9812
--- /dev/null
+++ b/docs/doxygen/html/xb__test__filter_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_filter.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_filter.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__filter_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__funcs_8cpp.html b/docs/doxygen/html/xb__test__funcs_8cpp.html
new file mode 100644
index 0000000..796e2f2
--- /dev/null
+++ b/docs/doxygen/html/xb__test__funcs_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_funcs.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_funcs.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__funcs_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__linklist_8cpp.html b/docs/doxygen/html/xb__test__linklist_8cpp.html
new file mode 100644
index 0000000..caad378
--- /dev/null
+++ b/docs/doxygen/html/xb__test__linklist_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_linklist.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_linklist.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__linklist_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__lock2_8cpp.html b/docs/doxygen/html/xb__test__lock2_8cpp.html
new file mode 100644
index 0000000..7a7849d
--- /dev/null
+++ b/docs/doxygen/html/xb__test__lock2_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_lock2.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_lock2.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__lock2_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__lock_8cpp.html b/docs/doxygen/html/xb__test__lock_8cpp.html
new file mode 100644
index 0000000..9b9277f
--- /dev/null
+++ b/docs/doxygen/html/xb__test__lock_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_lock.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_lock.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__lock_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__log_8cpp.html b/docs/doxygen/html/xb__test__log_8cpp.html
new file mode 100644
index 0000000..707a6b4
--- /dev/null
+++ b/docs/doxygen/html/xb__test__log_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_log.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_log.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__log_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__mdx_8cpp.html b/docs/doxygen/html/xb__test__mdx_8cpp.html
new file mode 100644
index 0000000..db304f9
--- /dev/null
+++ b/docs/doxygen/html/xb__test__mdx_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_mdx.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_mdx.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__mdx_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__ndx2_8cpp.html b/docs/doxygen/html/xb__test__ndx2_8cpp.html
new file mode 100644
index 0000000..b92ae09
--- /dev/null
+++ b/docs/doxygen/html/xb__test__ndx2_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_ndx2.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_ndx2.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__ndx2_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__ndx_8cpp.html b/docs/doxygen/html/xb__test__ndx_8cpp.html
new file mode 100644
index 0000000..767ed2c
--- /dev/null
+++ b/docs/doxygen/html/xb__test__ndx_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_ndx.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_ndx.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__ndx_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__sql_8cpp.html b/docs/doxygen/html/xb__test__sql_8cpp.html
new file mode 100644
index 0000000..e5c8d4b
--- /dev/null
+++ b/docs/doxygen/html/xb__test__sql_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_sql.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_sql.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__sql_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__string_8cpp.html b/docs/doxygen/html/xb__test__string_8cpp.html
new file mode 100644
index 0000000..e387d95
--- /dev/null
+++ b/docs/doxygen/html/xb__test__string_8cpp.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_string.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#define-members">Macros</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_string.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a42f8c497a1968074f38bf5055c650dca"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__string_8cpp.html#a42f8c497a1968074f38bf5055c650dca">VERBOSE</a></td></tr>
+<tr class="separator:a42f8c497a1968074f38bf5055c650dca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aabf71bc9adb6daf457b2ea8879ae537f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__string_8cpp.html#aabf71bc9adb6daf457b2ea8879ae537f">main</a> (int argCnt, char **av=NULL)</td></tr>
+<tr class="separator:aabf71bc9adb6daf457b2ea8879ae537f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a42f8c497a1968074f38bf5055c650dca" name="a42f8c497a1968074f38bf5055c650dca"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a42f8c497a1968074f38bf5055c650dca">&#9670;&nbsp;</a></span>VERBOSE</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define VERBOSE</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="aabf71bc9adb6daf457b2ea8879ae537f" name="aabf71bc9adb6daf457b2ea8879ae537f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aabf71bc9adb6daf457b2ea8879ae537f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em> = <code>NULL</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__tblmgr_8cpp.html b/docs/doxygen/html/xb__test__tblmgr_8cpp.html
new file mode 100644
index 0000000..f4a0ba2
--- /dev/null
+++ b/docs/doxygen/html/xb__test__tblmgr_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_tblmgr.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_tblmgr.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__tblmgr_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__uda_8cpp.html b/docs/doxygen/html/xb__test__uda_8cpp.html
new file mode 100644
index 0000000..7aec205
--- /dev/null
+++ b/docs/doxygen/html/xb__test__uda_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_uda.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_uda.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__uda_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__test__xbase_8cpp.html b/docs/doxygen/html/xb__test__xbase_8cpp.html
new file mode 100644
index 0000000..1799686
--- /dev/null
+++ b/docs/doxygen/html/xb__test__xbase_8cpp.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/tests/xb_test_xbase.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_d93a1d4020dea85bb71b237545b5e722.html">tests</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_test_xbase.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &quot;<a class="el" href="tstfuncs_8cpp.html">tstfuncs.cpp</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1470527971db41f828c26074cde7e15a"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__test__xbase_8cpp.html#a1470527971db41f828c26074cde7e15a">main</a> (int argCnt, char **av)</td></tr>
+<tr class="separator:a1470527971db41f828c26074cde7e15a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a1470527971db41f828c26074cde7e15a" name="a1470527971db41f828c26074cde7e15a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1470527971db41f828c26074cde7e15a">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>argCnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__undelall_8cpp.html b/docs/doxygen/html/xb__undelall_8cpp.html
new file mode 100644
index 0000000..4fa838b
--- /dev/null
+++ b/docs/doxygen/html/xb__undelall_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_undelall.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_undelall.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__undelall_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xb__zap_8cpp.html b/docs/doxygen/html/xb__zap_8cpp.html
new file mode 100644
index 0000000..f044ade
--- /dev/null
+++ b/docs/doxygen/html/xb__zap_8cpp.html
@@ -0,0 +1,117 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/utils/xb_zap.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_313caf1132e152dd9b58bea13a4052ca.html">utils</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xb_zap.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;<a class="el" href="xbase_8h_source.html">xbase.h</a>&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0c99d968a34e803d378692bde2e3f18f"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xb__zap_8cpp.html#a0c99d968a34e803d378692bde2e3f18f">main</a> (int ac, char **av)</td></tr>
+<tr class="separator:a0c99d968a34e803d378692bde2e3f18f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a id="a0c99d968a34e803d378692bde2e3f18f" name="a0c99d968a34e803d378692bde2e3f18f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0c99d968a34e803d378692bde2e3f18f">&#9670;&nbsp;</a></span>main()</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">int main </td>
+ <td>(</td>
+ <td class="paramtype">int&#160;</td>
+ <td class="paramname"><em>ac</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">char **&#160;</td>
+ <td class="paramname"><em>av</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbase_8h.html b/docs/doxygen/html/xbase_8h.html
new file mode 100644
index 0000000..1d54086
--- /dev/null
+++ b/docs/doxygen/html/xbase_8h.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbase.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbase.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;xbconfig.h&gt;</code><br />
+<code>#include &lt;stdio.h&gt;</code><br />
+<code>#include &lt;errno.h&gt;</code><br />
+<code>#include &lt;time.h&gt;</code><br />
+<code>#include &lt;math.h&gt;</code><br />
+<code>#include &lt;iomanip&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbretcod_8h_source.html">xbretcod.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbtypes_8h_source.html">xbtypes.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbstring_8h_source.html">xbstring.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbssv_8h_source.html">xbssv.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbdate_8h_source.html">xbdate.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbtblmgr_8h_source.html">xbtblmgr.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbxbase_8h_source.html">xbxbase.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xblnknod_8h_source.html">xblnknod.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xblnklst_8h_source.html">xblnklst.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xblnklstord_8h_source.html">xblnklstord.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbfile_8h_source.html">xbfile.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xblog_8h_source.html">xblog.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbmemo_8h_source.html">xbmemo.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbbcd_8h_source.html">xbbcd.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbuda_8h_source.html">xbuda.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbexpnode_8h_source.html">xbexpnode.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbexp_8h_source.html">xbexp.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbtag_8h_source.html">xbtag.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbdbf_8h_source.html">xbdbf.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbindex_8h_source.html">xbindex.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbfilter_8h_source.html">xbfilter.h</a>&gt;</code><br />
+<code>#include &lt;<a class="el" href="xbsql_8h_source.html">xbsql.h</a>&gt;</code><br />
+</div>
+<p><a href="xbase_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbase_8h_source.html b/docs/doxygen/html/xbase_8h_source.html
new file mode 100644
index 0000000..74eae66
--- /dev/null
+++ b/docs/doxygen/html/xbase_8h_source.html
@@ -0,0 +1,194 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbase.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbase.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbase_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbase.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment"></span> </div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">Xbase64 Software Library</span></div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment"></span> </div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment"></span> </div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license</span></div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment"></span> </div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"></span> </div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment"></span> </div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#include &lt;xbconfig.h&gt;</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#include &lt;stdio.h&gt;</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include &lt;errno.h&gt;</span></div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#include &lt;time.h&gt;</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include &lt;math.h&gt;</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> </div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#ifdef HAVE_INTTYPES_H</span></div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include &lt;inttypes.h&gt;</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#ifdef HAVE_STRING_H</span></div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#include &lt;string.h&gt;</span></div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#ifdef HAVE_STRINGS_H</span></div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#include &lt;strings.h&gt;</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="comment">// #ifdef STDC_HEADERS</span></div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="preprocessor">#ifdef HAVE_STDARGS_H</span></div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="preprocessor">#include &lt;stdargs.h&gt;</span></div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> </div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="preprocessor">#ifdef HAVE_CTYPE_H</span></div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="preprocessor">#include &lt;ctype.h&gt;</span></div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> </div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="preprocessor">#ifdef HAVE_STDARG_H</span></div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="preprocessor">#include &lt;stdarg.h&gt;</span></div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> </div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="preprocessor">#ifdef HAVE_STAT_H</span></div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="preprocessor">#include &lt;sys/stat.h&gt;</span></div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="preprocessor">#ifdef HAVE_FCNTL_H</span></div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="preprocessor">#include &lt;fcntl.h&gt;</span></div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> </div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="preprocessor">#ifdef HAVE_UNISTD_H</span></div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span><span class="preprocessor">#include &lt;unistd.h&gt;</span></div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="preprocessor">#ifdef HAVE_VARARGS_H</span></div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="preprocessor">#include &lt;varargs.h&gt;</span></div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> </div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="preprocessor">#ifdef HAVE_WINDOWS_H</span></div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="preprocessor">#include &lt;windows.h&gt;</span></div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="preprocessor">#include &lt;io.h&gt;</span></div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> </div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="preprocessor">#include &lt;iomanip&gt;</span></div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> </div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span><span class="preprocessor">#include &lt;<a class="code" href="xbretcod_8h.html">xbretcod.h</a>&gt;</span></div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span><span class="preprocessor">#include &lt;<a class="code" href="xbtypes_8h.html">xbtypes.h</a>&gt;</span></div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span><span class="preprocessor">#include &lt;<a class="code" href="xbstring_8h.html">xbstring.h</a>&gt;</span></div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span><span class="preprocessor">#include &lt;<a class="code" href="xbssv_8h.html">xbssv.h</a>&gt;</span></div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span><span class="preprocessor">#include &lt;<a class="code" href="xbdate_8h.html">xbdate.h</a>&gt;</span></div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span><span class="preprocessor">#include &lt;<a class="code" href="xbtblmgr_8h.html">xbtblmgr.h</a>&gt;</span></div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span><span class="preprocessor">#include &lt;<a class="code" href="xbxbase_8h.html">xbxbase.h</a>&gt;</span></div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span><span class="preprocessor">#include &lt;<a class="code" href="xblnknod_8h.html">xblnknod.h</a>&gt;</span></div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span><span class="preprocessor">#include &lt;<a class="code" href="xblnklst_8h.html">xblnklst.h</a>&gt;</span></div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span><span class="preprocessor">#include &lt;<a class="code" href="xblnklstord_8h.html">xblnklstord.h</a>&gt;</span></div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span><span class="preprocessor">#include &lt;<a class="code" href="xbfile_8h.html">xbfile.h</a>&gt;</span></div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span><span class="preprocessor">#include &lt;<a class="code" href="xblog_8h.html">xblog.h</a>&gt;</span></div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span><span class="preprocessor">#include &lt;<a class="code" href="xbmemo_8h.html">xbmemo.h</a>&gt;</span></div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span><span class="preprocessor">#include &lt;<a class="code" href="xbbcd_8h.html">xbbcd.h</a>&gt;</span></div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span><span class="preprocessor">#include &lt;<a class="code" href="xbuda_8h.html">xbuda.h</a>&gt;</span></div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span><span class="preprocessor">#include &lt;<a class="code" href="xbexpnode_8h.html">xbexpnode.h</a>&gt;</span></div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span><span class="preprocessor">#include &lt;<a class="code" href="xbexp_8h.html">xbexp.h</a>&gt;</span></div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> </div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="preprocessor">#include &lt;<a class="code" href="xbtag_8h.html">xbtag.h</a>&gt;</span></div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span><span class="preprocessor">#include &lt;<a class="code" href="xbdbf_8h.html">xbdbf.h</a>&gt;</span> <span class="comment">/* dbf base class */</span></div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span><span class="preprocessor">#include &lt;<a class="code" href="xbindex_8h.html">xbindex.h</a>&gt;</span> <span class="comment">/* index base class */</span></div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span><span class="preprocessor">#include &lt;<a class="code" href="xbfilter_8h.html">xbfilter.h</a>&gt;</span></div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span><span class="preprocessor">#include &lt;<a class="code" href="xbsql_8h.html">xbsql.h</a>&gt;</span></div>
+<div class="ttc" id="axbbcd_8h_html"><div class="ttname"><a href="xbbcd_8h.html">xbbcd.h</a></div></div>
+<div class="ttc" id="axbdate_8h_html"><div class="ttname"><a href="xbdate_8h.html">xbdate.h</a></div></div>
+<div class="ttc" id="axbdbf_8h_html"><div class="ttname"><a href="xbdbf_8h.html">xbdbf.h</a></div></div>
+<div class="ttc" id="axbexp_8h_html"><div class="ttname"><a href="xbexp_8h.html">xbexp.h</a></div></div>
+<div class="ttc" id="axbexpnode_8h_html"><div class="ttname"><a href="xbexpnode_8h.html">xbexpnode.h</a></div></div>
+<div class="ttc" id="axbfile_8h_html"><div class="ttname"><a href="xbfile_8h.html">xbfile.h</a></div></div>
+<div class="ttc" id="axbfilter_8h_html"><div class="ttname"><a href="xbfilter_8h.html">xbfilter.h</a></div></div>
+<div class="ttc" id="axbindex_8h_html"><div class="ttname"><a href="xbindex_8h.html">xbindex.h</a></div></div>
+<div class="ttc" id="axblnklst_8h_html"><div class="ttname"><a href="xblnklst_8h.html">xblnklst.h</a></div></div>
+<div class="ttc" id="axblnklstord_8h_html"><div class="ttname"><a href="xblnklstord_8h.html">xblnklstord.h</a></div></div>
+<div class="ttc" id="axblnknod_8h_html"><div class="ttname"><a href="xblnknod_8h.html">xblnknod.h</a></div></div>
+<div class="ttc" id="axblog_8h_html"><div class="ttname"><a href="xblog_8h.html">xblog.h</a></div></div>
+<div class="ttc" id="axbmemo_8h_html"><div class="ttname"><a href="xbmemo_8h.html">xbmemo.h</a></div></div>
+<div class="ttc" id="axbretcod_8h_html"><div class="ttname"><a href="xbretcod_8h.html">xbretcod.h</a></div></div>
+<div class="ttc" id="axbsql_8h_html"><div class="ttname"><a href="xbsql_8h.html">xbsql.h</a></div></div>
+<div class="ttc" id="axbssv_8h_html"><div class="ttname"><a href="xbssv_8h.html">xbssv.h</a></div></div>
+<div class="ttc" id="axbstring_8h_html"><div class="ttname"><a href="xbstring_8h.html">xbstring.h</a></div></div>
+<div class="ttc" id="axbtag_8h_html"><div class="ttname"><a href="xbtag_8h.html">xbtag.h</a></div></div>
+<div class="ttc" id="axbtblmgr_8h_html"><div class="ttname"><a href="xbtblmgr_8h.html">xbtblmgr.h</a></div></div>
+<div class="ttc" id="axbtypes_8h_html"><div class="ttname"><a href="xbtypes_8h.html">xbtypes.h</a></div></div>
+<div class="ttc" id="axbuda_8h_html"><div class="ttname"><a href="xbuda_8h.html">xbuda.h</a></div></div>
+<div class="ttc" id="axbxbase_8h_html"><div class="ttname"><a href="xbxbase_8h.html">xbxbase.h</a></div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbbcd_8cpp.html b/docs/doxygen/html/xbbcd_8cpp.html
new file mode 100644
index 0000000..9af4fab
--- /dev/null
+++ b/docs/doxygen/html/xbbcd_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbbcd.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbbcd.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbbcd_8h.html b/docs/doxygen/html/xbbcd_8h.html
new file mode 100644
index 0000000..84a854b
--- /dev/null
+++ b/docs/doxygen/html/xbbcd_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbbcd.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbbcd.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbbcd_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbbcd_8h_source.html b/docs/doxygen/html/xbbcd_8h_source.html
new file mode 100644
index 0000000..42621e0
--- /dev/null
+++ b/docs/doxygen/html/xbbcd_8h_source.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbbcd.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbbcd.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbbcd_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbbcd.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014, 2018, 2019, 2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#ifndef __XB_BCD_H__</span></div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#define __XB_BCD_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="comment">// structure for bcd value</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="comment">// next structure superceeded. Different compilers allocate different</span></div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="comment">// sizes to structures with bit fields, can&#39;t count on the size</span></div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="comment">/*</span></div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="comment">struct XBDLLEXPORT xbBcdStrucOld {</span></div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="comment"> unsigned SigDigits : 8; // significant digit count</span></div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="comment"> unsigned Filler : 2; // always set to 1</span></div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="comment"> unsigned EncDigits : 5; // encoded digit count</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="comment"> unsigned Sign : 1; // +/- sign</span></div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="comment"> unsigned char Data[10];</span></div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="comment">};</span></div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="keyword">struct </span>XBDLLEXPORT xbBcdStruct {</div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cSigDigits; <span class="comment">// significant digit count</span></div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cEncDigits; <span class="comment">// encoded digit count</span></div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cData[10]; <span class="comment">// data</span></div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span>};</div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> </div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="keyword">struct </span>XBDLLEXPORT xbByteSplit {</div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <span class="keywordtype">unsigned</span> c1 : 4;</div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <span class="keywordtype">unsigned</span> c2 : 4;</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span>};</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> </div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="keyword">class </span>XBDLLEXPORT xbBcd {</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> xbBcd( <span class="keyword">const</span> xbString &amp;sIn );</div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> xbBcd( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn );</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> xbBcd( <span class="keyword">const</span> <span class="keywordtype">void</span> *vBcd12In );</div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keywordtype">void</span> Set( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn );</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keywordtype">void</span> Set( <span class="keyword">const</span> <span class="keywordtype">void</span> *cBcd12In );</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keywordtype">void</span> Set( <span class="keyword">const</span> xbString &amp;sIn );</div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> </div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keywordtype">void</span> ToString( xbString &amp;sOut );</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keywordtype">void</span> ToDouble( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dOut );</div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keywordtype">void</span> ToBcd( xbBcdStruct &amp;bcdOut );</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="keywordtype">void</span> ToChar( <span class="keywordtype">char</span> *cOut );</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> </div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="comment">// const unsigned char * GetBcd() const;</span></div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="keywordtype">void</span> StringToBcd( <span class="keyword">const</span> xbString &amp;sStringIn );</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="comment">// void StringToBcdOld( const xbString &amp;sStringIn );</span></div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> </div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> xbInt16 Compare( <span class="keyword">const</span> xbBcd &amp;bcdIn );</div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> xbInt16 Compare( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> d );</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> </div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *GetData() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <span class="keyword">const</span> <span class="keywordtype">void</span> * GetBcd() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> </div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordtype">void</span> ctor();</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> GetEncDigitsNoSign() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="keywordtype">unsigned</span> GetSign() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keywordtype">unsigned</span> GetSigDigits() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <span class="keywordtype">unsigned</span> GetActualSigDigits() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> </div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> </div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span><span class="comment">// xbBcdStruc bcdOld;</span></div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> xbBcdStruct bcd;</div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span>};</div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> </div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span>} <span class="comment">/* namespace xb */</span></div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> </div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> </div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span><span class="preprocessor">#endif </span><span class="comment">/* XB_INDEX_SUPPORT */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_BCD_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a25f47b226ce924a5c78f97989b0744a2"><div class="ttname"><a href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></div><div class="ttdeci">double xbDouble</div><div class="ttdef"><b>Definition:</b> xbtypes.h:23</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbcrix_8cpp.html b/docs/doxygen/html/xbcrix_8cpp.html
new file mode 100644
index 0000000..2064f23
--- /dev/null
+++ b/docs/doxygen/html/xbcrix_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbcrix.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_25b94c3afce00ed38231227d8141f932.html">sql</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbcrix.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbcrtbl_8cpp.html b/docs/doxygen/html/xbcrtbl_8cpp.html
new file mode 100644
index 0000000..17a6408
--- /dev/null
+++ b/docs/doxygen/html/xbcrtbl_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbcrtbl.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_25b94c3afce00ed38231227d8141f932.html">sql</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbcrtbl.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbdate_8cpp.html b/docs/doxygen/html/xbdate_8cpp.html
new file mode 100644
index 0000000..4f81e8f
--- /dev/null
+++ b/docs/doxygen/html/xbdate_8cpp.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdate.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle"><div class="title">xbdate.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+<code>#include &lt;time.h&gt;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbdate_8h.html b/docs/doxygen/html/xbdate_8h.html
new file mode 100644
index 0000000..b267860
--- /dev/null
+++ b/docs/doxygen/html/xbdate_8h.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdate.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#define-members">Macros</a> </div>
+ <div class="headertitle"><div class="title">xbdate.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbdate_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDate.html">xb::xbDate</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight"><a class="el" href="classxb_1_1xbDate.html" title="xbDate class.">xbDate</a> class. <a href="classxb_1_1xbDate.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a8f22704d3fd93fa85dd93b6c699e8178"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdate_8h.html#a8f22704d3fd93fa85dd93b6c699e8178">XB_FMT_WEEK</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a8f22704d3fd93fa85dd93b6c699e8178"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeacf2f7cc897ab5bd64781c0fb52b75d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdate_8h.html#aeacf2f7cc897ab5bd64781c0fb52b75d">XB_FMT_MONTH</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:aeacf2f7cc897ab5bd64781c0fb52b75d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa29d78982a9e007874af1c4f4e4d1aa4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdate_8h.html#aa29d78982a9e007874af1c4f4e4d1aa4">XB_FMT_YEAR</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:aa29d78982a9e007874af1c4f4e4d1aa4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a119f32fda399e2ebc2d734012a130e8f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdate_8h.html#a119f32fda399e2ebc2d734012a130e8f">JUL_OFFSET</a>&#160;&#160;&#160;1721425L</td></tr>
+<tr class="separator:a119f32fda399e2ebc2d734012a130e8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a119f32fda399e2ebc2d734012a130e8f" name="a119f32fda399e2ebc2d734012a130e8f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a119f32fda399e2ebc2d734012a130e8f">&#9670;&nbsp;</a></span>JUL_OFFSET</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define JUL_OFFSET&#160;&#160;&#160;1721425L</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aeacf2f7cc897ab5bd64781c0fb52b75d" name="aeacf2f7cc897ab5bd64781c0fb52b75d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aeacf2f7cc897ab5bd64781c0fb52b75d">&#9670;&nbsp;</a></span>XB_FMT_MONTH</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_FMT_MONTH&#160;&#160;&#160;2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8f22704d3fd93fa85dd93b6c699e8178" name="a8f22704d3fd93fa85dd93b6c699e8178"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8f22704d3fd93fa85dd93b6c699e8178">&#9670;&nbsp;</a></span>XB_FMT_WEEK</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_FMT_WEEK&#160;&#160;&#160;1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aa29d78982a9e007874af1c4f4e4d1aa4" name="aa29d78982a9e007874af1c4f4e4d1aa4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa29d78982a9e007874af1c4f4e4d1aa4">&#9670;&nbsp;</a></span>XB_FMT_YEAR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_FMT_YEAR&#160;&#160;&#160;3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbdate_8h_source.html b/docs/doxygen/html/xbdate_8h_source.html
new file mode 100644
index 0000000..7be2723
--- /dev/null
+++ b/docs/doxygen/html/xbdate_8h_source.html
@@ -0,0 +1,182 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdate.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbdate.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbdate_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbdate.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_XBDATE_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_XBDATE_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#pragma interface</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"><a class="line" href="xbdate_8h.html#a8f22704d3fd93fa85dd93b6c699e8178"> 27</a></span><span class="preprocessor">#define XB_FMT_WEEK 1</span></div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"><a class="line" href="xbdate_8h.html#aeacf2f7cc897ab5bd64781c0fb52b75d"> 28</a></span><span class="preprocessor">#define XB_FMT_MONTH 2</span></div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"><a class="line" href="xbdate_8h.html#aa29d78982a9e007874af1c4f4e4d1aa4"> 29</a></span><span class="preprocessor">#define XB_FMT_YEAR 3</span></div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="comment">// next value is added to the date calculation to match dbase calculation</span></div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="comment">// first valid dbase date is 01/01/0001</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"><a class="line" href="xbdate_8h.html#a119f32fda399e2ebc2d734012a130e8f"> 33</a></span><span class="preprocessor">#define JUL_OFFSET 1721425L</span></div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"><a class="line" href="classxb_1_1xbDate.html"> 62</a></span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> : <span class="keyword">public</span> <a class="code hl_class" href="classxb_1_1xbSsv.html">xbSsv</a> {</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> </div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a>();</div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a>( <span class="keyword">const</span> <span class="keywordtype">char</span> * Date8 );</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a>( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Date8 );</div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a>( xbInt32 lJulDate );</div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <a class="code hl_class" href="classxb_1_1xbDate.html">~xbDate</a>();</div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> </div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keywordtype">void</span> operator=( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;d );</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <span class="keywordtype">void</span> operator+=( xbInt32 i );</div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="keywordtype">void</span> operator-=( xbInt32 i );</div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <span class="keywordtype">void</span> operator++( xbInt32 i );</div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keywordtype">void</span> operator--( xbInt32 i );</div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> xbInt32 operator-( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * operator-( xbInt32 i );</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * operator+( xbInt32 i );</div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> </div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator==( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator!=( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator&lt; ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator&gt; ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator&lt;=( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator&gt;=( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> xbInt16 CalcRollingCenturyForYear( xbInt16 year ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> xbInt16 CenturyOf() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> xbInt16 CharDayOf( <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOutCharDay );</div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> xbInt16 CharMonthOf( <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOutCharMonth );</div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> DateIsValid ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sDate8 ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> xbInt16 DayOf( xbInt16 iFormat ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> xbInt16 CTOD( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sCtodInDate );</div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span><span class="comment">// xbInt16 FormatDate( const char *sFmtIn, xbString &amp;sFmtOut );</span></div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> xbInt16 FormatDate( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFmtIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFmtOut );</div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *Str() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsLeapYear( xbInt16 iYear ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsLeapYear() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> xbInt32 JulianDays() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> xbInt16 JulToDate8( xbInt32 lJulDate );</div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> xbInt16 LastDayOfMonth();</div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> xbInt16 MonthOf() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> xbInt16 Set( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Date8 );</div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> xbInt16 Sysdate();</div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> xbInt16 YearOf() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> </div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span><span class="preprocessor">#ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keywordtype">void</span> Dump( <span class="keyword">const</span> <span class="keywordtype">char</span> * title );</div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <span class="keywordtype">void</span> DumpDateTables();</div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> </div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordtype">void</span> SetDateTables();</div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> sDate8; <span class="comment">/* CCYYMMDD date format ie; 20140718 */</span></div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="keyword">static</span> <span class="keywordtype">int</span> iAggregatedDaysInMonths[2][13];</div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="keyword">static</span> <span class="keywordtype">int</span> iDaysInMonths[2][13];</div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span>};</div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div>
+<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span>} <span class="comment">/* namespace */</span></div>
+<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span><span class="preprocessor">#endif </span><span class="comment">/*__XB_XBDATE_H__ */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> </div>
+<div class="ttc" id="aclassxb_1_1xbDate_html"><div class="ttname"><a href="classxb_1_1xbDate.html">xb::xbDate</a></div><div class="ttdoc">xbDate class.</div><div class="ttdef"><b>Definition:</b> xbdate.h:62</div></div>
+<div class="ttc" id="aclassxb_1_1xbSsv_html"><div class="ttname"><a href="classxb_1_1xbSsv.html">xb::xbSsv</a></div><div class="ttdoc">Class for handling shared system variables.</div><div class="ttdef"><b>Definition:</b> xbssv.h:59</div></div>
+<div class="ttc" id="aclassxb_1_1xbString_html"><div class="ttname"><a href="classxb_1_1xbString.html">xb::xbString</a></div><div class="ttdoc">Class for handling string data.</div><div class="ttdef"><b>Definition:</b> xbstring.h:50</div></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbdbf3_8cpp.html b/docs/doxygen/html/xbdbf3_8cpp.html
new file mode 100644
index 0000000..e9b5e6a
--- /dev/null
+++ b/docs/doxygen/html/xbdbf3_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf3.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbdbf3.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbdbf4_8cpp.html b/docs/doxygen/html/xbdbf4_8cpp.html
new file mode 100644
index 0000000..29e9027
--- /dev/null
+++ b/docs/doxygen/html/xbdbf4_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf4.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbdbf4.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbdbf_8cpp.html b/docs/doxygen/html/xbdbf_8cpp.html
new file mode 100644
index 0000000..a7b9841
--- /dev/null
+++ b/docs/doxygen/html/xbdbf_8cpp.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbdbf.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle"><div class="title">xbdbf.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbdbf_8h.html b/docs/doxygen/html/xbdbf_8h.html
new file mode 100644
index 0000000..0975435
--- /dev/null
+++ b/docs/doxygen/html/xbdbf_8h.html
@@ -0,0 +1,456 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdbf.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#define-members">Macros</a> </div>
+ <div class="headertitle"><div class="title">xbdbf.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbdbf_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbSchema.html">xb::xbSchema</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Schema used for defining tables with CreateTable methods. <a href="structxb_1_1xbSchema.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbDbf.html">xb::xbDbf</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Base class for handling dbf files/tables. <a href="classxb_1_1xbDbf.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:a20f739b9d9dc6a002a246a999e76aeaa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a20f739b9d9dc6a002a246a999e76aeaa">XB_CHAR_FLD</a>&#160;&#160;&#160;'C'</td></tr>
+<tr class="separator:a20f739b9d9dc6a002a246a999e76aeaa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f6d5073af761bc1a806a2c7b1c1d886"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a2f6d5073af761bc1a806a2c7b1c1d886">XB_LOGICAL_FLD</a>&#160;&#160;&#160;'L'</td></tr>
+<tr class="separator:a2f6d5073af761bc1a806a2c7b1c1d886"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9fb6d69cc5edc94d36ae403c22ec1c6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#ae9fb6d69cc5edc94d36ae403c22ec1c6">XB_NUMERIC_FLD</a>&#160;&#160;&#160;'N'</td></tr>
+<tr class="separator:ae9fb6d69cc5edc94d36ae403c22ec1c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f685e6f5fe804b2174725a27ce73adc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a7f685e6f5fe804b2174725a27ce73adc">XB_DATE_FLD</a>&#160;&#160;&#160;'D'</td></tr>
+<tr class="separator:a7f685e6f5fe804b2174725a27ce73adc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a23fa19b19cb43bd6dcc59a5a3f6c30ad"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a23fa19b19cb43bd6dcc59a5a3f6c30ad">XB_MEMO_FLD</a>&#160;&#160;&#160;'M'</td></tr>
+<tr class="separator:a23fa19b19cb43bd6dcc59a5a3f6c30ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96ab4218d70ab603b4866354ce8c18cd"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a96ab4218d70ab603b4866354ce8c18cd">XB_FLOAT_FLD</a>&#160;&#160;&#160;'F'</td></tr>
+<tr class="separator:a96ab4218d70ab603b4866354ce8c18cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a843ca4569326dbd1d0647899b0eb512f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a843ca4569326dbd1d0647899b0eb512f">XB_CLOSED</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a843ca4569326dbd1d0647899b0eb512f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a6dafbb07cac744eb14094efa739409"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a9a6dafbb07cac744eb14094efa739409">XB_OPEN</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a9a6dafbb07cac744eb14094efa739409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26e7eeda69f32bc88b08a208ca9e7991"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a26e7eeda69f32bc88b08a208ca9e7991">XB_UPDATED</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:a26e7eeda69f32bc88b08a208ca9e7991"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a395a2e101a793bacabf6bc079d178e29"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a395a2e101a793bacabf6bc079d178e29">XB_LOCK</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a395a2e101a793bacabf6bc079d178e29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21389b73e7b4e7e185fa635b9e354c2e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a21389b73e7b4e7e185fa635b9e354c2e">XB_UNLOCK</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a21389b73e7b4e7e185fa635b9e354c2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c08d01bd69e295b001bd00a228d8106"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a4c08d01bd69e295b001bd00a228d8106">LK_DBASE</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a4c08d01bd69e295b001bd00a228d8106"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01d6d7910b0da2170eb904a97d864a41"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a01d6d7910b0da2170eb904a97d864a41">LK_CLIPPER</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:a01d6d7910b0da2170eb904a97d864a41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65e29186276222f460a7171803e07adf"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a65e29186276222f460a7171803e07adf">LK_FOX</a>&#160;&#160;&#160;3</td></tr>
+<tr class="separator:a65e29186276222f460a7171803e07adf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a42aea0ccd94f7422c8e0d7422dce85a4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a42aea0ccd94f7422c8e0d7422dce85a4">LK_XBASE64</a>&#160;&#160;&#160;9</td></tr>
+<tr class="separator:a42aea0ccd94f7422c8e0d7422dce85a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8bd17730da3ba5c55a6a07bc482dd0e4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a8bd17730da3ba5c55a6a07bc482dd0e4">XB_ALL_RECS</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a8bd17730da3ba5c55a6a07bc482dd0e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c44bb25bf2e23a3a9d3d2312df0b592"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a1c44bb25bf2e23a3a9d3d2312df0b592">XB_ACTIVE_RECS</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a1c44bb25bf2e23a3a9d3d2312df0b592"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc0a441854ed92b9d65d1181a97cad43"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#acc0a441854ed92b9d65d1181a97cad43">XB_DELETED_RECS</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:acc0a441854ed92b9d65d1181a97cad43"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fe10b307878b4612b04c2c876a4a592"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a6fe10b307878b4612b04c2c876a4a592">XB_OVERLAY</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a6fe10b307878b4612b04c2c876a4a592"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b797840abdb3291373d15978103a778"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a7b797840abdb3291373d15978103a778">XB_DONTOVERLAY</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a7b797840abdb3291373d15978103a778"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada1115f596131888c04df61546b198c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#ada1115f596131888c04df61546b198c4">XB_CHAREOF</a>&#160;&#160;&#160;'\x1A' /* end of DBF */</td></tr>
+<tr class="separator:ada1115f596131888c04df61546b198c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35d56cac7959c1e5c761684ced3f1e17"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbdbf_8h.html#a35d56cac7959c1e5c761684ced3f1e17">XB_CHARHDR</a>&#160;&#160;&#160;'\x0D' /* header terminator */</td></tr>
+<tr class="separator:a35d56cac7959c1e5c761684ced3f1e17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a01d6d7910b0da2170eb904a97d864a41" name="a01d6d7910b0da2170eb904a97d864a41"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a01d6d7910b0da2170eb904a97d864a41">&#9670;&nbsp;</a></span>LK_CLIPPER</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define LK_CLIPPER&#160;&#160;&#160;2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a4c08d01bd69e295b001bd00a228d8106" name="a4c08d01bd69e295b001bd00a228d8106"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4c08d01bd69e295b001bd00a228d8106">&#9670;&nbsp;</a></span>LK_DBASE</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define LK_DBASE&#160;&#160;&#160;1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a65e29186276222f460a7171803e07adf" name="a65e29186276222f460a7171803e07adf"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a65e29186276222f460a7171803e07adf">&#9670;&nbsp;</a></span>LK_FOX</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define LK_FOX&#160;&#160;&#160;3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a42aea0ccd94f7422c8e0d7422dce85a4" name="a42aea0ccd94f7422c8e0d7422dce85a4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a42aea0ccd94f7422c8e0d7422dce85a4">&#9670;&nbsp;</a></span>LK_XBASE64</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define LK_XBASE64&#160;&#160;&#160;9</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1c44bb25bf2e23a3a9d3d2312df0b592" name="a1c44bb25bf2e23a3a9d3d2312df0b592"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1c44bb25bf2e23a3a9d3d2312df0b592">&#9670;&nbsp;</a></span>XB_ACTIVE_RECS</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_ACTIVE_RECS&#160;&#160;&#160;1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8bd17730da3ba5c55a6a07bc482dd0e4" name="a8bd17730da3ba5c55a6a07bc482dd0e4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8bd17730da3ba5c55a6a07bc482dd0e4">&#9670;&nbsp;</a></span>XB_ALL_RECS</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_ALL_RECS&#160;&#160;&#160;0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a20f739b9d9dc6a002a246a999e76aeaa" name="a20f739b9d9dc6a002a246a999e76aeaa"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a20f739b9d9dc6a002a246a999e76aeaa">&#9670;&nbsp;</a></span>XB_CHAR_FLD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_CHAR_FLD&#160;&#160;&#160;'C'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ada1115f596131888c04df61546b198c4" name="ada1115f596131888c04df61546b198c4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ada1115f596131888c04df61546b198c4">&#9670;&nbsp;</a></span>XB_CHAREOF</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_CHAREOF&#160;&#160;&#160;'\x1A' /* end of DBF */</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a35d56cac7959c1e5c761684ced3f1e17" name="a35d56cac7959c1e5c761684ced3f1e17"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a35d56cac7959c1e5c761684ced3f1e17">&#9670;&nbsp;</a></span>XB_CHARHDR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_CHARHDR&#160;&#160;&#160;'\x0D' /* header terminator */</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a843ca4569326dbd1d0647899b0eb512f" name="a843ca4569326dbd1d0647899b0eb512f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a843ca4569326dbd1d0647899b0eb512f">&#9670;&nbsp;</a></span>XB_CLOSED</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_CLOSED&#160;&#160;&#160;0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a7f685e6f5fe804b2174725a27ce73adc" name="a7f685e6f5fe804b2174725a27ce73adc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7f685e6f5fe804b2174725a27ce73adc">&#9670;&nbsp;</a></span>XB_DATE_FLD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_DATE_FLD&#160;&#160;&#160;'D'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="acc0a441854ed92b9d65d1181a97cad43" name="acc0a441854ed92b9d65d1181a97cad43"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acc0a441854ed92b9d65d1181a97cad43">&#9670;&nbsp;</a></span>XB_DELETED_RECS</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_DELETED_RECS&#160;&#160;&#160;2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a7b797840abdb3291373d15978103a778" name="a7b797840abdb3291373d15978103a778"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7b797840abdb3291373d15978103a778">&#9670;&nbsp;</a></span>XB_DONTOVERLAY</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_DONTOVERLAY&#160;&#160;&#160;0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a96ab4218d70ab603b4866354ce8c18cd" name="a96ab4218d70ab603b4866354ce8c18cd"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a96ab4218d70ab603b4866354ce8c18cd">&#9670;&nbsp;</a></span>XB_FLOAT_FLD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_FLOAT_FLD&#160;&#160;&#160;'F'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a395a2e101a793bacabf6bc079d178e29" name="a395a2e101a793bacabf6bc079d178e29"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a395a2e101a793bacabf6bc079d178e29">&#9670;&nbsp;</a></span>XB_LOCK</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_LOCK&#160;&#160;&#160;0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a2f6d5073af761bc1a806a2c7b1c1d886" name="a2f6d5073af761bc1a806a2c7b1c1d886"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2f6d5073af761bc1a806a2c7b1c1d886">&#9670;&nbsp;</a></span>XB_LOGICAL_FLD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_LOGICAL_FLD&#160;&#160;&#160;'L'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a23fa19b19cb43bd6dcc59a5a3f6c30ad" name="a23fa19b19cb43bd6dcc59a5a3f6c30ad"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a23fa19b19cb43bd6dcc59a5a3f6c30ad">&#9670;&nbsp;</a></span>XB_MEMO_FLD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_MEMO_FLD&#160;&#160;&#160;'M'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae9fb6d69cc5edc94d36ae403c22ec1c6" name="ae9fb6d69cc5edc94d36ae403c22ec1c6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae9fb6d69cc5edc94d36ae403c22ec1c6">&#9670;&nbsp;</a></span>XB_NUMERIC_FLD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_NUMERIC_FLD&#160;&#160;&#160;'N'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9a6dafbb07cac744eb14094efa739409" name="a9a6dafbb07cac744eb14094efa739409"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9a6dafbb07cac744eb14094efa739409">&#9670;&nbsp;</a></span>XB_OPEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_OPEN&#160;&#160;&#160;1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a6fe10b307878b4612b04c2c876a4a592" name="a6fe10b307878b4612b04c2c876a4a592"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a6fe10b307878b4612b04c2c876a4a592">&#9670;&nbsp;</a></span>XB_OVERLAY</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_OVERLAY&#160;&#160;&#160;1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a21389b73e7b4e7e185fa635b9e354c2e" name="a21389b73e7b4e7e185fa635b9e354c2e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a21389b73e7b4e7e185fa635b9e354c2e">&#9670;&nbsp;</a></span>XB_UNLOCK</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_UNLOCK&#160;&#160;&#160;1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a26e7eeda69f32bc88b08a208ca9e7991" name="a26e7eeda69f32bc88b08a208ca9e7991"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a26e7eeda69f32bc88b08a208ca9e7991">&#9670;&nbsp;</a></span>XB_UPDATED</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_UPDATED&#160;&#160;&#160;2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbdbf_8h_source.html b/docs/doxygen/html/xbdbf_8h_source.html
new file mode 100644
index 0000000..6340920
--- /dev/null
+++ b/docs/doxygen/html/xbdbf_8h_source.html
@@ -0,0 +1,588 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbdbf.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbdbf.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbdbf_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbdbf.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014, 2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_XBDBF_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_XBDBF_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="comment">//#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="comment">//#pragma interface</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="comment">//#endif</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="comment">/*****************************/</span></div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="comment">/* Field Types */</span></div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a20f739b9d9dc6a002a246a999e76aeaa"> 29</a></span><span class="preprocessor">#define XB_CHAR_FLD &#39;C&#39;</span></div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a2f6d5073af761bc1a806a2c7b1c1d886"> 30</a></span><span class="preprocessor">#define XB_LOGICAL_FLD &#39;L&#39;</span></div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#ae9fb6d69cc5edc94d36ae403c22ec1c6"> 31</a></span><span class="preprocessor">#define XB_NUMERIC_FLD &#39;N&#39;</span></div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a7f685e6f5fe804b2174725a27ce73adc"> 32</a></span><span class="preprocessor">#define XB_DATE_FLD &#39;D&#39;</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a23fa19b19cb43bd6dcc59a5a3f6c30ad"> 33</a></span><span class="preprocessor">#define XB_MEMO_FLD &#39;M&#39;</span></div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a96ab4218d70ab603b4866354ce8c18cd"> 34</a></span><span class="preprocessor">#define XB_FLOAT_FLD &#39;F&#39;</span></div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="comment">/*****************************/</span></div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="comment">/* File Status Codes */</span></div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> </div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a843ca4569326dbd1d0647899b0eb512f"> 39</a></span><span class="preprocessor">#define XB_CLOSED 0</span></div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a9a6dafbb07cac744eb14094efa739409"> 40</a></span><span class="preprocessor">#define XB_OPEN 1</span></div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a26e7eeda69f32bc88b08a208ca9e7991"> 41</a></span><span class="preprocessor">#define XB_UPDATED 2</span></div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> </div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="comment">/*****************************/</span></div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="comment">/* File Access Modes */</span></div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="comment">// #define XB_SINGLE_USER 0 // file buffering on</span></div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="comment">// #define XB_MULTI_USER 1 // file buffering off</span></div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> </div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="comment">/*****************************/</span></div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="comment">/* File Lock Functions */</span></div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a395a2e101a793bacabf6bc079d178e29"> 51</a></span><span class="preprocessor">#define XB_LOCK 0</span></div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a21389b73e7b4e7e185fa635b9e354c2e"> 52</a></span><span class="preprocessor">#define XB_UNLOCK 1</span></div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> </div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a4c08d01bd69e295b001bd00a228d8106"> 54</a></span><span class="preprocessor">#define LK_DBASE 1</span></div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a01d6d7910b0da2170eb904a97d864a41"> 55</a></span><span class="preprocessor">#define LK_CLIPPER 2 </span><span class="comment">// future</span></div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a65e29186276222f460a7171803e07adf"> 56</a></span><span class="preprocessor">#define LK_FOX 3 </span><span class="comment">// future</span></div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a42aea0ccd94f7422c8e0d7422dce85a4"> 57</a></span><span class="preprocessor">#define LK_XBASE64 9 </span><span class="comment">// future</span></div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> </div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span><span class="comment">/*****************************/</span></div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="comment">/* Record retrieve options */</span></div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a8bd17730da3ba5c55a6a07bc482dd0e4"> 61</a></span><span class="preprocessor">#define XB_ALL_RECS 0</span></div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a1c44bb25bf2e23a3a9d3d2312df0b592"> 62</a></span><span class="preprocessor">#define XB_ACTIVE_RECS 1</span></div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#acc0a441854ed92b9d65d1181a97cad43"> 63</a></span><span class="preprocessor">#define XB_DELETED_RECS 2</span></div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> </div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="comment">/*****************************/</span></div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span><span class="comment">/* Other defines */</span></div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> </div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a6fe10b307878b4612b04c2c876a4a592"> 69</a></span><span class="preprocessor">#define XB_OVERLAY 1</span></div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a7b797840abdb3291373d15978103a778"> 70</a></span><span class="preprocessor">#define XB_DONTOVERLAY 0</span></div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#ada1115f596131888c04df61546b198c4"> 71</a></span><span class="preprocessor">#define XB_CHAREOF &#39;\x1A&#39; </span><span class="comment">/* end of DBF */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"><a class="line" href="xbdbf_8h.html#a35d56cac7959c1e5c761684ced3f1e17"> 72</a></span><span class="preprocessor">#define XB_CHARHDR &#39;\x0D&#39; </span><span class="comment">/* header terminator */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> </div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"><a class="line" href="structxb_1_1xbSchema.html"> 95</a></span><span class="keyword">struct </span>XBDLLEXPORT <a class="code hl_struct" href="structxb_1_1xbSchema.html">xbSchema</a> {</div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"><a class="line" href="structxb_1_1xbSchema.html#a514183856094123fd37df67885b4681e"> 96</a></span> <span class="keywordtype">char</span> cFieldName[11];</div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"><a class="line" href="structxb_1_1xbSchema.html#a1d612b2ed5dc0b0289c9e91b3cda3a25"> 97</a></span> <span class="keywordtype">char</span> <a class="code hl_variable" href="structxb_1_1xbSchema.html#a1d612b2ed5dc0b0289c9e91b3cda3a25">cType</a>;</div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"><a class="line" href="structxb_1_1xbSchema.html#a2da554af25ef628acf59bb52996056ac"> 98</a></span> xbInt16 <a class="code hl_variable" href="structxb_1_1xbSchema.html#a2da554af25ef628acf59bb52996056ac">iFieldLen</a>; <span class="comment">/* fields are stored as one byte on record*/</span></div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"><a class="line" href="structxb_1_1xbSchema.html#a55bab3bb69dee3508d168c93e182d4b9"> 99</a></span> xbInt16 <a class="code hl_variable" href="structxb_1_1xbSchema.html#a55bab3bb69dee3508d168c93e182d4b9">iNoOfDecs</a>;</div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span>};</div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> </div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span><span class="keyword">struct </span>XBDLLEXPORT xbSchemaRec {</div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="keywordtype">char</span> cFieldName[11]; <span class="comment">/* ASCIIZ field name */</span></div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordtype">char</span> cType; <span class="comment">/* field type */</span></div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <span class="keywordtype">char</span> *pAddress; <span class="comment">/* pointer to field in record buffer 1 */</span></div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cFieldLen; <span class="comment">/* fields are stored as one byte on record */</span></div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cNoOfDecs;</div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keywordtype">char</span> *pAddress2; <span class="comment">/* pointer to field in record buffer 2 */</span></div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> xbInt16 iLongFieldLen; <span class="comment">/* to handle long field lengths */</span></div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cIxFlag; <span class="comment">/* DBase IV Index field flag */</span></div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span>};</div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> </div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> </div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span><span class="preprocessor">#ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span><span class="keyword">class </span>XBDLLEXPORT xbIx;</div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span><span class="comment">// structure for file list, each open DBF file can have one or more index files</span></div>
+<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span><span class="keyword">struct </span>XBDLLEXPORT xbIxList {</div>
+<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> xbIxList *next;</div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> xbIx *ix;</div>
+<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> xbString *sFmt;</div>
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span>};</div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span><span class="preprocessor">#endif </span><span class="comment">// XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span><span class="comment"></span> </div>
+<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> </div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> </div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html"> 150</a></span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> : <span class="keyword">public</span> <a class="code hl_class" href="classxb_1_1xbFile.html">xbFile</a> {</div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> </div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a>( <a class="code hl_class" href="classxb_1_1xbXBase.html">xbXBase</a> *x );</div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classxb_1_1xbDbf.html">~xbDbf</a>();</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keyword">virtual</span> xbInt16 Abort();</div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keyword">virtual</span> xbInt16 AppendRecord();</div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keyword">virtual</span> xbInt16 BlankRecord();</div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="keyword">virtual</span> xbInt16 Commit();</div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <span class="keyword">virtual</span> xbInt16 Close();</div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="keyword">virtual</span> xbInt16 CopyDbfStructure( <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> *dNewTable, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableAlias, xbInt16 iOverlay, xbInt16 iShareMode );</div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a73e41bfe679dd06ab16c436652df93f1"> 162</a></span> <span class="keyword">virtual</span> xbInt16 <a class="code hl_function" href="classxb_1_1xbDbf.html#a73e41bfe679dd06ab16c436652df93f1">CreateTable</a> ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias, <a class="code hl_struct" href="structxb_1_1xbSchema.html">xbSchema</a> *pSchema, xbInt16 iOverlay, xbInt16 iShareMode ) = 0;</div>
+<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <span class="keyword">virtual</span> xbInt16 DeleteTable ();</div>
+<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="keyword">virtual</span> xbInt16 DeleteAll ( xbInt16 iOption );</div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> <span class="keyword">virtual</span> xbInt16 DeleteAllRecords ();</div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="keyword">virtual</span> xbInt16 DeleteRecord ();</div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#ab1f4a515533402f872cedcd0322aabd4"> 167</a></span> <span class="keyword">virtual</span> xbInt16 <a class="code hl_function" href="classxb_1_1xbDbf.html#ab1f4a515533402f872cedcd0322aabd4">DumpHeader</a> ( xbInt16 iOption ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a3a6a068addffd06fc9a996639d6ca69e"> 168</a></span> <span class="keyword">virtual</span> xbInt16 <a class="code hl_function" href="classxb_1_1xbDbf.html#a3a6a068addffd06fc9a996639d6ca69e">DumpRecord</a> ( xbUInt32 ulRecNo, xbInt16 iOutputDest = 0, xbInt16 iOutputFmt = 0 );</div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keyword">virtual</span> xbInt16 GetAutoCommit () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <span class="keyword">virtual</span> xbInt16 GetAutoCommit ( xbInt16 iOption ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> <span class="keyword">virtual</span> xbUInt32 GetCurRecNo () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <span class="keyword">virtual</span> xbInt16 GetDbfStatus () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <span class="keyword">virtual</span> xbInt32 GetFieldCnt () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <span class="keyword">virtual</span> xbInt16 GetFirstRecord ();</div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> <span class="keyword">virtual</span> xbInt16 GetFirstRecord ( xbInt16 iOption );</div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <span class="keyword">virtual</span> xbInt16 GetLastRecord ();</div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <span class="keyword">virtual</span> xbInt16 GetLastRecord ( xbInt16 iOption );</div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> </div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="keyword">virtual</span> xbInt16 GetNextRecord ();</div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <span class="keyword">virtual</span> xbInt16 GetNextRecord ( xbInt16 iOption );</div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="keyword">virtual</span> xbInt16 GetNextRecord ( xbInt16 iOption, xbUInt32 ulStartRec );</div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a13393704a8a191d4d6555ae31d3c3e92"> 182</a></span> <span class="keyword">virtual</span> xbInt32 <a class="code hl_function" href="classxb_1_1xbDbf.html#a13393704a8a191d4d6555ae31d3c3e92">GetPhysicalIxCnt</a> () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <span class="keyword">virtual</span> xbInt16 GetPrevRecord ();</div>
+<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <span class="keyword">virtual</span> xbInt16 GetPrevRecord ( xbInt16 iOption );</div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="keyword">virtual</span> xbInt16 GetRecord ( xbUInt32 ulRecNo );</div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> <span class="keyword">virtual</span> xbInt16 GetRecordCnt ( xbUInt32 &amp; ulRecCnt );</div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <span class="keyword">virtual</span> <span class="keywordtype">char</span> * GetRecordBuf ( xbInt16 iOpt = 0 ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> <span class="keyword">virtual</span> xbUInt16 GetRecordLen () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;GetTblAlias() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a49212a9eb17f7fa9f303e08d5fc50fc6"> 190</a></span> <span class="keyword">virtual</span> xbInt16 <a class="code hl_function" href="classxb_1_1xbDbf.html#a49212a9eb17f7fa9f303e08d5fc50fc6">GetVersion</a> () <span class="keyword">const</span> = 0; </div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keyword">virtual</span> <a class="code hl_class" href="classxb_1_1xbXBase.html">xbXBase</a> *GetXbasePtr () <span class="keyword">const</span>; <span class="comment">// return xbase pointer</span></div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> </div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#ac856fc1b110b46aefa1b2f5c0f530aa2"> 193</a></span> <span class="keyword">virtual</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> <a class="code hl_function" href="classxb_1_1xbDbf.html#ac856fc1b110b46aefa1b2f5c0f530aa2">MemoFieldsExist</a> () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> </div>
+<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a97366c7362e409d7f09973a6aef8dad0"> 195</a></span> <span class="keyword">virtual</span> xbInt16 <a class="code hl_function" href="classxb_1_1xbDbf.html#a97366c7362e409d7f09973a6aef8dad0">Open</a> ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName );</div>
+<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#ac658818bf9b8f8ff7467d8d80495b324"> 196</a></span> <span class="keyword">virtual</span> xbInt16 <a class="code hl_function" href="classxb_1_1xbDbf.html#ac658818bf9b8f8ff7467d8d80495b324">Open</a> ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias );</div>
+<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a4d018cbf44d8d8b2145c9acab02c8adf"> 197</a></span> <span class="keyword">virtual</span> xbInt16 <a class="code hl_function" href="classxb_1_1xbDbf.html#a4d018cbf44d8d8b2145c9acab02c8adf">Open</a> ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias, xbInt16 iOpenMode, xbInt16 iShareMode ) = 0;</div>
+<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="keyword">virtual</span> xbInt16 Pack ();</div>
+<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keyword">virtual</span> xbInt16 Pack ( xbUInt32 &amp;ulDeletedRecCnt );</div>
+<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> </div>
+<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> </div>
+<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="keyword">virtual</span> xbInt16 PutRecord (); <span class="comment">// Put record to current location</span></div>
+<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="keyword">virtual</span> xbInt16 PutRecord ( xbUInt32 ulRecNo );</div>
+<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keyword">virtual</span> xbInt16 ReadHeader ( xbInt16 iFilePositionOption, xbInt16 iReadOption );</div>
+<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="keyword">virtual</span> xbInt16 RecordDeleted ( xbInt16 iOpt = 0 ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> </div>
+<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="keyword">virtual</span> xbInt16 SetAutoCommit ( xbInt16 iAutoCommit );</div>
+<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> </div>
+<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keyword">virtual</span> xbInt16 UndeleteAllRecords();</div>
+<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="keyword">virtual</span> xbInt16 UndeleteRecord ();</div>
+<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <span class="keyword">virtual</span> xbInt16 Zap ();</div>
+<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> </div>
+<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> </div>
+<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> <span class="comment">/* field methods */</span></div>
+<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="comment">//virtual xbInt16 GetRawField( xbInt16 iFieldNo, char *Buf, xbUInt32 BufSize, xbInt16 iRecBufSw ) const;</span></div>
+<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="keyword">virtual</span> xbInt16 GetField(xbInt16 iFieldNo, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldValue, xbInt16 iRecBufSw ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="keyword">virtual</span> xbInt16 GetField(xbInt16 iFieldNo, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldValue) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="keyword">virtual</span> xbInt16 GetField(<span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldValue) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <span class="keyword">virtual</span> xbInt16 GetFieldDecimal( xbInt16 iFieldNo, xbInt16 &amp;iFieldDecimal ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="keyword">virtual</span> xbInt16 GetFieldDecimal( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, xbInt16 &amp;iFieldDecimal ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keyword">virtual</span> xbInt16 GetFieldLen( xbInt16 iFieldNo, xbInt16 &amp;iFieldLen ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="keyword">virtual</span> xbInt16 GetFieldLen( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, xbInt16 &amp;iFieldLen ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keyword">virtual</span> xbInt16 GetFieldName( xbInt16 iFieldNo, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> </div>
+<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keyword">virtual</span> xbInt16 GetFieldNo( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, xbInt16 &amp;iFieldNo ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <span class="keyword">virtual</span> xbInt16 GetFieldNo( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> </div>
+<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="keyword">virtual</span> xbInt16 GetFieldType( xbInt16 iFieldNo, <span class="keywordtype">char</span> &amp;cFieldType ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="keyword">virtual</span> xbInt16 GetFieldType( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <span class="keywordtype">char</span> &amp;cFieldType ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> <span class="keyword">virtual</span> xbInt16 PutField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData );</div>
+<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="keyword">virtual</span> xbInt16 PutField( xbInt16 iFieldNo, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData );</div>
+<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> </div>
+<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> <span class="keyword">virtual</span> xbInt16 PutLogicalField( xbInt16 iFieldNo, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData );</div>
+<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="keyword">virtual</span> xbInt16 PutLogicalField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData );</div>
+<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="keyword">virtual</span> xbInt16 GetLogicalField( xbInt16 iFieldNo, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="keyword">virtual</span> xbInt16 GetLogicalField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldData) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> </div>
+<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keyword">virtual</span> xbInt16 PutLogicalField( xbInt16 iFieldNo, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bFieldData );</div>
+<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="keyword">virtual</span> xbInt16 PutLogicalField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bFieldData );</div>
+<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> <span class="keyword">virtual</span> xbInt16 GetLogicalField( xbInt16 iFieldNo, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bFieldData ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> <span class="keyword">virtual</span> xbInt16 GetLogicalField( xbInt16 iFieldNo, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bFieldData, xbInt16 iRecBufSw ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> <span class="keyword">virtual</span> xbInt16 GetLogicalField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bFieldData) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> </div>
+<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="keyword">virtual</span> xbInt16 GetLongField( xbInt16 iFieldNo, xbInt32 &amp;lFieldValue ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> <span class="keyword">virtual</span> xbInt16 GetLongField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, xbInt32 &amp;lFieldValue ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> <span class="keyword">virtual</span> xbInt16 PutLongField( xbInt16 iFieldNo, xbInt32 lFieldValue );</div>
+<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> <span class="keyword">virtual</span> xbInt16 PutLongField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldNo, xbInt32 lFieldValue );</div>
+<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> </div>
+<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> <span class="keyword">virtual</span> xbInt16 GetULongField( xbInt16 iFieldNo, xbUInt32 &amp;lFieldValue ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> <span class="keyword">virtual</span> xbInt16 GetULongField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, xbUInt32 &amp;lFieldValue ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <span class="keyword">virtual</span> xbInt16 PutULongField( xbInt16 iFieldNo, xbUInt32 lFieldValue );</div>
+<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> <span class="keyword">virtual</span> xbInt16 PutULongField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldNo, xbUInt32 lFieldValue );</div>
+<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> </div>
+<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> <span class="keyword">virtual</span> xbInt16 GetDoubleField( xbInt16 FieldNo, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dFieldValue ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="keyword">virtual</span> xbInt16 GetDoubleField( xbInt16 FieldNo, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dFieldValue, xbInt16 iRecBufSw ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keyword">virtual</span> xbInt16 GetDoubleField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dFieldValue ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> <span class="keyword">virtual</span> xbInt16 PutDoubleField( xbInt16 FieldNo, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dFieldValue );</div>
+<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keyword">virtual</span> xbInt16 PutDoubleField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;FieldName, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dFieldValue );</div>
+<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> </div>
+<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> <span class="keyword">virtual</span> xbInt16 GetFloatField( xbInt16 iFieldNo, <a class="code hl_typedef" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a> &amp;fFieldValue ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> <span class="keyword">virtual</span> xbInt16 GetFloatField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="code hl_typedef" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a> &amp;fFieldValue ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> <span class="keyword">virtual</span> xbInt16 PutFloatField( xbInt16 iFieldNo, <a class="code hl_typedef" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a> fFieldValue );</div>
+<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="keyword">virtual</span> xbInt16 PutFloatField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="code hl_typedef" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a> fFieldValue );</div>
+<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> </div>
+<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> <span class="keyword">virtual</span> xbInt16 GetDateField( xbInt16 iFieldNo, <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dt ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <span class="keyword">virtual</span> xbInt16 GetDateField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dt ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keyword">virtual</span> xbInt16 PutDateField( xbInt16 iFieldNo, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dt );</div>
+<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> <span class="keyword">virtual</span> xbInt16 PutDateField( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dt );</div>
+<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> </div>
+<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> </div>
+<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> </div>
+<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span><span class="preprocessor"> #ifdef XB_MEMO_SUPPORT</span></div>
+<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <span class="keyword">virtual</span> xbInt16 GetMemoFieldCnt () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> <span class="keyword">virtual</span> xbMemo *GetMemoPtr ();</div>
+<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="keyword">virtual</span> xbUInt32 GetCreateMemoBlockSize() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> <span class="keyword">virtual</span> xbInt16 GetMemoField ( xbInt16 iFldNo, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sMemoData );</div>
+<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> <span class="keyword">virtual</span> xbInt16 GetMemoField ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp; sFldName, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sMemoData );</div>
+<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="keyword">virtual</span> xbInt16 GetMemoFieldLen ( xbInt16 iFldNo, xbUInt32 &amp;ullMemoFieldLen );</div>
+<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="keyword">virtual</span> xbInt16 GetMemoFieldLen ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp; sFldName, xbUInt32 &amp;ulMemoFieldLen );</div>
+<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> <span class="keyword">virtual</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> MemoFieldExists ( xbInt16 iFieldNo ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> <span class="keyword">virtual</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> MemoFieldExists ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFieldName ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> <span class="keyword">virtual</span> xbInt16 SetCreateMemoBlockSize( xbUInt32 ulBlockSize ) = 0;</div>
+<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> <span class="keyword">virtual</span> xbInt16 UpdateMemoField ( xbInt16 iFldNo, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sMemoData );</div>
+<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> <span class="keyword">virtual</span> xbInt16 UpdateMemoField ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp; sFldName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sMemoData );</div>
+<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span><span class="preprocessor"> #endif </span><span class="comment">// XB_MEMO_SUPPORT</span></div>
+<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> </div>
+<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> </div>
+<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span><span class="preprocessor"> #ifdef XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> <span class="keyword">virtual</span> xbInt16 LockTable ( xbInt16 iLockFunction );</div>
+<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> <span class="keyword">virtual</span> xbInt16 LockRecord ( xbInt16 iLockFunction, xbUInt32 ulRecNo );</div>
+<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> <span class="keyword">virtual</span> xbInt16 LockAppend ( xbInt16 iLockFunction );</div>
+<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <span class="keyword">virtual</span> xbInt16 LockHeader ( xbInt16 iLockFunction );</div>
+<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> </div>
+<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span><span class="preprocessor"> #ifdef XB_MEMO_SUPPORT</span></div>
+<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> <span class="keyword">virtual</span> xbInt16 LockMemo ( xbInt16 iLockFunction );</div>
+<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> <span class="keyword">virtual</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetMemoLocked () <span class="keyword">const</span>; </div>
+<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span><span class="preprocessor"> #endif </span><span class="comment">// XB_MEMO_LOCK</span></div>
+<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> </div>
+<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span><span class="preprocessor"> #ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> <span class="keyword">virtual</span> xbInt16 LockIndices ( xbInt16 iLockFunction );</div>
+<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span><span class="preprocessor"> #endif </span><span class="comment">// XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> </div>
+<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> xbInt16 GetAutoLock () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <span class="keywordtype">void</span> SetAutoLock ( xbInt16 iAutoLock );</div>
+<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> xbInt16 GetLockFlavor () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> <span class="keywordtype">void</span> SetLockFlavor ( xbInt16 iLockFlavor );</div>
+<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetTableLocked () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetHeaderLocked () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> xbUInt32 GetAppendLocked () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> xbLinkListNode&lt;xbUInt32&gt; * GetFirstRecLock () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> </div>
+<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keywordtype">void</span> DumpTableLockStatus() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span><span class="preprocessor"> #endif </span><span class="comment">// XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span><span class="preprocessor"> #endif </span><span class="comment">// XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> </div>
+<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> </div>
+<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span><span class="preprocessor"> #ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> <span class="keyword">virtual</span> xbInt16 CloseIndexFile( xbIx *pIx );</div>
+<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="keyword">virtual</span> xbInt16 CreateTag( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIxType, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sKey, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFilter, </div>
+<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverLay, xbIx **xbIxOut, <span class="keywordtype">void</span> **vpTagOut );</div>
+<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> <span class="keyword">virtual</span> xbInt16 DeleteTag( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIxType, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sName );</div>
+<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="keyword">virtual</span> xbInt16 DeleteAllIndexFiles();</div>
+<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> <span class="keyword">virtual</span> xbInt16 Find( <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sKey );</div>
+<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> <span class="keyword">virtual</span> xbInt16 Find( <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dtKey );</div>
+<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <span class="keyword">virtual</span> xbInt16 Find( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dKey );</div>
+<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> <span class="keyword">virtual</span> xbIx *GetCurIx() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *GetCurTag() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> </div>
+<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> <span class="keyword">virtual</span> xbInt16 GetFirstKey();</div>
+<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> <span class="keyword">virtual</span> xbInt16 GetNextKey();</div>
+<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <span class="keyword">virtual</span> xbInt16 GetPrevKey();</div>
+<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> <span class="keyword">virtual</span> xbInt16 GetLastKey();</div>
+<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> </div>
+<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;GetCurIxType() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> <span class="keyword">virtual</span> <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;GetCurTagName() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> <span class="keyword">virtual</span> xbIxList *GetIxList() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> xbLinkListNode&lt;xbTag *&gt; *GetTagList () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> <span class="keyword">virtual</span> xbInt16 OpenIndex( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIxType, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIndexName );</div>
+<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> <span class="keyword">virtual</span> xbInt16 SetCurTag( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTagName );</div>
+<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> SetCurTag( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIxType, xbIx *pIx, <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> </div>
+<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> <span class="keyword">virtual</span> xbInt16 CheckTagIntegrity( xbInt16 iTagOpt, xbInt16 iOutputOpt );</div>
+<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> <span class="keyword">virtual</span> xbInt16 Reindex( xbInt16 iTagOpt );</div>
+<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span><span class="preprocessor"> #endif </span><span class="comment">// XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span><span class="preprocessor"> #endif </span><span class="comment">// XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> </div>
+<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span><span class="preprocessor"> #ifdef XB_NDXINF_SUPPORT</span></div>
+<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> <span class="keyword">virtual</span> xbInt16 AssociateIndex( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sType, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sName, xbInt16 iOption );</div>
+<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> xbLinkListNode&lt;xbString&gt; *GetNdxInfList() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span><span class="preprocessor"> #endif </span><span class="comment">// XB_NDXINF_SUPPORT</span></div>
+<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> </div>
+<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="comment">//#ifdef XB_MDX_SUPPORT</span></div>
+<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="comment">//virtual xbInt16 GetCreateMdxBlockSize() const;</span></div>
+<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> <span class="comment">//virtual xbInt16 SetCreateMdxBlockSize( xbInt16 ulBlockSize );</span></div>
+<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> <span class="comment">//#endif</span></div>
+<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> </div>
+<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> </div>
+<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> </div>
+<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span><span class="preprocessor"> #ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> <span class="keyword">friend</span> <span class="keyword">class </span>xbIx;</div>
+<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> <span class="keyword">friend</span> <span class="keyword">class </span>xbIxMdx;</div>
+<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> </div>
+<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> xbInt16 AddIndex( xbIx *ix, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFmt );</div>
+<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> <span class="keywordtype">void</span> ClearTagList();</div>
+<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> <span class="keyword">virtual</span> xbInt16 GetNdxInfFileName( <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sNdxIdxFileName );</div>
+<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> xbInt16 RemoveIndex( xbIx * ix );</div>
+<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> <span class="keywordtype">void</span> UpdateSchemaIxFlag( xbInt16 iFldNo, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cVal );</div>
+<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> <span class="keyword">virtual</span> xbInt16 UpdateTagList ();</div>
+<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> </div>
+<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> </div>
+<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> </div>
+<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span><span class="preprocessor"> #ifdef XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> <span class="keywordtype">void</span> SetHeaderLocked ( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bTableLocked );</div>
+<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> <span class="keywordtype">void</span> SetTableLocked ( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bTableLocked );</div>
+<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span><span class="preprocessor"> #endif </span><span class="comment">// XB_LOCKING_SUPORT</span></div>
+<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> </div>
+<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span><span class="preprocessor"> #ifdef XB_MEMO_SUPPORT</span></div>
+<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> xbInt16 iMemoFieldCnt; <span class="comment">// Memo field cnt in the table</span></div>
+<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> xbMemo *Memo; <span class="comment">// Pointer to memo class</span></div>
+<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span> xbUInt32 ulCreateMemoBlockSize; <span class="comment">// blocksize to use when creating dbt file</span></div>
+<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> </div>
+<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span><span class="preprocessor"> #ifdef XB_NDXINF_SUPPORT</span></div>
+<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <span class="keyword">virtual</span> xbInt16 DeleteNdxInfData();</div>
+<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> <span class="keyword">virtual</span> xbInt16 LoadNdxInfData();</div>
+<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> <span class="keyword">virtual</span> xbInt16 SaveNdxInfData();</div>
+<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span><span class="preprocessor"> #endif </span><span class="comment">// XB_NDXINF_SUPPORT</span></div>
+<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> </div>
+<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span><span class="comment">/*</span></div>
+<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span><span class="comment"> #ifdef XB_MDX_SUPPORT</span></div>
+<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span><span class="comment"> xbInt16 iCreateMdxBlockSize;</span></div>
+<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span><span class="comment"> #endif // XB_MDX_SUPPORT</span></div>
+<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> </div>
+<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> <span class="keyword">virtual</span> xbInt16 GetRawField( xbInt16 iFieldNo, <span class="keywordtype">char</span> *Buf, xbUInt32 BufSize, xbInt16 iRecBufSw ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a7e63e852418f337eb7c44de5dcd50323"> 400</a></span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> InitVars(); </div>
+<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#aba5dcac3b4092261bc1669740cdd669d"> 401</a></span> <span class="keyword">virtual</span> xbInt16 SetVersion() = 0;</div>
+<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> <span class="keyword">virtual</span> xbInt16 ValidateSchema( <a class="code hl_struct" href="structxb_1_1xbSchema.html">xbSchema</a> * s ) = 0;</div>
+<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> xbInt16 WriteHeader( xbInt16 iPositionOption, xbInt16 iWriteOption );</div>
+<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> </div>
+<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#afcd99924606be0a9e1e25180bcd1abf8"> 405</a></span> </div>
+<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#ab506450954bc86e7bf1d7c4efe681f43"> 406</a></span> xbUInt32 ulCurRec; <span class="comment">// Current record or zero</span></div>
+<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> xbInt16 iAutoCommit; <span class="comment">// Auto commit updates if not explicitly performed before moving off record?</span></div>
+<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> <span class="comment">// -1 --&gt; Use DBMS default</span></div>
+<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> <span class="comment">// 0 --&gt; No auto update on this table, regardless of DBMS setting</span></div>
+<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> <span class="comment">// 1 --&gt; Auto update on this table, regardless of DBMS setting</span></div>
+<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a15f495446f0d75bcf2fa89e3b699d388"> 411</a></span> </div>
+<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> xbInt16 iFileVersion; <span class="comment">// xBase file version - which class is in play</span></div>
+<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> </div>
+<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a73f9c792d0a769e2e604c1855245a276"> 414</a></span> </div>
+<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a5056757614c39f725cc775332494966a"> 415</a></span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> sAlias; <span class="comment">// table alias</span></div>
+<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a6d8e193da3ca414eef1e8866ec5ca81b"> 416</a></span> xbInt16 iNoOfFields;</div>
+<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> xbInt16 iDbfStatus; <span class="comment">// 0 = closed</span></div>
+<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> <span class="comment">// 1 = open</span></div>
+<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> <span class="comment">// 2 = updates pending</span></div>
+<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#ad8c8b5eb12063bb898da1b2cc02cfce7"> 420</a></span> </div>
+<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a8a9b3bce0b741e73473d3ebbd6e6f1cd"> 421</a></span> xbSchemaRec *SchemaPtr; <span class="comment">// Pointer to field data</span></div>
+<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a353ebfc8a2960ef827f429ec74025606"> 422</a></span> <span class="keywordtype">char</span> *RecBuf; <span class="comment">// Pointer to record buffer</span></div>
+<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> <span class="keywordtype">char</span> *RecBuf2; <span class="comment">// Pointer to original rec buf</span></div>
+<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> </div>
+<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> </div>
+<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a3a262abf658e5fa968b57ef457a69470"> 426</a></span><span class="comment">/* Next several variables are database header fields, up through dbase V */</span></div>
+<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a4fcd6a86ddd32d4a9d76a4074573440a"> 427</a></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cVersion;</div>
+<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a9340a5e8ee53eb0f3b6601eec2d71e1b"> 428</a></span> <span class="keywordtype">char</span> cUpdateYY;</div>
+<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a6021789d314cd41488991e708fcd0df2"> 429</a></span> <span class="keywordtype">char</span> cUpdateMM;</div>
+<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#acb594ab61dd35b17bdf28394083f8e87"> 430</a></span> <span class="keywordtype">char</span> cUpdateDD;</div>
+<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a62f5fa9149ae0f6dc75642823de66918"> 431</a></span> xbUInt32 ulNoOfRecs;</div>
+<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a1760e222567e2c849f9c799b9d896e91"> 432</a></span> xbUInt16 uiHeaderLen;</div>
+<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#ac3c89fc3bc6a6abf385478a8adbed970"> 433</a></span> xbUInt16 uiRecordLen;</div>
+<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#a8734e799707582f022fc341d515650f4"> 434</a></span> <span class="keywordtype">char</span> cTransactionFlag;</div>
+<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#ad59074633641e03647e54d2b66c9102b"> 435</a></span> <span class="keywordtype">char</span> cEncryptionFlag;</div>
+<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"><a class="line" href="classxb_1_1xbDbf.html#aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1"> 436</a></span> <span class="keywordtype">char</span> cIndexFlag;</div>
+<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> <span class="keywordtype">char</span> cLangDriver; <span class="comment">// dbase 7 sets to 1B</span></div>
+<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> </div>
+<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> </div>
+<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> </div>
+<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span> <span class="keywordtype">void</span> ResetNoOfRecords(); </div>
+<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> </div>
+<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span> </div>
+<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span><span class="preprocessor">#ifdef XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> xbInt16 iAutoLock; <span class="comment">// 0 - autolock off, 1 - autolock on</span></div>
+<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> xbInt16 iLockFlavor;</div>
+<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bTableLocked; <span class="comment">// is the table locked</span></div>
+<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bHeaderLocked; <span class="comment">// is the header locked</span></div>
+<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> xbUInt32 ulAppendLocked; <span class="comment">// record number of the new record for the append lock operation</span></div>
+<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> xbLinkListOrd&lt;xbUInt32&gt; lloRecLocks; <span class="comment">// ordered link list of locked records</span></div>
+<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> </div>
+<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> </div>
+<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span><span class="preprocessor">#ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> xbIxList *ixList; <span class="comment">// pointer to a list of indices associated with the table</span></div>
+<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span><span class="comment">// #ifdef XB_MDX_SUPPORT</span></div>
+<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span><span class="comment">// xbIx *ixMdx; // pointer to production multi-tag index file</span></div>
+<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span><span class="comment">// #endif</span></div>
+<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> xbIx *pCurIx; <span class="comment">// Pointer to current index class</span></div>
+<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> <span class="keywordtype">void</span> *vpCurIxTag; <span class="comment">// Pointer to current tag</span></div>
+<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> sCurIxType; <span class="comment">// Current index type</span></div>
+<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> xbLinkList&lt;xbTag *&gt; llTags; <span class="comment">// linked list of open tags</span></div>
+<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> </div>
+<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span><span class="preprocessor">#endif </span><span class="comment">// XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> </div>
+<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span><span class="preprocessor">#ifdef XB_NDXINF_SUPPORT</span></div>
+<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span> xbLinkList&lt;xbString&gt; llNdxInfData; <span class="comment">// linked list of strings containing ndx file entries</span></div>
+<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span><span class="preprocessor">#endif </span><span class="comment">// XB_NDXINF_SUPPORT</span></div>
+<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> </div>
+<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> </div>
+<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span>};</div>
+<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> </div>
+<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span> </div>
+<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span><span class="preprocessor">#ifdef XB_DBF3_SUPPORT</span></div>
+<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> </div>
+<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span><span class="keyword">class </span>XBDLLEXPORT xbDbf3 : <span class="keyword">public</span> <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> {</div>
+<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> xbDbf3(<a class="code hl_class" href="classxb_1_1xbXBase.html">xbXBase</a> *x);</div>
+<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> ~xbDbf3();</div>
+<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> <span class="keyword">virtual</span> xbInt16 CreateTable ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias, <a class="code hl_struct" href="structxb_1_1xbSchema.html">xbSchema</a> *, xbInt16 iOverlay, xbInt16 iShareMode );</div>
+<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> <span class="keyword">virtual</span> xbInt16 GetVersion () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> <span class="keyword">virtual</span> xbInt16 Open ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias, xbInt16 iOpenMode, xbInt16 iShareMode );</div>
+<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> </div>
+<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span><span class="preprocessor"> #ifdef XB_MEMO_SUPPORT</span></div>
+<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> <span class="keyword">virtual</span> xbInt16 SetCreateMemoBlockSize( xbUInt32 iBlockSize );</div>
+<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> </div>
+<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> xbInt16 SetVersion ();</div>
+<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> <span class="keyword">virtual</span> xbInt16 ValidateSchema( <a class="code hl_struct" href="structxb_1_1xbSchema.html">xbSchema</a> *s );</div>
+<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> </div>
+<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> </div>
+<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span>};</div>
+<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span><span class="preprocessor">#endif </span><span class="comment">/* XB_DBF3_SUPPORT */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> </div>
+<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> </div>
+<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span><span class="preprocessor">#ifdef XB_DBF4_SUPPORT</span></div>
+<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> </div>
+<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span><span class="keyword">class </span>XBDLLEXPORT xbDbf4 : <span class="keyword">public</span> <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> {</div>
+<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> xbDbf4( <a class="code hl_variable" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a> *x );</div>
+<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> </div>
+<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> ~xbDbf4();</div>
+<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> </div>
+<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> <span class="keyword">virtual</span> xbInt16 CreateTable ( <span class="keyword">const</span> xbString &amp;sTableName, <span class="keyword">const</span> xbString &amp;sAlias, xbSchema *, xbInt16 iOverlay, xbInt16 iShareMode );</div>
+<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> <span class="keyword">virtual</span> xbInt16 GetVersion () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> <span class="keyword">virtual</span> xbInt16 Open ( <span class="keyword">const</span> xbString &amp;sTableName, <span class="keyword">const</span> xbString &amp;sAlias, xbInt16 iOpenMode, xbInt16 iShareMode );</div>
+<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> </div>
+<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span><span class="preprocessor"> #ifdef XB_MEMO_SUPPORT</span></div>
+<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> <span class="keyword">virtual</span> xbInt16 SetCreateMemoBlockSize( xbUInt32 iBlockSize );</div>
+<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> </div>
+<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> <span class="comment">// void InitVars ();</span></div>
+<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> xbInt16 SetVersion();</div>
+<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> <span class="keyword">virtual</span> xbInt16 ValidateSchema ( xbSchema *s );</div>
+<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span> </div>
+<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> </div>
+<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span>};</div>
+<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> </div>
+<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span><span class="preprocessor">#endif </span><span class="comment">/* XB_DBF4_SUPPORT */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span> </div>
+<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span>} <span class="comment">/* namespace xb */</span></div>
+<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_DBF_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="aclassxb_1_1xbDate_html"><div class="ttname"><a href="classxb_1_1xbDate.html">xb::xbDate</a></div><div class="ttdoc">xbDate class.</div><div class="ttdef"><b>Definition:</b> xbdate.h:62</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html"><div class="ttname"><a href="classxb_1_1xbDbf.html">xb::xbDbf</a></div><div class="ttdoc">Base class for handling dbf files/tables.</div><div class="ttdef"><b>Definition:</b> xbdbf.h:150</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html_a13393704a8a191d4d6555ae31d3c3e92"><div class="ttname"><a href="classxb_1_1xbDbf.html#a13393704a8a191d4d6555ae31d3c3e92">xb::xbDbf::GetPhysicalIxCnt</a></div><div class="ttdeci">virtual xbInt32 GetPhysicalIxCnt() const</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html_a3a6a068addffd06fc9a996639d6ca69e"><div class="ttname"><a href="classxb_1_1xbDbf.html#a3a6a068addffd06fc9a996639d6ca69e">xb::xbDbf::DumpRecord</a></div><div class="ttdeci">virtual xbInt16 DumpRecord(xbUInt32 ulRecNo, xbInt16 iOutputDest=0, xbInt16 iOutputFmt=0)</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html_a49212a9eb17f7fa9f303e08d5fc50fc6"><div class="ttname"><a href="classxb_1_1xbDbf.html#a49212a9eb17f7fa9f303e08d5fc50fc6">xb::xbDbf::GetVersion</a></div><div class="ttdeci">virtual xbInt16 GetVersion() const =0</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html_a4d018cbf44d8d8b2145c9acab02c8adf"><div class="ttname"><a href="classxb_1_1xbDbf.html#a4d018cbf44d8d8b2145c9acab02c8adf">xb::xbDbf::Open</a></div><div class="ttdeci">virtual xbInt16 Open(const xbString &amp;sTableName, const xbString &amp;sAlias, xbInt16 iOpenMode, xbInt16 iShareMode)=0</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html_a73e41bfe679dd06ab16c436652df93f1"><div class="ttname"><a href="classxb_1_1xbDbf.html#a73e41bfe679dd06ab16c436652df93f1">xb::xbDbf::CreateTable</a></div><div class="ttdeci">virtual xbInt16 CreateTable(const xbString &amp;sTableName, const xbString &amp;sAlias, xbSchema *pSchema, xbInt16 iOverlay, xbInt16 iShareMode)=0</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html_a97366c7362e409d7f09973a6aef8dad0"><div class="ttname"><a href="classxb_1_1xbDbf.html#a97366c7362e409d7f09973a6aef8dad0">xb::xbDbf::Open</a></div><div class="ttdeci">virtual xbInt16 Open(const xbString &amp;sTableName)</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html_ab1f4a515533402f872cedcd0322aabd4"><div class="ttname"><a href="classxb_1_1xbDbf.html#ab1f4a515533402f872cedcd0322aabd4">xb::xbDbf::DumpHeader</a></div><div class="ttdeci">virtual xbInt16 DumpHeader(xbInt16 iOption) const</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html_ac658818bf9b8f8ff7467d8d80495b324"><div class="ttname"><a href="classxb_1_1xbDbf.html#ac658818bf9b8f8ff7467d8d80495b324">xb::xbDbf::Open</a></div><div class="ttdeci">virtual xbInt16 Open(const xbString &amp;sTableName, const xbString &amp;sAlias)</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html_ac856fc1b110b46aefa1b2f5c0f530aa2"><div class="ttname"><a href="classxb_1_1xbDbf.html#ac856fc1b110b46aefa1b2f5c0f530aa2">xb::xbDbf::MemoFieldsExist</a></div><div class="ttdeci">virtual xbBool MemoFieldsExist() const</div></div>
+<div class="ttc" id="aclassxb_1_1xbFile_html"><div class="ttname"><a href="classxb_1_1xbFile.html">xb::xbFile</a></div><div class="ttdoc">Class for handling low level file I/O.</div><div class="ttdef"><b>Definition:</b> xbfile.h:56</div></div>
+<div class="ttc" id="aclassxb_1_1xbString_html"><div class="ttname"><a href="classxb_1_1xbString.html">xb::xbString</a></div><div class="ttdoc">Class for handling string data.</div><div class="ttdef"><b>Definition:</b> xbstring.h:50</div></div>
+<div class="ttc" id="aclassxb_1_1xbXBase_html"><div class="ttname"><a href="classxb_1_1xbXBase.html">xb::xbXBase</a></div><div class="ttdoc">xbXbase class.</div><div class="ttdef"><b>Definition:</b> xbxbase.h:123</div></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a25f47b226ce924a5c78f97989b0744a2"><div class="ttname"><a href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></div><div class="ttdeci">double xbDouble</div><div class="ttdef"><b>Definition:</b> xbtypes.h:23</div></div>
+<div class="ttc" id="anamespacexb_html_a83aa6a550398db55973aa9fb4257e66e"><div class="ttname"><a href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xb::xbFloat</a></div><div class="ttdeci">float xbFloat</div><div class="ttdef"><b>Definition:</b> xbtypes.h:22</div></div>
+<div class="ttc" id="anamespacexb_html_a97858ddeb1c4b0100f3edc1a46d3a8b0"><div class="ttname"><a href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xb::xbXBase</a></div><div class="ttdeci">class XBDLLEXPORT xbXBase</div><div class="ttdef"><b>Definition:</b> xbssv.h:27</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+<div class="ttc" id="anamespacexb_html_ab2eae4b4732466698a7fdd89d77ba53b"><div class="ttname"><a href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xb::xbDbf</a></div><div class="ttdeci">class XBDLLEXPORT xbDbf</div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:28</div></div>
+<div class="ttc" id="astructxb_1_1xbSchema_html"><div class="ttname"><a href="structxb_1_1xbSchema.html">xb::xbSchema</a></div><div class="ttdoc">Schema used for defining tables with CreateTable methods.</div><div class="ttdef"><b>Definition:</b> xbdbf.h:95</div></div>
+<div class="ttc" id="astructxb_1_1xbSchema_html_a1d612b2ed5dc0b0289c9e91b3cda3a25"><div class="ttname"><a href="structxb_1_1xbSchema.html#a1d612b2ed5dc0b0289c9e91b3cda3a25">xb::xbSchema::cType</a></div><div class="ttdeci">char cType</div><div class="ttdef"><b>Definition:</b> xbdbf.h:97</div></div>
+<div class="ttc" id="astructxb_1_1xbSchema_html_a2da554af25ef628acf59bb52996056ac"><div class="ttname"><a href="structxb_1_1xbSchema.html#a2da554af25ef628acf59bb52996056ac">xb::xbSchema::iFieldLen</a></div><div class="ttdeci">xbInt16 iFieldLen</div><div class="ttdef"><b>Definition:</b> xbdbf.h:98</div></div>
+<div class="ttc" id="astructxb_1_1xbSchema_html_a55bab3bb69dee3508d168c93e182d4b9"><div class="ttname"><a href="structxb_1_1xbSchema.html#a55bab3bb69dee3508d168c93e182d4b9">xb::xbSchema::iNoOfDecs</a></div><div class="ttdeci">xbInt16 iNoOfDecs</div><div class="ttdef"><b>Definition:</b> xbdbf.h:99</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbdrpix_8cpp.html b/docs/doxygen/html/xbdrpix_8cpp.html
new file mode 100644
index 0000000..b2f3fe8
--- /dev/null
+++ b/docs/doxygen/html/xbdrpix_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbdrpix.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_25b94c3afce00ed38231227d8141f932.html">sql</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbdrpix.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbdrptbl_8cpp.html b/docs/doxygen/html/xbdrptbl_8cpp.html
new file mode 100644
index 0000000..f1b3b96
--- /dev/null
+++ b/docs/doxygen/html/xbdrptbl_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbdrptbl.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_25b94c3afce00ed38231227d8141f932.html">sql</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbdrptbl.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbexp_8cpp.html b/docs/doxygen/html/xbexp_8cpp.html
new file mode 100644
index 0000000..86b99b7
--- /dev/null
+++ b/docs/doxygen/html/xbexp_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbexp.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbexp.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbexp_8h.html b/docs/doxygen/html/xbexp_8h.html
new file mode 100644
index 0000000..ce878fe
--- /dev/null
+++ b/docs/doxygen/html/xbexp_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexp.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbexp.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbexp_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbexp_8h_source.html b/docs/doxygen/html/xbexp_8h_source.html
new file mode 100644
index 0000000..7077bb6
--- /dev/null
+++ b/docs/doxygen/html/xbexp_8h_source.html
@@ -0,0 +1,242 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexp.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbexp.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbexp_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbexp.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_EXP_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_EXP_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="comment">// #ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="comment">// #pragma interface</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="comment">// #endif</span></div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#ifdef XB_FUNCTION_SUPPORT</span></div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="preprocessor">#define XB_EXP_CHAR &#39;C&#39;</span></div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="preprocessor">#define XB_EXP_DATE &#39;D&#39;</span></div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="preprocessor">#define XB_EXP_LOGICAL &#39;L&#39;</span></div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="preprocessor">#define XB_EXP_NUMERIC &#39;N&#39;</span></div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#define XB_EXP_UNKNOWN &#39;U&#39;</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="preprocessor">#ifdef XB_EXPRESSION_SUPPORT</span></div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> </div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="preprocessor">#define XB_EXP_CONSTANT &#39;C&#39;</span></div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#define XB_EXP_FUNCTION &#39;F&#39;</span></div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="preprocessor">#define XB_EXP_FIELD &#39;D&#39;</span></div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="preprocessor">#define XB_EXP_OPERATOR &#39;O&#39;</span></div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="preprocessor">#define XB_EXP_NOTROOT &#39;N&#39; </span><span class="comment">// not root node, needs further parsing</span></div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="preprocessor">#define XB_EXP_PRE_OPERATOR &#39;B&#39; </span><span class="comment">// (B)efore) pre increment, pre decrement</span></div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="preprocessor">#define XB_EXP_POST_OPERATOR &#39;A&#39; </span><span class="comment">// (A)fter) post increment, pre decrement</span></div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="preprocessor">#define XB_END_OF_EXPRESSION -100</span></div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> </div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="comment">// #define XB_UNBALANCED_PARENS -101</span></div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="comment">// #define XB_UNBALANCED_QUOTES -102</span></div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> </div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> </div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> </div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="keyword">struct </span>XBDLLEXPORT xbExpToken {</div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> xbString sExpression; <span class="comment">// in - expression to pull next token from</span></div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="comment">// out - remainder of the expression after token removed</span></div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> xbString sToken; <span class="comment">// next token pulled from the expression</span></div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="keywordtype">char</span> cNodeType; <span class="comment">// one of XB_EXP_CONSTANT, XB_EXP_FUNCTION, XB_EXP_FIELD, XB_EXP_OPERATOR, XB_EXP_NOTROOT</span></div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="keywordtype">char</span> cReturnType; <span class="comment">// one of XB_EXP_CHAR, XB_EXP_DATE, XB_EXP_LOGICAL, XB_EXP_NUMERIC, XB_EXP_UNKNOWN</span></div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> xbInt16 iSts; <span class="comment">// return status after retrieving or attempting next token from expression</span></div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="comment">// 0 = no error</span></div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="comment">// XB_END_OF_EXPRESSION</span></div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="comment">// XB_UNBALANCED_PARENS</span></div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> <span class="comment">// XB_UNBALANCED_QUOTES</span></div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keywordtype">char</span> cPrevNodeType; <span class="comment">// previous node type</span></div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="keywordtype">char</span> cPrevReturnType; <span class="comment">// previous return type</span></div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="comment">// constructor</span></div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> xbExpToken() { cNodeType = 0; cReturnType = 0; iSts = 0; cPrevNodeType = 0; cPrevReturnType = 0; }</div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span>};</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> </div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span><span class="comment">/************************************************************************/</span></div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> </div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> </div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span><span class="keyword">class </span>XBDLLEXPORT xbExp{</div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> </div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> xbExp( <a class="code hl_variable" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a> * );</div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> xbExp( <a class="code hl_variable" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a> *, <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> * );</div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="keyword">virtual</span> ~xbExp();</div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keywordtype">void</span> ClearTreeHandle();</div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> </div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> </div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordtype">void</span> DumpTree( xbInt16 iOption );</div>
+<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keywordtype">void</span> DumpToken( xbExpToken &amp;t, xbInt16 iOption = 0 );</div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> </div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> xbInt16 GetResultLen() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="keywordtype">char</span> GetReturnType() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> xbInt16 GetBoolResult( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bResult );</div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> xbInt16 GetDateResult( xbDate &amp;dtResult );</div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> xbInt16 GetNumericResult( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dResult );</div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> xbInt16 GetStringResult( xbString &amp;sResult );</div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> xbInt16 GetStringResult( <span class="keywordtype">char</span> * vpResult, xbUInt32 ulLen );</div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> xbExpNode *GetTreeHandle();</div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> xbInt16 ParseExpression( <span class="keyword">const</span> xbString &amp;sExpression );</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> xbInt16 ParseExpression( <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf, <span class="keyword">const</span> xbString &amp;sExpression );</div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> xbInt16 ProcessExpression();</div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> xbInt16 ProcessExpression( xbInt16 iRecBufSw );</div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> </div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> </div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> xbInt16 GetNextToken( xbExpToken &amp;t );</div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> xbInt16 OperatorWeight( <span class="keyword">const</span> xbString &amp;sOperator );</div>
+<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> xbExpNode *GetNextNode( xbExpNode * n ) <span class="keyword">const</span>; <span class="comment">// traverses the tree from bottom left node, right, then up</span></div>
+<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> </div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> <span class="keyword">private</span>: <span class="comment">// methods</span></div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> </div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="comment">// xbInt16 CalcExpressionResultLen();</span></div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> xbInt16 CalcFunctionResultLen( xbExpNode *n ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> xbInt16 CalcCharNodeLen( xbExpNode *n );</div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> xbInt16 CheckParensAndQuotes( <span class="keyword">const</span> xbString &amp;sExpression );</div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> xbInt16 GetExpressionResultLen() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> </div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> xbInt16 GetTokenCharConstant ( xbExpToken &amp;t );</div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> xbInt16 GetTokenDatabaseField ( xbExpToken &amp;t );</div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> xbInt16 GetTokenDateConstant ( xbExpToken &amp;t );</div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> xbInt16 GetTokenFunction ( xbExpToken &amp;t );</div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> xbInt16 GetTokenLogicalConstant( xbExpToken &amp;t );</div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> xbInt16 GetTokenNumericConstant( xbExpToken &amp;t );</div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> xbInt16 GetTokenOperator ( xbExpToken &amp;t );</div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> xbInt16 GetTokenParen ( xbExpToken &amp;t );</div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> </div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsFunction ( <span class="keyword">const</span> xbString &amp;sExp, <span class="keywordtype">char</span> &amp;cReturnType );</div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsLogicalConstant ( <span class="keyword">const</span> xbString &amp;sExp );</div>
+<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsNumericConstant ( <span class="keyword">const</span> xbString &amp;sExp, <span class="keywordtype">char</span> cPrevNodeType );</div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsOperator ( <span class="keyword">const</span> xbString &amp;sExp );</div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> <span class="keywordtype">char</span> IsTokenSeparator ( <span class="keywordtype">char</span> c );</div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsWhiteSpace ( <span class="keywordtype">char</span> c );</div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> </div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> xbInt16 ParseExpression ( <span class="keyword">const</span> xbString &amp;sExpression, xbInt16 iWeight );</div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> xbInt16 ParseExpressionConstant( xbExpToken &amp;t, xbExpNode *n );</div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> xbInt16 ParseExpressionFunction( xbExpToken &amp;t, xbExpNode *n, xbInt16 iWeight );</div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> xbInt16 ParseExpressionFunctionParms( <span class="keyword">const</span> xbString &amp;sParms, xbLinkList&lt;xbString&gt; &amp;llParms );</div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> xbInt16 ParseExpressionField ( xbExpToken &amp;t, xbExpNode *n );</div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> xbInt16 ParseExpressionOperator( xbExpToken &amp;t, xbExpNode *n, xbInt16 iWeight );</div>
+<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> </div>
+<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> xbInt16 ProcessExpressionFunction( xbExpNode *n, xbInt16 iRecBufSw = 0 );</div>
+<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> xbInt16 ProcessExpressionOperator( xbExpNode *n );</div>
+<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> </div>
+<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keyword">private</span>: <span class="comment">// fields</span></div>
+<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <a class="code hl_variable" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a> *xbase;</div>
+<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf;</div>
+<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> xbExpNode *nTree; <span class="comment">// pointer to tree of expNodes</span></div>
+<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="comment">// xbInt16 iExpLen; // size of expression result</span></div>
+<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> </div>
+<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> </div>
+<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span>};</div>
+<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> </div>
+<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span><span class="comment">/* Expression handler */</span></div>
+<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> </div>
+<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> </div>
+<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span>};</div>
+<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span><span class="preprocessor">#endif </span><span class="comment">// XB_EXPRESSION_SUPPORT</span></div>
+<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span><span class="preprocessor">#endif </span><span class="comment">// __XB_EXP_H__</span></div>
+<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> </div>
+<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> </div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a25f47b226ce924a5c78f97989b0744a2"><div class="ttname"><a href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></div><div class="ttdeci">double xbDouble</div><div class="ttdef"><b>Definition:</b> xbtypes.h:23</div></div>
+<div class="ttc" id="anamespacexb_html_a97858ddeb1c4b0100f3edc1a46d3a8b0"><div class="ttname"><a href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xb::xbXBase</a></div><div class="ttdeci">class XBDLLEXPORT xbXBase</div><div class="ttdef"><b>Definition:</b> xbssv.h:27</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+<div class="ttc" id="anamespacexb_html_ab2eae4b4732466698a7fdd89d77ba53b"><div class="ttname"><a href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xb::xbDbf</a></div><div class="ttdeci">class XBDLLEXPORT xbDbf</div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:28</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbexpnode_8cpp.html b/docs/doxygen/html/xbexpnode_8cpp.html
new file mode 100644
index 0000000..a33b6b4
--- /dev/null
+++ b/docs/doxygen/html/xbexpnode_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbexpnode.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbexpnode.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbexpnode_8h.html b/docs/doxygen/html/xbexpnode_8h.html
new file mode 100644
index 0000000..0b575e3
--- /dev/null
+++ b/docs/doxygen/html/xbexpnode_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexpnode.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbexpnode.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbexpnode_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbexpnode_8h_source.html b/docs/doxygen/html/xbexpnode_8h_source.html
new file mode 100644
index 0000000..cd5128b
--- /dev/null
+++ b/docs/doxygen/html/xbexpnode_8h_source.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbexpnode.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbexpnode.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbexpnode_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbexpnode.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_EXPNODE_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_EXPNODE_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="comment">// #ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="comment">// #pragma interface</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="comment">// #endif</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#ifdef XB_EXPRESSION_SUPPORT</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="comment">//class XBDLLEXPORT xbDbf;</span></div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="comment">/************************************************************************/</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> </div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="keyword">class </span>XBDLLEXPORT xbExpNode {</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> xbExpNode();</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> xbExpNode( xbString &amp;sNodeText, <span class="keywordtype">char</span> cReturnType, <span class="keywordtype">char</span> cNodeType );</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> xbExpNode( xbString &amp;sNodeText, <span class="keywordtype">char</span> cNodeType );</div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> xbExpNode( <span class="keywordtype">char</span> cNodeType );</div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> </div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keyword">virtual</span> ~xbExpNode();</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> xbInt16 AddChild( xbExpNode *n );</div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> xbExpNode *GetChild( xbUInt32 ulChildNo ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> xbUInt32 GetChildCnt() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> xbUInt32 GetChildNo() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *GetDbf() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> xbInt16 GetFieldNo() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> xbExpNode *GetFirstNode();</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> xbExpNode *GetNextNode() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keywordtype">void</span> GetNodeText( xbString &amp;sNodeText ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="keywordtype">char</span> GetNodeType() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> xbExpNode *GetParent() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> xbString &amp;GetStringResult();</div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetBoolResult() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> GetNumericResult() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> xbUInt32 GetResultLen() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> xbExpNode *GetRightSibling() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keywordtype">char</span> GetReturnType() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> xbInt16 GetWeight() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> HasRightSibling() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsOperator() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsUnaryOperator() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keywordtype">void</span> RemoveLastChild();</div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keywordtype">void</span> SetResultLen( xbUInt32 ulResultLen );</div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordtype">void</span> SetDbfInfo( <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf );</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordtype">void</span> SetDbfInfo( <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf, xbInt16 iFieldNo );</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordtype">void</span> SetNodeText( xbString &amp;sNodeText );</div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="keywordtype">void</span> SetNodeType( <span class="keywordtype">char</span> cNodeType );</div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keywordtype">void</span> SetParent( xbExpNode *n );</div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <span class="keywordtype">void</span> SetResult( xbString &amp;sResult );</div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keywordtype">void</span> SetResult( xbDate &amp;dtResult );</div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <span class="keywordtype">void</span> SetResult( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bResult );</div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keywordtype">void</span> SetResult( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dResult );</div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <span class="keywordtype">void</span> SetReturnType( <span class="keywordtype">char</span> cReturnType );</div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <span class="keywordtype">void</span> SetWeight( xbInt16 iWeight );</div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> </div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="keywordtype">void</span> DumpNode( xbInt16 iOption ) <span class="keyword">const</span>; <span class="comment">// 0 = no children, 1 = and children</span></div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> </div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> xbString sNodeText; <span class="comment">// expression text</span></div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keywordtype">char</span> cReturnType; <span class="comment">// one of: XB_EXP_CHAR, XB_EXP_DATE, XB_EXP_LOGICAL, XB_EXP_NUMERIC</span></div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="keywordtype">char</span> cNodeType; <span class="comment">// one of: XB_EXP_CONSTANT, XB_EXP_FUNCTION, XB_EXP_FIELD, XB_EXP_OPERATOR</span></div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> xbString sResult; <span class="comment">// char result, and operator</span></div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dResult; <span class="comment">// numeric and bool results</span></div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> xbExpNode * nParent; <span class="comment">// pointer to parent</span></div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> xbLinkList&lt;xbExpNode *&gt; llChildren; <span class="comment">// linked list of descendent nodes</span></div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf; <span class="comment">// pointer to dbf, used for field, RECNO() and RECCOUNT()</span></div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> xbInt16 iFieldNo; <span class="comment">// field no if DBF field</span></div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> xbUInt32 ulResultLen; <span class="comment">// for string results, accumulated length of character operations</span></div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="comment">// includes the sum of all nodes under this + this</span></div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="comment">// date = 8, numeric = 4, logical = 1</span></div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> xbInt16 iWeight; <span class="comment">// used for buildign the tree of nodes, assigned to operators</span></div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <span class="comment">// the higher the number, the lower it goes on the tree</span></div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> </div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span>};</div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> </div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="comment">/************************************************************************/</span></div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> </div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span><span class="comment">/* Expression handler */</span></div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> </div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> </div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span>};</div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span><span class="preprocessor">#endif </span><span class="comment">// XB_EXPRESSION_SUPPORT</span></div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span><span class="preprocessor">#endif </span><span class="comment">// __XB_EXP_H__</span></div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> </div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a25f47b226ce924a5c78f97989b0744a2"><div class="ttname"><a href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></div><div class="ttdeci">double xbDouble</div><div class="ttdef"><b>Definition:</b> xbtypes.h:23</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+<div class="ttc" id="anamespacexb_html_ab2eae4b4732466698a7fdd89d77ba53b"><div class="ttname"><a href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xb::xbDbf</a></div><div class="ttdeci">class XBDLLEXPORT xbDbf</div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:28</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbfields_8cpp.html b/docs/doxygen/html/xbfields_8cpp.html
new file mode 100644
index 0000000..83108a8
--- /dev/null
+++ b/docs/doxygen/html/xbfields_8cpp.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfields.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle"><div class="title">xbfields.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbfile_8cpp.html b/docs/doxygen/html/xbfile_8cpp.html
new file mode 100644
index 0000000..b3e9d8e
--- /dev/null
+++ b/docs/doxygen/html/xbfile_8cpp.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfile.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle"><div class="title">xbfile.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbfile_8h.html b/docs/doxygen/html/xbfile_8h.html
new file mode 100644
index 0000000..4a12804
--- /dev/null
+++ b/docs/doxygen/html/xbfile_8h.html
@@ -0,0 +1,181 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfile.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#define-members">Macros</a> </div>
+ <div class="headertitle"><div class="title">xbfile.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbfile_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbFile.html">xb::xbFile</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class for handling low level file I/O. <a href="classxb_1_1xbFile.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ae58c73e0ba237fcf67ee20feea6c2743"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfile_8h.html#ae58c73e0ba237fcf67ee20feea6c2743">XB_READ</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ae58c73e0ba237fcf67ee20feea6c2743"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af991a288c327f6857e90156ea734a633"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfile_8h.html#af991a288c327f6857e90156ea734a633">XB_READ_WRITE</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:af991a288c327f6857e90156ea734a633"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abbf99e259c2f31572c886da6d85b1359"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfile_8h.html#abbf99e259c2f31572c886da6d85b1359">XB_WRITE</a>&#160;&#160;&#160;2</td></tr>
+<tr class="separator:abbf99e259c2f31572c886da6d85b1359"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ec4d60a008c667d9861e3b3814f0232"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfile_8h.html#a9ec4d60a008c667d9861e3b3814f0232">XB_SINGLE_USER</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:a9ec4d60a008c667d9861e3b3814f0232"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05c0fc99ba71cf953d046d12f3f874bc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbfile_8h.html#a05c0fc99ba71cf953d046d12f3f874bc">XB_MULTI_USER</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:a05c0fc99ba71cf953d046d12f3f874bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="a05c0fc99ba71cf953d046d12f3f874bc" name="a05c0fc99ba71cf953d046d12f3f874bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a05c0fc99ba71cf953d046d12f3f874bc">&#9670;&nbsp;</a></span>XB_MULTI_USER</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_MULTI_USER&#160;&#160;&#160;1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae58c73e0ba237fcf67ee20feea6c2743" name="ae58c73e0ba237fcf67ee20feea6c2743"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae58c73e0ba237fcf67ee20feea6c2743">&#9670;&nbsp;</a></span>XB_READ</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_READ&#160;&#160;&#160;0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="af991a288c327f6857e90156ea734a633" name="af991a288c327f6857e90156ea734a633"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af991a288c327f6857e90156ea734a633">&#9670;&nbsp;</a></span>XB_READ_WRITE</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_READ_WRITE&#160;&#160;&#160;1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9ec4d60a008c667d9861e3b3814f0232" name="a9ec4d60a008c667d9861e3b3814f0232"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9ec4d60a008c667d9861e3b3814f0232">&#9670;&nbsp;</a></span>XB_SINGLE_USER</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_SINGLE_USER&#160;&#160;&#160;0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="abbf99e259c2f31572c886da6d85b1359" name="abbf99e259c2f31572c886da6d85b1359"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#abbf99e259c2f31572c886da6d85b1359">&#9670;&nbsp;</a></span>XB_WRITE</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_WRITE&#160;&#160;&#160;2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbfile_8h_source.html b/docs/doxygen/html/xbfile_8h_source.html
new file mode 100644
index 0000000..a111150
--- /dev/null
+++ b/docs/doxygen/html/xbfile_8h_source.html
@@ -0,0 +1,262 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfile.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbfile.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbfile_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbfile.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#ifndef __XB_FILE_H__</span></div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#define __XB_FILE_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#pragma interface</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> </div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="comment">/*****************************/</span></div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="comment">/* File Open Modes */</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"><a class="line" href="xbfile_8h.html#ae58c73e0ba237fcf67ee20feea6c2743"> 25</a></span><span class="preprocessor">#define XB_READ 0</span></div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"><a class="line" href="xbfile_8h.html#af991a288c327f6857e90156ea734a633"> 26</a></span><span class="preprocessor">#define XB_READ_WRITE 1</span></div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"><a class="line" href="xbfile_8h.html#abbf99e259c2f31572c886da6d85b1359"> 27</a></span><span class="preprocessor">#define XB_WRITE 2</span></div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="comment">/*****************************/</span></div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="comment">/* File Access Modes */</span></div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"><a class="line" href="xbfile_8h.html#a9ec4d60a008c667d9861e3b3814f0232"> 31</a></span><span class="preprocessor">#define XB_SINGLE_USER 0 </span><span class="comment">// file buffering on</span></div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"><a class="line" href="xbfile_8h.html#a05c0fc99ba71cf953d046d12f3f874bc"> 32</a></span><span class="preprocessor">#define XB_MULTI_USER 1 </span><span class="comment">// file buffering off</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> </div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"><a class="line" href="classxb_1_1xbFile.html"> 56</a></span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_class" href="classxb_1_1xbFile.html">xbFile</a> : <span class="keyword">public</span> <a class="code hl_class" href="classxb_1_1xbSsv.html">xbSsv</a> {</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> </div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="comment">// xbFile();</span></div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <a class="code hl_class" href="classxb_1_1xbFile.html">xbFile</a>( <a class="code hl_class" href="classxb_1_1xbXBase.html">xbXBase</a> * x );</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <a class="code hl_class" href="classxb_1_1xbFile.html">~xbFile</a>();</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> xbInt16 CreateUniqueFileName( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sDirIn, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sExtIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFqnOut );</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> xbInt16 CreateUniqueFileName( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sDirIn, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sExtIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFqnOut, xbInt16 iOption );</div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; GetDirectory() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; GetFileName() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; GetFqFileName() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> </div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keywordtype">void</span> SetDirectory ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sDirectory);</div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keywordtype">void</span> SetFileName ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName );</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <span class="keywordtype">void</span> SetFqFileName( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFqName );</div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> xbUInt32 GetBlockSize () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> xbInt16 SetBlockSize ( xbUInt32 ulBlockSize );</div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> xbInt16 GetOpenMode () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> xbInt16 GetShareMode () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> </div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> xbInt16 GetFileDirPart ( <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileDirPartOut ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> xbInt16 GetFileDirPart ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sCompleteFileNameIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileDirPartOut ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> xbInt16 GetFileExtPart ( <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileExtPartOut ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> xbInt16 GetFileExtPart ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sCompleteFileNameIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileExtPartOut ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> xbInt16 GetFileNamePart( <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileNamePartOut ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> xbInt16 GetFileNamePart( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sCompleteFileNameIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileNamePartOut ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> xbInt16 GetFileType ( <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileType ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> xbInt16 GetXbaseFileTypeByte( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 &amp;iVersion );</div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> xbInt16 GetXbaseFileTypeByte( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> &amp;cFileTypeByte );</div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> xbInt16 GetXbaseFileTypeByte( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> &amp;cFileTypeByte, xbInt16 &amp;iVersion );</div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> xbInt16 DetermineXbaseTableVersion( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cFileTypeByte ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> xbInt16 DetermineXbaseMemoVersion( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cFileTypeByte ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> </div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> FileExists () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> FileExists ( xbInt16 iOption ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> FileExists ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> FileExists ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iOption ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> </div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> FileIsOpen () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> </div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> xbInt16 ReadBlock ( xbUInt32 ulBlockNo, <span class="keywordtype">size_t</span> readSize, <span class="keywordtype">void</span> *buf );</div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> xbInt16 ReadBlock ( xbUInt32 ulBlockNo, xbUInt32 ulBlockSize, <span class="keywordtype">size_t</span> readSize, <span class="keywordtype">void</span> *buf );</div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> xbInt16 WriteBlock( xbUInt32 ulBlockNo, <span class="keywordtype">size_t</span> writeSize, <span class="keywordtype">void</span> *buf );</div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> </div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> xbInt16 GetFileSize( xbUInt64 &amp;ullFileSize );</div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> xbInt16 GetFileMtime( time_t &amp;mtime );</div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> </div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> eGetDouble( <span class="keyword">const</span> <span class="keywordtype">char</span> *p ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> xbInt32 eGetInt32 ( <span class="keyword">const</span> <span class="keywordtype">char</span> *p ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> xbUInt32 eGetUInt32( <span class="keyword">const</span> <span class="keywordtype">char</span> *p ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> xbInt16 eGetInt16 ( <span class="keyword">const</span> <span class="keywordtype">char</span> *p ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> xbUInt16 eGetUInt16( <span class="keyword">const</span> <span class="keywordtype">char</span> *p ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keywordtype">void</span> ePutDouble( <span class="keywordtype">char</span> *p, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> d );</div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordtype">void</span> ePutInt32 ( <span class="keywordtype">char</span> *p, xbInt32 l );</div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordtype">void</span> ePutUInt32( <span class="keywordtype">char</span> *p, xbUInt32 ul );</div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <span class="keywordtype">void</span> ePutInt16 ( <span class="keywordtype">char</span> *p, xbInt16 s );</div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="keywordtype">void</span> ePutUInt16( <span class="keywordtype">char</span> *p, xbUInt16 s );</div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> </div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> xbInt16 xbFclose ();</div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> xbInt16 xbFeof ();</div>
+<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> xbInt16 xbFflush ();</div>
+<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> xbInt16 xbFgetc ( xbInt32 &amp;c );</div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> xbInt16 xbFgetc ( <span class="keywordtype">char</span> &amp;c );</div>
+<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> </div>
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span><span class="preprocessor"> #ifdef XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> xbInt16 xbLock ( xbInt16 iFunction, xbInt64 llOffset, <span class="keywordtype">size_t</span> stLen );</div>
+<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> xbInt16 GetLockRetryCount() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keywordtype">void</span> SetLockRetryCount( xbInt16 iLockRetries );</div>
+<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> </div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"><a class="line" href="classxb_1_1xbFile.html#a7cdfef5ede9ac98d44a28a6b7a70972c"> 131</a></span> xbInt16 <a class="code hl_function" href="classxb_1_1xbFile.html#a7cdfef5ede9ac98d44a28a6b7a70972c">xbFopen</a> ( xbInt16 iOpenMode );</div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> xbInt16 xbFopen ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOpenMode, xbInt16 iShareMode );</div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> xbInt16 xbFopen ( xbInt16 iOpenMode, xbInt16 iShareMode );</div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> xbInt16 xbFopen ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sMode, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iShareMode );</div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> </div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> xbInt16 xbFputc ( xbInt32 c );</div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> xbInt16 xbFputc ( xbInt32 c, xbInt32 iNoTimes );</div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> xbInt16 xbFputs ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s );</div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> xbInt16 xbFread ( <span class="keywordtype">void</span> *ptr, <span class="keywordtype">size_t</span> size, <span class="keywordtype">size_t</span> nmemb );</div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> xbInt16 xbFgets ( <span class="keywordtype">size_t</span> lSize, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sLine );</div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> </div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordtype">size_t</span> xbFtell ();</div>
+<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> xbInt16 xbFseek ( xbInt64 llOffset, xbInt32 whence );</div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> </div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordtype">void</span> xbFTurnOffFileBuffering();</div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> xbInt16 xbFwrite ( <span class="keyword">const</span> <span class="keywordtype">void</span> *ptr, <span class="keywordtype">size_t</span> lSize, <span class="keywordtype">size_t</span> lNmemb );</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> xbInt16 xbReadUntil ( <span class="keyword">const</span> <span class="keywordtype">char</span> cDelim, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> xbInt16 xbRemove ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iOption );</div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> xbInt16 xbRemove ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName );</div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> xbInt16 xbRemove ();</div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> </div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> xbInt16 xbRename ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOldName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sNewName );</div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> xbInt16 xbRename ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOldName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sNewName, xbInt16 iOption );</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keywordtype">void</span> xbRewind ();</div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> </div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> xbInt16 xbTruncate ( xbInt64 llSize );</div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> xbInt16 NameSuffixMissing( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFileName, xbInt16 iOption ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> </div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> xbInt16 DumpBlockToDisk( xbUInt32 ulBlockNo, <span class="keywordtype">size_t</span> lBlockSize );</div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> </div>
+<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> </div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> </div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"><a class="line" href="classxb_1_1xbFile.html#ae39a67ea391b46055d4ca299cb222004"> 167</a></span> <a class="code hl_class" href="classxb_1_1xbXBase.html">xbXBase</a> *<a class="code hl_variable" href="classxb_1_1xbFile.html#ae39a67ea391b46055d4ca299cb222004">xbase</a>; <span class="comment">/* pointer to the main structures */</span></div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> </div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> FILE *fp;</div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> sFqFileName; <span class="comment">/* fully qualified file name */</span></div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> sFileName; <span class="comment">/* file name */</span></div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> sDirectory; <span class="comment">/* directory, ends with / or \ */</span></div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bFileOpen; <span class="comment">/* true if file is open */</span></div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> xbUInt32 ulBlockSize; <span class="comment">/* used for memo and index files */</span></div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> </div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> xbInt16 iOpenMode; <span class="comment">/* XB_READ || XB_READ_WRITE || XB_WRITE */</span></div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> xbInt16 iShareMode; <span class="comment">/* XB_SINGLE_USER || XB_MULTI_USER - set file buffering */</span></div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> xbInt32 iFileNo; <span class="comment">/* Library File No */</span></div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> </div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span><span class="preprocessor"> #ifdef XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> xbInt16 iLockRetries; <span class="comment">/* file override number of lock attempts */</span></div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> </div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span><span class="preprocessor"> #ifdef HAVE_SETENDOFFILE_F</span></div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> HANDLE fHandle;</div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> </div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> </div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span>};</div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> </div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span>} <span class="comment">/* namespace */</span></div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span><span class="preprocessor">#endif </span><span class="comment">/* __XBFILE_H__ */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> </div>
+<div class="ttc" id="aclassxb_1_1xbFile_html"><div class="ttname"><a href="classxb_1_1xbFile.html">xb::xbFile</a></div><div class="ttdoc">Class for handling low level file I/O.</div><div class="ttdef"><b>Definition:</b> xbfile.h:56</div></div>
+<div class="ttc" id="aclassxb_1_1xbFile_html_a7cdfef5ede9ac98d44a28a6b7a70972c"><div class="ttname"><a href="classxb_1_1xbFile.html#a7cdfef5ede9ac98d44a28a6b7a70972c">xb::xbFile::xbFopen</a></div><div class="ttdeci">xbInt16 xbFopen(xbInt16 iOpenMode)</div></div>
+<div class="ttc" id="aclassxb_1_1xbFile_html_ae39a67ea391b46055d4ca299cb222004"><div class="ttname"><a href="classxb_1_1xbFile.html#ae39a67ea391b46055d4ca299cb222004">xb::xbFile::xbase</a></div><div class="ttdeci">xbXBase * xbase</div><div class="ttdef"><b>Definition:</b> xbfile.h:167</div></div>
+<div class="ttc" id="aclassxb_1_1xbSsv_html"><div class="ttname"><a href="classxb_1_1xbSsv.html">xb::xbSsv</a></div><div class="ttdoc">Class for handling shared system variables.</div><div class="ttdef"><b>Definition:</b> xbssv.h:59</div></div>
+<div class="ttc" id="aclassxb_1_1xbString_html"><div class="ttname"><a href="classxb_1_1xbString.html">xb::xbString</a></div><div class="ttdoc">Class for handling string data.</div><div class="ttdef"><b>Definition:</b> xbstring.h:50</div></div>
+<div class="ttc" id="aclassxb_1_1xbXBase_html"><div class="ttname"><a href="classxb_1_1xbXBase.html">xb::xbXBase</a></div><div class="ttdoc">xbXbase class.</div><div class="ttdef"><b>Definition:</b> xbxbase.h:123</div></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a25f47b226ce924a5c78f97989b0744a2"><div class="ttname"><a href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></div><div class="ttdeci">double xbDouble</div><div class="ttdef"><b>Definition:</b> xbtypes.h:23</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbfilter_8cpp.html b/docs/doxygen/html/xbfilter_8cpp.html
new file mode 100644
index 0000000..a25b867
--- /dev/null
+++ b/docs/doxygen/html/xbfilter_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfilter.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbfilter.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbfilter_8h.html b/docs/doxygen/html/xbfilter_8h.html
new file mode 100644
index 0000000..2d86f46
--- /dev/null
+++ b/docs/doxygen/html/xbfilter_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfilter.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbfilter.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbfilter_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbfilter_8h_source.html b/docs/doxygen/html/xbfilter_8h_source.html
new file mode 100644
index 0000000..4a6cd97
--- /dev/null
+++ b/docs/doxygen/html/xbfilter_8h_source.html
@@ -0,0 +1,160 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbfilter.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbfilter.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbfilter_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbfilter.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">This class manages the user data area (UDA)</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="comment"></span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> </div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#ifndef __XB_XBFILTER_H__</span></div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#define __XB_XBFILTER_H__</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#pragma interface</span></div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#ifdef XB_FILTER_SUPPORT</span></div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> </div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="comment">//#ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="comment">//class XBDLLEXPORT xbIx;</span></div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="comment">//#endif // XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> </div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="keyword">class </span>XBDLLEXPORT xbFilter {</div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> </div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> xbFilter( <a class="code hl_variable" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a> *xbase, <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf );</div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> ~xbFilter();</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> xbInt16 Set( xbString &amp;sFilterExpression );</div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> xbInt16 GetFirstRecord( xbInt16 iOpt = 1 );</div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> xbInt16 GetNextRecord ( xbInt16 iOpt = 1 );</div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> xbInt16 GetPrevRecord ( xbInt16 iOpt = 1 );</div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> xbInt16 GetLastRecord ( xbInt16 iOpt = 1 );</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keywordtype">void</span> SetLimit( xbInt32 ulLimit );</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> xbInt32 GetLimit() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordtype">void</span> ResetQryCnt();</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> xbInt32 GetQryCnt() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="preprocessor"> #ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="comment">// void Set( xbIx *pIx, void *vpTag );</span></div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> xbInt16 GetFirstRecordIx( xbInt16 iOpt = 1 );</div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> xbInt16 GetNextRecordIx ( xbInt16 iOpt = 1 );</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> xbInt16 GetPrevRecordIx ( xbInt16 iOpt = 1 );</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> xbInt16 GetLastRecordIx ( xbInt16 iOpt = 1 );</div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="preprocessor"> #endif </span><span class="comment">// XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> </div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <a class="code hl_variable" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a> *xbase;</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf;</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> xbExp *exp;</div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> xbInt32 lLimit; <span class="comment">// max number rows returned</span></div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> xbInt32 lCurQryCnt; <span class="comment">// current count of rows returned, neg# is moving from bottom to top</span></div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="comment">// pos# is moving from top to bottom</span></div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="preprocessor"> #ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> xbIx *pIx; <span class="comment">// if index is set, the class uses the index tag, otherwise table</span></div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keywordtype">void</span> *vpTag;</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span><span class="preprocessor"> #endif </span><span class="comment">// XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> </div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span>};</div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span>} <span class="comment">/* namespace */</span></div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span><span class="preprocessor">#endif </span><span class="comment">/* XB_FILTER_SUPPORT */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span><span class="preprocessor">#endif </span><span class="comment">/* __XBFILTER_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a97858ddeb1c4b0100f3edc1a46d3a8b0"><div class="ttname"><a href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xb::xbXBase</a></div><div class="ttdeci">class XBDLLEXPORT xbXBase</div><div class="ttdef"><b>Definition:</b> xbssv.h:27</div></div>
+<div class="ttc" id="anamespacexb_html_ab2eae4b4732466698a7fdd89d77ba53b"><div class="ttname"><a href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xb::xbDbf</a></div><div class="ttdeci">class XBDLLEXPORT xbDbf</div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:28</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbfuncs_8cpp.html b/docs/doxygen/html/xbfuncs_8cpp.html
new file mode 100644
index 0000000..247b277
--- /dev/null
+++ b/docs/doxygen/html/xbfuncs_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbfuncs.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbfuncs.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbindex_8h.html b/docs/doxygen/html/xbindex_8h.html
new file mode 100644
index 0000000..adae508
--- /dev/null
+++ b/docs/doxygen/html/xbindex_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbindex.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbindex.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbindex_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbindex_8h_source.html b/docs/doxygen/html/xbindex_8h_source.html
new file mode 100644
index 0000000..28afbb8
--- /dev/null
+++ b/docs/doxygen/html/xbindex_8h_source.html
@@ -0,0 +1,592 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbindex.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbindex.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbindex_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbindex.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014, 2018, 2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_INDEX_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_INDEX_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> </div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#define XB_ADD_KEY 1</span></div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#define XB_UPD_KEY 2</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#define XB_DEL_KEY 3</span></div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> </div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="comment">// structure for index nodes, each node contains information regarding one block</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="keyword">struct </span>XBDLLEXPORT xbIxNode {</div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> xbIxNode *npPrev; <span class="comment">// pointer to previous node in chain</span></div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> xbIxNode *npNext; <span class="comment">// pointer to next node in chain</span></div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> xbUInt32 iCurKeyNo; <span class="comment">// current key number in the node, 0 offset</span></div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> xbUInt32 ulBlockNo; <span class="comment">// this block number</span></div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> xbUInt32 ulBufSize; <span class="comment">// size of cpBlockData</span></div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keywordtype">char</span> *cpBlockData; <span class="comment">// pointer to memory version of block data stored in file</span></div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span>};</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> </div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> </div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span><span class="keyword">class </span>XBDLLEXPORT xbIx : <span class="keyword">public</span> xbFile {</div>
+<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> xbIx( <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> * d );</div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="keyword">virtual</span> ~xbIx();</div>
+<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> </div>
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keyword">virtual</span> xbInt16 CheckTagIntegrity( <span class="keywordtype">void</span> *vpTag, xbInt16 iOpt ) = 0;</div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keyword">virtual</span> xbInt16 Close();</div>
+<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keyword">virtual</span> xbInt16 CreateTag( <span class="keyword">const</span> xbString &amp;sName, <span class="keyword">const</span> xbString &amp;sKey, <span class="keyword">const</span> xbString &amp;sFilter, xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverlay, <span class="keywordtype">void</span> **vpTag ) = 0;</div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keyword">virtual</span> xbInt16 FindKey( <span class="keywordtype">void</span> *vpTag, <span class="keyword">const</span> xbString &amp;sKey, xbInt16 iRetrieveSw );</div>
+<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keyword">virtual</span> xbInt16 FindKey( <span class="keywordtype">void</span> *vpTag, <span class="keyword">const</span> <span class="keywordtype">char</span> * cKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw );</div>
+<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="keyword">virtual</span> xbInt16 FindKey( <span class="keywordtype">void</span> *vpTag, <span class="keyword">const</span> xbBcd &amp;bcd, xbInt16 iRetrieveSw );</div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="keyword">virtual</span> xbInt16 FindKey( <span class="keywordtype">void</span> *vpTag, <span class="keyword">const</span> xbDate &amp;dtKey, xbInt16 iRetrieveSw );</div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="keyword">virtual</span> xbInt16 FindKey( <span class="keywordtype">void</span> *vpTag, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dKey, xbInt16 iRetrieveSw );</div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="keyword">virtual</span> xbInt16 FindKey( <span class="keywordtype">void</span> *vpTag, <span class="keyword">const</span> <span class="keywordtype">void</span> *vKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw ) = 0;</div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *GetCurTag() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keyword">virtual</span> <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *GetDbf() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> </div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="keyword">virtual</span> xbString &amp;GetKeyExpression( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keyword">virtual</span> xbString &amp;GetKeyFilter( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keyword">virtual</span> <span class="keywordtype">char</span> GetKeyType( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="keyword">virtual</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetLocked() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> </div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keyword">virtual</span> xbInt16 GetFirstKey( <span class="keywordtype">void</span> *vpTag, xbInt16 iRetrieveSw ) = 0;</div>
+<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keyword">virtual</span> xbInt16 GetFirstKey( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keyword">virtual</span> xbInt16 GetFirstKey();</div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> </div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="keyword">virtual</span> xbInt16 GetLastKey( <span class="keywordtype">void</span> *vpTag, xbInt16 lRetrieveSw ) = 0;</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="keyword">virtual</span> xbInt16 GetLastKey( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keyword">virtual</span> xbInt16 GetLastKey();</div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> <span class="keyword">virtual</span> xbInt16 GetNextKey( <span class="keywordtype">void</span> *vpTag, xbInt16 iRetrieveSw ) = 0;</div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> <span class="keyword">virtual</span> xbInt16 GetNextKey( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keyword">virtual</span> xbInt16 GetNextKey();</div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> </div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keyword">virtual</span> xbInt16 GetPrevKey( <span class="keywordtype">void</span> *vpTag, xbInt16 iRetrieveSw ) = 0;</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keyword">virtual</span> xbInt16 GetPrevKey( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keyword">virtual</span> xbInt16 GetPrevKey();</div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> </div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *GetTag( xbInt16 iTagNo ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> *GetTag( xbString &amp;sTagName ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <span class="keyword">virtual</span> xbInt16 GetTagCount() <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> </div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keyword">virtual</span> xbString &amp;GetTagName( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <span class="keyword">virtual</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * GetTagName( <span class="keywordtype">void</span> *vpTag, xbInt16 iOpt ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> GetTagName( <span class="keywordtype">void</span> *vpTag, xbString &amp;sTagName ) {};</div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> </div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="keyword">virtual</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetUnique( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="keyword">virtual</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetSortOrder( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> </div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keyword">virtual</span> xbInt16 Open( <span class="keyword">const</span> xbString &amp;sFileName );</div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <span class="keyword">virtual</span> xbInt16 Reindex( <span class="keywordtype">void</span> **vpTag ) = 0;</div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> <span class="keyword">virtual</span> xbInt16 SetCurTag( xbInt16 iTagNo ) = 0;</div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <span class="keyword">virtual</span> xbInt16 SetCurTag( xbString &amp;sTagName ) = 0;</div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> SetCurTag( <span class="keywordtype">void</span> * vpCurTag );</div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> SetLocked( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bLocked );</div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> </div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> TestStub( <span class="keywordtype">char</span> *s, <span class="keywordtype">void</span> *vpTag ) {};</div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> </div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> </div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <span class="keyword">virtual</span> xbInt16 DumpFreeBlocks( xbInt16 iOpt = 0 ) { <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>; }</div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="keyword">virtual</span> xbInt16 DumpHeader( xbInt16 iDestOpt = 0, xbInt16 iFmtOpt = 0 ) = 0;</div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <span class="keyword">virtual</span> xbInt16 DumpIxForTag( <span class="keywordtype">void</span> *vpTag, xbInt16 iOutputOpt ) = 0;</div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> DumpIxNodeChain( <span class="keywordtype">void</span> *vpTag, xbInt16 iOutputOpt ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <span class="keyword">virtual</span> xbInt16 DumpNode( <span class="keywordtype">void</span> * vpTag, xbIxNode * pNode, xbInt16 iOption ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="keyword">virtual</span> xbInt16 DumpTagBlocks( xbInt16 iOpt = 1, <span class="keywordtype">void</span> *vpTag = NULL ) = 0;</div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> </div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> </div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a>;</div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> </div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <span class="keyword">virtual</span> xbInt16 AddKey( <span class="keywordtype">void</span> *vpTag, xbUInt32 ulRecNo ) = 0;</div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="keyword">virtual</span> xbInt16 AddKeys( xbUInt32 ulRecNo );</div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="keyword">virtual</span> xbIxNode *AllocateIxNode( xbUInt32 ulBufSize = 0, xbInt16 iOption = 0 );</div>
+<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <span class="keyword">virtual</span> xbInt16 BSearchBlock( <span class="keywordtype">char</span> cKeyType, xbIxNode *npNode, xbInt32 lKeyLen, <span class="keyword">const</span> <span class="keywordtype">void</span> *vpKey, xbInt32 lSearchKeyLen, xbInt16 &amp;iCompRc, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bDescending = <a class="code hl_define" href="xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc">xbFalse</a> ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> <span class="keyword">virtual</span> xbInt16 CheckForDupKeys();</div>
+<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keyword">virtual</span> xbInt16 CheckForDupKey( <span class="keywordtype">void</span> *vpTag ) = 0;</div>
+<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="keyword">virtual</span> xbInt16 CompareKey( <span class="keywordtype">char</span> cKeyType, <span class="keyword">const</span> <span class="keywordtype">void</span> *v1, <span class="keyword">const</span> <span class="keywordtype">void</span> *v2, <span class="keywordtype">size_t</span> lKeyLen ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keyword">virtual</span> xbInt16 CreateKeys( xbInt16 iOpt );</div>
+<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <span class="keyword">virtual</span> xbInt16 CreateKey( <span class="keywordtype">void</span> * vpTag, xbInt16 iOpt ) = 0;</div>
+<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <span class="keyword">virtual</span> xbInt16 DeleteFromNode( <span class="keywordtype">void</span> *vpTag, xbIxNode * npNode, xbInt16 iSlotNo ) = 0;</div>
+<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span><span class="comment">// virtual xbInt16 DeleteKeys( xbUInt32 ulRecNo );</span></div>
+<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="keyword">virtual</span> xbInt16 DeleteKeys();</div>
+<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keyword">virtual</span> xbInt16 DeleteKey( <span class="keywordtype">void</span> *vpTag ) = 0;</div>
+<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> </div>
+<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keyword">virtual</span> xbInt16 DeleteTag( <span class="keywordtype">void</span> *vpTag ) = 0;</div>
+<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> </div>
+<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> </div>
+<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keyword">virtual</span> xbInt16 FindKeyForCurRec( <span class="keywordtype">void</span> *vpTag ) = 0;</div>
+<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="keyword">virtual</span> xbIxNode *FreeNodeChain( xbIxNode *np );</div>
+<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <span class="keyword">virtual</span> xbInt16 GetBlock( <span class="keywordtype">void</span> *vpTag, xbUInt32 ulBlockNo, xbInt16 iOpt, xbUInt32 ulAddlBuf = 0 );</div>
+<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span><span class="comment">// virtual xbBool GetIndexUpdated() const = 0;</span></div>
+<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <span class="keyword">virtual</span> xbInt32 GetKeyCount( xbIxNode *npNode ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> <span class="keyword">virtual</span> <span class="keywordtype">char</span> *GetKeyData( xbIxNode *npNode, xbInt16 iKeyNo, xbInt16 iKeyItemLen ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="keyword">virtual</span> xbInt16 GetKeySts( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="keyword">virtual</span> xbInt16 GetLastKey( xbUInt32 ulNodeNo, <span class="keywordtype">void</span> *vpTag, xbInt16 lRetrieveSw ) = 0;</div>
+<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="keyword">virtual</span> xbInt16 InsertNodeL( <span class="keywordtype">void</span> *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, <span class="keywordtype">char</span> * cpKeyBuf, xbUInt32 uiPtr ) = 0;</div>
+<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="keyword">virtual</span> xbInt16 InsertNodeI( <span class="keywordtype">void</span> *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, xbUInt32 uiPtr ) = 0;</div>
+<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <span class="keyword">virtual</span> xbInt16 KeyExists( <span class="keywordtype">void</span> * ) = 0;</div>
+<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span><span class="comment">// virtual xbInt16 KeyUpdated( void *vpTag ) const = 0;</span></div>
+<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> NodeFree( xbIxNode * ixNode );</div>
+<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="keyword">virtual</span> xbInt16 ReadHeadBlock( xbInt16 iOpt = 0 ) = 0;</div>
+<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> SetDbf( <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf );</div>
+<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <span class="keyword">virtual</span> xbInt16 SplitNodeL( <span class="keywordtype">void</span> *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, <span class="keywordtype">char</span> *cpKeyBuf, xbUInt32 uiPtr ) = 0;</div>
+<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keyword">virtual</span> xbInt16 SplitNodeI( <span class="keywordtype">void</span> *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 uiPtr ) = 0;</div>
+<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <span class="keyword">virtual</span> xbInt16 UpdateTagKey( <span class="keywordtype">char</span> cAction, <span class="keywordtype">void</span> *vpTag, xbUInt32 ulRecNo = 0 ) = 0;</div>
+<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> <span class="keyword">virtual</span> xbInt16 WriteHeadBlock( xbInt16 iOption ) = 0;</div>
+<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> </div>
+<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf;</div>
+<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> <span class="keywordtype">char</span> *cNodeBuf; <span class="comment">// pointer to memory for processing in a block of index data</span></div>
+<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="keywordtype">void</span> *vpCurTag; <span class="comment">// pointer to active tag. Single index files have only one tag</span></div>
+<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> </div>
+<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> AppendNodeChain( <span class="keywordtype">void</span> *vpTag, xbIxNode *npNode ) = 0;</div>
+<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="keyword">virtual</span> xbInt16 GetKeyPtr( <span class="keywordtype">void</span> *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 &amp;ulKeyPtr ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="keyword">virtual</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsLeaf( <span class="keywordtype">void</span> *vpTag, xbIxNode *npNode ) <span class="keyword">const</span> = 0;</div>
+<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="comment">// virtual void SetCurNode( void *vpTag, xbIxNode *npNode ) = 0;</span></div>
+<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> </div>
+<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bLocked; <span class="comment">// index file locked?</span></div>
+<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span>};</div>
+<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> </div>
+<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span><span class="preprocessor">#ifdef XB_NDX_SUPPORT</span></div>
+<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> </div>
+<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span><span class="preprocessor">#define XB_NDX_BLOCK_SIZE 512</span></div>
+<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> </div>
+<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> </div>
+<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span><span class="keyword">struct </span>XBDLLEXPORT xbNdxTag {</div>
+<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> </div>
+<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> <span class="comment">// NDX File Header Fields</span></div>
+<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> xbUInt32 ulRootBlock; <span class="comment">// header node is 0</span></div>
+<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> xbUInt32 ulTotalBlocks; <span class="comment">// includes header node</span></div>
+<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keywordtype">char</span> cKeyType; <span class="comment">// C = Char, F = Numeric, D = Date</span></div>
+<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> xbInt16 iKeyLen; <span class="comment">// length of key data</span></div>
+<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> xbInt16 iKeysPerBlock; <span class="comment">// max number keys per block &lt;=100</span></div>
+<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> xbInt16 iKeyType; <span class="comment">// 00 = Char, 01 = Numeric</span></div>
+<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> xbInt16 iKeyItemLen; <span class="comment">// KeyLen + 8 bytes</span></div>
+<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordtype">char</span> cSerNo; <span class="comment">// rolling incrementing serial number +1 on each index update</span></div>
+<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> xbInt16 iUnique; <span class="comment">// True if unique</span></div>
+<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> xbString sKeyExpression; <span class="comment">// index expression</span></div>
+<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> <span class="comment">// end of NDX Header field</span></div>
+<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> </div>
+<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> xbExp *exp; <span class="comment">// pointer to expression for expression keys</span></div>
+<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> time_t tNodeChainTs; <span class="comment">// node chain time stamp</span></div>
+<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> xbIxNode *npNodeChain;</div>
+<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> xbIxNode *npCurNode;</div>
+<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keywordtype">char</span> *cpKeyBuf; <span class="comment">// key buffer, for searches and adds</span></div>
+<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> <span class="keywordtype">char</span> *cpKeyBuf2; <span class="comment">// key buffer, for deletes</span></div>
+<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> xbString sTagName; <span class="comment">// tag name - is the file name without the extension</span></div>
+<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span><span class="comment">// xbInt16 iKeyUpdated; // key updated? set in method KeyUpdated, checked in AddKey and DeleteKey routines</span></div>
+<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bFoundSts; <span class="comment">// key found? used to determine if new key should be added in XB_EMULATE_DBASE mode in AddKey</span></div>
+<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> </div>
+<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> </div>
+<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> xbInt16 iKeySts; <span class="comment">// key updated? set in method CreateKey, checked in AddKey and DeleteKey routines</span></div>
+<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="comment">// old key filtered new key filtered iKeySts</span></div>
+<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> <span class="comment">// Y Y XB_UPD_KEY 2 - update key if changed (delete and add)</span></div>
+<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> <span class="comment">// Y N XB_DEL_KEY 3 - delete key</span></div>
+<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="comment">// N Y XB_ADD_KEY 1 - add key</span></div>
+<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="comment">// N N 0 - no update</span></div>
+<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> </div>
+<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span>};</div>
+<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> </div>
+<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> </div>
+<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span><span class="keyword">class </span>XBDLLEXPORT xbIxNdx : <span class="keyword">public</span> xbIx {</div>
+<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> xbIxNdx( <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> * d );</div>
+<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> ~xbIxNdx();</div>
+<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> xbInt16 CheckTagIntegrity( <span class="keywordtype">void</span> *vpTag, xbInt16 iOpt );</div>
+<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> xbInt16 CreateTag( <span class="keyword">const</span> xbString &amp;sName, <span class="keyword">const</span> xbString &amp;sKey, <span class="keyword">const</span> xbString &amp;sFilter, xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverlay, <span class="keywordtype">void</span> **vpTag );</div>
+<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span><span class="comment">// xbInt16 DeleteTag( void *vpTag );</span></div>
+<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> xbInt16 FindKey( <span class="keywordtype">void</span> *vpTag, <span class="keyword">const</span> <span class="keywordtype">void</span> *vpKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw );</div>
+<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> xbInt16 GetFirstKey( <span class="keywordtype">void</span> *vpTag, xbInt16 iRetrieveSw );</div>
+<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> </div>
+<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> xbInt16 GetLastKey( <span class="keywordtype">void</span> *vpTag, xbInt16 iRetrieveSw = 1 );</div>
+<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> xbInt16 GetNextKey( <span class="keywordtype">void</span> *vpTag, xbInt16 iRetrieveSw = 1 );</div>
+<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> xbInt16 GetPrevKey( <span class="keywordtype">void</span> *vpTag, xbInt16 iRetrieveSw = 1 );</div>
+<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> xbInt32 GetKeyLen ( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> <span class="keywordtype">char</span> GetKeyType ( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> xbString &amp;GetKeyExpression( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> xbString &amp;GetKeyFilter( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> <span class="keywordtype">void</span> *GetTag( xbInt16 iTagNo ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> <span class="keywordtype">void</span> *GetTag( xbString &amp;sTagName ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> xbString &amp;GetTagName( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * GetTagName( <span class="keywordtype">void</span> *vpTag, xbInt16 iOpt ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> </div>
+<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> xbInt16 GetTagCount() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetUnique( <span class="keywordtype">void</span> *vpTag = NULL ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetSortOrder( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> xbInt16 Reindex( <span class="keywordtype">void</span> **vpTag );</div>
+<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> xbInt16 SetCurTag( xbInt16 iTagNo );</div>
+<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> xbInt16 SetCurTag( xbString &amp;sTagName );</div>
+<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> </div>
+<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> </div>
+<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> </div>
+<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> xbInt16 DumpTagBlocks( xbInt16 iOpt = 1, <span class="keywordtype">void</span> *vpTag = NULL );</div>
+<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> xbInt16 DumpHeader( xbInt16 iOpt = 0, xbInt16 iFmt = 0 );</div>
+<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> xbInt16 DumpIxForTag( <span class="keywordtype">void</span> *vpTag, xbInt16 iOutputOpt );</div>
+<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> <span class="keywordtype">void</span> DumpIxNodeChain( <span class="keywordtype">void</span> *vpTag, xbInt16 iOutputOpt ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> xbInt16 DumpNode( <span class="keywordtype">void</span> * vpTag, xbIxNode * pNode, xbInt16 iOption ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> </div>
+<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a>;</div>
+<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> xbInt16 AddKey( <span class="keywordtype">void</span> *vpTag, xbUInt32 ulRecNo );</div>
+<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> xbIxNode *AllocateIxNode( xbUInt32 ulBufSize = 0, xbInt16 iOption = 0 );</div>
+<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> xbInt16 CheckForDupKey( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> xbIxNode *CreateIxNode( xbUInt32 ulBufSize );</div>
+<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> xbInt16 CreateKey( <span class="keywordtype">void</span> * vpTag, xbInt16 iOpt );</div>
+<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> xbInt16 DeleteFromNode( <span class="keywordtype">void</span> *vpTag, xbIxNode * npNode, xbInt16 iSlotNo );</div>
+<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> xbInt16 DeleteKey( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> </div>
+<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> xbInt16 DeleteTag( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> </div>
+<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> xbInt16 FindKeyForCurRec( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span><span class="comment">// xbBool GetIndexUpdated() const;</span></div>
+<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> xbInt16 GetKeyTypeN( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> xbInt16 GetKeySts( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> xbInt16 GetLastKey( xbUInt32 ulNodeNo, <span class="keywordtype">void</span> *vpTag, xbInt16 iRetrieveSw = 1 );</div>
+<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> xbInt16 InsertNodeI( <span class="keywordtype">void</span> *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, xbUInt32 uiPtr );</div>
+<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> xbInt16 InsertNodeL( <span class="keywordtype">void</span> *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, <span class="keywordtype">char</span> * cpKeyBuf, xbUInt32 uiPtr );</div>
+<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> xbInt16 KeyExists( <span class="keywordtype">void</span> *vpTag = NULL );</div>
+<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span><span class="comment">// xbBool KeyFiltered( void *vpTag ) const;</span></div>
+<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span><span class="comment">// xbInt16 KeyUpdated( void *vpTag ) const;</span></div>
+<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> xbInt16 ReadHeadBlock(xbInt16 iOpt); <span class="comment">// read the header node of the disk NDX file</span></div>
+<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> xbInt16 SplitNodeI( <span class="keywordtype">void</span> *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 uiPtr );</div>
+<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> xbInt16 SplitNodeL( <span class="keywordtype">void</span> *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, <span class="keywordtype">char</span> *cpKeyBuf, xbUInt32 uiPtr );</div>
+<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> xbInt16 UpdateTagKey( <span class="keywordtype">char</span> cAction, <span class="keywordtype">void</span> *vpTag, xbUInt32 ulRecNo = 0 );</div>
+<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> xbInt16 WriteHeadBlock( xbInt16 iOption );</div>
+<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> </div>
+<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> xbInt16 AddKeyNewRoot( xbNdxTag *npTag, xbIxNode *npLeft, xbIxNode *npRight );</div>
+<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> <span class="keywordtype">void</span> AppendNodeChain( <span class="keywordtype">void</span> *vpTag, xbIxNode *npNode );</div>
+<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> xbInt16 GetDbfPtr( <span class="keywordtype">void</span> *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 &amp;ulDbfPtr ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> xbInt16 GetKeyPtr( <span class="keywordtype">void</span> *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 &amp;ulKeyPtr ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> xbInt16 GetLastKeyForBlockNo( <span class="keywordtype">void</span> *vpTag, xbUInt32 ulBlockNo, <span class="keywordtype">char</span> *cpKeyBuf );</div>
+<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsLeaf( <span class="keywordtype">void</span> *vpTag, xbIxNode *npNode ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> xbInt16 KeySetPosAdd( xbNdxTag *npTag, xbUInt32 ulAddKeyRecNo );</div>
+<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> xbInt16 KeySetPosDel( xbNdxTag *npTag );</div>
+<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> <span class="comment">// void SetCurNode( void *vpTag, xbIxNode *np );</span></div>
+<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> xbNdxTag *ndxTag;</div>
+<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span>};</div>
+<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> </div>
+<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span><span class="preprocessor">#endif </span><span class="comment">/* XB_NDX_SUPPORT */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> </div>
+<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span> </div>
+<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span><span class="preprocessor">#ifdef XB_MDX_SUPPORT</span></div>
+<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span><span class="comment">//#define XB_MDX_BLOCK_SIZE 1024</span></div>
+<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span> </div>
+<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span><span class="keyword">struct </span>XBDLLEXPORT xbMdxTag {</div>
+<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span> </div>
+<div class="line"><a id="l00392" name="l00392"></a><span class="lineno"> 392</span> <span class="comment">// next 7 fields comprise the tag table entry</span></div>
+<div class="line"><a id="l00393" name="l00393"></a><span class="lineno"> 393</span> xbUInt32 ulTagHdrPageNo; <span class="comment">// 512 byte page number, NOT block number</span></div>
+<div class="line"><a id="l00394" name="l00394"></a><span class="lineno"> 394</span> <span class="keywordtype">char</span> cTagName[11];</div>
+<div class="line"><a id="l00395" name="l00395"></a><span class="lineno"> 395</span> <span class="keywordtype">char</span> cKeyFmt; <span class="comment">// always 0x10 w/ DBase V7</span></div>
+<div class="line"><a id="l00396" name="l00396"></a><span class="lineno"> 396</span> <span class="keywordtype">char</span> cLeftChild; <span class="comment">// cFwdTagThread</span></div>
+<div class="line"><a id="l00397" name="l00397"></a><span class="lineno"> 397</span> <span class="keywordtype">char</span> cRightChild; <span class="comment">// cFwdTagThread2</span></div>
+<div class="line"><a id="l00398" name="l00398"></a><span class="lineno"> 398</span> <span class="keywordtype">char</span> cParent; <span class="comment">// cBwdTagThread</span></div>
+<div class="line"><a id="l00399" name="l00399"></a><span class="lineno"> 399</span> <span class="keywordtype">char</span> c2;</div>
+<div class="line"><a id="l00400" name="l00400"></a><span class="lineno"> 400</span> <span class="keywordtype">char</span> cKeyType; <span class="comment">// C,D,N</span></div>
+<div class="line"><a id="l00401" name="l00401"></a><span class="lineno"> 401</span> </div>
+<div class="line"><a id="l00402" name="l00402"></a><span class="lineno"> 402</span> xbUInt32 ulRootPage; <span class="comment">// 512 byte page number, NOT block number</span></div>
+<div class="line"><a id="l00403" name="l00403"></a><span class="lineno"> 403</span> xbUInt32 ulTagSize; <span class="comment">// Number of 512 byte pages allocated to the tag. Tag size of two is a single 1024 block</span></div>
+<div class="line"><a id="l00404" name="l00404"></a><span class="lineno"> 404</span> </div>
+<div class="line"><a id="l00405" name="l00405"></a><span class="lineno"> 405</span> <span class="keywordtype">char</span> cKeyFmt2; <span class="comment">// 0x10 - base</span></div>
+<div class="line"><a id="l00406" name="l00406"></a><span class="lineno"> 406</span> <span class="comment">// 0x08 - descending</span></div>
+<div class="line"><a id="l00407" name="l00407"></a><span class="lineno"> 407</span> <span class="comment">// 0x40 - unique</span></div>
+<div class="line"><a id="l00408" name="l00408"></a><span class="lineno"> 408</span> <span class="keywordtype">char</span> cKeyType2;</div>
+<div class="line"><a id="l00409" name="l00409"></a><span class="lineno"> 409</span> <span class="comment">// one unused byte fits here</span></div>
+<div class="line"><a id="l00410" name="l00410"></a><span class="lineno"> 410</span> </div>
+<div class="line"><a id="l00411" name="l00411"></a><span class="lineno"> 411</span> <span class="keywordtype">char</span> cTag11; <span class="comment">// dbase sets to 0x1B</span></div>
+<div class="line"><a id="l00412" name="l00412"></a><span class="lineno"> 412</span> </div>
+<div class="line"><a id="l00413" name="l00413"></a><span class="lineno"> 413</span> xbInt16 iKeyLen;</div>
+<div class="line"><a id="l00414" name="l00414"></a><span class="lineno"> 414</span> xbInt16 iKeysPerBlock;</div>
+<div class="line"><a id="l00415" name="l00415"></a><span class="lineno"> 415</span> xbInt16 iSecKeyType;</div>
+<div class="line"><a id="l00416" name="l00416"></a><span class="lineno"> 416</span> xbInt16 iKeyItemLen; <span class="comment">// iKeyLen + 4</span></div>
+<div class="line"><a id="l00417" name="l00417"></a><span class="lineno"> 417</span> </div>
+<div class="line"><a id="l00418" name="l00418"></a><span class="lineno"> 418</span> <span class="keywordtype">char</span> cSerialNo; <span class="comment">// Increments +1 for each tag update</span></div>
+<div class="line"><a id="l00419" name="l00419"></a><span class="lineno"> 419</span> <span class="keywordtype">char</span> cUnique;</div>
+<div class="line"><a id="l00420" name="l00420"></a><span class="lineno"> 420</span> xbString *sKeyExp; <span class="comment">// Key expression</span></div>
+<div class="line"><a id="l00421" name="l00421"></a><span class="lineno"> 421</span> </div>
+<div class="line"><a id="l00422" name="l00422"></a><span class="lineno"> 422</span> <span class="keywordtype">char</span> cHasFilter; <span class="comment">// 0x00 or 0x01</span></div>
+<div class="line"><a id="l00423" name="l00423"></a><span class="lineno"> 423</span> <span class="keywordtype">char</span> cHasKeys; <span class="comment">// 0x00 or 0x01</span></div>
+<div class="line"><a id="l00424" name="l00424"></a><span class="lineno"> 424</span> </div>
+<div class="line"><a id="l00425" name="l00425"></a><span class="lineno"> 425</span> xbUInt32 ulLeftChild; <span class="comment">// dbase 7 sets this to the root page on tag creation</span></div>
+<div class="line"><a id="l00426" name="l00426"></a><span class="lineno"> 426</span> xbUInt32 ulRightChild; <span class="comment">// dbase 7 sets this to the root page on tag creation</span></div>
+<div class="line"><a id="l00427" name="l00427"></a><span class="lineno"> 427</span> </div>
+<div class="line"><a id="l00428" name="l00428"></a><span class="lineno"> 428</span> <span class="keywordtype">char</span> cTagYY;</div>
+<div class="line"><a id="l00429" name="l00429"></a><span class="lineno"> 429</span> <span class="keywordtype">char</span> cTagMM;</div>
+<div class="line"><a id="l00430" name="l00430"></a><span class="lineno"> 430</span> <span class="keywordtype">char</span> cTagDD;</div>
+<div class="line"><a id="l00431" name="l00431"></a><span class="lineno"> 431</span> </div>
+<div class="line"><a id="l00432" name="l00432"></a><span class="lineno"> 432</span> <span class="keywordtype">char</span> cKeyFmt3; <span class="comment">// dbase 7 sets this 0x01 if discreet field or 0x00 if calculated or combination field key expression on tag creation</span></div>
+<div class="line"><a id="l00433" name="l00433"></a><span class="lineno"> 433</span> </div>
+<div class="line"><a id="l00434" name="l00434"></a><span class="lineno"> 434</span> xbString *sFiltExp; <span class="comment">// Filter expression</span></div>
+<div class="line"><a id="l00435" name="l00435"></a><span class="lineno"> 435</span> </div>
+<div class="line"><a id="l00436" name="l00436"></a><span class="lineno"> 436</span> time_t tNodeChainTs;</div>
+<div class="line"><a id="l00437" name="l00437"></a><span class="lineno"> 437</span> xbIxNode *npNodeChain;</div>
+<div class="line"><a id="l00438" name="l00438"></a><span class="lineno"> 438</span> xbIxNode *npCurNode;</div>
+<div class="line"><a id="l00439" name="l00439"></a><span class="lineno"> 439</span> xbExp *exp; <span class="comment">// pointer to expression for expression based tags</span></div>
+<div class="line"><a id="l00440" name="l00440"></a><span class="lineno"> 440</span> xbExp *filter; <span class="comment">// pointer to expression for index filter</span></div>
+<div class="line"><a id="l00441" name="l00441"></a><span class="lineno"> 441</span> </div>
+<div class="line"><a id="l00442" name="l00442"></a><span class="lineno"> 442</span> <span class="keywordtype">char</span> *cpKeyBuf; <span class="comment">// key buffer</span></div>
+<div class="line"><a id="l00443" name="l00443"></a><span class="lineno"> 443</span> <span class="keywordtype">char</span> *cpKeyBuf2; <span class="comment">// key buffer</span></div>
+<div class="line"><a id="l00444" name="l00444"></a><span class="lineno"> 444</span><span class="comment">// xbBool iKeyUpdated; // key updated? set in method CreateKey, checked in AddKey and DeleteKey routines</span></div>
+<div class="line"><a id="l00445" name="l00445"></a><span class="lineno"> 445</span> <span class="comment">// 0 - no update</span></div>
+<div class="line"><a id="l00446" name="l00446"></a><span class="lineno"> 446</span> <span class="comment">// 1 - Add</span></div>
+<div class="line"><a id="l00447" name="l00447"></a><span class="lineno"> 447</span> <span class="comment">// 2 - Update</span></div>
+<div class="line"><a id="l00448" name="l00448"></a><span class="lineno"> 448</span> <span class="comment">// 3 - Delete</span></div>
+<div class="line"><a id="l00449" name="l00449"></a><span class="lineno"> 449</span><span class="comment">// xbBool bKeyFiltered; // key filtered? True if included key, False if excluded key. Set in method CreateKey, checked in AddKey and DeleteKey routines</span></div>
+<div class="line"><a id="l00450" name="l00450"></a><span class="lineno"> 450</span> xbString *sTagName; <span class="comment">// string tag name</span></div>
+<div class="line"><a id="l00451" name="l00451"></a><span class="lineno"> 451</span> </div>
+<div class="line"><a id="l00452" name="l00452"></a><span class="lineno"> 452</span> </div>
+<div class="line"><a id="l00453" name="l00453"></a><span class="lineno"> 453</span> xbMdxTag *next;</div>
+<div class="line"><a id="l00454" name="l00454"></a><span class="lineno"> 454</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bFoundSts; <span class="comment">// key found? used to determine if new key should be added in XB_EMULATE_DBASE mode in AddKey</span></div>
+<div class="line"><a id="l00455" name="l00455"></a><span class="lineno"> 455</span> </div>
+<div class="line"><a id="l00456" name="l00456"></a><span class="lineno"> 456</span> </div>
+<div class="line"><a id="l00457" name="l00457"></a><span class="lineno"> 457</span> xbInt16 iKeySts; <span class="comment">// key updated? set in method CreateKey, checked in AddKey and DeleteKey routines</span></div>
+<div class="line"><a id="l00458" name="l00458"></a><span class="lineno"> 458</span> <span class="comment">// old key filtered new key filtered iKeySts</span></div>
+<div class="line"><a id="l00459" name="l00459"></a><span class="lineno"> 459</span> <span class="comment">// Y Y XB_UPD_KEY 2 - update key if changed (delete and add)</span></div>
+<div class="line"><a id="l00460" name="l00460"></a><span class="lineno"> 460</span> <span class="comment">// Y N XB_DEL_KEY 3 - delete key</span></div>
+<div class="line"><a id="l00461" name="l00461"></a><span class="lineno"> 461</span> <span class="comment">// N Y XB_ADD_KEY 1 - add key</span></div>
+<div class="line"><a id="l00462" name="l00462"></a><span class="lineno"> 462</span> <span class="comment">// N N 0 - no update</span></div>
+<div class="line"><a id="l00463" name="l00463"></a><span class="lineno"> 463</span> </div>
+<div class="line"><a id="l00464" name="l00464"></a><span class="lineno"> 464</span> </div>
+<div class="line"><a id="l00465" name="l00465"></a><span class="lineno"> 465</span>};</div>
+<div class="line"><a id="l00466" name="l00466"></a><span class="lineno"> 466</span> </div>
+<div class="line"><a id="l00467" name="l00467"></a><span class="lineno"> 467</span> </div>
+<div class="line"><a id="l00468" name="l00468"></a><span class="lineno"> 468</span><span class="keyword">class </span>XBDLLEXPORT xbIxMdx : <span class="keyword">public</span> xbIx {</div>
+<div class="line"><a id="l00469" name="l00469"></a><span class="lineno"> 469</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00470" name="l00470"></a><span class="lineno"> 470</span> xbIxMdx( <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> * d );</div>
+<div class="line"><a id="l00471" name="l00471"></a><span class="lineno"> 471</span> ~xbIxMdx();</div>
+<div class="line"><a id="l00472" name="l00472"></a><span class="lineno"> 472</span> xbInt16 CheckTagIntegrity( <span class="keywordtype">void</span> *vpTag, xbInt16 iOpt );</div>
+<div class="line"><a id="l00473" name="l00473"></a><span class="lineno"> 473</span> xbInt16 CreateTag( <span class="keyword">const</span> xbString &amp;sName, <span class="keyword">const</span> xbString &amp;sKey, <span class="keyword">const</span> xbString &amp;sFilter, xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverlay, <span class="keywordtype">void</span> **vpTag );</div>
+<div class="line"><a id="l00474" name="l00474"></a><span class="lineno"> 474</span><span class="comment">// xbInt16 DeleteTag( void *vpTag );</span></div>
+<div class="line"><a id="l00475" name="l00475"></a><span class="lineno"> 475</span> xbInt16 FindKey( <span class="keywordtype">void</span> *vpTag, <span class="keyword">const</span> <span class="keywordtype">void</span> *vKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw );</div>
+<div class="line"><a id="l00476" name="l00476"></a><span class="lineno"> 476</span> xbInt16 FindKey( <span class="keywordtype">void</span> *vpTag, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dKey, xbInt16 iRetrieveSw );</div>
+<div class="line"><a id="l00477" name="l00477"></a><span class="lineno"> 477</span> xbInt16 GetFirstKey( <span class="keywordtype">void</span> *vpTag, xbInt16 lRetrieveSw );</div>
+<div class="line"><a id="l00478" name="l00478"></a><span class="lineno"> 478</span> xbString &amp;GetKeyExpression( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00479" name="l00479"></a><span class="lineno"> 479</span> xbString &amp;GetKeyFilter( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00480" name="l00480"></a><span class="lineno"> 480</span> <span class="keywordtype">char</span> GetKeyType( <span class="keyword">const</span> <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00481" name="l00481"></a><span class="lineno"> 481</span> xbInt16 GetLastKey( <span class="keywordtype">void</span> *vpTag, xbInt16 lRetrieveSw );</div>
+<div class="line"><a id="l00482" name="l00482"></a><span class="lineno"> 482</span> xbInt16 GetNextKey( <span class="keywordtype">void</span> *vpTag, xbInt16 lRetrieveSw );</div>
+<div class="line"><a id="l00483" name="l00483"></a><span class="lineno"> 483</span> xbInt16 GetPrevKey( <span class="keywordtype">void</span> *vpTag, xbInt16 lRetrieveSw );</div>
+<div class="line"><a id="l00484" name="l00484"></a><span class="lineno"> 484</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetReuseEmptyNodesSw() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00485" name="l00485"></a><span class="lineno"> 485</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetSortOrder( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00486" name="l00486"></a><span class="lineno"> 486</span> <span class="keywordtype">void</span> *GetTag( xbInt16 iTagNo ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00487" name="l00487"></a><span class="lineno"> 487</span> <span class="keywordtype">void</span> *GetTag( xbString &amp;sTagName ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00488" name="l00488"></a><span class="lineno"> 488</span> xbInt16 GetTagCount() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00489" name="l00489"></a><span class="lineno"> 489</span> </div>
+<div class="line"><a id="l00490" name="l00490"></a><span class="lineno"> 490</span> xbString &amp;GetTagName( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00491" name="l00491"></a><span class="lineno"> 491</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * GetTagName( <span class="keywordtype">void</span> *vpTag, xbInt16 iOpt ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00492" name="l00492"></a><span class="lineno"> 492</span> <span class="keywordtype">void</span> GetTagName( <span class="keywordtype">void</span> *vpTag, xbString &amp;sTagName );</div>
+<div class="line"><a id="l00493" name="l00493"></a><span class="lineno"> 493</span> </div>
+<div class="line"><a id="l00494" name="l00494"></a><span class="lineno"> 494</span> xbInt16 GetUnique( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00495" name="l00495"></a><span class="lineno"> 495</span> xbInt16 Reindex( <span class="keywordtype">void</span> **vpTag );</div>
+<div class="line"><a id="l00496" name="l00496"></a><span class="lineno"> 496</span> xbInt16 SetCurTag( xbInt16 iTagNo );</div>
+<div class="line"><a id="l00497" name="l00497"></a><span class="lineno"> 497</span> xbInt16 SetCurTag( xbString &amp;sTagName );</div>
+<div class="line"><a id="l00498" name="l00498"></a><span class="lineno"> 498</span> <span class="keywordtype">void</span> SetReuseEmptyNodesSw( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bReuse );</div>
+<div class="line"><a id="l00499" name="l00499"></a><span class="lineno"> 499</span> </div>
+<div class="line"><a id="l00500" name="l00500"></a><span class="lineno"> 500</span> <span class="keywordtype">void</span> TestStub( <span class="keywordtype">char</span> *s, <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00501" name="l00501"></a><span class="lineno"> 501</span> </div>
+<div class="line"><a id="l00502" name="l00502"></a><span class="lineno"> 502</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00503" name="l00503"></a><span class="lineno"> 503</span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a>;</div>
+<div class="line"><a id="l00504" name="l00504"></a><span class="lineno"> 504</span> </div>
+<div class="line"><a id="l00505" name="l00505"></a><span class="lineno"> 505</span> xbInt16 AddKey( <span class="keywordtype">void</span> *vpTag, xbUInt32 ulRecNo );</div>
+<div class="line"><a id="l00506" name="l00506"></a><span class="lineno"> 506</span> xbIxNode *AllocateIxNode( xbMdxTag * mpTag, xbUInt32 ulBufSize, xbUInt32 ulBlock2 );</div>
+<div class="line"><a id="l00507" name="l00507"></a><span class="lineno"> 507</span> xbInt16 CheckForDupKey( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00508" name="l00508"></a><span class="lineno"> 508</span> xbInt16 Close();</div>
+<div class="line"><a id="l00509" name="l00509"></a><span class="lineno"> 509</span> xbInt16 CreateKey( <span class="keywordtype">void</span> * vpTag, xbInt16 iOpt );</div>
+<div class="line"><a id="l00510" name="l00510"></a><span class="lineno"> 510</span> xbInt16 DeleteFromNode( <span class="keywordtype">void</span> *vpTag, xbIxNode * npNode, xbInt16 iSlotNo );</div>
+<div class="line"><a id="l00511" name="l00511"></a><span class="lineno"> 511</span> xbInt16 DeleteKey( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00512" name="l00512"></a><span class="lineno"> 512</span> </div>
+<div class="line"><a id="l00513" name="l00513"></a><span class="lineno"> 513</span> xbInt16 DeleteTag( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00514" name="l00514"></a><span class="lineno"> 514</span> </div>
+<div class="line"><a id="l00515" name="l00515"></a><span class="lineno"> 515</span> xbInt16 FindKeyForCurRec( <span class="keywordtype">void</span> *vpTag );</div>
+<div class="line"><a id="l00516" name="l00516"></a><span class="lineno"> 516</span> xbInt16 GetKeySts( <span class="keywordtype">void</span> *vpTag ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00517" name="l00517"></a><span class="lineno"> 517</span> xbInt16 GetLastKey( xbUInt32 ulBlockNo, <span class="keywordtype">void</span> *vpTag, xbInt16 lRetrieveSw );</div>
+<div class="line"><a id="l00518" name="l00518"></a><span class="lineno"> 518</span> <span class="keywordtype">void</span> *GetTagTblPtr() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00519" name="l00519"></a><span class="lineno"> 519</span> <span class="keywordtype">void</span> Init( xbInt16 iOpt = 0 );</div>
+<div class="line"><a id="l00520" name="l00520"></a><span class="lineno"> 520</span> xbInt16 InsertNodeI( <span class="keywordtype">void</span> *vpTag, xbIxNode *npNode, xbInt16 iSlotNo, xbUInt32 uiPtr );</div>
+<div class="line"><a id="l00521" name="l00521"></a><span class="lineno"> 521</span> xbInt16 InsertNodeL( <span class="keywordtype">void</span> *vpTag, xbIxNode *npNode, xbInt16 iSlotNo, <span class="keywordtype">char</span> *cpKeyBuf, xbUInt32 uiPtr );</div>
+<div class="line"><a id="l00522" name="l00522"></a><span class="lineno"> 522</span> xbInt16 KeyExists( <span class="keywordtype">void</span> * );</div>
+<div class="line"><a id="l00523" name="l00523"></a><span class="lineno"> 523</span> xbInt16 LoadTagTable();</div>
+<div class="line"><a id="l00524" name="l00524"></a><span class="lineno"> 524</span> xbInt16 ReadHeadBlock(xbInt16 iOpt); <span class="comment">// read the header node of the disk file</span></div>
+<div class="line"><a id="l00525" name="l00525"></a><span class="lineno"> 525</span> xbInt16 SplitNodeI( <span class="keywordtype">void</span> *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 uiPtr );</div>
+<div class="line"><a id="l00526" name="l00526"></a><span class="lineno"> 526</span> xbInt16 SplitNodeL( <span class="keywordtype">void</span> *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, <span class="keywordtype">char</span> *cpKeyBuf, xbUInt32 uiPtr );</div>
+<div class="line"><a id="l00527" name="l00527"></a><span class="lineno"> 527</span> xbInt16 UpdateTagKey( <span class="keywordtype">char</span> cAction, <span class="keywordtype">void</span> *vpTag, xbUInt32 ulRecNo = 0 );</div>
+<div class="line"><a id="l00528" name="l00528"></a><span class="lineno"> 528</span> xbInt16 WriteHeadBlock( xbInt16 iOption );</div>
+<div class="line"><a id="l00529" name="l00529"></a><span class="lineno"> 529</span> </div>
+<div class="line"><a id="l00530" name="l00530"></a><span class="lineno"> 530</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00531" name="l00531"></a><span class="lineno"> 531</span> xbInt16 DumpTagBlocks( xbInt16 iOpt = 1, <span class="keywordtype">void</span> *vpTag = NULL );</div>
+<div class="line"><a id="l00532" name="l00532"></a><span class="lineno"> 532</span> xbInt16 DumpFreeBlocks( xbInt16 iOpt = 0 );</div>
+<div class="line"><a id="l00533" name="l00533"></a><span class="lineno"> 533</span> xbInt16 DumpHeader( xbInt16 iOpt = 0, xbInt16 iFmtOpt = 0 );</div>
+<div class="line"><a id="l00534" name="l00534"></a><span class="lineno"> 534</span> xbInt16 DumpIxForTag( <span class="keywordtype">void</span> *vpTag, xbInt16 iOutputOpt );</div>
+<div class="line"><a id="l00535" name="l00535"></a><span class="lineno"> 535</span> <span class="keywordtype">void</span> DumpIxNodeChain( <span class="keywordtype">void</span> *vpTag, xbInt16 iOutputOpt ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00536" name="l00536"></a><span class="lineno"> 536</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00537" name="l00537"></a><span class="lineno"> 537</span> </div>
+<div class="line"><a id="l00538" name="l00538"></a><span class="lineno"> 538</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00539" name="l00539"></a><span class="lineno"> 539</span> xbInt16 AddKeyNewRoot( xbMdxTag *npTag, xbIxNode *npLeft, xbIxNode *npRight );</div>
+<div class="line"><a id="l00540" name="l00540"></a><span class="lineno"> 540</span> <span class="keywordtype">void</span> AppendNodeChain( <span class="keywordtype">void</span> *vpTag, xbIxNode *npNode );</div>
+<div class="line"><a id="l00541" name="l00541"></a><span class="lineno"> 541</span> xbUInt32 BlockToPage( xbUInt32 ulBlockNo );</div>
+<div class="line"><a id="l00542" name="l00542"></a><span class="lineno"> 542</span> <span class="keywordtype">void</span> CalcBtreePointers();</div>
+<div class="line"><a id="l00543" name="l00543"></a><span class="lineno"> 543</span> <span class="keywordtype">char</span> CalcTagKeyFmt( xbExp &amp;exp );</div>
+<div class="line"><a id="l00544" name="l00544"></a><span class="lineno"> 544</span> <span class="keywordtype">char</span> CalcTagFwdThread1();</div>
+<div class="line"><a id="l00545" name="l00545"></a><span class="lineno"> 545</span> <span class="keywordtype">char</span> CalcTagFwdThread2();</div>
+<div class="line"><a id="l00546" name="l00546"></a><span class="lineno"> 546</span> xbMdxTag *ClearTagTable();</div>
+<div class="line"><a id="l00547" name="l00547"></a><span class="lineno"> 547</span> xbInt16 DumpBlock( xbInt16 iOpt, xbUInt32 ulBlockNo, xbMdxTag * mpTag );</div>
+<div class="line"><a id="l00548" name="l00548"></a><span class="lineno"> 548</span> xbInt16 GetDbfPtr( <span class="keywordtype">void</span> *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 &amp;ulDbfPtr ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00549" name="l00549"></a><span class="lineno"> 549</span> xbInt16 GetKeyPtr( <span class="keywordtype">void</span> *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 &amp;ulKeyPtr ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00550" name="l00550"></a><span class="lineno"> 550</span> xbInt16 GetLastKeyForBlockNo( <span class="keywordtype">void</span> *vpTag, xbUInt32 ulBlockNo, <span class="keywordtype">char</span> *cpKeyBuf );</div>
+<div class="line"><a id="l00551" name="l00551"></a><span class="lineno"> 551</span> xbInt16 HarvestEmptyNode( xbMdxTag *mpTag, xbIxNode *npNode, xbInt16 iOpt, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bHarvestRoot = <a class="code hl_define" href="xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc">xbFalse</a> );</div>
+<div class="line"><a id="l00552" name="l00552"></a><span class="lineno"> 552</span> xbInt16 HarvestTagNodes( xbMdxTag *mpTag, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bRecycleRoot = <a class="code hl_define" href="xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc">xbFalse</a> );</div>
+<div class="line"><a id="l00553" name="l00553"></a><span class="lineno"> 553</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsLeaf( <span class="keywordtype">void</span> *vpTag, xbIxNode *npNode ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00554" name="l00554"></a><span class="lineno"> 554</span> xbInt16 KeySetPosAdd( xbMdxTag *mpTag, xbUInt32 ulAddKeyRecNo );</div>
+<div class="line"><a id="l00555" name="l00555"></a><span class="lineno"> 555</span> xbInt16 KeySetPosDel( xbMdxTag *mpTag );</div>
+<div class="line"><a id="l00556" name="l00556"></a><span class="lineno"> 556</span> xbInt16 LoadTagDetail( xbInt16 iOption, xbMdxTag *tte );</div>
+<div class="line"><a id="l00557" name="l00557"></a><span class="lineno"> 557</span> xbUInt32 PageToBlock( xbUInt32 ulPageNo );</div>
+<div class="line"><a id="l00558" name="l00558"></a><span class="lineno"> 558</span> xbInt16 TagSerialNo( xbInt16 iOption, xbMdxTag *mpTag );</div>
+<div class="line"><a id="l00559" name="l00559"></a><span class="lineno"> 559</span> xbInt16 UpdateTagSize( xbMdxTag *mpTag, xbUInt32 ulTagSz );</div>
+<div class="line"><a id="l00560" name="l00560"></a><span class="lineno"> 560</span> </div>
+<div class="line"><a id="l00561" name="l00561"></a><span class="lineno"> 561</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00562" name="l00562"></a><span class="lineno"> 562</span> xbInt16 PrintKey( <span class="keywordtype">void</span> *vpTag, xbIxNode *npNode, xbInt16 iKeyNo, xbInt16 iDepth, <span class="keywordtype">char</span> cType, xbInt16 iOutputOpt );</div>
+<div class="line"><a id="l00563" name="l00563"></a><span class="lineno"> 563</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00564" name="l00564"></a><span class="lineno"> 564</span> </div>
+<div class="line"><a id="l00565" name="l00565"></a><span class="lineno"> 565</span> <span class="comment">// MDX File Header Fields</span></div>
+<div class="line"><a id="l00566" name="l00566"></a><span class="lineno"> 566</span> <span class="keywordtype">char</span> cVersion;</div>
+<div class="line"><a id="l00567" name="l00567"></a><span class="lineno"> 567</span> <span class="keywordtype">char</span> cCreateYY;</div>
+<div class="line"><a id="l00568" name="l00568"></a><span class="lineno"> 568</span> <span class="keywordtype">char</span> cCreateMM;</div>
+<div class="line"><a id="l00569" name="l00569"></a><span class="lineno"> 569</span> <span class="keywordtype">char</span> cCreateDD;</div>
+<div class="line"><a id="l00570" name="l00570"></a><span class="lineno"> 570</span> xbString sFileName;</div>
+<div class="line"><a id="l00571" name="l00571"></a><span class="lineno"> 571</span> xbInt16 iBlockFactor; <span class="comment">// 1-32 #of 512 byte segments in a block</span></div>
+<div class="line"><a id="l00572" name="l00572"></a><span class="lineno"> 572</span> </div>
+<div class="line"><a id="l00573" name="l00573"></a><span class="lineno"> 573</span> <span class="comment">// use file version</span></div>
+<div class="line"><a id="l00574" name="l00574"></a><span class="lineno"> 574</span> <span class="comment">// xbInt16 iBlockSize; // Stored at the xbFile level</span></div>
+<div class="line"><a id="l00575" name="l00575"></a><span class="lineno"> 575</span> </div>
+<div class="line"><a id="l00576" name="l00576"></a><span class="lineno"> 576</span> <span class="keywordtype">char</span> cProdIxFlag;</div>
+<div class="line"><a id="l00577" name="l00577"></a><span class="lineno"> 577</span> <span class="keywordtype">char</span> cTagEntryCnt;</div>
+<div class="line"><a id="l00578" name="l00578"></a><span class="lineno"> 578</span> xbInt16 iTagLen;</div>
+<div class="line"><a id="l00579" name="l00579"></a><span class="lineno"> 579</span> xbInt16 iTagUseCnt;</div>
+<div class="line"><a id="l00580" name="l00580"></a><span class="lineno"> 580</span> <span class="keywordtype">char</span> cNextTag; <span class="comment">// byte 28 +1</span></div>
+<div class="line"><a id="l00581" name="l00581"></a><span class="lineno"> 581</span> <span class="keywordtype">char</span> c1B; <span class="comment">// always 0x1B</span></div>
+<div class="line"><a id="l00582" name="l00582"></a><span class="lineno"> 582</span> xbUInt32 ulPageCnt; <span class="comment">// number of 512 byte pages in the mdx file</span></div>
+<div class="line"><a id="l00583" name="l00583"></a><span class="lineno"> 583</span> xbUInt32 ulFirstFreePage; <span class="comment">// page number corresponding to the next free block</span></div>
+<div class="line"><a id="l00584" name="l00584"></a><span class="lineno"> 584</span> xbUInt32 ulNoOfBlockAvail; <span class="comment">// might be improperly named?? not sure how it is used</span></div>
+<div class="line"><a id="l00585" name="l00585"></a><span class="lineno"> 585</span> <span class="keywordtype">char</span> cUpdateYY;</div>
+<div class="line"><a id="l00586" name="l00586"></a><span class="lineno"> 586</span> <span class="keywordtype">char</span> cUpdateMM;</div>
+<div class="line"><a id="l00587" name="l00587"></a><span class="lineno"> 587</span> <span class="keywordtype">char</span> cUpdateDD;</div>
+<div class="line"><a id="l00588" name="l00588"></a><span class="lineno"> 588</span> <span class="comment">// end of MDX Header fields</span></div>
+<div class="line"><a id="l00589" name="l00589"></a><span class="lineno"> 589</span> </div>
+<div class="line"><a id="l00590" name="l00590"></a><span class="lineno"> 590</span> </div>
+<div class="line"><a id="l00591" name="l00591"></a><span class="lineno"> 591</span> </div>
+<div class="line"><a id="l00592" name="l00592"></a><span class="lineno"> 592</span> xbMdxTag *mdxTagTbl;</div>
+<div class="line"><a id="l00593" name="l00593"></a><span class="lineno"> 593</span> </div>
+<div class="line"><a id="l00594" name="l00594"></a><span class="lineno"> 594</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bReuseEmptyNodes; <span class="comment">// Reuese empty MDX nodes when all keys deleted?</span></div>
+<div class="line"><a id="l00595" name="l00595"></a><span class="lineno"> 595</span> <span class="comment">// DBase 7.x and MS ODBC drivers do not reuse empty nodes, leaves them stranded in the file</span></div>
+<div class="line"><a id="l00596" name="l00596"></a><span class="lineno"> 596</span> <span class="comment">// Codebase 6.x reuses empty nodes.</span></div>
+<div class="line"><a id="l00597" name="l00597"></a><span class="lineno"> 597</span> <span class="comment">// Setting this to True will reuse empty nodes in the same manner Codebase 6.x reuses them.</span></div>
+<div class="line"><a id="l00598" name="l00598"></a><span class="lineno"> 598</span> </div>
+<div class="line"><a id="l00599" name="l00599"></a><span class="lineno"> 599</span>};</div>
+<div class="line"><a id="l00600" name="l00600"></a><span class="lineno"> 600</span><span class="preprocessor">#endif </span><span class="comment">/* XB_MDX_SUPPORT */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00601" name="l00601"></a><span class="lineno"> 601</span> </div>
+<div class="line"><a id="l00602" name="l00602"></a><span class="lineno"> 602</span> </div>
+<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span>} <span class="comment">/* namespace xb */</span></div>
+<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span><span class="preprocessor">#endif </span><span class="comment">/* XB_INDEX_SUPPORT */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_INDEX_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a25f47b226ce924a5c78f97989b0744a2"><div class="ttname"><a href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></div><div class="ttdeci">double xbDouble</div><div class="ttdef"><b>Definition:</b> xbtypes.h:23</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+<div class="ttc" id="anamespacexb_html_ab2eae4b4732466698a7fdd89d77ba53b"><div class="ttname"><a href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xb::xbDbf</a></div><div class="ttdeci">class XBDLLEXPORT xbDbf</div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:28</div></div>
+<div class="ttc" id="axbretcod_8h_html_ac720d5b4ec45bfd606f5865d40816e23"><div class="ttname"><a href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a></div><div class="ttdeci">#define XB_NO_ERROR</div><div class="ttdef"><b>Definition:</b> xbretcod.h:24</div></div>
+<div class="ttc" id="axbtypes_8h_html_adc4b6ca5ad299f63675136d9e03938cc"><div class="ttname"><a href="xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc">xbFalse</a></div><div class="ttdeci">#define xbFalse</div><div class="ttdef"><b>Definition:</b> xbtypes.h:29</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbinsert_8cpp.html b/docs/doxygen/html/xbinsert_8cpp.html
new file mode 100644
index 0000000..9ab27db
--- /dev/null
+++ b/docs/doxygen/html/xbinsert_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbinsert.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_25b94c3afce00ed38231227d8141f932.html">sql</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbinsert.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbixbase_8cpp.html b/docs/doxygen/html/xbixbase_8cpp.html
new file mode 100644
index 0000000..1dc683b
--- /dev/null
+++ b/docs/doxygen/html/xbixbase_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixbase.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbixbase.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbixmdx_8cpp.html b/docs/doxygen/html/xbixmdx_8cpp.html
new file mode 100644
index 0000000..9678278
--- /dev/null
+++ b/docs/doxygen/html/xbixmdx_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixmdx.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbixmdx.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbixndx_8cpp.html b/docs/doxygen/html/xbixndx_8cpp.html
new file mode 100644
index 0000000..ef974f2
--- /dev/null
+++ b/docs/doxygen/html/xbixndx_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbixndx.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbixndx.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xblnklst_8h.html b/docs/doxygen/html/xblnklst_8h.html
new file mode 100644
index 0000000..f69d395
--- /dev/null
+++ b/docs/doxygen/html/xblnklst_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklst.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xblnklst.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xblnklst_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xblnklst_8h_source.html b/docs/doxygen/html/xblnklst_8h_source.html
new file mode 100644
index 0000000..0c54f18
--- /dev/null
+++ b/docs/doxygen/html/xblnklst_8h_source.html
@@ -0,0 +1,341 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklst.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xblnklst.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xblnklst_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xblnklst.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_XBLNKLST_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_XBLNKLST_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#ifdef XB_LINKLIST_SUPPORT</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="keyword">class </span>XBDLLEXPORT xbLinkList {</div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> xbLinkList();</div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> ~xbLinkList();</div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> xbLinkListNode&lt;xbNodeType&gt; *GetHeadNode() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> xbLinkListNode&lt;xbNodeType&gt; *GetEndNode() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> xbLinkListNode&lt;xbNodeType&gt; *GetNodeForNo( xbUInt32 ulNodeNo ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> <span class="keywordtype">void</span> Clear();</div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> xbUInt32 GetNodeCnt () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> xbInt16 InsertAtEnd ( <span class="keyword">const</span> xbNodeType &amp;xbLLN );</div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> xbInt16 InsertAtFront ( <span class="keyword">const</span> xbNodeType &amp;xbLLN );</div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> xbInt16 RemoveByVal ( <span class="keyword">const</span> xbNodeType &amp;xbLLN );</div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> xbInt16 RemoveFromEnd ();</div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> xbInt16 RemoveFromEnd ( xbNodeType &amp;xbLLN );</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> xbInt16 RemoveFromFront( xbNodeType &amp;xbLLN );</div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> xbInt16 SearchFor ( <span class="keyword">const</span> xbNodeType &amp;xbLLN );</div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> xbUInt32 ulNodeCnt;</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> xbLinkListNode&lt;xbNodeType&gt; *llStartPtr;</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> xbLinkListNode&lt;xbNodeType&gt; *llEndPtr;</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span>};</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> </div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span>xbLinkList&lt;xbNodeType&gt;::xbLinkList(){</div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> ulNodeCnt = 0;</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> llStartPtr = NULL;</div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> llEndPtr = NULL;</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span>}</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> </div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span>xbLinkList&lt;xbNodeType&gt;::~xbLinkList(){</div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> Clear();</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span>}</div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> </div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="keywordtype">void</span> xbLinkList&lt;xbNodeType&gt;::Clear(){</div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> xbLinkListNode&lt;xbNodeType&gt; *cPtr = llStartPtr, *tPtr;</div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="keywordflow">for</span>( xbUInt32 i = 0; i &lt; ulNodeCnt; i++ ){</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> tPtr = cPtr;</div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> cPtr = cPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="keyword">delete</span> tPtr;</div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> }</div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> ulNodeCnt = 0;</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> llStartPtr = NULL;</div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> llEndPtr = NULL;</div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span>}</div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> </div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span>xbLinkListNode&lt;xbNodeType&gt; *xbLinkList&lt;xbNodeType&gt;::GetHeadNode()<span class="keyword"> const</span>{</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordflow">return</span> llStartPtr;</div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span>}</div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> </div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span>xbLinkListNode&lt;xbNodeType&gt; *xbLinkList&lt;xbNodeType&gt;::GetEndNode()<span class="keyword"> const</span>{</div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <span class="keywordflow">return</span> llEndPtr;</div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span>}</div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> </div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span>xbLinkListNode&lt;xbNodeType&gt; *xbLinkList&lt;xbNodeType&gt;::GetNodeForNo( xbUInt32 ulNo )<span class="keyword"> const</span>{</div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> </div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> xbLinkListNode&lt;xbNodeType&gt; *cPtr = llStartPtr;</div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> xbUInt32 i;</div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keywordflow">for</span>( i = 0; i &lt; ulNo &amp;&amp; i &lt; ulNodeCnt; i++ )</div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> cPtr = cPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> </div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="keywordflow">if</span>( i == ulNo )</div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordflow">return</span> cPtr;</div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="keywordflow">else</span> </div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <span class="keywordflow">return</span> 0;</div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span>}</div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> </div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> </div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> </div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span>xbUInt32 xbLinkList&lt;xbNodeType&gt;::GetNodeCnt()<span class="keyword"> const</span>{</div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <span class="keywordflow">return</span> ulNodeCnt;</div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span>}</div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> </div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span>xbInt16 xbLinkList&lt;xbNodeType&gt;::InsertAtFront( <span class="keyword">const</span> xbNodeType &amp; ntKey ){</div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> </div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> xbLinkListNode&lt;xbNodeType&gt; *p = <span class="keyword">new</span> xbLinkListNode&lt;xbNodeType&gt;( ntKey );</div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keywordflow">if</span>( p == 0 )</div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54">XB_NO_MEMORY</a>;</div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> </div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <span class="keywordflow">if</span>( ulNodeCnt &gt; 0 ){</div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> llStartPtr-&gt;SetPrevNode( p );</div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> p-&gt;SetNextNode( llStartPtr );</div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> } <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> llEndPtr = p;</div>
+<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> }</div>
+<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> </div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> llStartPtr = p;</div>
+<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> ulNodeCnt++;</div>
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span>}</div>
+<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> </div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span>xbInt16 xbLinkList&lt;xbNodeType&gt;::InsertAtEnd( <span class="keyword">const</span> xbNodeType &amp; ntKey ){</div>
+<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> </div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> xbLinkListNode&lt;xbNodeType&gt; *p = <span class="keyword">new</span> xbLinkListNode&lt;xbNodeType&gt;( ntKey );</div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="keywordflow">if</span>( p == 0 )</div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54">XB_NO_MEMORY</a>;</div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> </div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keywordflow">if</span>( ulNodeCnt &gt; 0 ){</div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> llEndPtr-&gt;SetNextNode( p );</div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> p-&gt;SetPrevNode( llEndPtr );</div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> llEndPtr = p;</div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> } <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> llStartPtr = p;</div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> }</div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> </div>
+<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> llEndPtr = p;</div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> ulNodeCnt++;</div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span>}</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> </div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span>xbInt16 xbLinkList&lt;xbNodeType&gt;::RemoveByVal( <span class="keyword">const</span> xbNodeType &amp; ntKey ){</div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="comment">// Remove the first instance of ntKey from the node chain</span></div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> xbLinkListNode&lt;xbNodeType&gt; *currPtr = llStartPtr;</div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> xbLinkListNode&lt;xbNodeType&gt; *prevPtr = NULL;</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keywordflow">for</span>( xbUInt32 i = 0; i &lt; ulNodeCnt; i++ ){</div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keywordflow">if</span>( currPtr-&gt;GetKey() == ntKey ){</div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keywordflow">if</span>( prevPtr == NULL ){ <span class="comment">//then this is the first node</span></div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> llStartPtr = currPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <span class="keywordflow">if</span>( llStartPtr ) <span class="comment">// if more than one link in the linked list</span></div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> llStartPtr-&gt;SetPrevNode( NULL );</div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keyword">delete</span> currPtr;</div>
+<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="keywordflow">return</span> i + 1;</div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> }</div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> prevPtr-&gt;SetNextNode( currPtr-&gt;GetNextNode());</div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="keywordflow">if</span>( currPtr-&gt;GetNextNode())</div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> currPtr-&gt;GetNextNode()-&gt;SetPrevNode( prevPtr );</div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <span class="keyword">delete</span> currPtr;</div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <span class="keywordflow">return</span> i + 1;</div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> }</div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> }</div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> prevPtr = currPtr;</div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> currPtr = currPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> }</div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac2606659a54111334f5b02861e533700">XB_NOT_FOUND</a>;</div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span>}</div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> </div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> </div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span>xbInt16 xbLinkList&lt;xbNodeType&gt;::RemoveFromFront( xbNodeType &amp; ntKey ){</div>
+<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> </div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="keywordflow">if</span>( ulNodeCnt &lt;= 0 )</div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">XB_INVALID_NODELINK</a>;</div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> xbLinkListNode&lt;xbNodeType&gt; *p = llStartPtr;</div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> llStartPtr = p-&gt;GetNextNode();</div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="keywordflow">if</span>( llStartPtr )</div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> llStartPtr-&gt;SetPrevNode( NULL );</div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> ntKey = p-&gt;GetKey();</div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <span class="keyword">delete</span> p;</div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span>}</div>
+<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> </div>
+<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> </div>
+<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span>xbInt16 xbLinkList&lt;xbNodeType&gt;::RemoveFromEnd( xbNodeType &amp; ntKey ){</div>
+<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> </div>
+<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <span class="keywordflow">if</span>( ulNodeCnt &lt;= 0 )</div>
+<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">XB_INVALID_NODELINK</a>;</div>
+<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> xbLinkListNode&lt;xbNodeType&gt; *p = llEndPtr;</div>
+<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keywordflow">if</span>( p-&gt;GetPrevNode()){</div>
+<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> llEndPtr = p-&gt;GetPrevNode();</div>
+<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> llEndPtr-&gt;SetNextNode( NULL );</div>
+<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> } <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="comment">// there are no more nodes</span></div>
+<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> llStartPtr = NULL;</div>
+<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> llEndPtr = NULL;</div>
+<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> }</div>
+<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> ntKey = p-&gt;GetKey();</div>
+<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <span class="keyword">delete</span> p;</div>
+<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span>}</div>
+<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> </div>
+<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> </div>
+<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span>xbInt16 xbLinkList&lt;xbNodeType&gt;::RemoveFromEnd(){</div>
+<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> </div>
+<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="keywordflow">if</span>( ulNodeCnt &lt;= 0 )</div>
+<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">XB_INVALID_NODELINK</a>;</div>
+<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> xbLinkListNode&lt;xbNodeType&gt; *p = llEndPtr;</div>
+<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keywordflow">if</span>( p-&gt;GetPrevNode()){</div>
+<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> llEndPtr = p-&gt;GetPrevNode();</div>
+<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> llEndPtr-&gt;SetNextNode( NULL );</div>
+<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> } <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="comment">// there are no more nodes</span></div>
+<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> llStartPtr = NULL;</div>
+<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> llEndPtr = NULL;</div>
+<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> }</div>
+<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> <span class="keyword">delete</span> p-&gt;GetKey();</div>
+<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="keyword">delete</span> p;</div>
+<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span>}</div>
+<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> </div>
+<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> </div>
+<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span>xbInt16 xbLinkList&lt;xbNodeType&gt;::SearchFor( <span class="keyword">const</span> xbNodeType &amp; ntKey ){</div>
+<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> </div>
+<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> xbLinkListNode&lt;xbNodeType&gt; *cPtr = llStartPtr;</div>
+<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="keywordflow">for</span>( xbUInt32 i = 0; i &lt; ulNodeCnt; i++ ){</div>
+<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> <span class="keywordflow">if</span>( cPtr-&gt;GetKey() == ntKey )</div>
+<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> <span class="keywordflow">return</span> i+1;</div>
+<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> cPtr = cPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> }</div>
+<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> </div>
+<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span>}</div>
+<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span>} <span class="comment">// namespace</span></div>
+<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> </div>
+<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span><span class="preprocessor">#endif </span><span class="comment">// XB_LINKLIST_SUPPORT</span></div>
+<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span><span class="preprocessor">#endif </span><span class="comment">// XB_XBLNKLST_H__</span></div>
+<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> </div>
+<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> </div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="axbretcod_8h_html_a13e6876470bd34c8c4e5533f115e04eb"><div class="ttname"><a href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">XB_INVALID_NODELINK</a></div><div class="ttdeci">#define XB_INVALID_NODELINK</div><div class="ttdef"><b>Definition:</b> xbretcod.h:28</div></div>
+<div class="ttc" id="axbretcod_8h_html_ac2606659a54111334f5b02861e533700"><div class="ttname"><a href="xbretcod_8h.html#ac2606659a54111334f5b02861e533700">XB_NOT_FOUND</a></div><div class="ttdeci">#define XB_NOT_FOUND</div><div class="ttdef"><b>Definition:</b> xbretcod.h:39</div></div>
+<div class="ttc" id="axbretcod_8h_html_ac720d5b4ec45bfd606f5865d40816e23"><div class="ttname"><a href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a></div><div class="ttdeci">#define XB_NO_ERROR</div><div class="ttdef"><b>Definition:</b> xbretcod.h:24</div></div>
+<div class="ttc" id="axbretcod_8h_html_ae687fc7d872ba0475a8477e4447f9b54"><div class="ttname"><a href="xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54">XB_NO_MEMORY</a></div><div class="ttdeci">#define XB_NO_MEMORY</div><div class="ttdef"><b>Definition:</b> xbretcod.h:25</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xblnklstord_8h.html b/docs/doxygen/html/xblnklstord_8h.html
new file mode 100644
index 0000000..765968c
--- /dev/null
+++ b/docs/doxygen/html/xblnklstord_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklstord.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xblnklstord.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xblnklstord_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xblnklstord_8h_source.html b/docs/doxygen/html/xblnklstord_8h_source.html
new file mode 100644
index 0000000..952510d
--- /dev/null
+++ b/docs/doxygen/html/xblnklstord_8h_source.html
@@ -0,0 +1,455 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnklstord.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xblnklstord.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xblnklstord_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xblnklstord.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2019,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="comment">// Ordered link list</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#ifndef __XB_XBLNKLSTORD_H__</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#define __XB_XBLNKLSTORD_H__</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#ifdef XB_LINKLIST_SUPPORT</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> </div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="keyword">class </span>XBDLLEXPORT xbLinkListOrd {</div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> xbLinkListOrd();</div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> ~xbLinkListOrd();</div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keywordtype">void</span> Clear();</div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> xbLinkListNode&lt;xbNodeType&gt; *GetHeadNode() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> xbLinkListNode&lt;xbNodeType&gt; *GetEndNode() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> xbLinkListNode&lt;xbNodeType&gt; *GetNodeForKey( <span class="keyword">const</span> xbString &amp;sKey ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> </div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> xbInt16 GetDataForKey ( <span class="keyword">const</span> xbNodeType &amp;ntKey, xbString &amp;sData );</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetDupKeys ();</div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> xbUInt32 GetNodeCnt () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> xbUInt32 GetNodeCnt ( <span class="keyword">const</span> xbString &amp;sNodeKey ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> xbInt16 InsertKey ( <span class="keyword">const</span> xbNodeType &amp;ntKey );</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> xbInt16 InsertKey ( <span class="keyword">const</span> xbNodeType &amp;ntKey, <span class="keyword">const</span> xbString &amp;sData );</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> xbInt16 InsertKey ( <span class="keyword">const</span> xbNodeType &amp;ntKey, xbUInt32 ulData );</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> </div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> KeyExists ( <span class="keyword">const</span> xbNodeType &amp;ntKey ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> xbInt16 RemoveKey ( <span class="keyword">const</span> xbNodeType &amp;ntKey );</div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> xbInt16 RemoveFromEnd ( xbNodeType &amp;ntKey );</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> xbInt16 RemoveFromFront( xbNodeType &amp;ntKey );</div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> xbInt16 RemoveFromFront();</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keywordtype">void</span> SetDupKeys ( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bAllowDupKeys );</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> xbInt16 UpdateForKey ( <span class="keyword">const</span> xbNodeType &amp;ntKey, <span class="keyword">const</span> xbString &amp;sData );</div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> </div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> xbUInt32 ulNodeCnt;</div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bAllowDupKeys;</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> xbLinkListNode&lt;xbNodeType&gt; *llStartPtr;</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> xbLinkListNode&lt;xbNodeType&gt; *llEndPtr;</div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span>};</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> </div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span>xbLinkListOrd&lt;xbNodeType&gt;::xbLinkListOrd(){</div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> bAllowDupKeys = <a class="code hl_define" href="xbtypes_8h.html#ab0ae00665298fe7f5292691cb98ec2d9">xbTrue</a>; <span class="comment">// default setting - allow duplicate keys</span></div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> ulNodeCnt = 0;</div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> llStartPtr = NULL;</div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> llEndPtr = NULL;</div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span>}</div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span>xbLinkListOrd&lt;xbNodeType&gt;::~xbLinkListOrd(){</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> Clear();</div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span>}</div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> </div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span><span class="keywordtype">void</span> xbLinkListOrd&lt;xbNodeType&gt;::Clear(){</div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> xbLinkListNode&lt;xbNodeType&gt; *cPtr = llStartPtr, *tPtr;</div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keywordflow">for</span>( xbUInt32 i = 0; i &lt; ulNodeCnt; i++ ){</div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> tPtr = cPtr;</div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> cPtr = cPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> </div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="comment">// next line might cause seg faults</span></div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="comment">// delete tPtr-&gt;GetData();</span></div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keyword">delete</span> tPtr;</div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> }</div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> ulNodeCnt = 0;</div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> llStartPtr = NULL;</div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> llEndPtr = NULL;</div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span>}</div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> </div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span>xbLinkListNode&lt;xbNodeType&gt; * xbLinkListOrd&lt;xbNodeType&gt;::GetHeadNode()<span class="keyword"> const</span>{</div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <span class="keywordflow">return</span> llStartPtr;</div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span>}</div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> </div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span>xbLinkListNode&lt;xbNodeType&gt; * xbLinkListOrd&lt;xbNodeType&gt;::GetEndNode()<span class="keyword"> const</span>{</div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <span class="keywordflow">return</span> llEndPtr;</div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span>}</div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> </div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span>xbUInt32 xbLinkListOrd&lt;xbNodeType&gt;::GetNodeCnt()<span class="keyword"> const</span>{</div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> <span class="keywordflow">return</span> ulNodeCnt;</div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span>}</div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> </div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span>xbUInt32 xbLinkListOrd&lt;xbNodeType&gt;::GetNodeCnt( <span class="keyword">const</span> xbString &amp;sNodeKey )<span class="keyword"> const</span>{</div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="comment">// won&#39;t work if nodekey is not a string</span></div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> xbLinkListNode&lt;xbNodeType&gt; *currPtr = llStartPtr;</div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="comment">// skip to sNodeKey</span></div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="keywordflow">while</span>( currPtr &amp;&amp; ( sNodeKey &gt; currPtr-&gt;GetKey())) {</div>
+<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> currPtr = currPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> }</div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="comment">// count entries for sNodeKey</span></div>
+<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> xbInt16 iKeyCnt = 0;</div>
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keywordflow">while</span>( currPtr &amp;&amp; ( sNodeKey == currPtr-&gt;GetKey())) {</div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> iKeyCnt++;</div>
+<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> currPtr = currPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> }</div>
+<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keywordflow">return</span> iKeyCnt;</div>
+<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span>}</div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> </div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> </div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span>xbInt16 xbLinkListOrd&lt;xbNodeType&gt;::InsertKey( <span class="keyword">const</span> xbNodeType &amp;ntKey ){</div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> xbString s;</div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="keywordflow">return</span> InsertKey( ntKey, s );</div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span>}</div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> </div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> </div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> </div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> </div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span>xbInt16 xbLinkListOrd&lt;xbNodeType&gt;::InsertKey( <span class="keyword">const</span> xbNodeType &amp;ntKey, xbUInt32 ul ){</div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> </div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> xbString s;</div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> s.Sprintf( <span class="stringliteral">&quot;%ld&quot;</span>, ul );</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="keywordflow">return</span> InsertKey( ntKey, s );</div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span>}</div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> </div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span>xbInt16 xbLinkListOrd&lt;xbNodeType&gt;::InsertKey( <span class="keyword">const</span> xbNodeType &amp;ntKey, <span class="keyword">const</span> xbString &amp;sData ){</div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> </div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> xbLinkListNode&lt;xbNodeType&gt; *p = <span class="keyword">new</span> xbLinkListNode&lt;xbNodeType&gt;( ntKey, sData );</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keywordflow">if</span>( p == 0 )</div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54">XB_NO_MEMORY</a>;</div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> </div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keywordflow">if</span>( ulNodeCnt &gt; 0 ){</div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> xbLinkListNode&lt;xbNodeType&gt; *currPtr = llStartPtr;</div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> xbLinkListNode&lt;xbNodeType&gt; *prevPtr = NULL;</div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> </div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="comment">// find location in the chain</span></div>
+<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <span class="keywordflow">while</span>( currPtr &amp;&amp; ntKey &gt; currPtr-&gt;GetKey() ){</div>
+<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> prevPtr = currPtr;</div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> currPtr = currPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> }</div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="keywordflow">if</span>( currPtr &amp;&amp; ntKey == currPtr-&gt;GetKey() &amp;&amp; bAllowDupKeys == 0 ){</div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="keyword">delete</span> p;</div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ad60dbb1862c0c1c2dc0464cfbfd93a34">XB_KEY_NOT_UNIQUE</a>;</div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> }</div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> </div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <span class="keywordflow">if</span>( currPtr == NULL ){</div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <span class="comment">// std::cout &lt;&lt; &quot;at the end of the chain\n&quot;;</span></div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> llEndPtr = p;</div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> prevPtr-&gt;SetNextNode( p );</div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> p-&gt;SetPrevNode( prevPtr );</div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> </div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( currPtr-&gt;GetPrevNode() == NULL ){</div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="comment">// std::cout &lt;&lt; &quot;at the beginning of the chain\n&quot;;</span></div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> p-&gt;SetNextNode( llStartPtr );</div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> llStartPtr-&gt;SetPrevNode( p );</div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> llStartPtr = p;</div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> </div>
+<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> } <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="comment">// std::cout &lt;&lt; &quot;in the middle of the chain\n&quot;;</span></div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> p-&gt;SetNextNode( currPtr ); </div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> p-&gt;SetPrevNode( currPtr-&gt;GetPrevNode());</div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> currPtr-&gt;SetPrevNode( p );</div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> prevPtr-&gt;SetNextNode( p );</div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> }</div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> } <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <span class="comment">// std::cout &lt;&lt; &quot;first addition to the chain\n&quot;;</span></div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> llStartPtr = p;</div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> llEndPtr = p;</div>
+<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> }</div>
+<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> ulNodeCnt++;</div>
+<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span>}</div>
+<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> </div>
+<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span>xbInt16 xbLinkListOrd&lt;xbNodeType&gt;::RemoveKey( <span class="keyword">const</span> xbNodeType &amp;ntKey ){</div>
+<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="comment">// Remove the first instance of ntKey from the node chain</span></div>
+<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> xbLinkListNode&lt;xbNodeType&gt; *currPtr = llStartPtr;</div>
+<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> xbLinkListNode&lt;xbNodeType&gt; *prevPtr = NULL;</div>
+<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> </div>
+<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keywordflow">while</span>( currPtr &amp;&amp; ntKey &gt; currPtr-&gt;GetKey() ){</div>
+<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> prevPtr = currPtr;</div>
+<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> currPtr = currPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> }</div>
+<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> </div>
+<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <span class="keywordflow">if</span>( currPtr &amp;&amp; ntKey == currPtr-&gt;GetKey()){</div>
+<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span><span class="comment">// ntKey = currPtr-&gt;GetKey();</span></div>
+<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <span class="keywordflow">if</span>( prevPtr == NULL ){ <span class="comment">// this is the first node</span></div>
+<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> llStartPtr = currPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="comment">// next line fails</span></div>
+<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="keywordflow">if</span>( llStartPtr ){</div>
+<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> llStartPtr-&gt;SetPrevNode( NULL );</div>
+<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> }</div>
+<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <span class="keyword">delete</span> currPtr;</div>
+<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> } <span class="keywordflow">else</span> <span class="keywordflow">if</span>( currPtr-&gt;GetNextNode() == NULL ){ <span class="comment">// this is the last node</span></div>
+<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> llEndPtr = prevPtr;</div>
+<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> prevPtr-&gt;SetNextNode( NULL );</div>
+<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keyword">delete</span> currPtr;</div>
+<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> } <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> </div>
+<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> prevPtr-&gt;SetNextNode( currPtr-&gt;GetNextNode());</div>
+<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> currPtr-&gt;GetNextNode()-&gt;SetPrevNode( prevPtr );</div>
+<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> <span class="keyword">delete</span> currPtr;</div>
+<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> }</div>
+<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> } <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac2606659a54111334f5b02861e533700">XB_NOT_FOUND</a>;</div>
+<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> }</div>
+<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span>}</div>
+<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> </div>
+<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span>xbInt16 xbLinkListOrd&lt;xbNodeType&gt;::RemoveFromFront( xbNodeType &amp;ntKey ){</div>
+<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> </div>
+<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> <span class="keywordflow">if</span>( ulNodeCnt &lt;= 0 )</div>
+<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">XB_INVALID_NODELINK</a>;</div>
+<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> xbLinkListNode&lt;xbNodeType&gt; *p = llStartPtr;</div>
+<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> llStartPtr = p-&gt;GetNextNode();</div>
+<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> <span class="keywordflow">if</span>( llStartPtr )</div>
+<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> llStartPtr-&gt;SetPrevNode( NULL );</div>
+<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> ntKey = p-&gt;GetKey();</div>
+<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <span class="keyword">delete</span> p;</div>
+<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span>}</div>
+<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> </div>
+<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span>xbInt16 xbLinkListOrd&lt;xbNodeType&gt;::RemoveFromFront(){</div>
+<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> </div>
+<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> <span class="keywordflow">if</span>( ulNodeCnt &lt;= 0 )</div>
+<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">XB_INVALID_NODELINK</a>;</div>
+<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> xbLinkListNode&lt;xbNodeType&gt; *p = llStartPtr;</div>
+<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> llStartPtr = p-&gt;GetNextNode();</div>
+<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="keywordflow">if</span>( llStartPtr )</div>
+<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> llStartPtr-&gt;SetPrevNode( NULL );</div>
+<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> </div>
+<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> <span class="keywordflow">if</span>( p-&gt;GetKey())</div>
+<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keyword">delete</span> p-&gt;GetKey();</div>
+<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> </div>
+<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <span class="keyword">delete</span> p;</div>
+<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> </div>
+<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span>}</div>
+<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> </div>
+<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> </div>
+<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span>xbInt16 xbLinkListOrd&lt;xbNodeType&gt;::RemoveFromEnd( xbNodeType &amp;ntKey ){</div>
+<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> </div>
+<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="keywordflow">if</span>( ulNodeCnt &lt;= 0 )</div>
+<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">XB_INVALID_NODELINK</a>;</div>
+<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> xbLinkListNode&lt;xbNodeType&gt; *p = llEndPtr;</div>
+<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> llEndPtr = p-&gt;GetPrevNode();</div>
+<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> llEndPtr-&gt;SetNextNode( NULL );</div>
+<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> ntKey = p-&gt;GetKey();</div>
+<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keyword">delete</span> p;</div>
+<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> ulNodeCnt--;</div>
+<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span>}</div>
+<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> </div>
+<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span><a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xbLinkListOrd&lt;xbNodeType&gt;::GetDupKeys(){</div>
+<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> <span class="keywordflow">return</span> bAllowDupKeys;</div>
+<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span>}</div>
+<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> </div>
+<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span><span class="keywordtype">void</span> xbLinkListOrd&lt;xbNodeType&gt;::SetDupKeys( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bAllowDupKeys ){</div>
+<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> this-&gt;bAllowDupKeys = bAllowDupKeys;</div>
+<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span>}</div>
+<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> </div>
+<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> </div>
+<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span><a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> xbLinkListOrd&lt;xbNodeType&gt;::KeyExists( <span class="keyword">const</span> xbNodeType &amp;ntKey )<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> </div>
+<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> xbLinkListNode&lt;xbNodeType&gt; *currPtr = llStartPtr;</div>
+<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> <span class="keywordflow">while</span>( currPtr &amp;&amp; ntKey &gt; currPtr-&gt;GetKey() ){</div>
+<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> currPtr = currPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> }</div>
+<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> <span class="keywordflow">if</span>( currPtr &amp;&amp; ntKey == currPtr-&gt;GetKey()){</div>
+<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbtypes_8h.html#ab0ae00665298fe7f5292691cb98ec2d9">xbTrue</a>;</div>
+<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> } <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc">xbFalse</a>;</div>
+<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> }</div>
+<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span>}</div>
+<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> </div>
+<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> </div>
+<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span>xbInt16 xbLinkListOrd&lt;xbNodeType&gt;::GetDataForKey( <span class="keyword">const</span> xbNodeType &amp;ntKey, xbString &amp;sData ){</div>
+<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> </div>
+<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> xbLinkListNode&lt;xbNodeType&gt; *currPtr = llStartPtr;</div>
+<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="keywordflow">while</span>( currPtr &amp;&amp; ntKey &gt; currPtr-&gt;GetKey() ){</div>
+<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> currPtr = currPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> }</div>
+<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> </div>
+<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> <span class="keywordflow">if</span>( currPtr &amp;&amp; ntKey == currPtr-&gt;GetKey()){</div>
+<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> sData = currPtr-&gt;GetData();</div>
+<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> } <span class="keywordflow">else</span> {</div>
+<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac2606659a54111334f5b02861e533700">XB_NOT_FOUND</a>;</div>
+<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> }</div>
+<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span>}</div>
+<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> </div>
+<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> </div>
+<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span>xbInt16 xbLinkListOrd&lt;xbNodeType&gt;::UpdateForKey( <span class="keyword">const</span> xbNodeType &amp;ntKey, <span class="keyword">const</span> xbString &amp;sData ){</div>
+<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> </div>
+<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> <span class="keywordflow">if</span>( ulNodeCnt == 0 )</div>
+<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> <span class="keywordflow">return</span> InsertKey( ntKey, sData );</div>
+<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> xbLinkListNode&lt;xbNodeType&gt; * currPtr = llStartPtr;</div>
+<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> xbLinkListNode&lt;xbNodeType&gt; * prevPtr = NULL;</div>
+<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> <span class="keywordflow">while</span>( currPtr &amp;&amp; ntKey &gt; currPtr-&gt;GetKey() ) {</div>
+<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> prevPtr = currPtr;</div>
+<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> currPtr = currPtr-&gt;GetNextNode();</div>
+<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> }</div>
+<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> </div>
+<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> <span class="keywordflow">if</span>( currPtr &amp;&amp; ntKey == currPtr-&gt;GetKey() ) {</div>
+<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> xbLinkListNode&lt;xbNodeType&gt; *p = <span class="keyword">new</span> xbLinkListNode&lt;xbNodeType&gt;( ntKey, sData );</div>
+<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> <span class="keywordflow">if</span>( prevPtr )</div>
+<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> prevPtr-&gt;SetNextNode( p );</div>
+<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> <span class="keywordflow">else</span></div>
+<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> llStartPtr = p;</div>
+<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> p-&gt;SetNextNode( currPtr-&gt;GetNextNode() );</div>
+<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> p-&gt;SetPrevNode( currPtr-&gt;GetPrevNode() );</div>
+<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> <span class="keyword">delete</span> currPtr;</div>
+<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> <span class="keywordflow">return</span> <a class="code hl_define" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>;</div>
+<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> }</div>
+<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> </div>
+<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> <span class="keywordflow">return</span> InsertKey( ntKey, sData );</div>
+<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> </div>
+<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span><span class="comment">// return 0;</span></div>
+<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span>}</div>
+<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> </div>
+<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span>} <span class="comment">// namespace</span></div>
+<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> </div>
+<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span><span class="preprocessor">#endif </span><span class="comment">// XB_LINKLIST_SUPPORT</span></div>
+<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span><span class="preprocessor">#endif </span><span class="comment">// XB_XBLNKLSTORD_H__</span></div>
+<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> </div>
+<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> </div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+<div class="ttc" id="axbretcod_8h_html_a13e6876470bd34c8c4e5533f115e04eb"><div class="ttname"><a href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">XB_INVALID_NODELINK</a></div><div class="ttdeci">#define XB_INVALID_NODELINK</div><div class="ttdef"><b>Definition:</b> xbretcod.h:28</div></div>
+<div class="ttc" id="axbretcod_8h_html_ac2606659a54111334f5b02861e533700"><div class="ttname"><a href="xbretcod_8h.html#ac2606659a54111334f5b02861e533700">XB_NOT_FOUND</a></div><div class="ttdeci">#define XB_NOT_FOUND</div><div class="ttdef"><b>Definition:</b> xbretcod.h:39</div></div>
+<div class="ttc" id="axbretcod_8h_html_ac720d5b4ec45bfd606f5865d40816e23"><div class="ttname"><a href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a></div><div class="ttdeci">#define XB_NO_ERROR</div><div class="ttdef"><b>Definition:</b> xbretcod.h:24</div></div>
+<div class="ttc" id="axbretcod_8h_html_ad60dbb1862c0c1c2dc0464cfbfd93a34"><div class="ttname"><a href="xbretcod_8h.html#ad60dbb1862c0c1c2dc0464cfbfd93a34">XB_KEY_NOT_UNIQUE</a></div><div class="ttdeci">#define XB_KEY_NOT_UNIQUE</div><div class="ttdef"><b>Definition:</b> xbretcod.h:29</div></div>
+<div class="ttc" id="axbretcod_8h_html_ae687fc7d872ba0475a8477e4447f9b54"><div class="ttname"><a href="xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54">XB_NO_MEMORY</a></div><div class="ttdeci">#define XB_NO_MEMORY</div><div class="ttdef"><b>Definition:</b> xbretcod.h:25</div></div>
+<div class="ttc" id="axbtypes_8h_html_ab0ae00665298fe7f5292691cb98ec2d9"><div class="ttname"><a href="xbtypes_8h.html#ab0ae00665298fe7f5292691cb98ec2d9">xbTrue</a></div><div class="ttdeci">#define xbTrue</div><div class="ttdef"><b>Definition:</b> xbtypes.h:28</div></div>
+<div class="ttc" id="axbtypes_8h_html_adc4b6ca5ad299f63675136d9e03938cc"><div class="ttname"><a href="xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc">xbFalse</a></div><div class="ttdeci">#define xbFalse</div><div class="ttdef"><b>Definition:</b> xbtypes.h:29</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xblnknod_8h.html b/docs/doxygen/html/xblnknod_8h.html
new file mode 100644
index 0000000..89c9767
--- /dev/null
+++ b/docs/doxygen/html/xblnknod_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnknod.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xblnknod.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xblnknod_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xblnknod_8h_source.html b/docs/doxygen/html/xblnknod_8h_source.html
new file mode 100644
index 0000000..390e109
--- /dev/null
+++ b/docs/doxygen/html/xblnknod_8h_source.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblnknod.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xblnknod.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xblnknod_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xblnknod.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_XBLNKNOD_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_XBLNKNOD_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#ifdef XB_LINKLIST_SUPPORT</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="keyword">class </span>XBDLLEXPORT xbLinkListNode {</div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> xbLinkListNode( <span class="keyword">const</span> xbNodeType &amp; );</div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> xbLinkListNode( <span class="keyword">const</span> xbNodeType &amp;, <span class="keyword">const</span> xbString &amp; );</div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> xbNodeType GetKey() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> xbString &amp;GetData();</div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> xbLinkListNode&lt;xbNodeType&gt; *GetNextNode() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> xbLinkListNode&lt;xbNodeType&gt; *GetPrevNode() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> <span class="keywordtype">void</span> SetNextNode( xbLinkListNode&lt;xbNodeType&gt; *llNext );</div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keywordtype">void</span> SetPrevNode( xbLinkListNode&lt;xbNodeType&gt; *llPrev );</div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> xbNodeType ntKey;</div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> xbString sData;</div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> xbLinkListNode *llNext;</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> xbLinkListNode *llPrev;</div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span>};</div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> xbLinkListNode&lt;xbNodeType&gt;::xbLinkListNode( <span class="keyword">const</span> xbNodeType &amp;key ){</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> ntKey = key;</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> llNext = NULL;</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> llPrev = NULL;</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> }</div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> xbLinkListNode&lt;xbNodeType&gt;::xbLinkListNode( <span class="keyword">const</span> xbNodeType &amp;key, <span class="keyword">const</span> xbString &amp;s ){</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> ntKey = key;</div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> sData = s;</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> llNext = NULL;</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> llPrev = NULL;</div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> }</div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> xbNodeType xbLinkListNode&lt;xbNodeType&gt;::GetKey()<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keywordflow">return</span> ntKey;</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> }</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> </div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> xbString &amp;xbLinkListNode&lt;xbNodeType&gt;::GetData(){</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="keywordflow">return</span> sData;</div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> }</div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> </div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> xbLinkListNode&lt;xbNodeType&gt; *xbLinkListNode&lt;xbNodeType&gt;::GetNextNode()<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <span class="keywordflow">return</span> llNext;</div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> }</div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> </div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> xbLinkListNode&lt;xbNodeType&gt; *xbLinkListNode&lt;xbNodeType&gt;::GetPrevNode()<span class="keyword"> const </span>{</div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordflow">return</span> llPrev;</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> }</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> </div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keywordtype">void</span> xbLinkListNode&lt;xbNodeType&gt;::SetNextNode( xbLinkListNode&lt;xbNodeType&gt; *lln ){</div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> llNext = lln;</div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> }</div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> </div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keyword">template</span>&lt;<span class="keyword">class</span> xbNodeType&gt;</div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <span class="keywordtype">void</span> xbLinkListNode&lt;xbNodeType&gt;::SetPrevNode( xbLinkListNode&lt;xbNodeType&gt; *llp ){</div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> llPrev = llp;</div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> }</div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> </div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span>} <span class="comment">// namespace</span></div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span><span class="preprocessor">#endif </span><span class="comment">// XB_LINKLIST_SUPPORT</span></div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span><span class="preprocessor">#endif </span><span class="comment">// XB_XBLNKNOD_H__</span></div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> </div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> </div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xblog_8cpp.html b/docs/doxygen/html/xblog_8cpp.html
new file mode 100644
index 0000000..abe8926
--- /dev/null
+++ b/docs/doxygen/html/xblog_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xblog.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xblog.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xblog_8h.html b/docs/doxygen/html/xblog_8h.html
new file mode 100644
index 0000000..0cb4057
--- /dev/null
+++ b/docs/doxygen/html/xblog_8h.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblog.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle"><div class="title">xblog.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xblog_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xblog_8h_source.html b/docs/doxygen/html/xblog_8h_source.html
new file mode 100644
index 0000000..a33b79f
--- /dev/null
+++ b/docs/doxygen/html/xblog_8h_source.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xblog.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xblog.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xblog_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xblog.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#ifndef __XB_XBLOG_H__</span></div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#define __XB_XBLOG_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#pragma interface</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> </div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#ifdef XB_LOGGING_SUPPORT</span></div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_variable" href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xbLog</a> : <span class="keyword">public</span> xbFile {</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <a class="code hl_variable" href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xbLog</a>();</div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> <a class="code hl_variable" href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xbLog</a>( <span class="keyword">const</span> xbString &amp;sLogFileName );</div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> ~xbLog();</div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> </div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> xbInt16 LogClose ();</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> xbInt16 LogGetStatus ();</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> xbInt16 LogOpen ();</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> <span class="keywordtype">void</span> LogSetStatus ( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bLogStatus );</div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="keywordtype">void</span> LogSetLogSize( <span class="keywordtype">size_t</span> lSize ); <span class="comment">// { LogSize = size; }</span></div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> xbInt16 LogWrite ( <span class="keyword">const</span> xbString &amp;LogEntry, xbInt16 iOutputOption = 0 );</div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> xbInt16 LogWriteBytes( xbUInt32 lByteCnt, <span class="keyword">const</span> <span class="keywordtype">char</span> *p );</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> </div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bLoggingStatus; <span class="comment">// false = logging off</span></div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="comment">// true = logging on</span></div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="keywordtype">size_t</span> lLogSize;</div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> xbInt16 iShareMode;</div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span>};</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="preprocessor">#endif </span><span class="comment">// XB_LOGGING_SUPPORT</span></div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span>} <span class="comment">// namespace</span></div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="preprocessor">#endif </span><span class="comment">// XB_XBLOG_H__</span></div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> </div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a4a31fbe9110c9e55495ce71e642d785c"><div class="ttname"><a href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xb::xbLog</a></div><div class="ttdeci">class XBDLLEXPORT xbLog</div><div class="ttdef"><b>Definition:</b> xbxbase.h:26</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbmemo3_8cpp.html b/docs/doxygen/html/xbmemo3_8cpp.html
new file mode 100644
index 0000000..31e154c
--- /dev/null
+++ b/docs/doxygen/html/xbmemo3_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo3.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbmemo3.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbmemo4_8cpp.html b/docs/doxygen/html/xbmemo4_8cpp.html
new file mode 100644
index 0000000..90fbac2
--- /dev/null
+++ b/docs/doxygen/html/xbmemo4_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo4.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbmemo4.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbmemo_8cpp.html b/docs/doxygen/html/xbmemo_8cpp.html
new file mode 100644
index 0000000..5e311f8
--- /dev/null
+++ b/docs/doxygen/html/xbmemo_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbmemo.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbmemo.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbmemo_8h.html b/docs/doxygen/html/xbmemo_8h.html
new file mode 100644
index 0000000..e3ed820
--- /dev/null
+++ b/docs/doxygen/html/xbmemo_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbmemo.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbmemo.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbmemo_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbmemo_8h_source.html b/docs/doxygen/html/xbmemo_8h_source.html
new file mode 100644
index 0000000..ad2b055
--- /dev/null
+++ b/docs/doxygen/html/xbmemo_8h_source.html
@@ -0,0 +1,262 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbmemo.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbmemo.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbmemo_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbmemo.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_XBMEMO_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_XBMEMO_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="comment">// dont use &quot;#pragma interface&quot; with abstract classes</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="comment">// #ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="comment">// #pragma interface</span></div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="comment">// #endif</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#ifdef XB_MEMO_SUPPORT</span></div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> </div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> </div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="keyword">class </span>XBDLLEXPORT xbMemo : <span class="keyword">public</span> xbFile {</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> </div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> xbMemo( <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf, xbString <span class="keyword">const</span> &amp;sFileName );</div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> </div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="comment">/* virtual methods */</span></div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keyword">virtual</span> ~xbMemo();</div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keyword">virtual</span> xbInt16 Abort () = 0;</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <span class="keyword">virtual</span> xbInt16 CloseMemoFile ();</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> <span class="keyword">virtual</span> xbInt16 Commit () = 0;</div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="preprocessor"> #ifdef XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="keyword">virtual</span> xbInt16 LockMemo ( xbInt16 iLockFunction );</div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <span class="keyword">virtual</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetMemoLocked () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> </div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="comment">/* pure virtual methods */</span></div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <span class="keyword">virtual</span> xbInt16 CreateMemoFile () = 0;</div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <span class="keyword">virtual</span> xbInt16 GetMemoField ( xbInt16 iFieldNo, xbString &amp;sMemoData ) = 0;</div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keyword">virtual</span> xbInt16 GetMemoFieldLen( xbInt16 iFieldNo, xbUInt32 &amp;ulMemoFieldLen ) = 0;</div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keyword">virtual</span> xbInt16 OpenMemoFile () = 0;</div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keyword">virtual</span> xbInt16 GetMemoFileType();</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keyword">virtual</span> xbInt16 PackMemo ( <span class="keywordtype">void</span> (*memoStatusFunc)(xbUInt32 ulItemNum, xbUInt32 ulNumItems)) = 0;</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keyword">virtual</span> xbInt16 UpdateMemoField( xbInt16 iFieldNo, <span class="keyword">const</span> xbString &amp;sMemoData ) = 0;</div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> </div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <span class="keyword">virtual</span> xbInt16 DumpMemoFreeChain() = 0;</div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keyword">virtual</span> xbInt16 DumpMemoHeader () = 0;</div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> </div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <span class="comment">// *********** FIXME *************</span></div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <span class="comment">// next two methods should be protected but are called in the xb_test_xxxx programs testing routines</span></div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> <span class="comment">// so for now, they are kept as public</span></div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="keyword">virtual</span> xbInt16 CalcLastDataBlock ( xbUInt32 &amp;lLastDataBlock );</div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="keyword">virtual</span> xbInt16 GetHdrNextBlock ( xbUInt32 &amp;ulBlockNo );</div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keyword">friend</span> <span class="keyword">class </span><a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a>;</div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> </div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keyword">virtual</span> xbInt16 ReadDbtHeader ( xbInt16 iOption ) = 0;</div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="keyword">virtual</span> xbInt16 UpdateHeaderName () = 0;</div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keyword">virtual</span> xbInt16 UpdateHeadNextNode();</div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="keyword">virtual</span> xbInt16 Zap () = 0;</div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> </div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf; <span class="comment">/* pointer to related dbf instance */</span></div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <span class="keywordtype">char</span> cVersion; <span class="comment">/* byte 16 off the header block, 0x03 for V3, version IV - ? */</span></div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> xbInt16 iMemoFileType; <span class="comment">/* 3 = version III, 4 = version IV */</span></div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> xbUInt32 ulHdrNextBlock; <span class="comment">/* next available block , bytes 0-3 of the memo header */</span></div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="keywordtype">void</span> * mbb; <span class="comment">/* memo block buffer */</span></div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> </div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> </div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> </div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span><span class="preprocessor"> #ifdef XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bFileLocked; <span class="comment">/* memo file locked */</span></div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> </div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span>};</div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> </div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> </div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span><span class="preprocessor">#ifdef XB_DBF3_SUPPORT</span></div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> </div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span><span class="keyword">class </span>XBDLLEXPORT xbMemoDbt3 : <span class="keyword">public</span> xbMemo {</div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> xbMemoDbt3( <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf, xbString <span class="keyword">const</span> &amp;sFileName );</div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> ~xbMemoDbt3();</div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keyword">virtual</span> xbInt16 Abort ();</div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="keyword">virtual</span> xbInt16 Commit ();</div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="keyword">virtual</span> xbInt16 CreateMemoFile ();</div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keyword">virtual</span> xbInt16 GetMemoField ( xbInt16 iFieldNo, xbString &amp;sMemoData );</div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keyword">virtual</span> xbInt16 GetMemoFieldLen( xbInt16 iFieldNo, xbUInt32 &amp;ulMemoFieldLen );</div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="keyword">virtual</span> xbInt16 OpenMemoFile ();</div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keyword">virtual</span> xbInt16 PackMemo ( <span class="keywordtype">void</span> (*memoStatusFunc) (xbUInt32 ulItemNum, xbUInt32 ulNumItems));</div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keyword">virtual</span> xbInt16 UpdateMemoField( xbInt16 iFieldNo, <span class="keyword">const</span> xbString &amp;sMemoData );</div>
+<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> </div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keyword">virtual</span> xbInt16 DumpMemoFreeChain();</div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="keyword">virtual</span> xbInt16 DumpMemoHeader ();</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> </div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> <span class="keyword">virtual</span> xbInt16 ReadDbtHeader( xbInt16 iOption );</div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> <span class="keyword">virtual</span> xbInt16 UpdateHeaderName();</div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keyword">virtual</span> xbInt16 Zap();</div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> </div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span>};</div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> </div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> </div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span><span class="preprocessor">#ifdef XB_DBF4_SUPPORT</span></div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> </div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> </div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span><span class="keyword">class </span>XBDLLEXPORT xbMemoDbt4 : <span class="keyword">public</span> xbMemo {</div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> xbMemoDbt4( <a class="code hl_variable" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xbDbf</a> *dbf, xbString <span class="keyword">const</span> &amp;sFileName );</div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> ~xbMemoDbt4();</div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <span class="keyword">virtual</span> xbInt16 Abort ();</div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <span class="keyword">virtual</span> xbInt16 Commit ();</div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="keyword">virtual</span> xbInt16 CreateMemoFile ();</div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> </div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <span class="keyword">virtual</span> xbInt16 GetMemoField ( xbInt16 iFieldNo, xbString &amp;sMemoData );</div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="keyword">virtual</span> xbInt16 GetMemoFieldLen ( xbInt16 iFieldNo, xbUInt32 &amp;ulMemoFieldLen );</div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <span class="keyword">virtual</span> xbInt16 GetMemoFieldLen ( xbInt16 iFieldNo, xbUInt32 &amp;ulMemoFieldLen, xbUInt32 &amp;lBlockNo );</div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <span class="keyword">virtual</span> xbInt16 OpenMemoFile ();</div>
+<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <span class="keyword">virtual</span> xbInt16 PackMemo ( <span class="keywordtype">void</span> (*memoStatusFunc) (xbUInt32 ulItemNum, xbUInt32 ulNumItems));</div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <span class="keyword">virtual</span> xbInt16 UpdateMemoField ( xbInt16 iFieldNo, <span class="keyword">const</span> xbString &amp;sMemoData );</div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> </div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> <span class="keyword">virtual</span> xbInt16 DumpMemoFreeChain ();</div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="keyword">virtual</span> xbInt16 DumpMemoHeader ();</div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="keyword">virtual</span> xbInt16 DumpMemoInternals ();</div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keyword">virtual</span> xbInt16 ReadFreeBlockHeader( xbUInt32 ulBlockNo, xbUInt32 &amp;ulNextBlock, xbUInt32 &amp;ulFreeBlockCnt );</div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> </div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <span class="keyword">virtual</span> xbInt16 FindBlockSetInChain( xbUInt32 ulBlocksNeeded, xbUInt32 &amp;ulLastDataBlock, xbUInt32 &amp;ulLocation, xbUInt32 &amp;ulPrevNode, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bFound );</div>
+<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> <span class="keyword">virtual</span> xbInt16 FreeMemoBlockChain( xbUInt32 ulBlockNo );</div>
+<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keyword">virtual</span> xbInt16 FreeMemoBlockChain( xbUInt32 ulBlockNo, xbUInt32 &amp;ulLastDataBlock );</div>
+<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="keyword">virtual</span> xbInt16 GetBlockSetFromChain( xbUInt32 ulBlocksNeeded, xbUInt32 ulLocation, xbUInt32 ulPrevNode );</div>
+<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <span class="keyword">virtual</span> xbInt16 ReadDbtHeader( xbInt16 iOption );</div>
+<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> <span class="keyword">virtual</span> xbInt16 ReadBlockHeader( xbUInt32 ulBlockNo, xbInt16 iOption );</div>
+<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <span class="keyword">virtual</span> xbInt16 UpdateHeaderName ();</div>
+<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="keyword">virtual</span> xbInt16 WriteBlockHeader( xbUInt32 ulBlockNo, xbInt16 iOption );</div>
+<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="keyword">virtual</span> xbInt16 Zap();</div>
+<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> </div>
+<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> xbString sDbfFileNameWoExt;</div>
+<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> xbUInt32 ulNextFreeBlock;</div>
+<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> xbUInt32 ulFreeBlockCnt;</div>
+<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> xbInt16 iField1;</div>
+<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> xbInt16 iStartPos;</div>
+<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> xbUInt32 ulFieldLen;</div>
+<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> </div>
+<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> xbLinkList&lt;xbUInt32&gt; llOldBlocks; <span class="comment">// list of previously used memo blocks for field, used by Commit() / Abort()</span></div>
+<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> xbLinkList&lt;xbUInt32&gt; llNewBlocks; <span class="comment">// list of newly updated memo blocks for field, used by Commit() / Abort()</span></div>
+<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> </div>
+<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span>};</div>
+<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> </div>
+<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> </div>
+<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span>} <span class="comment">/* namespace xb */</span></div>
+<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span><span class="preprocessor">#endif </span><span class="comment">/* XB_MEMO_SUPPORT */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_MEMO_H__ */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> </div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+<div class="ttc" id="anamespacexb_html_ab2eae4b4732466698a7fdd89d77ba53b"><div class="ttname"><a href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xb::xbDbf</a></div><div class="ttdeci">class XBDLLEXPORT xbDbf</div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:28</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbretcod_8h.html b/docs/doxygen/html/xbretcod_8h.html
new file mode 100644
index 0000000..7cda0d2
--- /dev/null
+++ b/docs/doxygen/html/xbretcod_8h.html
@@ -0,0 +1,958 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbretcod.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#define-members">Macros</a> </div>
+ <div class="headertitle"><div class="title">xbretcod.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbretcod_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ac720d5b4ec45bfd606f5865d40816e23"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23">XB_NO_ERROR</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:ac720d5b4ec45bfd606f5865d40816e23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae687fc7d872ba0475a8477e4447f9b54"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54">XB_NO_MEMORY</a>&#160;&#160;&#160;-100</td></tr>
+<tr class="separator:ae687fc7d872ba0475a8477e4447f9b54"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1cd0baf346cad686fa4dd11f700012a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#af1cd0baf346cad686fa4dd11f700012a">XB_INVALID_OPTION</a>&#160;&#160;&#160;-101</td></tr>
+<tr class="separator:af1cd0baf346cad686fa4dd11f700012a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac18036408d10e5eee1bf76cf92352b95"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ac18036408d10e5eee1bf76cf92352b95">XB_DUP_TABLE_OR_ALIAS</a>&#160;&#160;&#160;-110</td></tr>
+<tr class="separator:ac18036408d10e5eee1bf76cf92352b95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13e6876470bd34c8c4e5533f115e04eb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb">XB_INVALID_NODELINK</a>&#160;&#160;&#160;-120</td></tr>
+<tr class="separator:a13e6876470bd34c8c4e5533f115e04eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad60dbb1862c0c1c2dc0464cfbfd93a34"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ad60dbb1862c0c1c2dc0464cfbfd93a34">XB_KEY_NOT_UNIQUE</a>&#160;&#160;&#160;-121</td></tr>
+<tr class="separator:ad60dbb1862c0c1c2dc0464cfbfd93a34"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54303a9677dbd5342233f33dd08c64d0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a54303a9677dbd5342233f33dd08c64d0">XB_FILE_EXISTS</a>&#160;&#160;&#160;-200</td></tr>
+<tr class="separator:a54303a9677dbd5342233f33dd08c64d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2ff8301503f446c6a5f6510090e520f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#aa2ff8301503f446c6a5f6510090e520f">XB_ALREADY_OPEN</a>&#160;&#160;&#160;-201</td></tr>
+<tr class="separator:aa2ff8301503f446c6a5f6510090e520f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8104510b347c87998eadd0b27201e3c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a8104510b347c87998eadd0b27201e3c2">XB_DBF_FILE_NOT_OPEN</a>&#160;&#160;&#160;-202</td></tr>
+<tr class="separator:a8104510b347c87998eadd0b27201e3c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad090af330c93111d12f6de35dbb065bc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ad090af330c93111d12f6de35dbb065bc">XB_FILE_NOT_FOUND</a>&#160;&#160;&#160;-203</td></tr>
+<tr class="separator:ad090af330c93111d12f6de35dbb065bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7b9130a5f1df9975cfeaf6241933596"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ab7b9130a5f1df9975cfeaf6241933596">XB_FILE_TYPE_NOT_SUPPORTED</a>&#160;&#160;&#160;-204</td></tr>
+<tr class="separator:ab7b9130a5f1df9975cfeaf6241933596"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a373f30b2efcbbab9f6d060fb3fe8cba3"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a373f30b2efcbbab9f6d060fb3fe8cba3">XB_RENAME_ERROR</a>&#160;&#160;&#160;-205</td></tr>
+<tr class="separator:a373f30b2efcbbab9f6d060fb3fe8cba3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a418c047353bc683d0fd6ecbbdd5b7885"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a418c047353bc683d0fd6ecbbdd5b7885">XB_INVALID_OBJECT</a>&#160;&#160;&#160;-206</td></tr>
+<tr class="separator:a418c047353bc683d0fd6ecbbdd5b7885"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9474b400f647bdefbbb07e5177e8d7a1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a9474b400f647bdefbbb07e5177e8d7a1">XB_NOT_OPEN</a>&#160;&#160;&#160;-207</td></tr>
+<tr class="separator:a9474b400f647bdefbbb07e5177e8d7a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2606659a54111334f5b02861e533700"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ac2606659a54111334f5b02861e533700">XB_NOT_FOUND</a>&#160;&#160;&#160;-208</td></tr>
+<tr class="separator:ac2606659a54111334f5b02861e533700"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaab55236993a1d3acb29206252a904c8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#aaab55236993a1d3acb29206252a904c8">XB_OPEN_ERROR</a>&#160;&#160;&#160;-209</td></tr>
+<tr class="separator:aaab55236993a1d3acb29206252a904c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a030684d5541cf6127a76d81b0684b235"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a030684d5541cf6127a76d81b0684b235">XB_CLOSE_ERROR</a>&#160;&#160;&#160;-210</td></tr>
+<tr class="separator:a030684d5541cf6127a76d81b0684b235"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0455ad8719e153b08ec68b10c81e9f41"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a0455ad8719e153b08ec68b10c81e9f41">XB_SEEK_ERROR</a>&#160;&#160;&#160;-211</td></tr>
+<tr class="separator:a0455ad8719e153b08ec68b10c81e9f41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adbd40585db8bb748d191f94a33bac710"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#adbd40585db8bb748d191f94a33bac710">XB_READ_ERROR</a>&#160;&#160;&#160;-212</td></tr>
+<tr class="separator:adbd40585db8bb748d191f94a33bac710"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef34ebe6726057f805d6063130280549"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#aef34ebe6726057f805d6063130280549">XB_WRITE_ERROR</a>&#160;&#160;&#160;-213</td></tr>
+<tr class="separator:aef34ebe6726057f805d6063130280549"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b47031e90c3f86306c7058e4490d3b7"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a8b47031e90c3f86306c7058e4490d3b7">XB_EOF</a>&#160;&#160;&#160;-214</td></tr>
+<tr class="separator:a8b47031e90c3f86306c7058e4490d3b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade5f3a7cf1467d12761e4e21b5e4200f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ade5f3a7cf1467d12761e4e21b5e4200f">XB_BOF</a>&#160;&#160;&#160;-215</td></tr>
+<tr class="separator:ade5f3a7cf1467d12761e4e21b5e4200f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1bd22921612389c37f6b2eac438c62c5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a1bd22921612389c37f6b2eac438c62c5">XB_INVALID_BLOCK_SIZE</a>&#160;&#160;&#160;-216</td></tr>
+<tr class="separator:a1bd22921612389c37f6b2eac438c62c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e13b529b486c43ca600ce7d8ddbf3c2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a4e13b529b486c43ca600ce7d8ddbf3c2">XB_INVALID_BLOCK_NO</a>&#160;&#160;&#160;-217</td></tr>
+<tr class="separator:a4e13b529b486c43ca600ce7d8ddbf3c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0fd212f912b2e62700a66bae95bd73a1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a0fd212f912b2e62700a66bae95bd73a1">XB_INVALID_RECORD</a>&#160;&#160;&#160;-218</td></tr>
+<tr class="separator:a0fd212f912b2e62700a66bae95bd73a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada15513935d5ede9216f07c0438f34d2"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ada15513935d5ede9216f07c0438f34d2">XB_DELETE_FAILED</a>&#160;&#160;&#160;-219</td></tr>
+<tr class="separator:ada15513935d5ede9216f07c0438f34d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53891c95a78483704d2a8e14c4499f92"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a53891c95a78483704d2a8e14c4499f92">XB_INVALID_TABLE_NAME</a>&#160;&#160;&#160;-220</td></tr>
+<tr class="separator:a53891c95a78483704d2a8e14c4499f92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18068d0cbe0c7a1b4dd3176220180c29"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a18068d0cbe0c7a1b4dd3176220180c29">XB_EMPTY</a>&#160;&#160;&#160;-221</td></tr>
+<tr class="separator:a18068d0cbe0c7a1b4dd3176220180c29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59f1a8a6aca19595c2d1804349a24850"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a59f1a8a6aca19595c2d1804349a24850">XB_LIMIT_REACHED</a>&#160;&#160;&#160;-222</td></tr>
+<tr class="separator:a59f1a8a6aca19595c2d1804349a24850"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a79e2588f067d6e236c0e5a2c0728ba9f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a79e2588f067d6e236c0e5a2c0728ba9f">XB_INVALID_FIELD_TYPE</a>&#160;&#160;&#160;-300</td></tr>
+<tr class="separator:a79e2588f067d6e236c0e5a2c0728ba9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09d6c08a44316f551108a74003efd381"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a09d6c08a44316f551108a74003efd381">XB_INVALID_FIELD_NO</a>&#160;&#160;&#160;-301</td></tr>
+<tr class="separator:a09d6c08a44316f551108a74003efd381"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb40bbed323ecb369dd430a2e1242f9a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#afb40bbed323ecb369dd430a2e1242f9a">XB_INVALID_DATA</a>&#160;&#160;&#160;-302</td></tr>
+<tr class="separator:afb40bbed323ecb369dd430a2e1242f9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59403978784130834cf39434cb73f96e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a59403978784130834cf39434cb73f96e">XB_INVALID_FIELD_NAME</a>&#160;&#160;&#160;-303</td></tr>
+<tr class="separator:a59403978784130834cf39434cb73f96e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a187c50745f51bfe4aa6f70a92f16c59f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a187c50745f51bfe4aa6f70a92f16c59f">XB_INVALID_MEMO_FIELD</a>&#160;&#160;&#160;-304</td></tr>
+<tr class="separator:a187c50745f51bfe4aa6f70a92f16c59f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a34180b2e2bd350ba2ebcdd1335e15d7e"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a34180b2e2bd350ba2ebcdd1335e15d7e">XB_INVALID_FIELD</a>&#160;&#160;&#160;-305</td></tr>
+<tr class="separator:a34180b2e2bd350ba2ebcdd1335e15d7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7bd322c0efbba17f68ccccd6cf624411"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a7bd322c0efbba17f68ccccd6cf624411">XB_INVALID_FIELD_LEN</a>&#160;&#160;&#160;-306</td></tr>
+<tr class="separator:a7bd322c0efbba17f68ccccd6cf624411"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a702475500357a27b8a34463be3e11925"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a702475500357a27b8a34463be3e11925">XB_INVALID_DATE</a>&#160;&#160;&#160;-307</td></tr>
+<tr class="separator:a702475500357a27b8a34463be3e11925"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab45735e63c208eb7e6d6df31fd527aec"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ab45735e63c208eb7e6d6df31fd527aec">XB_INVALID_LOCK_OPTION</a>&#160;&#160;&#160;-400</td></tr>
+<tr class="separator:ab45735e63c208eb7e6d6df31fd527aec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a001e24b39e0f155fb1e892f5b1b9cff1"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a001e24b39e0f155fb1e892f5b1b9cff1">XB_LOCK_FAILED</a>&#160;&#160;&#160;-401</td></tr>
+<tr class="separator:a001e24b39e0f155fb1e892f5b1b9cff1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6aaf779fddecca521d785666f6dc56b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#af6aaf779fddecca521d785666f6dc56b">XB_TABLE_NOT_LOCKED</a>&#160;&#160;&#160;-402</td></tr>
+<tr class="separator:af6aaf779fddecca521d785666f6dc56b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec713cac2b03a0d536a2d16336ae7c0b"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#aec713cac2b03a0d536a2d16336ae7c0b">XB_PARSE_ERROR</a>&#160;&#160;&#160;-500</td></tr>
+<tr class="separator:aec713cac2b03a0d536a2d16336ae7c0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b7e5e440dbcf5e6dc885b24dbe28742"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a2b7e5e440dbcf5e6dc885b24dbe28742">XB_INVALID_FUNCTION</a>&#160;&#160;&#160;-501</td></tr>
+<tr class="separator:a2b7e5e440dbcf5e6dc885b24dbe28742"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4cedf96581c9cbc9c14d07494143702d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a4cedf96581c9cbc9c14d07494143702d">XB_INVALID_PARM</a>&#160;&#160;&#160;-502</td></tr>
+<tr class="separator:a4cedf96581c9cbc9c14d07494143702d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc4b24bfffa202f8df25409894e547b9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#adc4b24bfffa202f8df25409894e547b9">XB_INCONSISTENT_PARM_LENS</a>&#160;&#160;&#160;-503</td></tr>
+<tr class="separator:adc4b24bfffa202f8df25409894e547b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af141ec58b7ca7360e0be6c61d015ea74"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#af141ec58b7ca7360e0be6c61d015ea74">XB_INCOMPATIBLE_OPERANDS</a>&#160;&#160;&#160;-504</td></tr>
+<tr class="separator:af141ec58b7ca7360e0be6c61d015ea74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff5646a6b0884ff81004de6961473ea6"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#aff5646a6b0884ff81004de6961473ea6">XB_UNBALANCED_PARENS</a>&#160;&#160;&#160;-505</td></tr>
+<tr class="separator:aff5646a6b0884ff81004de6961473ea6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aedfa20a6c4eb9ba3063ba56be8280eac"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#aedfa20a6c4eb9ba3063ba56be8280eac">XB_UNBALANCED_QUOTES</a>&#160;&#160;&#160;-506</td></tr>
+<tr class="separator:aedfa20a6c4eb9ba3063ba56be8280eac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54db562c3cae97581812b4fccd52b71a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a54db562c3cae97581812b4fccd52b71a">XB_INVALID_EXPRESSION</a>&#160;&#160;&#160;-507</td></tr>
+<tr class="separator:a54db562c3cae97581812b4fccd52b71a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec2c0ac2bd62e0329ef130e4fbda39f8"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#aec2c0ac2bd62e0329ef130e4fbda39f8">XB_INVALID_KEYNO</a>&#160;&#160;&#160;-600</td></tr>
+<tr class="separator:aec2c0ac2bd62e0329ef130e4fbda39f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd175ef0541e2cad424791bd87619dd4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#acd175ef0541e2cad424791bd87619dd4">XB_INVALID_INDEX</a>&#160;&#160;&#160;-601</td></tr>
+<tr class="separator:acd175ef0541e2cad424791bd87619dd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a176d917912d3433f065483f905a4c50a"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a176d917912d3433f065483f905a4c50a">XB_INVALID_TAG</a>&#160;&#160;&#160;-602</td></tr>
+<tr class="separator:a176d917912d3433f065483f905a4c50a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0aba12b5ae2137f8d6abd28b47f95f0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#ad0aba12b5ae2137f8d6abd28b47f95f0">XB_INVALID_PAGE</a>&#160;&#160;&#160;-603</td></tr>
+<tr class="separator:ad0aba12b5ae2137f8d6abd28b47f95f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5db3a90f215534143bdde81253729c7f"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a5db3a90f215534143bdde81253729c7f">XB_SYNTAX_ERROR</a>&#160;&#160;&#160;-700</td></tr>
+<tr class="separator:a5db3a90f215534143bdde81253729c7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a299419a9c80e000b74bf97a2d24d6a3d"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbretcod_8h.html#a299419a9c80e000b74bf97a2d24d6a3d">XB_MAX_ERROR_NO</a>&#160;&#160;&#160;-999</td></tr>
+<tr class="separator:a299419a9c80e000b74bf97a2d24d6a3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="aa2ff8301503f446c6a5f6510090e520f" name="aa2ff8301503f446c6a5f6510090e520f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aa2ff8301503f446c6a5f6510090e520f">&#9670;&nbsp;</a></span>XB_ALREADY_OPEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_ALREADY_OPEN&#160;&#160;&#160;-201</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ade5f3a7cf1467d12761e4e21b5e4200f" name="ade5f3a7cf1467d12761e4e21b5e4200f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ade5f3a7cf1467d12761e4e21b5e4200f">&#9670;&nbsp;</a></span>XB_BOF</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_BOF&#160;&#160;&#160;-215</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a030684d5541cf6127a76d81b0684b235" name="a030684d5541cf6127a76d81b0684b235"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a030684d5541cf6127a76d81b0684b235">&#9670;&nbsp;</a></span>XB_CLOSE_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_CLOSE_ERROR&#160;&#160;&#160;-210</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8104510b347c87998eadd0b27201e3c2" name="a8104510b347c87998eadd0b27201e3c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8104510b347c87998eadd0b27201e3c2">&#9670;&nbsp;</a></span>XB_DBF_FILE_NOT_OPEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_DBF_FILE_NOT_OPEN&#160;&#160;&#160;-202</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ada15513935d5ede9216f07c0438f34d2" name="ada15513935d5ede9216f07c0438f34d2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ada15513935d5ede9216f07c0438f34d2">&#9670;&nbsp;</a></span>XB_DELETE_FAILED</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_DELETE_FAILED&#160;&#160;&#160;-219</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac18036408d10e5eee1bf76cf92352b95" name="ac18036408d10e5eee1bf76cf92352b95"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac18036408d10e5eee1bf76cf92352b95">&#9670;&nbsp;</a></span>XB_DUP_TABLE_OR_ALIAS</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_DUP_TABLE_OR_ALIAS&#160;&#160;&#160;-110</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a18068d0cbe0c7a1b4dd3176220180c29" name="a18068d0cbe0c7a1b4dd3176220180c29"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a18068d0cbe0c7a1b4dd3176220180c29">&#9670;&nbsp;</a></span>XB_EMPTY</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_EMPTY&#160;&#160;&#160;-221</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a8b47031e90c3f86306c7058e4490d3b7" name="a8b47031e90c3f86306c7058e4490d3b7"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a8b47031e90c3f86306c7058e4490d3b7">&#9670;&nbsp;</a></span>XB_EOF</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_EOF&#160;&#160;&#160;-214</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a54303a9677dbd5342233f33dd08c64d0" name="a54303a9677dbd5342233f33dd08c64d0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a54303a9677dbd5342233f33dd08c64d0">&#9670;&nbsp;</a></span>XB_FILE_EXISTS</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_FILE_EXISTS&#160;&#160;&#160;-200</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ad090af330c93111d12f6de35dbb065bc" name="ad090af330c93111d12f6de35dbb065bc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad090af330c93111d12f6de35dbb065bc">&#9670;&nbsp;</a></span>XB_FILE_NOT_FOUND</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_FILE_NOT_FOUND&#160;&#160;&#160;-203</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab7b9130a5f1df9975cfeaf6241933596" name="ab7b9130a5f1df9975cfeaf6241933596"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab7b9130a5f1df9975cfeaf6241933596">&#9670;&nbsp;</a></span>XB_FILE_TYPE_NOT_SUPPORTED</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_FILE_TYPE_NOT_SUPPORTED&#160;&#160;&#160;-204</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="af141ec58b7ca7360e0be6c61d015ea74" name="af141ec58b7ca7360e0be6c61d015ea74"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af141ec58b7ca7360e0be6c61d015ea74">&#9670;&nbsp;</a></span>XB_INCOMPATIBLE_OPERANDS</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INCOMPATIBLE_OPERANDS&#160;&#160;&#160;-504</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="adc4b24bfffa202f8df25409894e547b9" name="adc4b24bfffa202f8df25409894e547b9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adc4b24bfffa202f8df25409894e547b9">&#9670;&nbsp;</a></span>XB_INCONSISTENT_PARM_LENS</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INCONSISTENT_PARM_LENS&#160;&#160;&#160;-503</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a4e13b529b486c43ca600ce7d8ddbf3c2" name="a4e13b529b486c43ca600ce7d8ddbf3c2"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4e13b529b486c43ca600ce7d8ddbf3c2">&#9670;&nbsp;</a></span>XB_INVALID_BLOCK_NO</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_BLOCK_NO&#160;&#160;&#160;-217</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a1bd22921612389c37f6b2eac438c62c5" name="a1bd22921612389c37f6b2eac438c62c5"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a1bd22921612389c37f6b2eac438c62c5">&#9670;&nbsp;</a></span>XB_INVALID_BLOCK_SIZE</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_BLOCK_SIZE&#160;&#160;&#160;-216</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="afb40bbed323ecb369dd430a2e1242f9a" name="afb40bbed323ecb369dd430a2e1242f9a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#afb40bbed323ecb369dd430a2e1242f9a">&#9670;&nbsp;</a></span>XB_INVALID_DATA</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_DATA&#160;&#160;&#160;-302</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a702475500357a27b8a34463be3e11925" name="a702475500357a27b8a34463be3e11925"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a702475500357a27b8a34463be3e11925">&#9670;&nbsp;</a></span>XB_INVALID_DATE</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_DATE&#160;&#160;&#160;-307</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a54db562c3cae97581812b4fccd52b71a" name="a54db562c3cae97581812b4fccd52b71a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a54db562c3cae97581812b4fccd52b71a">&#9670;&nbsp;</a></span>XB_INVALID_EXPRESSION</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_EXPRESSION&#160;&#160;&#160;-507</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a34180b2e2bd350ba2ebcdd1335e15d7e" name="a34180b2e2bd350ba2ebcdd1335e15d7e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a34180b2e2bd350ba2ebcdd1335e15d7e">&#9670;&nbsp;</a></span>XB_INVALID_FIELD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_FIELD&#160;&#160;&#160;-305</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a7bd322c0efbba17f68ccccd6cf624411" name="a7bd322c0efbba17f68ccccd6cf624411"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a7bd322c0efbba17f68ccccd6cf624411">&#9670;&nbsp;</a></span>XB_INVALID_FIELD_LEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_FIELD_LEN&#160;&#160;&#160;-306</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a59403978784130834cf39434cb73f96e" name="a59403978784130834cf39434cb73f96e"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a59403978784130834cf39434cb73f96e">&#9670;&nbsp;</a></span>XB_INVALID_FIELD_NAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_FIELD_NAME&#160;&#160;&#160;-303</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a09d6c08a44316f551108a74003efd381" name="a09d6c08a44316f551108a74003efd381"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a09d6c08a44316f551108a74003efd381">&#9670;&nbsp;</a></span>XB_INVALID_FIELD_NO</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_FIELD_NO&#160;&#160;&#160;-301</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a79e2588f067d6e236c0e5a2c0728ba9f" name="a79e2588f067d6e236c0e5a2c0728ba9f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a79e2588f067d6e236c0e5a2c0728ba9f">&#9670;&nbsp;</a></span>XB_INVALID_FIELD_TYPE</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_FIELD_TYPE&#160;&#160;&#160;-300</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a2b7e5e440dbcf5e6dc885b24dbe28742" name="a2b7e5e440dbcf5e6dc885b24dbe28742"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2b7e5e440dbcf5e6dc885b24dbe28742">&#9670;&nbsp;</a></span>XB_INVALID_FUNCTION</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_FUNCTION&#160;&#160;&#160;-501</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="acd175ef0541e2cad424791bd87619dd4" name="acd175ef0541e2cad424791bd87619dd4"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#acd175ef0541e2cad424791bd87619dd4">&#9670;&nbsp;</a></span>XB_INVALID_INDEX</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_INDEX&#160;&#160;&#160;-601</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aec2c0ac2bd62e0329ef130e4fbda39f8" name="aec2c0ac2bd62e0329ef130e4fbda39f8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aec2c0ac2bd62e0329ef130e4fbda39f8">&#9670;&nbsp;</a></span>XB_INVALID_KEYNO</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_KEYNO&#160;&#160;&#160;-600</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab45735e63c208eb7e6d6df31fd527aec" name="ab45735e63c208eb7e6d6df31fd527aec"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab45735e63c208eb7e6d6df31fd527aec">&#9670;&nbsp;</a></span>XB_INVALID_LOCK_OPTION</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_LOCK_OPTION&#160;&#160;&#160;-400</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a187c50745f51bfe4aa6f70a92f16c59f" name="a187c50745f51bfe4aa6f70a92f16c59f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a187c50745f51bfe4aa6f70a92f16c59f">&#9670;&nbsp;</a></span>XB_INVALID_MEMO_FIELD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_MEMO_FIELD&#160;&#160;&#160;-304</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a13e6876470bd34c8c4e5533f115e04eb" name="a13e6876470bd34c8c4e5533f115e04eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a13e6876470bd34c8c4e5533f115e04eb">&#9670;&nbsp;</a></span>XB_INVALID_NODELINK</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_NODELINK&#160;&#160;&#160;-120</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a418c047353bc683d0fd6ecbbdd5b7885" name="a418c047353bc683d0fd6ecbbdd5b7885"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a418c047353bc683d0fd6ecbbdd5b7885">&#9670;&nbsp;</a></span>XB_INVALID_OBJECT</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_OBJECT&#160;&#160;&#160;-206</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="af1cd0baf346cad686fa4dd11f700012a" name="af1cd0baf346cad686fa4dd11f700012a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af1cd0baf346cad686fa4dd11f700012a">&#9670;&nbsp;</a></span>XB_INVALID_OPTION</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_OPTION&#160;&#160;&#160;-101</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ad0aba12b5ae2137f8d6abd28b47f95f0" name="ad0aba12b5ae2137f8d6abd28b47f95f0"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad0aba12b5ae2137f8d6abd28b47f95f0">&#9670;&nbsp;</a></span>XB_INVALID_PAGE</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_PAGE&#160;&#160;&#160;-603</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a4cedf96581c9cbc9c14d07494143702d" name="a4cedf96581c9cbc9c14d07494143702d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a4cedf96581c9cbc9c14d07494143702d">&#9670;&nbsp;</a></span>XB_INVALID_PARM</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_PARM&#160;&#160;&#160;-502</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a0fd212f912b2e62700a66bae95bd73a1" name="a0fd212f912b2e62700a66bae95bd73a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0fd212f912b2e62700a66bae95bd73a1">&#9670;&nbsp;</a></span>XB_INVALID_RECORD</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_RECORD&#160;&#160;&#160;-218</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a53891c95a78483704d2a8e14c4499f92" name="a53891c95a78483704d2a8e14c4499f92"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a53891c95a78483704d2a8e14c4499f92">&#9670;&nbsp;</a></span>XB_INVALID_TABLE_NAME</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_TABLE_NAME&#160;&#160;&#160;-220</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a176d917912d3433f065483f905a4c50a" name="a176d917912d3433f065483f905a4c50a"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a176d917912d3433f065483f905a4c50a">&#9670;&nbsp;</a></span>XB_INVALID_TAG</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_INVALID_TAG&#160;&#160;&#160;-602</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ad60dbb1862c0c1c2dc0464cfbfd93a34" name="ad60dbb1862c0c1c2dc0464cfbfd93a34"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ad60dbb1862c0c1c2dc0464cfbfd93a34">&#9670;&nbsp;</a></span>XB_KEY_NOT_UNIQUE</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_KEY_NOT_UNIQUE&#160;&#160;&#160;-121</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a59f1a8a6aca19595c2d1804349a24850" name="a59f1a8a6aca19595c2d1804349a24850"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a59f1a8a6aca19595c2d1804349a24850">&#9670;&nbsp;</a></span>XB_LIMIT_REACHED</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_LIMIT_REACHED&#160;&#160;&#160;-222</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a001e24b39e0f155fb1e892f5b1b9cff1" name="a001e24b39e0f155fb1e892f5b1b9cff1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a001e24b39e0f155fb1e892f5b1b9cff1">&#9670;&nbsp;</a></span>XB_LOCK_FAILED</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_LOCK_FAILED&#160;&#160;&#160;-401</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a299419a9c80e000b74bf97a2d24d6a3d" name="a299419a9c80e000b74bf97a2d24d6a3d"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a299419a9c80e000b74bf97a2d24d6a3d">&#9670;&nbsp;</a></span>XB_MAX_ERROR_NO</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_MAX_ERROR_NO&#160;&#160;&#160;-999</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac720d5b4ec45bfd606f5865d40816e23" name="ac720d5b4ec45bfd606f5865d40816e23"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac720d5b4ec45bfd606f5865d40816e23">&#9670;&nbsp;</a></span>XB_NO_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_NO_ERROR&#160;&#160;&#160;0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ae687fc7d872ba0475a8477e4447f9b54" name="ae687fc7d872ba0475a8477e4447f9b54"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ae687fc7d872ba0475a8477e4447f9b54">&#9670;&nbsp;</a></span>XB_NO_MEMORY</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_NO_MEMORY&#160;&#160;&#160;-100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ac2606659a54111334f5b02861e533700" name="ac2606659a54111334f5b02861e533700"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ac2606659a54111334f5b02861e533700">&#9670;&nbsp;</a></span>XB_NOT_FOUND</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_NOT_FOUND&#160;&#160;&#160;-208</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a9474b400f647bdefbbb07e5177e8d7a1" name="a9474b400f647bdefbbb07e5177e8d7a1"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a9474b400f647bdefbbb07e5177e8d7a1">&#9670;&nbsp;</a></span>XB_NOT_OPEN</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_NOT_OPEN&#160;&#160;&#160;-207</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aaab55236993a1d3acb29206252a904c8" name="aaab55236993a1d3acb29206252a904c8"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aaab55236993a1d3acb29206252a904c8">&#9670;&nbsp;</a></span>XB_OPEN_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_OPEN_ERROR&#160;&#160;&#160;-209</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aec713cac2b03a0d536a2d16336ae7c0b" name="aec713cac2b03a0d536a2d16336ae7c0b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aec713cac2b03a0d536a2d16336ae7c0b">&#9670;&nbsp;</a></span>XB_PARSE_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_PARSE_ERROR&#160;&#160;&#160;-500</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="adbd40585db8bb748d191f94a33bac710" name="adbd40585db8bb748d191f94a33bac710"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adbd40585db8bb748d191f94a33bac710">&#9670;&nbsp;</a></span>XB_READ_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_READ_ERROR&#160;&#160;&#160;-212</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a373f30b2efcbbab9f6d060fb3fe8cba3" name="a373f30b2efcbbab9f6d060fb3fe8cba3"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a373f30b2efcbbab9f6d060fb3fe8cba3">&#9670;&nbsp;</a></span>XB_RENAME_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_RENAME_ERROR&#160;&#160;&#160;-205</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a0455ad8719e153b08ec68b10c81e9f41" name="a0455ad8719e153b08ec68b10c81e9f41"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a0455ad8719e153b08ec68b10c81e9f41">&#9670;&nbsp;</a></span>XB_SEEK_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_SEEK_ERROR&#160;&#160;&#160;-211</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a5db3a90f215534143bdde81253729c7f" name="a5db3a90f215534143bdde81253729c7f"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a5db3a90f215534143bdde81253729c7f">&#9670;&nbsp;</a></span>XB_SYNTAX_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_SYNTAX_ERROR&#160;&#160;&#160;-700</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="af6aaf779fddecca521d785666f6dc56b" name="af6aaf779fddecca521d785666f6dc56b"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#af6aaf779fddecca521d785666f6dc56b">&#9670;&nbsp;</a></span>XB_TABLE_NOT_LOCKED</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_TABLE_NOT_LOCKED&#160;&#160;&#160;-402</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aff5646a6b0884ff81004de6961473ea6" name="aff5646a6b0884ff81004de6961473ea6"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aff5646a6b0884ff81004de6961473ea6">&#9670;&nbsp;</a></span>XB_UNBALANCED_PARENS</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_UNBALANCED_PARENS&#160;&#160;&#160;-505</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aedfa20a6c4eb9ba3063ba56be8280eac" name="aedfa20a6c4eb9ba3063ba56be8280eac"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aedfa20a6c4eb9ba3063ba56be8280eac">&#9670;&nbsp;</a></span>XB_UNBALANCED_QUOTES</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_UNBALANCED_QUOTES&#160;&#160;&#160;-506</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="aef34ebe6726057f805d6063130280549" name="aef34ebe6726057f805d6063130280549"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#aef34ebe6726057f805d6063130280549">&#9670;&nbsp;</a></span>XB_WRITE_ERROR</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define XB_WRITE_ERROR&#160;&#160;&#160;-213</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbretcod_8h_source.html b/docs/doxygen/html/xbretcod_8h_source.html
new file mode 100644
index 0000000..def9385
--- /dev/null
+++ b/docs/doxygen/html/xbretcod_8h_source.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbretcod.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbretcod.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbretcod_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbretcod.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#ifndef __XB_RETCODES_H__</span></div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#define __XB_RETCODES_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="comment">/***********************************************/</span></div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="comment">/* Return Codes and Error Messages */</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ac720d5b4ec45bfd606f5865d40816e23"> 24</a></span><span class="preprocessor"> #define XB_NO_ERROR 0 </span><span class="comment">// general</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ae687fc7d872ba0475a8477e4447f9b54"> 25</a></span><span class="preprocessor"> #define XB_NO_MEMORY -100 </span><span class="comment">// general</span></div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#af1cd0baf346cad686fa4dd11f700012a"> 26</a></span><span class="preprocessor"> #define XB_INVALID_OPTION -101 </span><span class="comment">// general</span></div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ac18036408d10e5eee1bf76cf92352b95"> 27</a></span><span class="preprocessor"> #define XB_DUP_TABLE_OR_ALIAS -110 </span><span class="comment">// table manager</span></div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a13e6876470bd34c8c4e5533f115e04eb"> 28</a></span><span class="preprocessor"> #define XB_INVALID_NODELINK -120 </span><span class="comment">// linklist</span></div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ad60dbb1862c0c1c2dc0464cfbfd93a34"> 29</a></span><span class="preprocessor"> #define XB_KEY_NOT_UNIQUE -121 </span><span class="comment">// linklist</span></div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a54303a9677dbd5342233f33dd08c64d0"> 31</a></span><span class="preprocessor"> #define XB_FILE_EXISTS -200 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#aa2ff8301503f446c6a5f6510090e520f"> 32</a></span><span class="preprocessor"> #define XB_ALREADY_OPEN -201 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a8104510b347c87998eadd0b27201e3c2"> 33</a></span><span class="preprocessor"> #define XB_DBF_FILE_NOT_OPEN -202 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ad090af330c93111d12f6de35dbb065bc"> 34</a></span><span class="preprocessor"> #define XB_FILE_NOT_FOUND -203 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ab7b9130a5f1df9975cfeaf6241933596"> 35</a></span><span class="preprocessor"> #define XB_FILE_TYPE_NOT_SUPPORTED -204 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a373f30b2efcbbab9f6d060fb3fe8cba3"> 36</a></span><span class="preprocessor"> #define XB_RENAME_ERROR -205 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a418c047353bc683d0fd6ecbbdd5b7885"> 37</a></span><span class="preprocessor"> #define XB_INVALID_OBJECT -206 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a9474b400f647bdefbbb07e5177e8d7a1"> 38</a></span><span class="preprocessor"> #define XB_NOT_OPEN -207 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ac2606659a54111334f5b02861e533700"> 39</a></span><span class="preprocessor"> #define XB_NOT_FOUND -208 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#aaab55236993a1d3acb29206252a904c8"> 40</a></span><span class="preprocessor"> #define XB_OPEN_ERROR -209 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a030684d5541cf6127a76d81b0684b235"> 41</a></span><span class="preprocessor"> #define XB_CLOSE_ERROR -210 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a0455ad8719e153b08ec68b10c81e9f41"> 42</a></span><span class="preprocessor"> #define XB_SEEK_ERROR -211 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#adbd40585db8bb748d191f94a33bac710"> 43</a></span><span class="preprocessor"> #define XB_READ_ERROR -212 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#aef34ebe6726057f805d6063130280549"> 44</a></span><span class="preprocessor"> #define XB_WRITE_ERROR -213 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a8b47031e90c3f86306c7058e4490d3b7"> 45</a></span><span class="preprocessor"> #define XB_EOF -214 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ade5f3a7cf1467d12761e4e21b5e4200f"> 46</a></span><span class="preprocessor"> #define XB_BOF -215 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a1bd22921612389c37f6b2eac438c62c5"> 47</a></span><span class="preprocessor"> #define XB_INVALID_BLOCK_SIZE -216 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a4e13b529b486c43ca600ce7d8ddbf3c2"> 48</a></span><span class="preprocessor"> #define XB_INVALID_BLOCK_NO -217 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a0fd212f912b2e62700a66bae95bd73a1"> 49</a></span><span class="preprocessor"> #define XB_INVALID_RECORD -218 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ada15513935d5ede9216f07c0438f34d2"> 50</a></span><span class="preprocessor"> #define XB_DELETE_FAILED -219 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a53891c95a78483704d2a8e14c4499f92"> 51</a></span><span class="preprocessor"> #define XB_INVALID_TABLE_NAME -220 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a18068d0cbe0c7a1b4dd3176220180c29"> 52</a></span><span class="preprocessor"> #define XB_EMPTY -221 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a59f1a8a6aca19595c2d1804349a24850"> 53</a></span><span class="preprocessor"> #define XB_LIMIT_REACHED -222 </span><span class="comment">// file</span></div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> </div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a79e2588f067d6e236c0e5a2c0728ba9f"> 55</a></span><span class="preprocessor"> #define XB_INVALID_FIELD_TYPE -300 </span><span class="comment">// field</span></div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a09d6c08a44316f551108a74003efd381"> 56</a></span><span class="preprocessor"> #define XB_INVALID_FIELD_NO -301 </span><span class="comment">// field</span></div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#afb40bbed323ecb369dd430a2e1242f9a"> 57</a></span><span class="preprocessor"> #define XB_INVALID_DATA -302 </span><span class="comment">// field</span></div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a59403978784130834cf39434cb73f96e"> 58</a></span><span class="preprocessor"> #define XB_INVALID_FIELD_NAME -303 </span><span class="comment">// field</span></div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a187c50745f51bfe4aa6f70a92f16c59f"> 59</a></span><span class="preprocessor"> #define XB_INVALID_MEMO_FIELD -304 </span><span class="comment">// field</span></div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a34180b2e2bd350ba2ebcdd1335e15d7e"> 60</a></span><span class="preprocessor"> #define XB_INVALID_FIELD -305 </span><span class="comment">// field</span></div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a7bd322c0efbba17f68ccccd6cf624411"> 61</a></span><span class="preprocessor"> #define XB_INVALID_FIELD_LEN -306 </span><span class="comment">// field</span></div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a702475500357a27b8a34463be3e11925"> 62</a></span><span class="preprocessor"> #define XB_INVALID_DATE -307 </span><span class="comment">// date field</span></div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> </div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ab45735e63c208eb7e6d6df31fd527aec"> 64</a></span><span class="preprocessor"> #define XB_INVALID_LOCK_OPTION -400 </span><span class="comment">// lock</span></div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a001e24b39e0f155fb1e892f5b1b9cff1"> 65</a></span><span class="preprocessor"> #define XB_LOCK_FAILED -401 </span><span class="comment">// lock</span></div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#af6aaf779fddecca521d785666f6dc56b"> 66</a></span><span class="preprocessor"> #define XB_TABLE_NOT_LOCKED -402 </span><span class="comment">// lock - need table locked for operation</span></div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#aec713cac2b03a0d536a2d16336ae7c0b"> 68</a></span><span class="preprocessor"> #define XB_PARSE_ERROR -500 </span><span class="comment">// expression</span></div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a2b7e5e440dbcf5e6dc885b24dbe28742"> 69</a></span><span class="preprocessor"> #define XB_INVALID_FUNCTION -501 </span><span class="comment">// expression</span></div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a4cedf96581c9cbc9c14d07494143702d"> 70</a></span><span class="preprocessor"> #define XB_INVALID_PARM -502 </span><span class="comment">// expression</span></div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#adc4b24bfffa202f8df25409894e547b9"> 71</a></span><span class="preprocessor"> #define XB_INCONSISTENT_PARM_LENS -503 </span><span class="comment">// expression</span></div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#af141ec58b7ca7360e0be6c61d015ea74"> 72</a></span><span class="preprocessor"> #define XB_INCOMPATIBLE_OPERANDS -504 </span><span class="comment">// expression</span></div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#aff5646a6b0884ff81004de6961473ea6"> 73</a></span><span class="preprocessor"> #define XB_UNBALANCED_PARENS -505 </span><span class="comment">// expression</span></div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#aedfa20a6c4eb9ba3063ba56be8280eac"> 74</a></span><span class="preprocessor"> #define XB_UNBALANCED_QUOTES -506 </span><span class="comment">// expression</span></div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a54db562c3cae97581812b4fccd52b71a"> 75</a></span><span class="preprocessor"> #define XB_INVALID_EXPRESSION -507 </span><span class="comment">// expression</span></div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#aec2c0ac2bd62e0329ef130e4fbda39f8"> 77</a></span><span class="preprocessor"> #define XB_INVALID_KEYNO -600 </span><span class="comment">// index</span></div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#acd175ef0541e2cad424791bd87619dd4"> 78</a></span><span class="preprocessor"> #define XB_INVALID_INDEX -601 </span><span class="comment">// index file error</span></div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a176d917912d3433f065483f905a4c50a"> 79</a></span><span class="preprocessor"> #define XB_INVALID_TAG -602 </span><span class="comment">// invalid index tag name, must be &lt;= 10 bytes</span></div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#ad0aba12b5ae2137f8d6abd28b47f95f0"> 80</a></span><span class="preprocessor"> #define XB_INVALID_PAGE -603 </span><span class="comment">// invalid index page</span></div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> </div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> </div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a5db3a90f215534143bdde81253729c7f"> 83</a></span><span class="preprocessor"> #define XB_SYNTAX_ERROR -700 </span><span class="comment">// sql syntax error</span></div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> </div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> </div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"><a class="line" href="xbretcod_8h.html#a299419a9c80e000b74bf97a2d24d6a3d"> 86</a></span><span class="preprocessor"> #define XB_MAX_ERROR_NO -999</span></div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> </div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="comment">/* when updating this table, also need to update messages in xbssv.cpp */</span></div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> </div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> </div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span>} <span class="comment">/* namespace */</span></div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_RETCODES_H__ */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> </div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbset_8cpp.html b/docs/doxygen/html/xbset_8cpp.html
new file mode 100644
index 0000000..2030d8f
--- /dev/null
+++ b/docs/doxygen/html/xbset_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbset.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_25b94c3afce00ed38231227d8141f932.html">sql</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbset.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbsql_8cpp.html b/docs/doxygen/html/xbsql_8cpp.html
new file mode 100644
index 0000000..16a6210
--- /dev/null
+++ b/docs/doxygen/html/xbsql_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/sql/xbsql.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_25b94c3afce00ed38231227d8141f932.html">sql</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbsql.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbsql_8h.html b/docs/doxygen/html/xbsql_8h.html
new file mode 100644
index 0000000..89c3d51
--- /dev/null
+++ b/docs/doxygen/html/xbsql_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbsql.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbsql.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbsql_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbsql_8h_source.html b/docs/doxygen/html/xbsql_8h_source.html
new file mode 100644
index 0000000..1c0f4c1
--- /dev/null
+++ b/docs/doxygen/html/xbsql_8h_source.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbsql.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbsql.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbsql_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbsql.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">This class manages a list of open tables, open indices are connected to the open tables</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="comment"></span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> </div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#ifndef __XB_XBSQL_H__</span></div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#define __XB_XBSQL_H__</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#pragma interface</span></div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#ifdef XB_SQL_SUPPORT</span></div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="keyword">class </span>XBDLLEXPORT xbSql : <span class="keyword">public</span> xbSsv {</div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <span class="comment">// xbSql();</span></div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> xbSql( <a class="code hl_variable" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a> *x );</div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> ~xbSql();</div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> xbInt16 ExecuteNonQuery( <span class="keyword">const</span> xbString &amp;sCmdLine );</div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <a class="code hl_variable" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a> *GetXbasePtr() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> </div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> xbInt16 SqlCreateTable( <span class="keyword">const</span> xbString &amp;sCmdLine );</div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> xbInt16 SqlCreateIndex( <span class="keyword">const</span> xbString &amp;sCmdLine );</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> </div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> xbInt16 SqlDropIndex( <span class="keyword">const</span> xbString &amp;sCmdLine );</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> xbInt16 SqlDropTable( <span class="keyword">const</span> xbString &amp;sCmdLine );</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> </div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="comment">// xbInt16 SqlCreateView( const xbString &amp;sCmdLine );</span></div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="comment">// xbInt16 SqlDropView( const xbString &amp;sCmdLine );</span></div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="comment">// xbInt16 SqlUpdate( const xbString &amp;sCmdLine );</span></div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="comment">// xbInt16 SqlSelect( const xbString &amp;sCmdLine );</span></div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> </div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keywordtype">void</span> SqlHelp() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> xbInt16 SqlInsert( <span class="keyword">const</span> xbString &amp;sCmLine );</div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> xbInt16 SqlSet( <span class="keyword">const</span> xbString &amp;sCmdLine );</div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> xbInt16 SqlUse( <span class="keyword">const</span> xbString &amp;sCmdLine );</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <a class="code hl_variable" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a> *xbase;</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> xbUda uda;</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> </div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span>};</div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> </div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span>} <span class="comment">/* namespace xb */</span></div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="preprocessor">#endif </span><span class="comment">/* XB_SQL_SUPPORT */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_XBSQL_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a97858ddeb1c4b0100f3edc1a46d3a8b0"><div class="ttname"><a href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xb::xbXBase</a></div><div class="ttdeci">class XBDLLEXPORT xbXBase</div><div class="ttdef"><b>Definition:</b> xbssv.h:27</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbssv_8cpp.html b/docs/doxygen/html/xbssv_8cpp.html
new file mode 100644
index 0000000..a3b6d93
--- /dev/null
+++ b/docs/doxygen/html/xbssv_8cpp.html
@@ -0,0 +1,94 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbssv.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle"><div class="title">xbssv.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="var-members" name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a04be228a037d220dd5564f5ef618adcc"><td class="memItemLeft" align="right" valign="top">const xbErrorMessage&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#a04be228a037d220dd5564f5ef618adcc">xb::xbErrorMessages</a> []</td></tr>
+<tr class="separator:a04be228a037d220dd5564f5ef618adcc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbssv_8h.html b/docs/doxygen/html/xbssv_8h.html
new file mode 100644
index 0000000..a07c236
--- /dev/null
+++ b/docs/doxygen/html/xbssv_8h.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbssv.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle"><div class="title">xbssv.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbssv_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbSsv.html">xb::xbSsv</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class for handling shared system variables. <a href="classxb_1_1xbSsv.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="var-members" name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a97858ddeb1c4b0100f3edc1a46d3a8b0"><td class="memItemLeft" align="right" valign="top">class XBDLLEXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xb::xbXBase</a></td></tr>
+<tr class="separator:a97858ddeb1c4b0100f3edc1a46d3a8b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbssv_8h_source.html b/docs/doxygen/html/xbssv_8h_source.html
new file mode 100644
index 0000000..1ff9609
--- /dev/null
+++ b/docs/doxygen/html/xbssv_8h_source.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbssv.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbssv.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbssv_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbssv.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_XBSSV_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_XBSSV_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#pragma interface</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"><a class="line" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0"> 27</a></span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_class" href="classxb_1_1xbXBase.html">xbXBase</a>;</div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="keyword">struct </span>XBDLLEXPORT xbErrorMessage{</div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> xbInt16 iErrorNo;</div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *sErrorText;</div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span>};</div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> </div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> </div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> </div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="comment">// By design, DBase allows mutliple records in a table all having the same key, but only one entry in a unique index</span></div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="comment">// XB_HALT_ON_DUP_KEY tells the library to not allow appending records which generate duplicate keys in a unique index</span></div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="comment">//</span></div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="preprocessor">#if defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)</span></div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="preprocessor">#define XB_HALT_ON_DUPKEY 0</span></div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="preprocessor">#define XB_EMULATE_DBASE 1</span></div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> </div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> </div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> </div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"><a class="line" href="classxb_1_1xbSsv.html"> 59</a></span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_class" href="classxb_1_1xbSsv.html">xbSsv</a>{</div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <a class="code hl_class" href="classxb_1_1xbSsv.html">xbSsv</a>();</div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"><a class="line" href="classxb_1_1xbSsv.html#a6219f1b5e24ea12fe158cd5aea56988e"> 62</a></span> <span class="keyword">const</span> <span class="keyword">static</span> <span class="keywordtype">char</span> *ErrorCodeText[];</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> </div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> <span class="keywordtype">void</span> DisplayError ( xbInt16 ErrorCode ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; GetDefaultDateFormat () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; GetDataDirectory () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> xbInt16 GetEndianType () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> </div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *GetErrorMessage ( xbInt16 ErrorCode ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keywordtype">void</span> SetDataDirectory ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sDataDirectory );</div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keywordtype">void</span> SetDefaultDateFormat ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultDateFormat );</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> </div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> </div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> BitSet ( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c, xbInt16 iBitNo ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keywordtype">void</span> BitDump ( <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> c ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordtype">void</span> BitDump ( <span class="keywordtype">char</span> c ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> </div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetDefaultAutoCommit () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keywordtype">void</span> SetDefaultAutoCommit ( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bDefaultAutoCommit );</div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> </div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; GetDefaultLogDirectory () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; GetDefaultLogFileName () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keywordtype">void</span> SetDefaultLogDirectory ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sDefaultLogDirectory );</div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> </div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetMultiUser () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> <span class="keywordtype">void</span> SetMultiUser ( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bMultiUser );</div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> </div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span><span class="preprocessor"> #if defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)</span></div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> xbInt16 GetUniqueKeyOpt () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> xbInt16 SetUniqueKeyOpt ( xbInt16 iUniqueKeyOpt );</div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> </div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span><span class="preprocessor"> #ifdef XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> xbInt16 GetDefaultLockRetries () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordtype">void</span> SetDefaultLockRetries ( xbInt16 iRetryCount );</div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> xbInt32 GetDefaultLockWait () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <span class="keywordtype">void</span> SetDefaultLockWait ( xbInt32 lRetryWait );</div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> xbInt16 GetDefaultLockFlavor () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <span class="keywordtype">void</span> SetDefaultLockFlavor ( xbInt16 iLockFlavor );</div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetDefaultAutoLock () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="keywordtype">void</span> SetDefaultAutoLock ( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bAutoLock );</div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> <span class="keywordtype">void</span> EnableDefaultAutoLock ();</div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordtype">void</span> DisableDefaultAutoLock ();</div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> </div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span><span class="preprocessor"> #ifdef XB_MDX_SUPPORT</span></div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> xbInt16 GetCreateMdxBlockSize() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> xbInt16 SetCreateMdxBlockSize( xbInt16 ulBlockSize );</div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> </div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> </div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordtype">void</span> SetEndianType ();</div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"><a class="line" href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3"> 117</a></span> <span class="keyword">static</span> xbInt16 <a class="code hl_variable" href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3">iEndianType</a>; <span class="comment">// B=Big Endian L=Little Endian</span></div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"><a class="line" href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da"> 118</a></span> <span class="keyword">static</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> <a class="code hl_variable" href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da">sNullString</a>; <span class="comment">// Null String</span></div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> </div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> </div>
+<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> </div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="keyword">static</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> sDefaultDateFormat;</div>
+<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keyword">static</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> sDataDirectory; <span class="comment">//Data file directory</span></div>
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> </div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span><span class="preprocessor"> #ifdef XB_LOGGING_SUPPORT</span></div>
+<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keyword">static</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> sDefaultLogDirectory; <span class="comment">//Default location to store log files</span></div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keyword">static</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> sDefaultLogFileName; <span class="comment">//Default LogFileName</span></div>
+<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> </div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="keyword">static</span> xbInt16 iDefaultFileVersion; <span class="comment">// 3 = DBase 3</span></div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="comment">// 4 = DBase 4</span></div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="comment">// default version used in CreateTable command</span></div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="comment">// can be over ridden at the Xbase level, or table level</span></div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="comment">// Different versions can be open simultaneously</span></div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> </div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="keyword">static</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bDefaultAutoCommit; <span class="comment">// Default dbf auto commit switch</span></div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> </div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keyword">static</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bMultiUser; <span class="comment">// True if multi user mode is turned on</span></div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="comment">// Turn this off for better performance in single user mode</span></div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="comment">// This needs to be turned on or off before any data tables are opened</span></div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="comment">// turning this on after tables are opened, can result in out of date</span></div>
+<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="comment">// file buffers if multiple users are sharing the files</span></div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> </div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span><span class="preprocessor">#ifdef XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="keyword">static</span> xbInt32 lDefaultLockWait; <span class="comment">// Number of milliseconds between lock retries</span></div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="keyword">static</span> xbInt16 iDefaultLockRetries; <span class="comment">// Number of times to retry a lock before conceding</span></div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keyword">static</span> xbInt16 bDefaultAutoLock; <span class="comment">// Autolocking enabled?</span></div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keyword">static</span> xbInt16 iDefaultLockFlavor; <span class="comment">// 1 = DBase</span></div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> <span class="comment">// 2 = Clipper - not developed yet</span></div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> <span class="comment">// 3 = FoxPro - not developed yet</span></div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="comment">// 9 = Xbase64 - not developed yet</span></div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> </div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> </div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span><span class="preprocessor">#if defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)</span></div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> </div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="keyword">static</span> xbInt16 iUniqueKeyOpt;</div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> </div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="comment">// is one of:</span></div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="comment">// XB_HALT_ON_DUPKEY</span></div>
+<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> <span class="comment">// XB_EMULATE_DBASE</span></div>
+<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> </div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> </div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> </div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span><span class="preprocessor">#ifdef XB_MDX_SUPPORT</span></div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keyword">static</span> xbInt16 iCreateMdxBlockSize; <span class="comment">// System level Mdx Block Size</span></div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span><span class="preprocessor">#endif </span><span class="comment">// XB_MDX_SUPPORT</span></div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> </div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> </div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> </div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span>};</div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> </div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span>} <span class="comment">/* namespace xb */</span></div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_XBSSV_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="aclassxb_1_1xbSsv_html"><div class="ttname"><a href="classxb_1_1xbSsv.html">xb::xbSsv</a></div><div class="ttdoc">Class for handling shared system variables.</div><div class="ttdef"><b>Definition:</b> xbssv.h:59</div></div>
+<div class="ttc" id="aclassxb_1_1xbSsv_html_a5849e813f5e8e1cd180f0366637adbf3"><div class="ttname"><a href="classxb_1_1xbSsv.html#a5849e813f5e8e1cd180f0366637adbf3">xb::xbSsv::iEndianType</a></div><div class="ttdeci">static xbInt16 iEndianType</div><div class="ttdef"><b>Definition:</b> xbssv.h:117</div></div>
+<div class="ttc" id="aclassxb_1_1xbSsv_html_a9dec3164c3b264882df634915ecf21da"><div class="ttname"><a href="classxb_1_1xbSsv.html#a9dec3164c3b264882df634915ecf21da">xb::xbSsv::sNullString</a></div><div class="ttdeci">static xbString sNullString</div><div class="ttdef"><b>Definition:</b> xbssv.h:118</div></div>
+<div class="ttc" id="aclassxb_1_1xbString_html"><div class="ttname"><a href="classxb_1_1xbString.html">xb::xbString</a></div><div class="ttdoc">Class for handling string data.</div><div class="ttdef"><b>Definition:</b> xbstring.h:50</div></div>
+<div class="ttc" id="aclassxb_1_1xbXBase_html"><div class="ttname"><a href="classxb_1_1xbXBase.html">xb::xbXBase</a></div><div class="ttdoc">xbXbase class.</div><div class="ttdef"><b>Definition:</b> xbxbase.h:123</div></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbstring_8cpp.html b/docs/doxygen/html/xbstring_8cpp.html
new file mode 100644
index 0000000..d1ed65b
--- /dev/null
+++ b/docs/doxygen/html/xbstring_8cpp.html
@@ -0,0 +1,95 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbstring.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle"><div class="title">xbstring.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad27f348219e895c44f74addba8e1889a"><td class="memItemLeft" align="right" valign="top">std::ostream &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#ad27f348219e895c44f74addba8e1889a">xb::operator&lt;&lt;</a> (std::ostream &amp;os, const xbString &amp;s)</td></tr>
+<tr class="memdesc:ad27f348219e895c44f74addba8e1889a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Stream insertion operator &lt;&lt;. <a href="namespacexb.html#ad27f348219e895c44f74addba8e1889a">More...</a><br /></td></tr>
+<tr class="separator:ad27f348219e895c44f74addba8e1889a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbstring_8h.html b/docs/doxygen/html/xbstring_8h.html
new file mode 100644
index 0000000..af23a9b
--- /dev/null
+++ b/docs/doxygen/html/xbstring_8h.html
@@ -0,0 +1,98 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbstring.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle"><div class="title">xbstring.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &lt;stdlib.h&gt;</code><br />
+<code>#include &lt;iostream&gt;</code><br />
+</div>
+<p><a href="xbstring_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbString.html">xb::xbString</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">Class for handling string data. <a href="classxb_1_1xbString.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbstring_8h_source.html b/docs/doxygen/html/xbstring_8h_source.html
new file mode 100644
index 0000000..91bdbe8
--- /dev/null
+++ b/docs/doxygen/html/xbstring_8h_source.html
@@ -0,0 +1,247 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbstring.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbstring.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbstring_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbstring.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#ifndef __XBSTRING_H__</span></div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#define __XBSTRING_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#pragma interface</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> </div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#include &lt;stdlib.h&gt;</span></div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include &lt;iostream&gt;</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"><a class="line" href="classxb_1_1xbString.html"> 50</a></span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> {</div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="comment">//Various constructors</span></div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>(xbUInt32 size);</div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>(<span class="keywordtype">char</span> c);</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> *s, xbUInt32 lMaxLen);</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>(<span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s);</div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>(<span class="keyword">const</span> <span class="keywordtype">char</span> * = <span class="stringliteral">&quot;&quot;</span>);</div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> d );</div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <a class="code hl_class" href="classxb_1_1xbString.html">~xbString</a>();</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="comment">//operators</span></div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;operator= (<span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s);</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;operator= (<span class="keyword">const</span> <span class="keywordtype">char</span> *s);</div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keyword">operator</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="keywordtype">char</span> &amp;operator[](xbUInt32 n) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="keywordtype">char</span> &amp;operator[](xbInt32 n) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> </div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;operator+=(<span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s);</div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;operator+=(<span class="keyword">const</span> <span class="keywordtype">char</span> *s);</div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;operator+=(<span class="keywordtype">char</span> c);</div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;operator-=(<span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s);</div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;operator-=(<span class="keyword">const</span> <span class="keywordtype">char</span> *s);</div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;operator-=(<span class="keywordtype">char</span> c);</div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> </div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator == ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator == ( <span class="keyword">const</span> <span class="keywordtype">char</span> * ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator != ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator != ( <span class="keyword">const</span> <span class="keywordtype">char</span> * ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> </div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator &lt; ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator &gt; ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator &lt;= ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> operator &gt;= ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> </div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> operator-( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s );</div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> operator+( <span class="keyword">const</span> <span class="keywordtype">char</span> *s );</div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> operator+( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s );</div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> operator+( <span class="keyword">const</span> <span class="keywordtype">char</span> c );</div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> </div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;AddBackSlash( <span class="keywordtype">char</span> c );</div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Append(<span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s);</div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Append(<span class="keyword">const</span> <span class="keywordtype">char</span> *s);</div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Append(<span class="keyword">const</span> <span class="keywordtype">char</span> *s, xbUInt32 iByteCount );</div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Append(<span class="keywordtype">char</span> c);</div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Assign(<span class="keyword">const</span> <span class="keywordtype">char</span> *srcStr, xbUInt32 lStartPos, xbUInt32 lCopyLen );</div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Assign(<span class="keyword">const</span> <span class="keywordtype">char</span> *srcStr, xbUInt32 lStartPos );</div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Assign(<span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s, xbUInt32 pos, xbUInt32 n );</div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Assign(<span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s, xbUInt32 n );</div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> </div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> Copy() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> xbUInt32 CountChar( <span class="keywordtype">char</span> c ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> xbUInt32 CountChar( <span class="keywordtype">char</span> c, xbInt16 iOpt ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> xbInt16 CvtHexChar( <span class="keywordtype">char</span> &amp;cOut );</div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> xbInt16 CvtHexString( <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> xbInt16 CvtULongLong( xbUInt64 &amp;ullOut );</div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> xbInt16 CvtLongLong( xbInt64 &amp;llOut );</div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> </div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span><span class="preprocessor"> #ifdef XB_DEBUG_SUPPORT</span></div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <span class="keywordtype">void</span> Dump( <span class="keyword">const</span> <span class="keywordtype">char</span> *title ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> <span class="keywordtype">void</span> Dump( <span class="keyword">const</span> <span class="keywordtype">char</span> *title, xbInt16 iOption ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="keywordtype">void</span> DumpHex( <span class="keyword">const</span> <span class="keywordtype">char</span> *title ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> </div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;ExtractElement(<span class="keyword">const</span> <span class="keywordtype">char</span> *src, <span class="keywordtype">char</span> delim, xbUInt32 iCnt, xbInt16 iOpt = 0 );</div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <span class="keywordtype">char</span> GetCharacter( xbUInt32 lPos ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> xbUInt32 GetLastPos(<span class="keywordtype">char</span> c) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> xbUInt32 GetLastPos(<span class="keyword">const</span> <span class="keywordtype">char</span> *s) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="keywordtype">char</span> GetPathSeparator() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> xbUInt32 GetSize() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> </div>
+<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> HasAlphaChars() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsEmpty() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> IsNull() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> </div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Left( xbUInt32 ulLen );</div>
+<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> xbUInt32 Len() <span class="keyword">const</span>; <span class="comment">// returns the length of the string</span></div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Ltrim();</div>
+<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Ltrunc( xbUInt32 ulCnt );</div>
+<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> </div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Mid(xbUInt32 ulPos, xbUInt32 lLen );</div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;PadLeft( <span class="keywordtype">char</span> c, xbUInt32 ulLen );</div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;PadRight( <span class="keywordtype">char</span> c, xbUInt32 ulLen );</div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> xbUInt32 Pos(<span class="keywordtype">char</span> c) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> xbUInt32 Pos(<span class="keyword">const</span> <span class="keywordtype">char</span> *s) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;PutAt(xbUInt32 ulPos, <span class="keywordtype">char</span> c);</div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> </div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Remove( xbUInt32 ulPos, xbUInt32 ulN );</div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Resize( xbUInt32 lSize );</div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Rtrim();</div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> </div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Set( <span class="keyword">const</span> <span class="keywordtype">char</span> *s );</div>
+<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Set( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s );</div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Set( <span class="keyword">const</span> <span class="keywordtype">char</span> *s, xbUInt32 ulSize );</div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;SetNum( xbInt32 lNum );</div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Sprintf(<span class="keyword">const</span> <span class="keywordtype">char</span> *format, ...);</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *Str() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keywordtype">char</span> *strncpy( <span class="keywordtype">char</span> * cDest, xbUInt32 n ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;SwapChars( <span class="keywordtype">char</span> from, <span class="keywordtype">char</span> to );</div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> </div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;ToLowerCase();</div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;ToUpperCase();</div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;Trim();</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> ValidLogicalValue() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> ValidNumericValue() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;ZapChar( <span class="keywordtype">char</span> c );</div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;ZapLeadingChar( <span class="keywordtype">char</span> c );</div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;ZapTrailingChar( <span class="keywordtype">char</span> c );</div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> </div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keyword">friend</span> std::ostream&amp; <a class="code hl_function" href="namespacexb.html#ad27f348219e895c44f74addba8e1889a">operator&lt;&lt; </a>( std::ostream&amp; os, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a>&amp; s );</div>
+<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> </div>
+<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> </div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> * NullString;</div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="keyword">static</span> <span class="keywordtype">char</span> cJunkBuf;</div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> </div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keywordtype">char</span> *data; <span class="comment">// pointer to actual string data</span></div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> xbUInt32 size; <span class="comment">// size of string plus null terminating byte</span></div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> </div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> <span class="keywordtype">void</span> ctor(<span class="keyword">const</span> <span class="keywordtype">char</span> *s);</div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span><span class="comment">// xbUInt32 CalcSprintfBufSize(const char *format, ...);</span></div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> </div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span><span class="comment">// char * xb_realloc( char *pIn, xbUInt32 iLen );</span></div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> </div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <span class="comment">// next routine could result in buffer over runs if used with improperly sized buffers</span></div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> <span class="keywordtype">char</span> * xb_strcpy ( <span class="keywordtype">char</span> *target, <span class="keyword">const</span> <span class="keywordtype">char</span> *source);</div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> </div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span>};</div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> </div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span>} <span class="comment">/* namespace */</span></div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span><span class="preprocessor">#endif </span><span class="comment">/* __XBSTRING_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="aclassxb_1_1xbString_html"><div class="ttname"><a href="classxb_1_1xbString.html">xb::xbString</a></div><div class="ttdoc">Class for handling string data.</div><div class="ttdef"><b>Definition:</b> xbstring.h:50</div></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a25f47b226ce924a5c78f97989b0744a2"><div class="ttname"><a href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></div><div class="ttdeci">double xbDouble</div><div class="ttdef"><b>Definition:</b> xbtypes.h:23</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+<div class="ttc" id="anamespacexb_html_ad27f348219e895c44f74addba8e1889a"><div class="ttname"><a href="namespacexb.html#ad27f348219e895c44f74addba8e1889a">xb::operator&lt;&lt;</a></div><div class="ttdeci">std::ostream &amp; operator&lt;&lt;(std::ostream &amp;os, const xbString &amp;s)</div><div class="ttdoc">Stream insertion operator &lt;&lt;.</div><div class="ttdef"><b>Definition:</b> xbstring.cpp:148</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbtag_8cpp.html b/docs/doxygen/html/xbtag_8cpp.html
new file mode 100644
index 0000000..66fcf25
--- /dev/null
+++ b/docs/doxygen/html/xbtag_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbtag.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbtag.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbtag_8h.html b/docs/doxygen/html/xbtag_8h.html
new file mode 100644
index 0000000..ecd3c6d
--- /dev/null
+++ b/docs/doxygen/html/xbtag_8h.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtag.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle"><div class="title">xbtag.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbtag_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbtag_8h_source.html b/docs/doxygen/html/xbtag_8h_source.html
new file mode 100644
index 0000000..abbf7f5
--- /dev/null
+++ b/docs/doxygen/html/xbtag_8h_source.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtag.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbtag.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbtag_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbtag.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_XBTAG_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_XBTAG_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="comment">//#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="comment">//#pragma interface</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="comment">//#endif</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#ifdef XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="keyword">class </span>XBDLLEXPORT xbIx;</div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> </div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> </div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="keyword">class </span>XBDLLEXPORT xbTag {</div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> </div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> xbTag( xbIx *pIx, <span class="keywordtype">void</span> *vpTag, xbString &amp;sType, xbString &amp;sTagName, xbString &amp;sExpression, xbString &amp;sFilter, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bUnique, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bSort );</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> </div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> xbIx *GetIx() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="keywordtype">void</span> *GetVpTag() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> <span class="keyword">const</span> xbString &amp;GetType() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keyword">const</span> xbString &amp;GetTagName() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <span class="keyword">const</span> xbString &amp;GetExpression() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keyword">const</span> xbString &amp;GetFilter() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetUnique() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetSort() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> </div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> xbIx *pIx;</div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keywordtype">void</span> *vpTag;</div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> xbString sType;</div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> xbString sTagName;</div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> xbString sExpression;</div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> xbString sFilter;</div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bUnique;</div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bSort; <span class="comment">// 0 = Ascending, 1 = Descending</span></div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span>};</div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> </div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span><span class="preprocessor">#endif </span><span class="comment">// XB_INDEX_SUPPORT</span></div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> </div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> </div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span>} <span class="comment">/* namespace xb */</span></div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_TAG_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbtblmgr_8cpp.html b/docs/doxygen/html/xbtblmgr_8cpp.html
new file mode 100644
index 0000000..6f738b0
--- /dev/null
+++ b/docs/doxygen/html/xbtblmgr_8cpp.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbtblmgr.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle"><div class="title">xbtblmgr.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbtblmgr_8h.html b/docs/doxygen/html/xbtblmgr_8h.html
new file mode 100644
index 0000000..6baece0
--- /dev/null
+++ b/docs/doxygen/html/xbtblmgr_8h.html
@@ -0,0 +1,103 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtblmgr.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle"><div class="title">xbtblmgr.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbtblmgr_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structxb_1_1xbTblList.html">xb::xbTblList</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbTblMgr.html">xb::xbTblMgr</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="var-members" name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ab2eae4b4732466698a7fdd89d77ba53b"><td class="memItemLeft" align="right" valign="top">class XBDLLEXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b">xb::xbDbf</a></td></tr>
+<tr class="separator:ab2eae4b4732466698a7fdd89d77ba53b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbtblmgr_8h_source.html b/docs/doxygen/html/xbtblmgr_8h_source.html
new file mode 100644
index 0000000..566867f
--- /dev/null
+++ b/docs/doxygen/html/xbtblmgr_8h_source.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtblmgr.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbtblmgr.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbtblmgr_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbtblmgr.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">This class manages a list of open tables, open indices are connected to the open tables</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="comment"></span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> </div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#ifndef __XB_XBMGR_H__</span></div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#define __XB_XBMGR_H__</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#pragma interface</span></div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"><a class="line" href="namespacexb.html#ab2eae4b4732466698a7fdd89d77ba53b"> 28</a></span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a>;</div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> </div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="comment">/* this structure is a linked list of open tables */</span></div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"><a class="line" href="structxb_1_1xbTblList.html"> 31</a></span><span class="keyword">struct </span>XBDLLEXPORT <a class="code hl_struct" href="structxb_1_1xbTblList.html">xbTblList</a>{</div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"><a class="line" href="structxb_1_1xbTblList.html#a3fd169fcf0fd4df927544e5342db583c"> 32</a></span> <a class="code hl_struct" href="structxb_1_1xbTblList.html">xbTblList</a> *<a class="code hl_variable" href="structxb_1_1xbTblList.html#a3fd169fcf0fd4df927544e5342db583c">pNext</a>;</div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"><a class="line" href="structxb_1_1xbTblList.html#a02c3b0c47fd104ef9758b375ecdcfd0f"> 33</a></span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> *<a class="code hl_variable" href="structxb_1_1xbTblList.html#a02c3b0c47fd104ef9758b375ecdcfd0f">psTblName</a>; <span class="comment">/* Name of table - same table can be opened multiple times, but must have unique alias */</span></div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"><a class="line" href="structxb_1_1xbTblList.html#ac87742c8a6b1cf2e7e35218e96966a05"> 34</a></span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> *<a class="code hl_variable" href="structxb_1_1xbTblList.html#ac87742c8a6b1cf2e7e35218e96966a05">psTblAlias</a>; <span class="comment">/* TblAliasName must be unique */</span></div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"><a class="line" href="structxb_1_1xbTblList.html#a387d3f6bbf291a1fb96d276ed9bb96b6"> 35</a></span> <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> *<a class="code hl_variable" href="structxb_1_1xbTblList.html#a387d3f6bbf291a1fb96d276ed9bb96b6">pDbf</a>;</div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span>};</div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"><a class="line" href="classxb_1_1xbTblMgr.html"> 38</a></span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_class" href="classxb_1_1xbTblMgr.html">xbTblMgr</a> : <span class="keyword">public</span> <a class="code hl_class" href="classxb_1_1xbSsv.html">xbSsv</a> {</div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <a class="code hl_class" href="classxb_1_1xbTblMgr.html">xbTblMgr</a>();</div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <a class="code hl_class" href="classxb_1_1xbTblMgr.html">~xbTblMgr</a>();</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> xbInt16 AddTblToTblList ( <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> *d, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTblName );</div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> xbInt16 AddTblToTblList ( <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> *d, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTblName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTblAlias );</div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> xbInt16 DisplayTableList () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> * GetDbfPtr ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTblAlias ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> * GetDbfPtr ( xbInt16 sItemNo ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> xbInt16 GetOpenTableCount () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> xbInt16 RemoveTblFromTblList ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTblAlias );</div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> xbInt16 RemoveTblFromTblList ( <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> *d );</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> </div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> </div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <a class="code hl_struct" href="structxb_1_1xbTblList.html">xbTblList</a> * TblList; <span class="comment">// List of open database tables</span></div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> xbInt16 iOpenTableCount; <span class="comment">// Number of open tables</span></div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> </div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span>};</div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> </div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span>} <span class="comment">/* namespace xb */</span></div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> </div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_XBMGR_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html"><div class="ttname"><a href="classxb_1_1xbDbf.html">xb::xbDbf</a></div><div class="ttdoc">Base class for handling dbf files/tables.</div><div class="ttdef"><b>Definition:</b> xbdbf.h:150</div></div>
+<div class="ttc" id="aclassxb_1_1xbSsv_html"><div class="ttname"><a href="classxb_1_1xbSsv.html">xb::xbSsv</a></div><div class="ttdoc">Class for handling shared system variables.</div><div class="ttdef"><b>Definition:</b> xbssv.h:59</div></div>
+<div class="ttc" id="aclassxb_1_1xbString_html"><div class="ttname"><a href="classxb_1_1xbString.html">xb::xbString</a></div><div class="ttdoc">Class for handling string data.</div><div class="ttdef"><b>Definition:</b> xbstring.h:50</div></div>
+<div class="ttc" id="aclassxb_1_1xbTblMgr_html"><div class="ttname"><a href="classxb_1_1xbTblMgr.html">xb::xbTblMgr</a></div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:38</div></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="astructxb_1_1xbTblList_html"><div class="ttname"><a href="structxb_1_1xbTblList.html">xb::xbTblList</a></div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:31</div></div>
+<div class="ttc" id="astructxb_1_1xbTblList_html_a02c3b0c47fd104ef9758b375ecdcfd0f"><div class="ttname"><a href="structxb_1_1xbTblList.html#a02c3b0c47fd104ef9758b375ecdcfd0f">xb::xbTblList::psTblName</a></div><div class="ttdeci">xbString * psTblName</div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:33</div></div>
+<div class="ttc" id="astructxb_1_1xbTblList_html_a387d3f6bbf291a1fb96d276ed9bb96b6"><div class="ttname"><a href="structxb_1_1xbTblList.html#a387d3f6bbf291a1fb96d276ed9bb96b6">xb::xbTblList::pDbf</a></div><div class="ttdeci">xbDbf * pDbf</div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:35</div></div>
+<div class="ttc" id="astructxb_1_1xbTblList_html_a3fd169fcf0fd4df927544e5342db583c"><div class="ttname"><a href="structxb_1_1xbTblList.html#a3fd169fcf0fd4df927544e5342db583c">xb::xbTblList::pNext</a></div><div class="ttdeci">xbTblList * pNext</div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:32</div></div>
+<div class="ttc" id="astructxb_1_1xbTblList_html_ac87742c8a6b1cf2e7e35218e96966a05"><div class="ttname"><a href="structxb_1_1xbTblList.html#ac87742c8a6b1cf2e7e35218e96966a05">xb::xbTblList::psTblAlias</a></div><div class="ttdeci">xbString * psTblAlias</div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:34</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbtypes_8h.html b/docs/doxygen/html/xbtypes_8h.html
new file mode 100644
index 0000000..68e5377
--- /dev/null
+++ b/docs/doxygen/html/xbtypes_8h.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtypes.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#define-members">Macros</a> &#124;
+<a href="#typedef-members">Typedefs</a> </div>
+ <div class="headertitle"><div class="title">xbtypes.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbtypes_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
+Macros</h2></td></tr>
+<tr class="memitem:ab0ae00665298fe7f5292691cb98ec2d9"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbtypes_8h.html#ab0ae00665298fe7f5292691cb98ec2d9">xbTrue</a>&#160;&#160;&#160;1</td></tr>
+<tr class="separator:ab0ae00665298fe7f5292691cb98ec2d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc4b6ca5ad299f63675136d9e03938cc"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc">xbFalse</a>&#160;&#160;&#160;0</td></tr>
+<tr class="separator:adc4b6ca5ad299f63675136d9e03938cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c65f692ac861990861575e18f72f6eb"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xbtypes_8h.html#a2c65f692ac861990861575e18f72f6eb">xbFileNo</a>&#160;&#160;&#160;fileno</td></tr>
+<tr class="separator:a2c65f692ac861990861575e18f72f6eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
+Typedefs</h2></td></tr>
+<tr class="memitem:a83aa6a550398db55973aa9fb4257e66e"><td class="memItemLeft" align="right" valign="top">typedef float&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xb::xbFloat</a></td></tr>
+<tr class="separator:a83aa6a550398db55973aa9fb4257e66e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25f47b226ce924a5c78f97989b0744a2"><td class="memItemLeft" align="right" valign="top">typedef double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></td></tr>
+<tr class="separator:a25f47b226ce924a5c78f97989b0744a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1a750481dd487f0d384aa1d200dff0f"><td class="memItemLeft" align="right" valign="top">typedef short int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></td></tr>
+<tr class="separator:ab1a750481dd487f0d384aa1d200dff0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac963d9fde6debb416303cfbed35fb793"><td class="memItemLeft" align="right" valign="top">typedef xbUInt64&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#ac963d9fde6debb416303cfbed35fb793">xb::xbOffT</a></td></tr>
+<tr class="separator:ac963d9fde6debb416303cfbed35fb793"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Macro Definition Documentation</h2>
+<a id="adc4b6ca5ad299f63675136d9e03938cc" name="adc4b6ca5ad299f63675136d9e03938cc"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#adc4b6ca5ad299f63675136d9e03938cc">&#9670;&nbsp;</a></span>xbFalse</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define xbFalse&#160;&#160;&#160;0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="a2c65f692ac861990861575e18f72f6eb" name="a2c65f692ac861990861575e18f72f6eb"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#a2c65f692ac861990861575e18f72f6eb">&#9670;&nbsp;</a></span>xbFileNo</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define xbFileNo&#160;&#160;&#160;fileno</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a id="ab0ae00665298fe7f5292691cb98ec2d9" name="ab0ae00665298fe7f5292691cb98ec2d9"></a>
+<h2 class="memtitle"><span class="permalink"><a href="#ab0ae00665298fe7f5292691cb98ec2d9">&#9670;&nbsp;</a></span>xbTrue</h2>
+
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">#define xbTrue&#160;&#160;&#160;1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbtypes_8h_source.html b/docs/doxygen/html/xbtypes_8h_source.html
new file mode 100644
index 0000000..9222c7d
--- /dev/null
+++ b/docs/doxygen/html/xbtypes_8h_source.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbtypes.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbtypes.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbtypes_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbtypes.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="preprocessor">#ifndef __XB_XTYPES_H__</span></div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#define __XB_XTYPES_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"><a class="line" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e"> 22</a></span><span class="keyword">typedef</span> <span class="keywordtype">float</span> <a class="code hl_typedef" href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xbFloat</a>;</div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"><a class="line" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2"> 23</a></span><span class="keyword">typedef</span> <span class="keywordtype">double</span> <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a>;</div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"><a class="line" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f"> 24</a></span><span class="keyword">typedef</span> <span class="keywordtype">short</span> <span class="keywordtype">int</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a>;</div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"><a class="line" href="namespacexb.html#ac963d9fde6debb416303cfbed35fb793"> 25</a></span><span class="keyword">typedef</span> xbUInt64 <a class="code hl_typedef" href="namespacexb.html#ac963d9fde6debb416303cfbed35fb793">xbOffT</a>;</div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"><a class="line" href="xbtypes_8h.html#ab0ae00665298fe7f5292691cb98ec2d9"> 28</a></span><span class="preprocessor">#define xbTrue 1</span></div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"><a class="line" href="xbtypes_8h.html#adc4b6ca5ad299f63675136d9e03938cc"> 29</a></span><span class="preprocessor">#define xbFalse 0</span></div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="preprocessor">#ifdef HAVE__FILENO_F</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="preprocessor"> #define xbFileNo _fileno</span></div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="preprocessor">#else</span></div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"><a class="line" href="xbtypes_8h.html#a2c65f692ac861990861575e18f72f6eb"> 35</a></span><span class="preprocessor"> #define xbFileNo fileno</span></div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="preprocessor">#ifdef XB_LOCKING_SUPPORT</span></div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="preprocessor"> #if defined( HAVE_LONG_LONG )</span></div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="preprocessor"> #define LK4026531839 4026531839LL</span></div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="preprocessor"> #define LK4026531838 4026531838LL</span></div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="preprocessor"> #define LK3026531838 3026531838LL</span></div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="preprocessor"> #define LK1000000000 1000000000LL</span></div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="preprocessor"> #else</span></div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="preprocessor"> #define LK4026531839 4026531839L</span></div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="preprocessor"> #define LK4026531838 4026531838L</span></div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="preprocessor"> #define LK3026531838 3026531838L</span></div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="preprocessor"> #define LK1000000000 1000000000L</span></div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> </div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> </div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span>} <span class="comment">/* namespace */</span></div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_XTYPES_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a25f47b226ce924a5c78f97989b0744a2"><div class="ttname"><a href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></div><div class="ttdeci">double xbDouble</div><div class="ttdef"><b>Definition:</b> xbtypes.h:23</div></div>
+<div class="ttc" id="anamespacexb_html_a83aa6a550398db55973aa9fb4257e66e"><div class="ttname"><a href="namespacexb.html#a83aa6a550398db55973aa9fb4257e66e">xb::xbFloat</a></div><div class="ttdeci">float xbFloat</div><div class="ttdef"><b>Definition:</b> xbtypes.h:22</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+<div class="ttc" id="anamespacexb_html_ac963d9fde6debb416303cfbed35fb793"><div class="ttname"><a href="namespacexb.html#ac963d9fde6debb416303cfbed35fb793">xb::xbOffT</a></div><div class="ttdeci">xbUInt64 xbOffT</div><div class="ttdef"><b>Definition:</b> xbtypes.h:25</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbuda_8cpp.html b/docs/doxygen/html/xbuda_8cpp.html
new file mode 100644
index 0000000..7f2662d
--- /dev/null
+++ b/docs/doxygen/html/xbuda_8cpp.html
@@ -0,0 +1,80 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbuda.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbuda.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbuda_8h.html b/docs/doxygen/html/xbuda_8h.html
new file mode 100644
index 0000000..37e23ca
--- /dev/null
+++ b/docs/doxygen/html/xbuda_8h.html
@@ -0,0 +1,81 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbuda.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbuda.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbuda_8h_source.html">Go to the source code of this file.</a></p>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbuda_8h_source.html b/docs/doxygen/html/xbuda_8h_source.html
new file mode 100644
index 0000000..8fceaa1
--- /dev/null
+++ b/docs/doxygen/html/xbuda_8h_source.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbuda.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbuda.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbuda_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbuda.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">This class manages the user data area (UDA)</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="comment"></span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> </div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#ifndef __XB_XBUDA_H__</span></div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#define __XB_XBUDA_H__</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#pragma interface</span></div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> </div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="preprocessor">#ifdef XB_EXPRESSION_SUPPORT</span></div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> </div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="keyword">class </span>XBDLLEXPORT xbUda {</div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> </div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> xbUda();</div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> ~xbUda();</div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> xbInt16 AddTokenForKey( <span class="keyword">const</span> xbString &amp;sKey, <span class="keyword">const</span> xbString &amp;sToken );</div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keywordtype">void</span> Clear();</div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> xbInt16 DelTokenForKey( <span class="keyword">const</span> xbString &amp;sKey );</div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> xbInt16 GetTokenCnt() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> xbInt16 GetTokenForKey( <span class="keyword">const</span> xbString &amp;sKey, xbString &amp;sData );</div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> xbInt16 UpdTokenForKey( <span class="keyword">const</span> xbString &amp;sKey, <span class="keyword">const</span> xbString &amp;sToken );</div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> <span class="keywordtype">void</span> DumpUda() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> </div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> xbLinkListOrd&lt;xbString&gt; llOrd;</div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> </div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span>};</div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span>} <span class="comment">/* namespace */</span></div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="preprocessor">#endif </span><span class="comment">/* XB_EXPRESSION_SUPPORT */</span><span class="preprocessor"></span></div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="preprocessor">#endif </span><span class="comment">/* __XBUDA_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbxbase_8cpp.html b/docs/doxygen/html/xbxbase_8cpp.html
new file mode 100644
index 0000000..51647e7
--- /dev/null
+++ b/docs/doxygen/html/xbxbase_8cpp.html
@@ -0,0 +1,88 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/core/xbxbase.cpp File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_aebb8dcc11953d78e620bbef0b9e2183.html">core</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle"><div class="title">xbxbase.cpp File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><code>#include &quot;<a class="el" href="xbase_8h_source.html">xbase.h</a>&quot;</code><br />
+</div><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbxbase_8h.html b/docs/doxygen/html/xbxbase_8h.html
new file mode 100644
index 0000000..936104d
--- /dev/null
+++ b/docs/doxygen/html/xbxbase_8h.html
@@ -0,0 +1,102 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbxbase.h File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Data Structures</a> &#124;
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle"><div class="title">xbxbase.h File Reference</div></div>
+</div><!--header-->
+<div class="contents">
+
+<p><a href="xbxbase_8h_source.html">Go to the source code of this file.</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
+Data Structures</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classxb_1_1xbXBase.html">xb::xbXBase</a></td></tr>
+<tr class="memdesc:"><td class="mdescLeft">&#160;</td><td class="mdescRight">xbXbase class. <a href="classxb_1_1xbXBase.html#details">More...</a><br /></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacexb"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html">xb</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="var-members" name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a4a31fbe9110c9e55495ce71e642d785c"><td class="memItemLeft" align="right" valign="top">class XBDLLEXPORT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xb::xbLog</a></td></tr>
+<tr class="separator:a4a31fbe9110c9e55495ce71e642d785c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/html/xbxbase_8h_source.html b/docs/doxygen/html/xbxbase_8h_source.html
new file mode 100644
index 0000000..571efee
--- /dev/null
+++ b/docs/doxygen/html/xbxbase_8h_source.html
@@ -0,0 +1,309 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=11"/>
+<meta name="generator" content="Doxygen 1.9.3"/>
+<meta name="viewport" content="width=device-width, initial-scale=1"/>
+<title>Xbase64: /mnt/1Tdata/xbase/xbase64-4.0.2/src/include/xbxbase.h Source File</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/searchdata.js"></script>
+<script type="text/javascript" src="search/search.js"></script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr id="projectrow">
+ <td id="projectalign">
+ <div id="projectname">Xbase64<span id="projectnumber">&#160;4.0.1</span>
+ </div>
+ <div id="projectbrief">C++ Library for handling Xbase (DBF) format type files</div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.9.3 -->
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+var searchBox = new SearchBox("searchBox", "search",'Search','.html');
+/* @license-end */
+</script>
+<script type="text/javascript" src="menudata.js"></script>
+<script type="text/javascript" src="menu.js"></script>
+<script type="text/javascript">
+/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
+$(function() {
+ initMenu('',true,false,'search.php','Search');
+ $(document).ready(function() { init_search(); });
+});
+/* @license-end */
+</script>
+<div id="main-nav"></div>
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+</div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div id="nav-path" class="navpath">
+ <ul>
+<li class="navelem"><a class="el" href="dir_68267d1309a1af8e8297ef4c3efbcdba.html">src</a></li><li class="navelem"><a class="el" href="dir_b0856f6b0d80ccb263b2f415c91f9e17.html">include</a></li> </ul>
+</div>
+</div><!-- top -->
+<div class="header">
+ <div class="headertitle"><div class="title">xbxbase.h</div></div>
+</div><!--header-->
+<div class="contents">
+<a href="xbxbase_8h.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">/* xbxbase.h</span></div>
+<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment"></span> </div>
+<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">XBase64 Software Library</span></div>
+<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment"></span> </div>
+<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">Copyright (c) 1997,2003,2014,2022 Gary A Kunkel</span></div>
+<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment"></span> </div>
+<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.</span></div>
+<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment"></span> </div>
+<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">Email Contact:</span></div>
+<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment"></span> </div>
+<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span><span class="comment"> XDB-devel@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="comment"> XDB-users@lists.sourceforge.net</span></div>
+<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="comment"></span> </div>
+<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
+<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
+<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifndef __XB_XBDBLIST_H__</span></div>
+<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span><span class="preprocessor">#define __XB_XBDBLIST_H__</span></div>
+<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> </div>
+<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#ifdef CMAKE_COMPILER_IS_GNUCC</span></div>
+<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#pragma interface</span></div>
+<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
+<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacexb.html">xb</a>{</div>
+<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> </div>
+<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"><a class="line" href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c"> 26</a></span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_variable" href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xbLog</a>;</div>
+<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
+<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="comment">/************************************************************************/</span></div>
+<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span><span class="comment">/* </span></div>
+<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="comment"> Xbase functions</span></div>
+<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="comment"></span> </div>
+<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="comment"> Min Parm Count is the minimum number of input parms needed by the function</span></div>
+<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="comment"></span> </div>
+<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="comment"> Return Type</span></div>
+<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="comment"> C Char or string</span></div>
+<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="comment"> D Date</span></div>
+<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="comment"> L Logical</span></div>
+<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="comment"> N Numeric</span></div>
+<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="comment"> 1 Varies - pull return type from first sibling</span></div>
+<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="comment"> 2 Varies - pull return type from second sibling</span></div>
+<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
+<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="preprocessor">#ifdef XB_FUNCTION_SUPPORT</span></div>
+<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> </div>
+<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="comment">/*</span></div>
+<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="comment">struct XBDLLEXPORT xbFunctionInfo {</span></div>
+<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="comment"> const char * FuncName; // function name</span></div>
+<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="comment"> char ReturnType; // return type of function</span></div>
+<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="comment"> xbInt16 iReturnLenCalc; // used to calculate the function return value is</span></div>
+<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="comment"> // 1 = use value specified in iReturnLenVal</span></div>
+<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="comment"> // 2 = use length of operand specified in col 4</span></div>
+<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="comment"> // 3 = use valued of numeric operand specified in col 4</span></div>
+<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="comment"> // 4 = length of parm 1 * numeric value parm</span></div>
+<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="comment"> // 5 = larger length of parm 2 or length of parm 3</span></div>
+<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="comment"> // 6 = if two or more parms, use numeric value from second parm,</span></div>
+<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="comment"> // otherwise use col4 value</span></div>
+<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span><span class="comment"> xbInt16 iReturnLenVal; // Used in combination with iReturnLenCalc</span></div>
+<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="comment"></span> </div>
+<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span><span class="comment">};</span></div>
+<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="comment">/*</span></div>
+<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="comment">static xbFunctionInfo FunctionList[] =</span></div>
+<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="comment">// Func Return -Rtrn Len-</span></div>
+<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="comment">// Name Type -Calc Val-</span></div>
+<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="comment">{</span></div>
+<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="comment"> { &quot;ABS&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span><span class="comment"> { &quot;ALLTRIM&quot;, &#39;C&#39;, 2, 1 },</span></div>
+<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="comment"> { &quot;ASC&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span><span class="comment"> { &quot;AT&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span><span class="comment"> { &quot;CDOW&quot;, &#39;C&#39;, 1, 9 },</span></div>
+<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span><span class="comment"> { &quot;CHR&quot;, &#39;C&#39;, 1, 1 },</span></div>
+<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span><span class="comment"> { &quot;CMONTH&quot;, &#39;C&#39;, 1, 9 },</span></div>
+<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span><span class="comment"> { &quot;CTOD&quot;, &#39;D&#39;, 1, 8 },</span></div>
+<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span><span class="comment"> { &quot;DATE&quot;, &#39;D&#39;, 1, 8 },</span></div>
+<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span><span class="comment"> { &quot;DAY&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span><span class="comment"> { &quot;DEL&quot;, &#39;C&#39;, 1, 1 },</span></div>
+<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span><span class="comment"> { &quot;DELETED&quot;, &#39;L&#39;, 1, 1 },</span></div>
+<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span><span class="comment"> { &quot;DESCEND&quot;, &#39;1&#39;, 2, 1 },</span></div>
+<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span><span class="comment"> { &quot;DOW&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span><span class="comment"> { &quot;DTOC&quot;, &#39;C&#39;, 1, 8 },</span></div>
+<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span><span class="comment"> { &quot;DTOS&quot;, &#39;C&#39;, 1, 8 },</span></div>
+<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span><span class="comment"> { &quot;EXP&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span><span class="comment"> { &quot;IIF&quot;, &#39;C&#39;, 5, 0 },</span></div>
+<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span><span class="comment"> { &quot;INT&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span><span class="comment"> { &quot;ISALPHA&quot;, &#39;L&#39;, 1, 1 },</span></div>
+<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span><span class="comment"> { &quot;ISLOWER&quot;, &#39;L&#39;, 1, 1 },</span></div>
+<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span><span class="comment"> { &quot;ISUPPER&quot;, &#39;L&#39;, 1, 1 },</span></div>
+<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span><span class="comment"> { &quot;LEFT&quot;, &#39;C&#39;, 3, 2 },</span></div>
+<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="comment"> { &quot;LEN&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span><span class="comment"> { &quot;LOG&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span><span class="comment"> { &quot;LOWER&quot;, &#39;C&#39;, 2, 1 },</span></div>
+<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span><span class="comment"> { &quot;LTRIM&quot;, &#39;C&#39;, 2, 1 },</span></div>
+<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span><span class="comment"> { &quot;MAX&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span><span class="comment"> { &quot;MIN&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span><span class="comment"> { &quot;MONTH&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span><span class="comment"> { &quot;RECNO&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span><span class="comment"> { &quot;RECCOUNT&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span><span class="comment"> { &quot;REPLICATE&quot;, &#39;C&#39;, 4, 0 },</span></div>
+<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span><span class="comment"> { &quot;RIGHT&quot;, &#39;C&#39;, 3, 2 },</span></div>
+<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span><span class="comment"> { &quot;RTRIM&quot;, &#39;C&#39;, 2, 1 },</span></div>
+<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span><span class="comment"> { &quot;SPACE&quot;, &#39;C&#39;, 3, 1 },</span></div>
+<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span><span class="comment"> { &quot;SQRT&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span><span class="comment"> { &quot;STOD&quot;, &#39;D&#39;, 1, 8 },</span></div>
+<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span><span class="comment"> { &quot;STR&quot;, &#39;C&#39;, 6, 10 },</span></div>
+<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span><span class="comment"> { &quot;STRZERO&quot;, &#39;C&#39;, 3, 2 },</span></div>
+<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span><span class="comment"> { &quot;SUBSTR&quot;, &#39;C&#39;, 3, 3 },</span></div>
+<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span><span class="comment"> { &quot;TRIM&quot;, &#39;C&#39;, 2, 1 },</span></div>
+<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span><span class="comment"> { &quot;UPPER&quot;, &#39;C&#39;, 2, 1 },</span></div>
+<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span><span class="comment"> { &quot;VAL&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span><span class="comment"> { &quot;YEAR&quot;, &#39;N&#39;, 1, 4 },</span></div>
+<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="comment"> { 0, 0, 0, 0 },</span></div>
+<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span><span class="comment">};</span></div>
+<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span><span class="comment">*/</span></div>
+<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> </div>
+<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
+<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> </div>
+<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> </div>
+<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"><a class="line" href="classxb_1_1xbXBase.html"> 123</a></span><span class="keyword">class </span>XBDLLEXPORT <a class="code hl_class" href="classxb_1_1xbXBase.html">xbXBase</a> : <span class="keyword">public</span> <a class="code hl_class" href="classxb_1_1xbTblMgr.html">xbTblMgr</a>{</div>
+<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keyword">public</span>:</div>
+<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <a class="code hl_variable" href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xbXBase</a>();</div>
+<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <a class="code hl_class" href="classxb_1_1xbXBase.html">~xbXBase</a>();</div>
+<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> </div>
+<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> xbInt16 CloseAllTables();</div>
+<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keywordtype">void</span> DisableMsgLogging();</div>
+<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="keywordtype">void</span> EnableMsgLogging ();</div>
+<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> xbInt16 FlushLog();</div>
+<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> </div>
+<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;GetLogDirectory () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;GetLogFileName () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;GetLogFqFileName() <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> GetLogStatus () <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> </div>
+<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"><a class="line" href="classxb_1_1xbXBase.html#aa957eb502ecd076e5df89e7415cb094b"> 138</a></span> xbInt16 <a class="code hl_function" href="classxb_1_1xbXBase.html#aa957eb502ecd076e5df89e7415cb094b">OpenHighestVersion</a>( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias, <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> &amp;dbf, <span class="keywordtype">int</span> dummy );</div>
+<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> xbInt16 OpenHighestVersion( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias, <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> **dbf );</div>
+<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> </div>
+<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> * Open( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, xbInt16 &amp;iRc );</div>
+<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> * Open( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTableName, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sAlias, xbInt16 iOpenMode, xbInt16 iShareMode, xbInt16 iVersion, xbInt16 &amp;iRc );</div>
+<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keywordtype">void</span> SetLogDirectory( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sLogFileDirectory );</div>
+<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordtype">void</span> SetLogFileName ( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sLogFileName );</div>
+<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordtype">void</span> SetLogSize ( <span class="keywordtype">size_t</span> lSize );</div>
+<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> xbInt16 WriteLogMessage( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sLogMessage, xbInt16 iOutputOpt = 0 );</div>
+<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> xbInt16 WriteLogBytes ( xbUInt32 lCnt, <span class="keyword">const</span> <span class="keywordtype">char</span> *p );</div>
+<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> </div>
+<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keywordtype">void</span> xbSleep ( xbInt32 lMillisecs );</div>
+<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> </div>
+<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> </div>
+<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="comment">/* xbase functions */</span></div>
+<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span><span class="preprocessor"> #ifdef XB_FUNCTION_SUPPORT</span></div>
+<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> xbInt16 ABS( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dOut );</div>
+<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> xbInt16 ALLTRIM( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> xbInt16 ASC( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dAscOut );</div>
+<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> xbInt16 AT( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sSrchFor, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sBase, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dPos );</div>
+<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> xbInt16 CDOW( <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dInDate, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOutDow );</div>
+<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> xbInt16 CHR( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dAsciCd, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> xbInt16 CMONTH( <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dInDate, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOutMonth );</div>
+<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> xbInt16 CTOD( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sInDate, <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dOutDate );</div>
+<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> xbInt16 DATE( <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dOutDate );</div>
+<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> xbInt16 DAY( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dInDate, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dOutDay );</div>
+<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> xbInt16 DEL( <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> * d, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut, xbInt16 iRecBufSw = 0 );</div>
+<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> xbInt16 DELETED( <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> * d, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bOut, xbInt16 iRecBufSw = 0 );</div>
+<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> xbInt16 DESCEND( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> xbInt16 DESCEND( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dInDate, <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dOutDate );</div>
+<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> xbInt16 DESCEND( <span class="keyword">const</span> <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dsOut );</div>
+<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> xbInt16 DOW( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;sInDate, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dDowOut );</div>
+<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> xbInt16 DTOC( <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dInDate, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOutFmtDate );</div>
+<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> xbInt16 DTOS( <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dInDate, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOutFmtDate );</div>
+<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> xbInt16 EXP( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dOut );</div>
+<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> xbInt16 IIF( <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> bResult, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sTrueResult, <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sFalseResult, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sResult );</div>
+<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> xbInt16 INT( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dOut );</div>
+<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> xbInt16 ISALPHA( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bResult );</div>
+<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> xbInt16 ISLOWER( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bResult );</div>
+<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> xbInt16 ISUPPER( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;s, <a class="code hl_typedef" href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xbBool</a> &amp;bResult );</div>
+<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> xbInt16 LEFT( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, xbUInt32 lCharCnt, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> xbInt16 LEN( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dLen );</div>
+<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> xbInt16 LOG( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dOut );</div>
+<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> xbInt16 LOWER( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> xbInt16 LTRIM( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp; sOut );</div>
+<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> xbInt16 MAX( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn1, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn2, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dOut );</div>
+<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> xbInt16 MIN( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn1, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn2, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dOut );</div>
+<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> xbInt16 MONTH( <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dInDate, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dMonthOut );</div>
+<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> xbInt16 RECCOUNT( <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> * d, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dRecOut );</div>
+<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> xbInt16 RECNO( <a class="code hl_class" href="classxb_1_1xbDbf.html">xbDbf</a> * d, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dRecOut );</div>
+<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> xbInt16 REPLICATE( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, xbUInt32 ulRepCnt, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> xbInt16 RIGHT( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, xbUInt32 iCharCnt, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> xbInt16 RTRIM( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> xbInt16 SPACE( xbInt32 lCnt, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> xbInt16 SQRT( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dBase, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dSqrRt );</div>
+<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> xbInt16 STOD( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;sDateOut );</div>
+<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> xbInt16 STR( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> xbInt16 STR( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn, xbUInt32 ulLen, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> xbInt16 STR( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn, xbUInt32 ulLen, xbUInt32 ulDec, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> xbInt16 STR( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn, xbUInt32 ulLen, xbUInt32 ulDec, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sPadChar, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> xbInt16 STRZERO( <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> dIn, xbUInt32 ulLen, xbUInt32 ulDec, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> xbInt16 SUBSTR( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, xbUInt32 ulStartPos, xbUInt32 ulLen, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> xbInt16 TRIM( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> xbInt16 UPPER( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sOut );</div>
+<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> xbInt16 VAL( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sIn, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dOut );</div>
+<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> xbInt16 YEAR( <a class="code hl_class" href="classxb_1_1xbDate.html">xbDate</a> &amp;dInDate, <a class="code hl_typedef" href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xbDouble</a> &amp;dOutYear );</div>
+<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span><span class="preprocessor"> #endif</span></div>
+<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> </div>
+<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keyword">protected</span>:</div>
+<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"><a class="line" href="classxb_1_1xbXBase.html#a86a53ce3efbf910996df0f853f1c0add"> 207</a></span> <span class="keyword">friend</span> <span class="keyword">class </span>xbBcd;</div>
+<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"><a class="line" href="classxb_1_1xbXBase.html#a3c3e5617be811d732472fe2cc8fb18cc"> 208</a></span> <span class="keyword">friend</span> <span class="keyword">class </span>xbExp;</div>
+<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> </div>
+<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"><a class="line" href="classxb_1_1xbXBase.html#ae52e53340593b4253936c1372ec15ee1"> 210</a></span> xbInt16 <a class="code hl_function" href="classxb_1_1xbXBase.html#ae52e53340593b4253936c1372ec15ee1">GetFunctionInfo</a>( <span class="keyword">const</span> <a class="code hl_class" href="classxb_1_1xbString.html">xbString</a> &amp;sExpLine, <span class="keywordtype">char</span> &amp;cReturnType, xbInt16 &amp;iReturnLenCalc, xbInt32 &amp;lReturnLenVal ) <span class="keyword">const</span>;</div>
+<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <span class="keyword">static</span> xbInt16 xbMemcmp( <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *s1, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *s2, <span class="keywordtype">size_t</span> n );</div>
+<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> </div>
+<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> <span class="keyword">private</span>:</div>
+<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> </div>
+<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span><span class="preprocessor">#ifdef XB_LOGGING_SUPPORT</span></div>
+<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <a class="code hl_variable" href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xbLog</a> *xLog;</div>
+<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span><span class="preprocessor">#endif</span></div>
+<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> </div>
+<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span>};</div>
+<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> </div>
+<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span>} <span class="comment">/* namespace xb */</span></div>
+<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span><span class="preprocessor">#endif </span><span class="comment">/* __XB_DBLIST_H__ */</span><span class="preprocessor"></span></div>
+<div class="ttc" id="aclassxb_1_1xbDate_html"><div class="ttname"><a href="classxb_1_1xbDate.html">xb::xbDate</a></div><div class="ttdoc">xbDate class.</div><div class="ttdef"><b>Definition:</b> xbdate.h:62</div></div>
+<div class="ttc" id="aclassxb_1_1xbDbf_html"><div class="ttname"><a href="classxb_1_1xbDbf.html">xb::xbDbf</a></div><div class="ttdoc">Base class for handling dbf files/tables.</div><div class="ttdef"><b>Definition:</b> xbdbf.h:150</div></div>
+<div class="ttc" id="aclassxb_1_1xbString_html"><div class="ttname"><a href="classxb_1_1xbString.html">xb::xbString</a></div><div class="ttdoc">Class for handling string data.</div><div class="ttdef"><b>Definition:</b> xbstring.h:50</div></div>
+<div class="ttc" id="aclassxb_1_1xbTblMgr_html"><div class="ttname"><a href="classxb_1_1xbTblMgr.html">xb::xbTblMgr</a></div><div class="ttdef"><b>Definition:</b> xbtblmgr.h:38</div></div>
+<div class="ttc" id="aclassxb_1_1xbXBase_html"><div class="ttname"><a href="classxb_1_1xbXBase.html">xb::xbXBase</a></div><div class="ttdoc">xbXbase class.</div><div class="ttdef"><b>Definition:</b> xbxbase.h:123</div></div>
+<div class="ttc" id="aclassxb_1_1xbXBase_html_aa957eb502ecd076e5df89e7415cb094b"><div class="ttname"><a href="classxb_1_1xbXBase.html#aa957eb502ecd076e5df89e7415cb094b">xb::xbXBase::OpenHighestVersion</a></div><div class="ttdeci">xbInt16 OpenHighestVersion(const xbString &amp;sTableName, const xbString &amp;sAlias, xbDbf &amp;dbf, int dummy)</div></div>
+<div class="ttc" id="aclassxb_1_1xbXBase_html_ae52e53340593b4253936c1372ec15ee1"><div class="ttname"><a href="classxb_1_1xbXBase.html#ae52e53340593b4253936c1372ec15ee1">xb::xbXBase::GetFunctionInfo</a></div><div class="ttdeci">xbInt16 GetFunctionInfo(const xbString &amp;sExpLine, char &amp;cReturnType, xbInt16 &amp;iReturnLenCalc, xbInt32 &amp;lReturnLenVal) const</div></div>
+<div class="ttc" id="anamespacexb_html"><div class="ttname"><a href="namespacexb.html">xb</a></div><div class="ttdef"><b>Definition:</b> xbdate.cpp:19</div></div>
+<div class="ttc" id="anamespacexb_html_a25f47b226ce924a5c78f97989b0744a2"><div class="ttname"><a href="namespacexb.html#a25f47b226ce924a5c78f97989b0744a2">xb::xbDouble</a></div><div class="ttdeci">double xbDouble</div><div class="ttdef"><b>Definition:</b> xbtypes.h:23</div></div>
+<div class="ttc" id="anamespacexb_html_a4a31fbe9110c9e55495ce71e642d785c"><div class="ttname"><a href="namespacexb.html#a4a31fbe9110c9e55495ce71e642d785c">xb::xbLog</a></div><div class="ttdeci">class XBDLLEXPORT xbLog</div><div class="ttdef"><b>Definition:</b> xbxbase.h:26</div></div>
+<div class="ttc" id="anamespacexb_html_a97858ddeb1c4b0100f3edc1a46d3a8b0"><div class="ttname"><a href="namespacexb.html#a97858ddeb1c4b0100f3edc1a46d3a8b0">xb::xbXBase</a></div><div class="ttdeci">class XBDLLEXPORT xbXBase</div><div class="ttdef"><b>Definition:</b> xbssv.h:27</div></div>
+<div class="ttc" id="anamespacexb_html_ab1a750481dd487f0d384aa1d200dff0f"><div class="ttname"><a href="namespacexb.html#ab1a750481dd487f0d384aa1d200dff0f">xb::xbBool</a></div><div class="ttdeci">short int xbBool</div><div class="ttdef"><b>Definition:</b> xbtypes.h:24</div></div>
+</div><!-- fragment --></div><!-- contents -->
+<!-- start footer part -->
+<hr class="footer"/><address class="footer"><small>
+Generated by&#160;<a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3
+</small></address>
+</body>
+</html>
diff --git a/docs/doxygen/latex/Makefile b/docs/doxygen/latex/Makefile
new file mode 100644
index 0000000..877c9cc
--- /dev/null
+++ b/docs/doxygen/latex/Makefile
@@ -0,0 +1,23 @@
+LATEX_CMD=pdflatex
+
+all: refman.pdf
+
+pdf: refman.pdf
+
+refman.pdf: clean refman.tex
+ $(LATEX_CMD) refman
+ makeindex refman.idx
+ $(LATEX_CMD) refman
+ latex_count=8 ; \
+ while egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\
+ do \
+ echo "Rerunning latex...." ;\
+ $(LATEX_CMD) refman ;\
+ latex_count=`expr $$latex_count - 1` ;\
+ done
+ makeindex refman.idx
+ $(LATEX_CMD) refman
+
+
+clean:
+ rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out *.brf *.blg *.bbl refman.pdf
diff --git a/docs/doxygen/latex/annotated.tex b/docs/doxygen/latex/annotated.tex
new file mode 100644
index 0000000..4ee4578
--- /dev/null
+++ b/docs/doxygen/latex/annotated.tex
@@ -0,0 +1,12 @@
+\doxysection{Data Structures}
+Here are the data structures with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{\mbox{\hyperlink{classxb_1_1xbDate}{xb\+::xb\+Date}} \\*Xb\+Date class }{\pageref{classxb_1_1xbDate}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+::xb\+Dbf}} \\*Base class for handling dbf files/tables }{\pageref{classxb_1_1xbDbf}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classxb_1_1xbFile}{xb\+::xb\+File}} \\*Class for handling low level file I/O }{\pageref{classxb_1_1xbFile}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structxb_1_1xbSchema}{xb\+::xb\+Schema}} \\*Schema used for defining tables with Create\+Table methods }{\pageref{structxb_1_1xbSchema}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classxb_1_1xbSsv}{xb\+::xb\+Ssv}} \\*Class for handling shared system variables }{\pageref{classxb_1_1xbSsv}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classxb_1_1xbString}{xb\+::xb\+String}} \\*Class for handling string data }{\pageref{classxb_1_1xbString}}{}
+\item\contentsline{section}{\mbox{\hyperlink{structxb_1_1xbTblList}{xb\+::xb\+Tbl\+List}} }{\pageref{structxb_1_1xbTblList}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classxb_1_1xbTblMgr}{xb\+::xb\+Tbl\+Mgr}} }{\pageref{classxb_1_1xbTblMgr}}{}
+\item\contentsline{section}{\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+::xb\+XBase}} \\*Xb\+Xbase class }{\pageref{classxb_1_1xbXBase}}{}
+\end{DoxyCompactList}
diff --git a/docs/doxygen/latex/checkndx_8cpp.tex b/docs/doxygen/latex/checkndx_8cpp.tex
new file mode 100644
index 0000000..d2155ae
--- /dev/null
+++ b/docs/doxygen/latex/checkndx_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{checkndx_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/checkndx.cpp File Reference}
+\label{checkndx_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/checkndx.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/checkndx.cpp}}
+{\ttfamily \#include $<$xbase64/xbase64.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{checkndx_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{checkndx_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{checkndx_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{checkndx.cpp@{checkndx.cpp}!main@{main}}
+\index{main@{main}!checkndx.cpp@{checkndx.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/classxb_1_1xbDate.eps b/docs/doxygen/latex/classxb_1_1xbDate.eps
new file mode 100644
index 0000000..80ed36f
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbDate.eps
@@ -0,0 +1,197 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: ClassName
+%%Creator: Doxygen
+%%CreationDate: Time
+%%For:
+%Magnification: 1.00
+%%Orientation: Portrait
+%%BoundingBox: 0 0 500 512.820496
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%EndComments
+
+% ----- variables -----
+
+/boxwidth 0 def
+/boxheight 40 def
+/fontheight 24 def
+/marginwidth 10 def
+/distx 20 def
+/disty 40 def
+/boundaspect 0.975000 def % aspect ratio of the BoundingBox (width/height)
+/boundx 500 def
+/boundy boundx boundaspect div def
+/xspacing 0 def
+/yspacing 0 def
+/rows 2 def
+/cols 1 def
+/scalefactor 0 def
+/boxfont /Times-Roman findfont fontheight scalefont def
+
+% ----- procedures -----
+
+/dotted { [1 4] 0 setdash } def
+/dashed { [5] 0 setdash } def
+/solid { [] 0 setdash } def
+
+/max % result = MAX(arg1,arg2)
+{
+ /a exch def
+ /b exch def
+ a b gt {a} {b} ifelse
+} def
+
+/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)
+{
+ 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max
+} def
+
+/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))
+{
+ /str exch def
+ /boxwidth boxwidth str stringwidth pop max def
+} def
+
+/box % draws a box with text 'arg1' at grid pos (arg2,arg3)
+{ gsave
+ 2 setlinewidth
+ newpath
+ exch xspacing mul xoffset add
+ exch yspacing mul
+ moveto
+ boxwidth 0 rlineto
+ 0 boxheight rlineto
+ boxwidth neg 0 rlineto
+ 0 boxheight neg rlineto
+ closepath
+ dup stringwidth pop neg boxwidth add 2 div
+ boxheight fontheight 2 div sub 2 div
+ rmoveto show stroke
+ grestore
+} def
+
+/mark
+{ newpath
+ exch xspacing mul xoffset add boxwidth add
+ exch yspacing mul
+ moveto
+ 0 boxheight 4 div rlineto
+ boxheight neg 4 div boxheight neg 4 div rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/arrow
+{ newpath
+ moveto
+ 3 -8 rlineto
+ -6 0 rlineto
+ 3 8 rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/out % draws an output connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight add
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/in % draws an input connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul disty 2 div sub
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/hedge
+{
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight 2 div sub
+ /y exch def
+ /x exch def
+ newpath
+ x y moveto
+ boxwidth 2 div distx add 0 rlineto
+ stroke
+ 1 eq
+ { newpath x boxwidth 2 div distx add add y moveto
+ -8 3 rlineto
+ 0 -6 rlineto
+ 8 3 rlineto
+ closepath
+ eofill
+ stroke
+ } if
+} def
+
+/vedge
+{
+ /ye exch def
+ /ys exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add dup
+ ys yspacing mul boxheight 2 div sub
+ moveto
+ ye yspacing mul boxheight 2 div sub
+ lineto
+ stroke
+} def
+
+/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3'
+{
+ /ys exch def
+ /xe exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add
+ ys yspacing mul disty 2 div sub
+ moveto
+ xspacing xe xs sub mul 0
+ rlineto
+ stroke
+} def
+
+% ----- main ------
+
+boxfont setfont
+1 boundaspect scale
+(xb::xbDate) cw
+(xb::xbSsv) cw
+/boxwidth boxwidth marginwidth 2 mul add def
+/xspacing boxwidth distx add def
+/yspacing boxheight disty add def
+/scalefactor
+ boxwidth cols mul distx cols 1 sub mul add
+ boxheight rows mul disty rows 1 sub mul add boundaspect mul
+ max def
+boundx scalefactor div boundy scalefactor div scale
+
+% ----- classes -----
+
+ (xb::xbDate) 0.000000 0.000000 box
+ (xb::xbSsv) 0.000000 1.000000 box
+
+% ----- relations -----
+
+solid
+0 0.000000 0.000000 out
+solid
+1 0.000000 1.000000 in
diff --git a/docs/doxygen/latex/classxb_1_1xbDate.pdf b/docs/doxygen/latex/classxb_1_1xbDate.pdf
new file mode 100644
index 0000000..a18103b
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbDate.pdf
Binary files differ
diff --git a/docs/doxygen/latex/classxb_1_1xbDate.tex b/docs/doxygen/latex/classxb_1_1xbDate.tex
new file mode 100644
index 0000000..9001be4
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbDate.tex
@@ -0,0 +1,1029 @@
+\hypertarget{classxb_1_1xbDate}{}\doxysection{xb\+::xb\+Date Class Reference}
+\label{classxb_1_1xbDate}\index{xb::xbDate@{xb::xbDate}}
+
+
+\mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} class.
+
+
+
+
+{\ttfamily \#include $<$xbdate.\+h$>$}
+
+Inheritance diagram for xb\+::xb\+Date\+:\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[height=2.000000cm]{classxb_1_1xbDate}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classxb_1_1xbDate_ab3150e7db0ab5db10a07d748b55465eb}{xb\+Date}} ()
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbDate_ac8a4d9330221a3daee21b3c28c1d9719}{xb\+Date}} (const char $\ast$Date8)
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbDate_acf4546f5681735ede18210f60bab68d4}{xb\+Date}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&Date8)
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbDate_a7ab727a7ec184a086ad36ef83b948170}{xb\+Date}} (xb\+Int32 l\+Jul\+Date)
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbDate_a05c9680c6eb9fe07ecf13a189b596c37}{$\sim$xb\+Date}} ()
+\begin{DoxyCompactList}\small\item\em Destructor. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbDate_a2e33ad9415c32e820e08fd8084198690}{operator=}} (const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&d)
+\begin{DoxyCompactList}\small\item\em Set operator=. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbDate_a947ba156d04fe063aaa4c9964ae5d163}{operator+=}} (xb\+Int32 i)
+\begin{DoxyCompactList}\small\item\em operator += \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbDate_a4a8f207d759540114373f5e9d6d375f7}{operator-\/=}} (xb\+Int32 i)
+\begin{DoxyCompactList}\small\item\em operator -\/= \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbDate_a1c7d9e3718c43df18b21646072c8605e}{operator++}} (xb\+Int32 i)
+\begin{DoxyCompactList}\small\item\em operator ++ \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbDate_ae2b33dfee60d324916d833b2098b5a6b}{operator-\/-\/}} (xb\+Int32 i)
+\begin{DoxyCompactList}\small\item\em operator -- \end{DoxyCompactList}\item
+xb\+Int32 \mbox{\hyperlink{classxb_1_1xbDate_a3f3a8802c96098c85aa8d0e19717a979}{operator-\/}} (const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&) const
+\begin{DoxyCompactList}\small\item\em operator -\/ \end{DoxyCompactList}\item
+const char $\ast$ \mbox{\hyperlink{classxb_1_1xbDate_a73ff5c037046ac0a0bb7d73f74e25cbb}{operator-\/}} (xb\+Int32 i)
+\begin{DoxyCompactList}\small\item\em operator -\/ \end{DoxyCompactList}\item
+const char $\ast$ \mbox{\hyperlink{classxb_1_1xbDate_ad09609bf78cf038886a4f9cd19423f9c}{operator+}} (xb\+Int32 i)
+\begin{DoxyCompactList}\small\item\em operator + \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbDate_aaaf98c1a672066021895f0953b6e94d0}{operator==}} (const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&) const
+\begin{DoxyCompactList}\small\item\em operator == \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbDate_ac3aaf8997fc0c36676085e7741f33a8a}{operator!=}} (const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&) const
+\begin{DoxyCompactList}\small\item\em operator != \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbDate_a11f09d97ed527e7ef00ba6f17b9fb02c}{operator$<$}} (const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&) const
+\begin{DoxyCompactList}\small\item\em operator \texorpdfstring{$<$}{<} \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbDate_a744031c4031d6ec4595d34acbd1c5860}{operator$>$}} (const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&) const
+\begin{DoxyCompactList}\small\item\em \texorpdfstring{$>$}{>} \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbDate_a6d8fa4df4664f3fd8d4cc15e77f6d046}{operator$<$=}} (const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&) const
+\begin{DoxyCompactList}\small\item\em operator \texorpdfstring{$<$}{<}= \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbDate_a1d81959ea55440588068ea7f82617c99}{operator$>$=}} (const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&) const
+\begin{DoxyCompactList}\small\item\em operator \texorpdfstring{$>$}{>}= \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_a9df58caa54105c489c314785c457e8cb}{Calc\+Rolling\+Century\+For\+Year}} (xb\+Int16 year) const
+\begin{DoxyCompactList}\small\item\em Calculate century for a given year. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_a38b2c5285c69ed65e94ece6c22dafde0}{Century\+Of}} () const
+\begin{DoxyCompactList}\small\item\em Get century for date. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_a9fc29730b66cddfbb58c69992a99cc7c}{Char\+Day\+Of}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Out\+Char\+Day)
+\begin{DoxyCompactList}\small\item\em Get the day of the week. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_afffc84f02bd421335ff8ebe9fb3db0ac}{Char\+Month\+Of}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Out\+Char\+Month)
+\begin{DoxyCompactList}\small\item\em Get the month from the date. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbDate_a367f66ef0c03c1747c12a18784554ccb}{Date\+Is\+Valid}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Date8) const
+\begin{DoxyCompactList}\small\item\em Check a date for valid data. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_ad6417a900ce64a46f8909c0c7a2ddea2}{Day\+Of}} (xb\+Int16 i\+Format) const
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_abb1eb4b0394e4a67aadab15779b1b8c5}{CTOD}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Ctod\+In\+Date)
+\begin{DoxyCompactList}\small\item\em Format MM/\+DD/\+YY date. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_a01de44dc869f7db99f33046fc91f2c6a}{Format\+Date}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Fmt\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Fmt\+Out)
+\item
+const char $\ast$ \mbox{\hyperlink{classxb_1_1xbDate_ab43a5d8d929767c0ffdd722972bb8cc0}{Str}} () const
+\begin{DoxyCompactList}\small\item\em Return the date value. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbDate_af2bd33a72448e2c5ee00d8b711dc5d95}{Is\+Leap\+Year}} (xb\+Int16 i\+Year) const
+\begin{DoxyCompactList}\small\item\em Determine if date is a leap year. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbDate_a5f8051c31b29244265e8f26ac3547b9b}{Is\+Leap\+Year}} () const
+\begin{DoxyCompactList}\small\item\em Determine if date is a leap year. \end{DoxyCompactList}\item
+xb\+Int32 \mbox{\hyperlink{classxb_1_1xbDate_a1ee3377d4ead9d31099eee539d9b13a7}{Julian\+Days}} () const
+\begin{DoxyCompactList}\small\item\em Calculate julian days for a given date. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_a9d28b2a46d8aaa284b92f44eeb96b2ff}{Jul\+To\+Date8}} (xb\+Int32 l\+Jul\+Date)
+\begin{DoxyCompactList}\small\item\em Convert the number of julian days to gregorian date. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_a15847866bb7642aa42bc254e0cf2038a}{Last\+Day\+Of\+Month}} ()
+\begin{DoxyCompactList}\small\item\em Set the date to the last day of month for a given date. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_a08bd84c67e1119d8c5c1748cd89d092e}{Month\+Of}} () const
+\begin{DoxyCompactList}\small\item\em Return the month for the date. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_a4b0cde152b5de0f7d26608d1445110b6}{Set}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&Date8)
+\begin{DoxyCompactList}\small\item\em Set the date. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_a40ba54a58d64cf56266f020f91584192}{Sysdate}} ()
+\begin{DoxyCompactList}\small\item\em Set the date equal to the system date. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDate_a31057dfaa36389a16e40e3db82c46262}{Year\+Of}} () const
+\begin{DoxyCompactList}\small\item\em Returns the year of the date. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}{Display\+Error}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Display error message on console for a given error number. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}{Get\+Default\+Date\+Format}} () const
+\begin{DoxyCompactList}\small\item\em Get the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}{Get\+Data\+Directory}} () const
+\begin{DoxyCompactList}\small\item\em Get the current data directory. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}{Get\+Endian\+Type}} () const
+\begin{DoxyCompactList}\small\item\em Get the Endian type. \end{DoxyCompactList}\item
+const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}{Get\+Error\+Message}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Get an error message. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}{Set\+Data\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Data\+Directory)
+\begin{DoxyCompactList}\small\item\em Set the data directory. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}{Set\+Default\+Date\+Format}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Date\+Format)
+\begin{DoxyCompactList}\small\item\em Set the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}{Bit\+Set}} (unsigned char c, xb\+Int16 i\+Bit\+No) const
+\begin{DoxyCompactList}\small\item\em Check a bit in a one byte field and see if it is set. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}{Get\+Default\+Auto\+Commit}} () const
+\begin{DoxyCompactList}\small\item\em Get the default auto commit setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}{Set\+Default\+Auto\+Commit}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Default\+Auto\+Commit)
+\begin{DoxyCompactList}\small\item\em Set the default auto commit. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}{Get\+Default\+Log\+Directory}} () const
+\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}{Get\+Default\+Log\+File\+Name}} () const
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}{Set\+Default\+Log\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Log\+Directory)
+\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}{Get\+Multi\+User}} () const
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}{Set\+Multi\+User}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Multi\+User)
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+static const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}{Error\+Code\+Text}} \mbox{[}$\,$\mbox{]}
+\end{DoxyCompactItemize}
+\doxysubsection*{Protected Member Functions}
+\begin{DoxyCompactItemize}
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}{Set\+Endian\+Type}} ()
+\begin{DoxyCompactList}\small\item\em Set the endian type. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Protected Attributes}
+\begin{DoxyCompactItemize}
+\item
+static xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}{i\+Endian\+Type}} = 0
+\item
+static \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}{s\+Null\+String}} = \char`\"{}\char`\"{}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+\mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} class.
+
+This \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} class handles two type of date values\+:~\newline
+
+
+1) Gregorian dates with a format of CCYYMMDD. This is how dates are stored in dbf files.~\newline
+ 2) Julian dates calculated as the number of days since 1901-\/01-\/01 + 1721425.~\newline
+
+
+Leap Years\+: The routines in the class support both leap years (one every four years) and leap centuries (one every four hundred years.)
+
+A leap year is a year having 366 days, which can be evenly divisible by 4 and not by 100.~\newline
+ Leap centuries are years which are evenly divisible by 400.~\newline
+
+
+From a programming perspective, Julian dates are useful for date arithmetic, determining the difference between two dates or calculating a future or past date.~\newline
+
+
+To determine the difference between two dates, convert both dates to a Julian date and subtract one from the other.~\newline
+
+
+To calculate a future or past date, convert the base date to a Julian date, add (or subtract) the number of days necessary to (from) it and convert the julian date back to a Gregorian date.
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classxb_1_1xbDate_ab3150e7db0ab5db10a07d748b55465eb}\label{classxb_1_1xbDate_ab3150e7db0ab5db10a07d748b55465eb}}
+\index{xb::xbDate@{xb::xbDate}!xbDate@{xbDate}}
+\index{xbDate@{xbDate}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{xbDate()}{xbDate()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}}
+{\footnotesize\ttfamily xb\+::xb\+Date\+::xb\+Date (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+\mbox{\Hypertarget{classxb_1_1xbDate_ac8a4d9330221a3daee21b3c28c1d9719}\label{classxb_1_1xbDate_ac8a4d9330221a3daee21b3c28c1d9719}}
+\index{xb::xbDate@{xb::xbDate}!xbDate@{xbDate}}
+\index{xbDate@{xbDate}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{xbDate()}{xbDate()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}}
+{\footnotesize\ttfamily xb\+::xb\+Date\+::xb\+Date (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s\+Date8\+In }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Date8\+In} & -\/ Input date. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDate_acf4546f5681735ede18210f60bab68d4}\label{classxb_1_1xbDate_acf4546f5681735ede18210f60bab68d4}}
+\index{xb::xbDate@{xb::xbDate}!xbDate@{xbDate}}
+\index{xbDate@{xbDate}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{xbDate()}{xbDate()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}}
+{\footnotesize\ttfamily xb\+::xb\+Date\+::xb\+Date (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Date8\+In }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Date8\+In} & -\/ Input date. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDate_a7ab727a7ec184a086ad36ef83b948170}\label{classxb_1_1xbDate_a7ab727a7ec184a086ad36ef83b948170}}
+\index{xb::xbDate@{xb::xbDate}!xbDate@{xbDate}}
+\index{xbDate@{xbDate}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{xbDate()}{xbDate()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}}
+{\footnotesize\ttfamily xb\+::xb\+Date\+::xb\+Date (\begin{DoxyParamCaption}\item[{xb\+Int32}]{l\+Jul\+Date }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+
+\begin{DoxyParams}{Parameters}
+{\em l\+Jul\+Date} & -\/ Input julian date. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDate_a05c9680c6eb9fe07ecf13a189b596c37}\label{classxb_1_1xbDate_a05c9680c6eb9fe07ecf13a189b596c37}}
+\index{xb::xbDate@{xb::xbDate}!````~xbDate@{$\sim$xbDate}}
+\index{````~xbDate@{$\sim$xbDate}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{$\sim$xbDate()}{~xbDate()}}
+{\footnotesize\ttfamily xb\+::xb\+Date\+::$\sim$xb\+Date (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Destructor.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}\label{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}}
+\index{xb::xbDate@{xb::xbDate}!BitSet@{BitSet}}
+\index{BitSet@{BitSet}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{BitSet()}{BitSet()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Bit\+Set (\begin{DoxyParamCaption}\item[{unsigned char}]{c, }\item[{xb\+Int16}]{i\+Bit\+No }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Check a bit in a one byte field and see if it is set.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & One byte char field to examine. \\
+\hline
+{\em i\+Bit\+No} & which bit to examine. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True Bit is set~\newline
+ xb\+False Bit is not set
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a9df58caa54105c489c314785c457e8cb}\label{classxb_1_1xbDate_a9df58caa54105c489c314785c457e8cb}}
+\index{xb::xbDate@{xb::xbDate}!CalcRollingCenturyForYear@{CalcRollingCenturyForYear}}
+\index{CalcRollingCenturyForYear@{CalcRollingCenturyForYear}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{CalcRollingCenturyForYear()}{CalcRollingCenturyForYear()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Calc\+Rolling\+Century\+For\+Year (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Calc\+Year }\end{DoxyParamCaption}) const}
+
+
+
+Calculate century for a given year.
+
+This routine calculates a century for a given year. It uses an 80/20 rolling date window to calculate the century.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Calc\+Year} & -\/ Two digit year to calculate a century for. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Century calculated for the two digit year.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a38b2c5285c69ed65e94ece6c22dafde0}\label{classxb_1_1xbDate_a38b2c5285c69ed65e94ece6c22dafde0}}
+\index{xb::xbDate@{xb::xbDate}!CenturyOf@{CenturyOf}}
+\index{CenturyOf@{CenturyOf}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{CenturyOf()}{CenturyOf()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Century\+Of (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get century for date.
+
+\begin{DoxyReturn}{Returns}
+This routine returns the century from the date.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a9fc29730b66cddfbb58c69992a99cc7c}\label{classxb_1_1xbDate_a9fc29730b66cddfbb58c69992a99cc7c}}
+\index{xb::xbDate@{xb::xbDate}!CharDayOf@{CharDayOf}}
+\index{CharDayOf@{CharDayOf}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{CharDayOf()}{CharDayOf()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Char\+Day\+Of (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Out\+Char\+Day }\end{DoxyParamCaption})}
+
+
+
+Get the day of the week.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Out\+Char\+Day} & -\/ Output character day of week (Sun-\/\+Sat). \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+INVALID\+\_\+\+DATE~\newline
+XB\+\_\+\+NO\+\_\+\+ERROR
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_afffc84f02bd421335ff8ebe9fb3db0ac}\label{classxb_1_1xbDate_afffc84f02bd421335ff8ebe9fb3db0ac}}
+\index{xb::xbDate@{xb::xbDate}!CharMonthOf@{CharMonthOf}}
+\index{CharMonthOf@{CharMonthOf}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{CharMonthOf()}{CharMonthOf()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Char\+Month\+Of (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Out\+Char\+Month }\end{DoxyParamCaption})}
+
+
+
+Get the month from the date.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Out\+Char\+Month} & -\/ Output character month. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+INVALID\+\_\+\+DATE~\newline
+XB\+\_\+\+NO\+\_\+\+ERROR
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_abb1eb4b0394e4a67aadab15779b1b8c5}\label{classxb_1_1xbDate_abb1eb4b0394e4a67aadab15779b1b8c5}}
+\index{xb::xbDate@{xb::xbDate}!CTOD@{CTOD}}
+\index{CTOD@{CTOD}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{CTOD()}{CTOD()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+CTOD (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Ctod\+In\+Date }\end{DoxyParamCaption})}
+
+
+
+Format MM/\+DD/\+YY date.
+
+This routine takes an MM/\+DD/\+YY format date as input and populates a date class with the appropriate YYYYMMDD data.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Ctod\+In\+Date} & -\/ MM/\+DD/\+YY formatted date as input. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+INVALID\+\_\+\+OPTION~\newline
+XB\+\_\+\+NO\+\_\+\+ERROR
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a367f66ef0c03c1747c12a18784554ccb}\label{classxb_1_1xbDate_a367f66ef0c03c1747c12a18784554ccb}}
+\index{xb::xbDate@{xb::xbDate}!DateIsValid@{DateIsValid}}
+\index{DateIsValid@{DateIsValid}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{DateIsValid()}{DateIsValid()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Date\+::\+Date\+Is\+Valid (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Date\+In }\end{DoxyParamCaption}) const}
+
+
+
+Check a date for valid data.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Date\+In} & -\/ Date to check for valid formaat of CCYYMMDD. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Valid date.~\newline
+xb\+False -\/ Not a valid date.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_ad6417a900ce64a46f8909c0c7a2ddea2}\label{classxb_1_1xbDate_ad6417a900ce64a46f8909c0c7a2ddea2}}
+\index{xb::xbDate@{xb::xbDate}!DayOf@{DayOf}}
+\index{DayOf@{DayOf}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{DayOf()}{DayOf()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Day\+Of (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Format }\end{DoxyParamCaption}) const}
+
+This routine returns the numeric day.
+\begin{DoxyParams}{Parameters}
+{\em i\+Format} & XB\+\_\+\+FMT\+\_\+\+WEEK Number of day in WEEK 0-\/6 ( Sat -\/ Fri )~\newline
+ XB\+\_\+\+FMT\+\_\+\+MONTH Number of day in MONTH 1-\/31~\newline
+ XB\+\_\+\+FMT\+\_\+\+YEAR Number of day in YEAR 1-\/366 \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+INVALID\+\_\+\+OPTION~\newline
+XB\+\_\+\+NO\+\_\+\+ERROR
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}\label{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}}
+\index{xb::xbDate@{xb::xbDate}!DisplayError@{DisplayError}}
+\index{DisplayError@{DisplayError}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{DisplayError()}{DisplayError()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Display\+Error (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Display error message on console for a given error number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error number to reference \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDate_a01de44dc869f7db99f33046fc91f2c6a}\label{classxb_1_1xbDate_a01de44dc869f7db99f33046fc91f2c6a}}
+\index{xb::xbDate@{xb::xbDate}!FormatDate@{FormatDate}}
+\index{FormatDate@{FormatDate}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{FormatDate()}{FormatDate()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Format\+Date (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Fmt\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Out\+Fmt\+Date }\end{DoxyParamCaption})}
+
+This routine will reformat a date based on the format specifiers entered in s\+Fmt\+In. If no input format is specified, the routine will use the system default date format.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Fmt\+In} & -\/ A format specifier with the following paramaters\+:~\newline
+ \begin{DoxyVerb} 1) YYDDD - A julian date format
+ 2) YY or YYYY will print a 2 or 4 digit year
+ 3) M,MM,MMM or MMMM
+ M - one digit month if no leading zero
+ MM - two digit month, contains leading zero
+ MMM - Jan through Dec
+ MMMM - January through December
+ 4) D,DD,DDD or DDDD
+ D - one digit dayif no leading zero
+ DD - two digit day, contains leading zero
+ DDD - Sun through Sat (or julian if YYDDD)
+ DDDD - Sunday through Saturday
+\end{DoxyVerb}
+ \\
+\hline
+{\em s\+Out\+Fmt\+Date} & -\/ Reformatted output date. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+NO\+\_\+\+ERROR ~\newline
+~\newline
+ Format Examples\+:~\newline
+ MM/\+DD/\+YY~\newline
+ YYYY-\/\+MM-\/\+DD~\newline
+ DDDDDDDDDDD MMMMMMMMMMM DD,YYYY
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}\label{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}}
+\index{xb::xbDate@{xb::xbDate}!GetDataDirectory@{GetDataDirectory}}
+\index{GetDataDirectory@{GetDataDirectory}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{GetDataDirectory()}{GetDataDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Data\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the current data directory.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the current data directory where the database files are stored.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}\label{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}}
+\index{xb::xbDate@{xb::xbDate}!GetDefaultAutoCommit@{GetDefaultAutoCommit}}
+\index{GetDefaultAutoCommit@{GetDefaultAutoCommit}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{GetDefaultAutoCommit()}{GetDefaultAutoCommit()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Default\+Auto\+Commit (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the default auto commit setting.
+
+When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}Append\+Record().
+
+\begin{DoxyReturn}{Returns}
+xb\+True if auto commit is turned on~\newline
+ xb\+False is auto commit is turned off
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}\label{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}}
+\index{xb::xbDate@{xb::xbDate}!GetDefaultDateFormat@{GetDefaultDateFormat}}
+\index{GetDefaultDateFormat@{GetDefaultDateFormat}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{GetDefaultDateFormat()}{GetDefaultDateFormat()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Date\+Format (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the default date format.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the default date format.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}\label{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}}
+\index{xb::xbDate@{xb::xbDate}!GetDefaultLogDirectory@{GetDefaultLogDirectory}}
+\index{GetDefaultLogDirectory@{GetDefaultLogDirectory}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogDirectory()}{GetDefaultLogDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}\label{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}}
+\index{xb::xbDate@{xb::xbDate}!GetDefaultLogFileName@{GetDefaultLogFileName}}
+\index{GetDefaultLogFileName@{GetDefaultLogFileName}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogFileName()}{GetDefaultLogFileName()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}\label{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}}
+\index{xb::xbDate@{xb::xbDate}!GetEndianType@{GetEndianType}}
+\index{GetEndianType@{GetEndianType}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{GetEndianType()}{GetEndianType()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::\+Get\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the Endian type.
+
+\begin{DoxyReturn}{Returns}
+B -\/ Big endian~\newline
+ L -\/ Little endian~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}\label{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}}
+\index{xb::xbDate@{xb::xbDate}!GetErrorMessage@{GetErrorMessage}}
+\index{GetErrorMessage@{GetErrorMessage}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{GetErrorMessage()}{GetErrorMessage()}}
+{\footnotesize\ttfamily const char $\ast$ xb\+::xb\+Ssv\+::\+Get\+Error\+Message (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get an error message.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error\+Code is the error number of description to be returned. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Returns a pointer to a string containing a text description for the error code.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}\label{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}}
+\index{xb::xbDate@{xb::xbDate}!GetMultiUser@{GetMultiUser}}
+\index{GetMultiUser@{GetMultiUser}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{GetMultiUser()}{GetMultiUser()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Multi\+User (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the multi user setting.
+
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Multi user mode turned on.~\newline
+ xb\+False -\/ Multi user mode turned off.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a5f8051c31b29244265e8f26ac3547b9b}\label{classxb_1_1xbDate_a5f8051c31b29244265e8f26ac3547b9b}}
+\index{xb::xbDate@{xb::xbDate}!IsLeapYear@{IsLeapYear}}
+\index{IsLeapYear@{IsLeapYear}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{IsLeapYear()}{IsLeapYear()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Date\+::\+Is\+Leap\+Year (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Determine if date is a leap year.
+
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Is leapyear.~\newline
+ xb\+False -\/ Not a leap year.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_af2bd33a72448e2c5ee00d8b711dc5d95}\label{classxb_1_1xbDate_af2bd33a72448e2c5ee00d8b711dc5d95}}
+\index{xb::xbDate@{xb::xbDate}!IsLeapYear@{IsLeapYear}}
+\index{IsLeapYear@{IsLeapYear}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{IsLeapYear()}{IsLeapYear()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Date\+::\+Is\+Leap\+Year (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Year }\end{DoxyParamCaption}) const}
+
+
+
+Determine if date is a leap year.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Year} & -\/ Year to check for leap year status. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Is leapyear.~\newline
+ xb\+False -\/ Not a leap year.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a1ee3377d4ead9d31099eee539d9b13a7}\label{classxb_1_1xbDate_a1ee3377d4ead9d31099eee539d9b13a7}}
+\index{xb::xbDate@{xb::xbDate}!JulianDays@{JulianDays}}
+\index{JulianDays@{JulianDays}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{JulianDays()}{JulianDays()}}
+{\footnotesize\ttfamily xb\+Int32 xb\+::xb\+Date\+::\+Julian\+Days (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Calculate julian days for a given date.
+
+\begin{DoxyReturn}{Returns}
+The number of days since 01/01/0001 + JUL\+\_\+\+OFFSET.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a9d28b2a46d8aaa284b92f44eeb96b2ff}\label{classxb_1_1xbDate_a9d28b2a46d8aaa284b92f44eeb96b2ff}}
+\index{xb::xbDate@{xb::xbDate}!JulToDate8@{JulToDate8}}
+\index{JulToDate8@{JulToDate8}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{JulToDate8()}{JulToDate8()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Jul\+To\+Date8 (\begin{DoxyParamCaption}\item[{xb\+Int32}]{l\+Jul\+Days }\end{DoxyParamCaption})}
+
+
+
+Convert the number of julian days to gregorian date.
+
+
+\begin{DoxyParams}{Parameters}
+{\em l\+Jul\+Days} & -\/ Julian days. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+NO\+\_\+\+ERROR
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a15847866bb7642aa42bc254e0cf2038a}\label{classxb_1_1xbDate_a15847866bb7642aa42bc254e0cf2038a}}
+\index{xb::xbDate@{xb::xbDate}!LastDayOfMonth@{LastDayOfMonth}}
+\index{LastDayOfMonth@{LastDayOfMonth}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{LastDayOfMonth()}{LastDayOfMonth()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Last\+Day\+Of\+Month (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Set the date to the last day of month for a given date.
+
+This routine sets the last date of the month. \begin{DoxyReturn}{Returns}
+XB\+\_\+\+NO\+\_\+\+ERROR
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a08bd84c67e1119d8c5c1748cd89d092e}\label{classxb_1_1xbDate_a08bd84c67e1119d8c5c1748cd89d092e}}
+\index{xb::xbDate@{xb::xbDate}!MonthOf@{MonthOf}}
+\index{MonthOf@{MonthOf}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{MonthOf()}{MonthOf()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Month\+Of (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Return the month for the date.
+
+\begin{DoxyReturn}{Returns}
+The month of the date.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_ac3aaf8997fc0c36676085e7741f33a8a}\label{classxb_1_1xbDate_ac3aaf8997fc0c36676085e7741f33a8a}}
+\index{xb::xbDate@{xb::xbDate}!operator"!=@{operator"!=}}
+\index{operator"!=@{operator"!=}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator"!=()}{operator!=()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Date\+::operator!= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt }\end{DoxyParamCaption}) const}
+
+
+
+operator !=
+
+This routine compares two dates for inequality.
+\begin{DoxyParams}{Parameters}
+{\em dt} & -\/ Date to compare. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Dates don\textquotesingle{}t match.~\newline
+xb\+False -\/ Dates match.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_ad09609bf78cf038886a4f9cd19423f9c}\label{classxb_1_1xbDate_ad09609bf78cf038886a4f9cd19423f9c}}
+\index{xb::xbDate@{xb::xbDate}!operator+@{operator+}}
+\index{operator+@{operator+}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator+()}{operator+()}}
+{\footnotesize\ttfamily const char $\ast$ xb\+::xb\+Date\+::operator+ (\begin{DoxyParamCaption}\item[{xb\+Int32}]{l\+Count }\end{DoxyParamCaption})}
+
+
+
+operator +
+
+This routine adds additional days to a date field.
+\begin{DoxyParams}{Parameters}
+{\em l\+Count} & -\/ Number of days to add. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+New date in CCYYMMDD format.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a1c7d9e3718c43df18b21646072c8605e}\label{classxb_1_1xbDate_a1c7d9e3718c43df18b21646072c8605e}}
+\index{xb::xbDate@{xb::xbDate}!operator++@{operator++}}
+\index{operator++@{operator++}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator++()}{operator++()}}
+{\footnotesize\ttfamily void xb\+::xb\+Date\+::operator++ (\begin{DoxyParamCaption}\item[{xb\+Int32}]{i }\end{DoxyParamCaption})}
+
+
+
+operator ++
+
+This routine adds one day to the date field. \mbox{\Hypertarget{classxb_1_1xbDate_a947ba156d04fe063aaa4c9964ae5d163}\label{classxb_1_1xbDate_a947ba156d04fe063aaa4c9964ae5d163}}
+\index{xb::xbDate@{xb::xbDate}!operator+=@{operator+=}}
+\index{operator+=@{operator+=}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator+=()}{operator+=()}}
+{\footnotesize\ttfamily void xb\+::xb\+Date\+::operator+= (\begin{DoxyParamCaption}\item[{xb\+Int32}]{l\+Days }\end{DoxyParamCaption})}
+
+
+
+operator +=
+
+This routine adds l\+Days to the date
+\begin{DoxyParams}{Parameters}
+{\em l\+Days} & -\/ Number of days to add to the date. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDate_a3f3a8802c96098c85aa8d0e19717a979}\label{classxb_1_1xbDate_a3f3a8802c96098c85aa8d0e19717a979}}
+\index{xb::xbDate@{xb::xbDate}!operator-\/@{operator-\/}}
+\index{operator-\/@{operator-\/}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator-\/()}{operator-()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int32 xb\+::xb\+Date\+::operator-\/ (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt }\end{DoxyParamCaption}) const}
+
+
+
+operator -\/
+
+This routine subtracts one date from another date returning the difference.
+\begin{DoxyParams}{Parameters}
+{\em dt} & -\/ Date to subtract. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Number of days
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a73ff5c037046ac0a0bb7d73f74e25cbb}\label{classxb_1_1xbDate_a73ff5c037046ac0a0bb7d73f74e25cbb}}
+\index{xb::xbDate@{xb::xbDate}!operator-\/@{operator-\/}}
+\index{operator-\/@{operator-\/}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator-\/()}{operator-()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily const char $\ast$ xb\+::xb\+Date\+::operator-\/ (\begin{DoxyParamCaption}\item[{xb\+Int32}]{l\+Count }\end{DoxyParamCaption})}
+
+
+
+operator -\/
+
+This routine subtracts days from a date field.
+\begin{DoxyParams}{Parameters}
+{\em l\+Count} & -\/ Number of days to subtract. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+New date in CCYYMMDD format.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_ae2b33dfee60d324916d833b2098b5a6b}\label{classxb_1_1xbDate_ae2b33dfee60d324916d833b2098b5a6b}}
+\index{xb::xbDate@{xb::xbDate}!operator-\/-\/@{operator-\/-\/}}
+\index{operator-\/-\/@{operator-\/-\/}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator-\/-\/()}{operator--()}}
+{\footnotesize\ttfamily void xb\+::xb\+Date\+::operator-\/-\/ (\begin{DoxyParamCaption}\item[{xb\+Int32}]{i }\end{DoxyParamCaption})}
+
+
+
+operator --
+
+This routine subtracts one day from the date field. \mbox{\Hypertarget{classxb_1_1xbDate_a4a8f207d759540114373f5e9d6d375f7}\label{classxb_1_1xbDate_a4a8f207d759540114373f5e9d6d375f7}}
+\index{xb::xbDate@{xb::xbDate}!operator-\/=@{operator-\/=}}
+\index{operator-\/=@{operator-\/=}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator-\/=()}{operator-=()}}
+{\footnotesize\ttfamily void xb\+::xb\+Date\+::operator-\/= (\begin{DoxyParamCaption}\item[{xb\+Int32}]{l\+Days }\end{DoxyParamCaption})}
+
+
+
+operator -\/=
+
+This routine subtracts l\+Days from the date.
+\begin{DoxyParams}{Parameters}
+{\em l\+Days} & -\/ Number of days to subtract from the date. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDate_a11f09d97ed527e7ef00ba6f17b9fb02c}\label{classxb_1_1xbDate_a11f09d97ed527e7ef00ba6f17b9fb02c}}
+\index{xb::xbDate@{xb::xbDate}!operator$<$@{operator$<$}}
+\index{operator$<$@{operator$<$}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator$<$()}{operator<()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Date\+::operator$<$ (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt }\end{DoxyParamCaption}) const}
+
+
+
+operator \texorpdfstring{$<$}{<}
+
+This routine compares two dates
+\begin{DoxyParams}{Parameters}
+{\em dt} & -\/ Date to compare. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Left date is less than right date.~\newline
+ xb\+False -\/ Left date is not less than right date.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a6d8fa4df4664f3fd8d4cc15e77f6d046}\label{classxb_1_1xbDate_a6d8fa4df4664f3fd8d4cc15e77f6d046}}
+\index{xb::xbDate@{xb::xbDate}!operator$<$=@{operator$<$=}}
+\index{operator$<$=@{operator$<$=}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator$<$=()}{operator<=()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Date\+::operator$<$= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt }\end{DoxyParamCaption}) const}
+
+
+
+operator \texorpdfstring{$<$}{<}=
+
+This routine compares two dates
+\begin{DoxyParams}{Parameters}
+{\em dt} & -\/ Date to compare. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Left date is less than or equal to right date.~\newline
+ xb\+False -\/ Left date is not less than or equal to right date.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a2e33ad9415c32e820e08fd8084198690}\label{classxb_1_1xbDate_a2e33ad9415c32e820e08fd8084198690}}
+\index{xb::xbDate@{xb::xbDate}!operator=@{operator=}}
+\index{operator=@{operator=}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator=()}{operator=()}}
+{\footnotesize\ttfamily void xb\+::xb\+Date\+::operator= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt }\end{DoxyParamCaption})}
+
+
+
+Set operator=.
+
+
+\begin{DoxyParams}{Parameters}
+{\em dt} & -\/ Date value for set operation. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDate_aaaf98c1a672066021895f0953b6e94d0}\label{classxb_1_1xbDate_aaaf98c1a672066021895f0953b6e94d0}}
+\index{xb::xbDate@{xb::xbDate}!operator==@{operator==}}
+\index{operator==@{operator==}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator==()}{operator==()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Date\+::operator== (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt }\end{DoxyParamCaption}) const}
+
+
+
+operator ==
+
+This routine compares two dates for equality.
+\begin{DoxyParams}{Parameters}
+{\em dt} & -\/ Date to compare. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Dates match.~\newline
+xb\+False -\/ Dates don\textquotesingle{}t match.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a744031c4031d6ec4595d34acbd1c5860}\label{classxb_1_1xbDate_a744031c4031d6ec4595d34acbd1c5860}}
+\index{xb::xbDate@{xb::xbDate}!operator$>$@{operator$>$}}
+\index{operator$>$@{operator$>$}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator$>$()}{operator>()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Date\+::operator$>$ (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt }\end{DoxyParamCaption}) const}
+
+
+
+\texorpdfstring{$>$}{>}
+
+This routine compares two dates
+\begin{DoxyParams}{Parameters}
+{\em dt} & -\/ Date to compare. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Left date is greater than right date.~\newline
+ xb\+False -\/ Left date is not greater than right date.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a1d81959ea55440588068ea7f82617c99}\label{classxb_1_1xbDate_a1d81959ea55440588068ea7f82617c99}}
+\index{xb::xbDate@{xb::xbDate}!operator$>$=@{operator$>$=}}
+\index{operator$>$=@{operator$>$=}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{operator$>$=()}{operator>=()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Date\+::operator$>$= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt }\end{DoxyParamCaption}) const}
+
+
+
+operator \texorpdfstring{$>$}{>}=
+
+This routine compares two dates
+\begin{DoxyParams}{Parameters}
+{\em dt} & -\/ Date to compare. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Left date is greater than or equal to right date.~\newline
+ xb\+False -\/ Left date is not greater than or equal to right date.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a4b0cde152b5de0f7d26608d1445110b6}\label{classxb_1_1xbDate_a4b0cde152b5de0f7d26608d1445110b6}}
+\index{xb::xbDate@{xb::xbDate}!Set@{Set}}
+\index{Set@{Set}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{Set()}{Set()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Set (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Date\+In }\end{DoxyParamCaption})}
+
+
+
+Set the date.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Date\+In} & -\/ Input date. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATE
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}\label{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}}
+\index{xb::xbDate@{xb::xbDate}!SetDataDirectory@{SetDataDirectory}}
+\index{SetDataDirectory@{SetDataDirectory}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{SetDataDirectory()}{SetDataDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Data\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Data\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the data directory.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Data\+Directory} & Set the data direcroty. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}\label{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}}
+\index{xb::xbDate@{xb::xbDate}!SetDefaultAutoCommit@{SetDefaultAutoCommit}}
+\index{SetDefaultAutoCommit@{SetDefaultAutoCommit}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{SetDefaultAutoCommit()}{SetDefaultAutoCommit()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Auto\+Commit (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Default\+Auto\+Commit }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the default auto commit.
+
+Disabling auto commit requires the application execute explicit updates using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}Append\+Record(). With auto commit on, the library posts updates automatically when moving off the current record or closing a file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Default\+Auto\+Commit} & xb\+True -\/ Enable default auto commit.~\newline
+ xb\+False -\/ Disable default auto commit.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}\label{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}}
+\index{xb::xbDate@{xb::xbDate}!SetDefaultDateFormat@{SetDefaultDateFormat}}
+\index{SetDefaultDateFormat@{SetDefaultDateFormat}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{SetDefaultDateFormat()}{SetDefaultDateFormat()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Date\+Format (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Date\+Format }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the default date format.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Default\+Date\+Format} & Set the default date format. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}\label{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}}
+\index{xb::xbDate@{xb::xbDate}!SetDefaultLogDirectory@{SetDefaultLogDirectory}}
+\index{SetDefaultLogDirectory@{SetDefaultLogDirectory}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{SetDefaultLogDirectory()}{SetDefaultLogDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Log\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Log\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}\label{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}}
+\index{xb::xbDate@{xb::xbDate}!SetEndianType@{SetEndianType}}
+\index{SetEndianType@{SetEndianType}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{SetEndianType()}{SetEndianType()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+
+
+Set the endian type.
+
+This routine determines the Endian-\/ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. \mbox{\Hypertarget{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}\label{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}}
+\index{xb::xbDate@{xb::xbDate}!SetMultiUser@{SetMultiUser}}
+\index{SetMultiUser@{SetMultiUser}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{SetMultiUser()}{SetMultiUser()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Multi\+User (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Multi\+User }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the multi user setting.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Multi\+User} & xb\+True -\/ Turn on Multi user mode.~\newline
+ xb\+False -\/ Turn off Multi user mode.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDate_ab43a5d8d929767c0ffdd722972bb8cc0}\label{classxb_1_1xbDate_ab43a5d8d929767c0ffdd722972bb8cc0}}
+\index{xb::xbDate@{xb::xbDate}!Str@{Str}}
+\index{Str@{Str}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{Str()}{Str()}}
+{\footnotesize\ttfamily const char $\ast$ xb\+::xb\+Date\+::\+Str (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Return the date value.
+
+\begin{DoxyReturn}{Returns}
+char ptr to date value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a40ba54a58d64cf56266f020f91584192}\label{classxb_1_1xbDate_a40ba54a58d64cf56266f020f91584192}}
+\index{xb::xbDate@{xb::xbDate}!Sysdate@{Sysdate}}
+\index{Sysdate@{Sysdate}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{Sysdate()}{Sysdate()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Sysdate (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Set the date equal to the system date.
+
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+NO\+\_\+\+ERROR
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDate_a31057dfaa36389a16e40e3db82c46262}\label{classxb_1_1xbDate_a31057dfaa36389a16e40e3db82c46262}}
+\index{xb::xbDate@{xb::xbDate}!YearOf@{YearOf}}
+\index{YearOf@{YearOf}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{YearOf()}{YearOf()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Date\+::\+Year\+Of (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Returns the year of the date.
+
+\begin{DoxyReturn}{Returns}
+The year of the date.
+\end{DoxyReturn}
+
+
+\doxysubsection{Field Documentation}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}\label{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}}
+\index{xb::xbDate@{xb::xbDate}!ErrorCodeText@{ErrorCodeText}}
+\index{ErrorCodeText@{ErrorCodeText}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{ErrorCodeText}{ErrorCodeText}}
+{\footnotesize\ttfamily const char$\ast$ xb\+::xb\+Ssv\+::\+Error\+Code\+Text\mbox{[}$\,$\mbox{]}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}\label{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}}
+\index{xb::xbDate@{xb::xbDate}!iEndianType@{iEndianType}}
+\index{iEndianType@{iEndianType}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{iEndianType}{iEndianType}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::i\+Endian\+Type = 0\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}\label{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}}
+\index{xb::xbDate@{xb::xbDate}!sNullString@{sNullString}}
+\index{sNullString@{sNullString}!xb::xbDate@{xb::xbDate}}
+\doxysubsubsection{\texorpdfstring{sNullString}{sNullString}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+Ssv\+::s\+Null\+String = \char`\"{}\char`\"{}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbdate_8h}{xbdate.\+h}}\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbdate_8cpp}{xbdate.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/classxb_1_1xbDbf.eps b/docs/doxygen/latex/classxb_1_1xbDbf.eps
new file mode 100644
index 0000000..26ff00c
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbDbf.eps
@@ -0,0 +1,203 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: ClassName
+%%Creator: Doxygen
+%%CreationDate: Time
+%%For:
+%Magnification: 1.00
+%%Orientation: Portrait
+%%BoundingBox: 0 0 500 821.917786
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%EndComments
+
+% ----- variables -----
+
+/boxwidth 0 def
+/boxheight 40 def
+/fontheight 24 def
+/marginwidth 10 def
+/distx 20 def
+/disty 40 def
+/boundaspect 0.608333 def % aspect ratio of the BoundingBox (width/height)
+/boundx 500 def
+/boundy boundx boundaspect div def
+/xspacing 0 def
+/yspacing 0 def
+/rows 3 def
+/cols 1 def
+/scalefactor 0 def
+/boxfont /Times-Roman findfont fontheight scalefont def
+
+% ----- procedures -----
+
+/dotted { [1 4] 0 setdash } def
+/dashed { [5] 0 setdash } def
+/solid { [] 0 setdash } def
+
+/max % result = MAX(arg1,arg2)
+{
+ /a exch def
+ /b exch def
+ a b gt {a} {b} ifelse
+} def
+
+/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)
+{
+ 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max
+} def
+
+/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))
+{
+ /str exch def
+ /boxwidth boxwidth str stringwidth pop max def
+} def
+
+/box % draws a box with text 'arg1' at grid pos (arg2,arg3)
+{ gsave
+ 2 setlinewidth
+ newpath
+ exch xspacing mul xoffset add
+ exch yspacing mul
+ moveto
+ boxwidth 0 rlineto
+ 0 boxheight rlineto
+ boxwidth neg 0 rlineto
+ 0 boxheight neg rlineto
+ closepath
+ dup stringwidth pop neg boxwidth add 2 div
+ boxheight fontheight 2 div sub 2 div
+ rmoveto show stroke
+ grestore
+} def
+
+/mark
+{ newpath
+ exch xspacing mul xoffset add boxwidth add
+ exch yspacing mul
+ moveto
+ 0 boxheight 4 div rlineto
+ boxheight neg 4 div boxheight neg 4 div rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/arrow
+{ newpath
+ moveto
+ 3 -8 rlineto
+ -6 0 rlineto
+ 3 8 rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/out % draws an output connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight add
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/in % draws an input connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul disty 2 div sub
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/hedge
+{
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight 2 div sub
+ /y exch def
+ /x exch def
+ newpath
+ x y moveto
+ boxwidth 2 div distx add 0 rlineto
+ stroke
+ 1 eq
+ { newpath x boxwidth 2 div distx add add y moveto
+ -8 3 rlineto
+ 0 -6 rlineto
+ 8 3 rlineto
+ closepath
+ eofill
+ stroke
+ } if
+} def
+
+/vedge
+{
+ /ye exch def
+ /ys exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add dup
+ ys yspacing mul boxheight 2 div sub
+ moveto
+ ye yspacing mul boxheight 2 div sub
+ lineto
+ stroke
+} def
+
+/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3'
+{
+ /ys exch def
+ /xe exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add
+ ys yspacing mul disty 2 div sub
+ moveto
+ xspacing xe xs sub mul 0
+ rlineto
+ stroke
+} def
+
+% ----- main ------
+
+boxfont setfont
+1 boundaspect scale
+(xb::xbDbf) cw
+(xb::xbFile) cw
+(xb::xbSsv) cw
+/boxwidth boxwidth marginwidth 2 mul add def
+/xspacing boxwidth distx add def
+/yspacing boxheight disty add def
+/scalefactor
+ boxwidth cols mul distx cols 1 sub mul add
+ boxheight rows mul disty rows 1 sub mul add boundaspect mul
+ max def
+boundx scalefactor div boundy scalefactor div scale
+
+% ----- classes -----
+
+ (xb::xbDbf) 0.000000 0.000000 box
+ (xb::xbFile) 0.000000 1.000000 box
+ (xb::xbSsv) 0.000000 2.000000 box
+
+% ----- relations -----
+
+solid
+0 0.000000 0.000000 out
+solid
+1 0.000000 1.000000 in
+solid
+0 0.000000 1.000000 out
+solid
+1 0.000000 2.000000 in
diff --git a/docs/doxygen/latex/classxb_1_1xbDbf.pdf b/docs/doxygen/latex/classxb_1_1xbDbf.pdf
new file mode 100644
index 0000000..0cf80d4
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbDbf.pdf
Binary files differ
diff --git a/docs/doxygen/latex/classxb_1_1xbDbf.tex b/docs/doxygen/latex/classxb_1_1xbDbf.tex
new file mode 100644
index 0000000..cf0ac0a
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbDbf.tex
@@ -0,0 +1,4204 @@
+\hypertarget{classxb_1_1xbDbf}{}\doxysection{xb\+::xb\+Dbf Class Reference}
+\label{classxb_1_1xbDbf}\index{xb::xbDbf@{xb::xbDbf}}
+
+
+Base class for handling dbf files/tables.
+
+
+
+
+{\ttfamily \#include $<$xbdbf.\+h$>$}
+
+Inheritance diagram for xb\+::xb\+Dbf\+:\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[height=3.000000cm]{classxb_1_1xbDbf}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classxb_1_1xbDbf_a84a75f80bc0e9b8a22b728767949c204}{xb\+Dbf}} (\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$x)
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+virtual \mbox{\hyperlink{classxb_1_1xbDbf_a7eb87521fba8a939c613056d9918d880}{$\sim$xb\+Dbf}} ()
+\begin{DoxyCompactList}\small\item\em Destructor. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a4edcf31390fbdc8c3558004770fd9f2f}{Abort}} ()
+\begin{DoxyCompactList}\small\item\em Abort any uncommited changes for the current record buffer. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a5b412dd796241673eb1aa2c93513d69b}{Append\+Record}} ()
+\begin{DoxyCompactList}\small\item\em Append the current record to the data file. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a78da5a3d2011a3f2e7618cbdd3ba02d6}{Blank\+Record}} ()
+\begin{DoxyCompactList}\small\item\em Blank the record buffer. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_abd69532c885ab72bcf3fb5066b318f4f}{Commit}} ()
+\begin{DoxyCompactList}\small\item\em Commit updates to disk. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ad68d73113e54e1b5f326e90f45e9989d}{Close}} ()
+\begin{DoxyCompactList}\small\item\em Close DBF file/table. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a829c615a130a1fdf609d93438d8a6264}{Copy\+Dbf\+Structure}} (\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d\+New\+Table, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Table\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Table\+Alias, xb\+Int16 i\+Overlay, xb\+Int16 i\+Share\+Mode)
+\begin{DoxyCompactList}\small\item\em Copy table (dbf) file structure. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a73e41bfe679dd06ab16c436652df93f1}{Create\+Table}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Table\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&\mbox{\hyperlink{classxb_1_1xbDbf_a73f9c792d0a769e2e604c1855245a276}{s\+Alias}}, \mbox{\hyperlink{structxb_1_1xbSchema}{xb\+Schema}} $\ast$p\+Schema, xb\+Int16 i\+Overlay, xb\+Int16 i\+Share\+Mode)=0
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a4085ed4f049d976124d8edc3d3c56397}{Delete\+Table}} ()
+\begin{DoxyCompactList}\small\item\em Delete a table. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a01c26b67e312be1e674b3da710e031b9}{Delete\+All}} (xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Delete or undelete all records in a dbf file (table). \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a3067fdfa3a7a5c15651f6e89d1102176}{Delete\+All\+Records}} ()
+\begin{DoxyCompactList}\small\item\em Delete all records. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_acd8c10579229f3a2e2c5fdb7fcef90db}{Delete\+Record}} ()
+\begin{DoxyCompactList}\small\item\em Delete the current record. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ab1f4a515533402f872cedcd0322aabd4}{Dump\+Header}} (xb\+Int16 i\+Option) const
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a3a6a068addffd06fc9a996639d6ca69e}{Dump\+Record}} (xb\+UInt32 ul\+Rec\+No, xb\+Int16 i\+Output\+Dest=0, xb\+Int16 i\+Output\+Fmt=0)
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_abb9e20c5efacd4fea80f1515abbc6b55}{Get\+Auto\+Commit}} () const
+\begin{DoxyCompactList}\small\item\em Get auto commit setting. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ae0c00226fd2ea7a67f101e795467ed68}{Get\+Auto\+Commit}} (xb\+Int16 i\+Option) const
+\begin{DoxyCompactList}\small\item\em Get auto commit setting. \end{DoxyCompactList}\item
+virtual xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbDbf_a643a80a3792a52760c8e09ba18719503}{Get\+Cur\+Rec\+No}} () const
+\begin{DoxyCompactList}\small\item\em Get Auto Lock setting. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ac1110d867ba297a52c8b0e83e88f05e6}{Get\+Dbf\+Status}} () const
+\begin{DoxyCompactList}\small\item\em Return the current dbf status. \end{DoxyCompactList}\item
+virtual xb\+Int32 \mbox{\hyperlink{classxb_1_1xbDbf_add27d8ef555a13b336b8c804165dc15e}{Get\+Field\+Cnt}} () const
+\begin{DoxyCompactList}\small\item\em Return the number of fields in the table. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a6fc5b8a3e2f177d5ceaf9d975cbb5226}{Get\+First\+Record}} ()
+\begin{DoxyCompactList}\small\item\em Get the first record. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_acb78991e8435edd36318c653cb977c1a}{Get\+First\+Record}} (xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Get the first record. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a49e667f9c8ee55c36444702663fc5964}{Get\+Last\+Record}} ()
+\begin{DoxyCompactList}\small\item\em Get the last record. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a8ccfa2291417412b6894940d1b92f9a6}{Get\+Last\+Record}} (xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Get the last record. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ab896fe3b734f556de578d30f92b18fe2}{Get\+Next\+Record}} ()
+\begin{DoxyCompactList}\small\item\em Get the next record. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a3191428a7a92d9107d8d42448884f2ac}{Get\+Next\+Record}} (xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Get the next record. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a18fdcb4ab15b36cd47fa6f6f7a540d1a}{Get\+Next\+Record}} (xb\+Int16 i\+Option, xb\+UInt32 ul\+Start\+Rec)
+\begin{DoxyCompactList}\small\item\em Get the next record. \end{DoxyCompactList}\item
+virtual xb\+Int32 \mbox{\hyperlink{classxb_1_1xbDbf_a13393704a8a191d4d6555ae31d3c3e92}{Get\+Physical\+Ix\+Cnt}} () const
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ab3d248e5221b4f0809897cd43af17a1e}{Get\+Prev\+Record}} ()
+\begin{DoxyCompactList}\small\item\em Get the previous record. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a7eadc7b08d73003802b90584f7b33387}{Get\+Prev\+Record}} (xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Get the previous record. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a26fba086b07caeab95066bf1c8d25161}{Get\+Record}} (xb\+UInt32 ul\+Rec\+No)
+\begin{DoxyCompactList}\small\item\em Get record for specified record number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ac196ad55335e1f4789d698748434dc89}{Get\+Record\+Cnt}} (xb\+UInt32 \&ul\+Rec\+Cnt)
+\begin{DoxyCompactList}\small\item\em Get the current number of records in the dbf data file. \end{DoxyCompactList}\item
+virtual char $\ast$ \mbox{\hyperlink{classxb_1_1xbDbf_aa3e38c4057d726a28a27d07a1610d124}{Get\+Record\+Buf}} (xb\+Int16 i\+Opt=0) const
+\begin{DoxyCompactList}\small\item\em Get pointer to record buffer. \end{DoxyCompactList}\item
+virtual xb\+UInt16 \mbox{\hyperlink{classxb_1_1xbDbf_ab50d76c6e29e81e347a6feb04c2f62bb}{Get\+Record\+Len}} () const
+\begin{DoxyCompactList}\small\item\em Get the dbf record length. \end{DoxyCompactList}\item
+virtual const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbDbf_a27758a325c097f204247908b65ba7fbd}{Get\+Tbl\+Alias}} () const
+\begin{DoxyCompactList}\small\item\em Get the table alias. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a49212a9eb17f7fa9f303e08d5fc50fc6}{Get\+Version}} () const =0
+\item
+virtual \mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$ \mbox{\hyperlink{classxb_1_1xbDbf_ab21ec23c076b0c9affdc0f6672bd133f}{Get\+Xbase\+Ptr}} () const
+\begin{DoxyCompactList}\small\item\em Get the pointer to the xb\+Xbase structure,. \end{DoxyCompactList}\item
+virtual \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbDbf_ac856fc1b110b46aefa1b2f5c0f530aa2}{Memo\+Fields\+Exist}} () const
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a97366c7362e409d7f09973a6aef8dad0}{Open}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Table\+Name)
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ac658818bf9b8f8ff7467d8d80495b324}{Open}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Table\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&\mbox{\hyperlink{classxb_1_1xbDbf_a73f9c792d0a769e2e604c1855245a276}{s\+Alias}})
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a4d018cbf44d8d8b2145c9acab02c8adf}{Open}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Table\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&\mbox{\hyperlink{classxb_1_1xbDbf_a73f9c792d0a769e2e604c1855245a276}{s\+Alias}}, xb\+Int16 i\+Open\+Mode, xb\+Int16 i\+Share\+Mode)=0
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a8a52bf3ef2123c0d17e6b1f67bf0dc55}{Pack}} ()
+\begin{DoxyCompactList}\small\item\em Pack dbf file. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a93bb14ad0451355bfa3379128120988a}{Pack}} (xb\+UInt32 \&ul\+Deleted\+Rec\+Cnt)
+\begin{DoxyCompactList}\small\item\em Pack dbf file. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a3c36a5ffbc7067a1abbcb526dd3b981d}{Put\+Record}} ()
+\begin{DoxyCompactList}\small\item\em Write the current record to disk. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_aacbc7bac3ea0c502ee75b838f4f0fcbf}{Put\+Record}} (xb\+UInt32 ul\+Rec\+No)
+\begin{DoxyCompactList}\small\item\em Write record to disk. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a060541addb5bb1f0fe12959ed6f66fb9}{Read\+Header}} (xb\+Int16 i\+File\+Position\+Option, xb\+Int16 i\+Read\+Option)
+\begin{DoxyCompactList}\small\item\em Read dbf file header information. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a94d7d626ba691fd4b740c034673e6fc6}{Record\+Deleted}} (xb\+Int16 i\+Opt=0) const
+\begin{DoxyCompactList}\small\item\em Return record deletion status. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a4cf7f0d423164f3cf074ae41f96f4e90}{Set\+Auto\+Commit}} (xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ab506450954bc86e7bf1d7c4efe681f43}{i\+Auto\+Commit}})
+\begin{DoxyCompactList}\small\item\em Set auto commit. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ae94cb1bf9f75184f39d9e1a80ab49d4a}{Undelete\+All\+Records}} ()
+\begin{DoxyCompactList}\small\item\em Undelete all records. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a255681976a04fc722538bb630507b3a0}{Undelete\+Record}} ()
+\begin{DoxyCompactList}\small\item\em Undelete one record. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a8ed0693b10b95aaa4e46037758d160ed}{Zap}} ()
+\begin{DoxyCompactList}\small\item\em Zap (remove) everything from the file,. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ad245a26eb8b79610c9ae7bab19e05513}{Get\+Field}} (xb\+Int16 i\+Field\+No, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Value, xb\+Int16 i\+Rec\+Buf\+Sw) const
+\begin{DoxyCompactList}\small\item\em Get field data for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ac81f078f3c932f0da60ad1fbdd848d3e}{Get\+Field}} (xb\+Int16 i\+Field\+No, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Value) const
+\begin{DoxyCompactList}\small\item\em Get field data for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a9a0fcf7e2040ab483e3807927833cb26}{Get\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Value) const
+\begin{DoxyCompactList}\small\item\em Get \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_abcb4defad2e1b6e67f63cc60737ad840}{Get\+Field\+Decimal}} (xb\+Int16 i\+Field\+No, xb\+Int16 \&i\+Field\+Decimal) const
+\begin{DoxyCompactList}\small\item\em Get decimal for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a607f774fcd6dc0b9913d7a7801b60db2}{Get\+Field\+Decimal}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, xb\+Int16 \&i\+Field\+Decimal) const
+\begin{DoxyCompactList}\small\item\em Get decimal for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_adda4302b58cc6109b048f19d9b68bbd4}{Get\+Field\+Len}} (xb\+Int16 i\+Field\+No, xb\+Int16 \&i\+Field\+Len) const
+\begin{DoxyCompactList}\small\item\em Get field length for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_acf06dbccdba1a4bcd90fa0bea6cca59b}{Get\+Field\+Len}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, xb\+Int16 \&i\+Field\+Len) const
+\begin{DoxyCompactList}\small\item\em Get field length for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a5e3e4368bfba1724c016b8859023e34c}{Get\+Field\+Name}} (xb\+Int16 i\+Field\+No, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name) const
+\begin{DoxyCompactList}\small\item\em Returns the name of the specified field. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_aed9113b5095c6df1b9c854cbd0d8047b}{Get\+Field\+No}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, xb\+Int16 \&i\+Field\+No) const
+\begin{DoxyCompactList}\small\item\em Get the field number for name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_aad9029e63909aeb77d8473256d88bea8}{Get\+Field\+No}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name) const
+\begin{DoxyCompactList}\small\item\em Get field ID number for a given field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a5143973e4f165651152aa13c8fd45f84}{Get\+Field\+Type}} (xb\+Int16 i\+Field\+No, char \&c\+Field\+Type) const
+\begin{DoxyCompactList}\small\item\em Get field type for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a181db879f1a75f93a34c03513a0b2fea}{Get\+Field\+Type}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, char \&c\+Field\+Type) const
+\begin{DoxyCompactList}\small\item\em Get field type for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a7862215dd2f83a1c488e539cd1f9aec0}{Put\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Data)
+\begin{DoxyCompactList}\small\item\em Put field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a142b0c0dc904917f3c68c5572c1237b5}{Put\+Field}} (xb\+Int16 i\+Field\+No, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Data)
+\begin{DoxyCompactList}\small\item\em Put field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ab39ac4269ac63bc7ea4f638733bb17f0}{Put\+Logical\+Field}} (xb\+Int16 i\+Field\+No, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Data)
+\begin{DoxyCompactList}\small\item\em Put logical field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a507e400ca6526a9e0391cf06dd6a014e}{Put\+Logical\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Data)
+\begin{DoxyCompactList}\small\item\em Put logical field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a3254f091fc4a1404abed3dd2bcdd6ce6}{Get\+Logical\+Field}} (xb\+Int16 i\+Field\+No, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Data) const
+\begin{DoxyCompactList}\small\item\em Get logical field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a9cd6819bfd932ff8507e54d9cb9a624e}{Get\+Logical\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Data) const
+\begin{DoxyCompactList}\small\item\em Get logical field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a423a0cb7bd252cedf956ace4954f275d}{Put\+Logical\+Field}} (xb\+Int16 i\+Field\+No, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Field\+Data)
+\begin{DoxyCompactList}\small\item\em Put logical field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a623ca3ef5520c42308c1a16b518e7ff3}{Put\+Logical\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Field\+Data)
+\begin{DoxyCompactList}\small\item\em Put logical field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_aaf615ddcf08f8cd14efc713c2a8d7ae1}{Get\+Logical\+Field}} (xb\+Int16 i\+Field\+No, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \&b\+Field\+Data) const
+\begin{DoxyCompactList}\small\item\em Get logical field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ab28feef20c988b0a6f1c1911a45377b0}{Get\+Logical\+Field}} (xb\+Int16 i\+Field\+No, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \&b\+Field\+Data, xb\+Int16 i\+Rec\+Buf\+Sw) const
+\begin{DoxyCompactList}\small\item\em Get logical field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a943cea7fde1b06c1a05184193eff8d2d}{Get\+Logical\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \&b\+Field\+Data) const
+\begin{DoxyCompactList}\small\item\em Get logical field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_abe525c0820640e0a9e169d0b7913cfa1}{Get\+Long\+Field}} (xb\+Int16 i\+Field\+No, xb\+Int32 \&l\+Field\+Value) const
+\begin{DoxyCompactList}\small\item\em Get long field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a7b8ef75b17941beac17e50e969b2d3db}{Get\+Long\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, xb\+Int32 \&l\+Field\+Value) const
+\begin{DoxyCompactList}\small\item\em Get long field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a56c8f924284bf88aabf90b7930b4eb47}{Put\+Long\+Field}} (xb\+Int16 i\+Field\+No, xb\+Int32 l\+Field\+Value)
+\begin{DoxyCompactList}\small\item\em Put long field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ae7aad223119edb3d541e9f65e88c9f2f}{Put\+Long\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+No, xb\+Int32 l\+Field\+Value)
+\begin{DoxyCompactList}\small\item\em Put long field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a67e3a050f9090edf69eee75aef7f5d83}{Get\+ULong\+Field}} (xb\+Int16 i\+Field\+No, xb\+UInt32 \&l\+Field\+Value) const
+\begin{DoxyCompactList}\small\item\em Get unsigned long field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a039eb02418ec4ca862adbc0f95b9cbec}{Get\+ULong\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, xb\+UInt32 \&l\+Field\+Value) const
+\begin{DoxyCompactList}\small\item\em Get unsigned long field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_af5dec5c9ff903efffdb0490a44d296d2}{Put\+ULong\+Field}} (xb\+Int16 i\+Field\+No, xb\+UInt32 l\+Field\+Value)
+\begin{DoxyCompactList}\small\item\em Put unsigned long field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ac62cb97c4e678c83f41788b1ae4d0381}{Put\+ULong\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+No, xb\+UInt32 l\+Field\+Value)
+\begin{DoxyCompactList}\small\item\em Put unsigned long field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a4556041a7ff2f6b6f986729901c11f08}{Get\+Double\+Field}} (xb\+Int16 Field\+No, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} \&d\+Field\+Value) const
+\begin{DoxyCompactList}\small\item\em Get xb\+Double field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a2370b5e736931441a5968649291b9ef4}{Get\+Double\+Field}} (xb\+Int16 Field\+No, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} \&d\+Field\+Value, xb\+Int16 i\+Rec\+Buf\+Sw) const
+\begin{DoxyCompactList}\small\item\em Get xb\+Double field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a6e6774df0f2d7733f4b25a9989596d95}{Get\+Double\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} \&d\+Field\+Value) const
+\begin{DoxyCompactList}\small\item\em Get xb\+Double field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a4f34842d7e8ff1f16992c2ece2fc38a5}{Put\+Double\+Field}} (xb\+Int16 Field\+No, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} d\+Field\+Value)
+\begin{DoxyCompactList}\small\item\em Put double field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ae695bbc71c19abc71c0c5f2ff2e1f971}{Put\+Double\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&Field\+Name, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} d\+Field\+Value)
+\begin{DoxyCompactList}\small\item\em Put double field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a3443f646038ced14425f067a59c0f2da}{Get\+Float\+Field}} (xb\+Int16 i\+Field\+No, \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+Float}} \&f\+Field\+Value) const
+\begin{DoxyCompactList}\small\item\em Get xb\+Float field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a81ef2f36f921d7ece066a592eb6393eb}{Get\+Float\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+Float}} \&f\+Field\+Value) const
+\begin{DoxyCompactList}\small\item\em Get xb\+Float field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a64161eb50d72e424b11bf3732657ebd8}{Put\+Float\+Field}} (xb\+Int16 i\+Field\+No, \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+Float}} f\+Field\+Value)
+\begin{DoxyCompactList}\small\item\em Put float field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a4ea3241bc710d57e5f755efda62288ad}{Put\+Float\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+Float}} f\+Field\+Value)
+\begin{DoxyCompactList}\small\item\em Put float field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_af78ef1fba949463ff7f829d3cffc4555}{Get\+Date\+Field}} (xb\+Int16 i\+Field\+No, \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&dt) const
+\begin{DoxyCompactList}\small\item\em Get \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ac624e06a97666bfd64b4f252b4548b36}{Get\+Date\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&dt) const
+\begin{DoxyCompactList}\small\item\em Get \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} field for field name. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a873f04af528a9d81e6a367a59d998ec5}{Put\+Date\+Field}} (xb\+Int16 i\+Field\+No, const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&dt)
+\begin{DoxyCompactList}\small\item\em Put date field for field number. \end{DoxyCompactList}\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a571b36b3a940b1a16d5e834f329b33b9}{Put\+Date\+Field}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Field\+Name, const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&dt)
+\begin{DoxyCompactList}\small\item\em Put date field for field name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_aae9a2ddb0adb8165b4ac2b6a28a932f7}{Create\+Unique\+File\+Name}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Dir\+In, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Ext\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Fqn\+Out)
+\begin{DoxyCompactList}\small\item\em Create a unique file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ae5ffabde2c88ea58324f27e471f6bfc0}{Create\+Unique\+File\+Name}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Dir\+In, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Ext\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Fqn\+Out, xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Create a unique file name. \end{DoxyCompactList}\item
+const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbFile_acd0fb2166b2bff7e8a1cf65a7bc8be1e}{Get\+Directory}} () const
+\begin{DoxyCompactList}\small\item\em Get the directory name. \end{DoxyCompactList}\item
+const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbFile_ac95cb882ccbcdedc9a233c6ad9fed07a}{Get\+File\+Name}} () const
+\begin{DoxyCompactList}\small\item\em Get the file name. \end{DoxyCompactList}\item
+const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbFile_a31b4e641f93206ba23e2a5a27491dcd4}{Get\+Fq\+File\+Name}} () const
+\begin{DoxyCompactList}\small\item\em Get the fully qualified file name. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_ae78a85255488bc78964c16946dbaead3}{Set\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Directory)
+\begin{DoxyCompactList}\small\item\em Set the directory. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a5419eb27e56822f828b2b88a9502a636}{Set\+File\+Name}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name)
+\begin{DoxyCompactList}\small\item\em Set the filename. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_aee832fa11db2077a532f49e1329bd05a}{Set\+Fq\+File\+Name}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Fq\+Name)
+\begin{DoxyCompactList}\small\item\em Set the fully qualifed filename. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbFile_a638e14262410a1627819f016a16cdce2}{Get\+Block\+Size}} () const
+\begin{DoxyCompactList}\small\item\em Get the block size. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a991c5676a6f38fa752435390989f413e}{Set\+Block\+Size}} (xb\+UInt32 ul\+Block\+Size)
+\begin{DoxyCompactList}\small\item\em Set the block size. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a3c500dc9dac22c49496e4b29386b2dd3}{Get\+Open\+Mode}} () const
+\begin{DoxyCompactList}\small\item\em Get the open mode of the file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a9b63e05b77f477ff6109ff7b9432c1b6}{Get\+Share\+Mode}} () const
+\begin{DoxyCompactList}\small\item\em Get the share mode of the file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a60c53998e3d1b694134b20a87bc9bf5a}{Get\+File\+Dir\+Part}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Dir\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the directory part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_af5127c92892816e9bbc5c19653c4147a}{Get\+File\+Dir\+Part}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Complete\+File\+Name\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Dir\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the directory part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a57a9222e5cbb51019d4eeb2c3ac89fa2}{Get\+File\+Ext\+Part}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Ext\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the extension part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ab289b6ffe955321160c1f90220c22e25}{Get\+File\+Ext\+Part}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Complete\+File\+Name\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Ext\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the extension part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a81422b3dd52763d2cc6c77237ec9af0a}{Get\+File\+Name\+Part}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the name part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a6110763c5ae996b72c7a62c15bdecc73}{Get\+File\+Name\+Part}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Complete\+File\+Name\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the name part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a5548236d38d43b89ae29b9a015b1f678}{Get\+File\+Type}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Type) const
+\begin{DoxyCompactList}\small\item\em Get the file type aka Capitalized file extension. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_aaf2e697751a0beff41432a66bb83fb5e}{Get\+Xbase\+File\+Type\+Byte}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, xb\+Int16 \&i\+Version)
+\begin{DoxyCompactList}\small\item\em Get the file type byte and version of the dbf file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a7af337808919680b90710ad5e8a99232}{Get\+Xbase\+File\+Type\+Byte}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, unsigned char \&c\+File\+Type\+Byte)
+\begin{DoxyCompactList}\small\item\em Get the file type byte and version of the dbf file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a78aebdd21d3de46a450d5f835e3027f6}{Get\+Xbase\+File\+Type\+Byte}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, unsigned char \&c\+File\+Type\+Byte, xb\+Int16 \&i\+Version)
+\begin{DoxyCompactList}\small\item\em Get the file type byte and version of the dbf file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ae2b6ac26018dc28f77afbb3f008c3f66}{Determine\+Xbase\+Table\+Version}} (unsigned char c\+File\+Type\+Byte) const
+\begin{DoxyCompactList}\small\item\em Determine xbase dbf version. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a5a740033664c9ad2611c90e2a6d0c2d3}{Determine\+Xbase\+Memo\+Version}} (unsigned char c\+File\+Type\+Byte) const
+\begin{DoxyCompactList}\small\item\em Determine which version the memo (dbt) file is. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbFile_a78bd8a11dce102647095baf3aff2b006}{File\+Exists}} () const
+\begin{DoxyCompactList}\small\item\em Determines if a file exists. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbFile_a174d8a6aabc9cfcd32fedbd1e5b13ddd}{File\+Exists}} (xb\+Int16 i\+Option) const
+\begin{DoxyCompactList}\small\item\em Determines if a file exists. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbFile_a61130b4fbf4cf9d5972dcb4993de2f94}{File\+Exists}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name) const
+\begin{DoxyCompactList}\small\item\em Determines if a file exists. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbFile_a0592168f39a10f2a401a88ef781f6148}{File\+Exists}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, xb\+Int16 i\+Option) const
+\begin{DoxyCompactList}\small\item\em Determines if a file exists. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbFile_a7fa837938a32dc9ca3fbc81cbaf50f59}{File\+Is\+Open}} () const
+\begin{DoxyCompactList}\small\item\em Determines if file is open. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_aa1bb80340abc7a5c22f87f878e9dc825}{Read\+Block}} (xb\+UInt32 ul\+Block\+No, size\+\_\+t read\+Size, void $\ast$buf)
+\begin{DoxyCompactList}\small\item\em Read a block of data from file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_aef696b1c4c0ef5338e818599f695d485}{Read\+Block}} (xb\+UInt32 ul\+Block\+No, xb\+UInt32 ul\+Block\+Size, size\+\_\+t read\+Size, void $\ast$buf)
+\begin{DoxyCompactList}\small\item\em Read a block of data from file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a5d871dcfecc2b4338f7a13722aab766c}{Write\+Block}} (xb\+UInt32 ul\+Block\+No, size\+\_\+t write\+Size, void $\ast$buf)
+\begin{DoxyCompactList}\small\item\em Write a block of data to file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a50b63c39e49d44e52078038027b24cc5}{Get\+File\+Size}} (xb\+UInt64 \&ull\+File\+Size)
+\begin{DoxyCompactList}\small\item\em Get the size of the file as reported by the OS. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a02df78f4c90313243f508fc56b95aba8}{Get\+File\+Mtime}} (time\+\_\+t \&mtime)
+\begin{DoxyCompactList}\small\item\em Get the time of last file modification timestamp as reported by the OS. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} \mbox{\hyperlink{classxb_1_1xbFile_ab14e4a11427f5efb81cba1dd32bd1aa1}{e\+Get\+Double}} (const char $\ast$p) const
+\begin{DoxyCompactList}\small\item\em Get a portable double value. \end{DoxyCompactList}\item
+xb\+Int32 \mbox{\hyperlink{classxb_1_1xbFile_a60b24a5afc984c586bf384c7e915ba0d}{e\+Get\+Int32}} (const char $\ast$p) const
+\begin{DoxyCompactList}\small\item\em Get a portable long value. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbFile_a78f052529d39a18deaface5a0d47d0b0}{e\+Get\+UInt32}} (const char $\ast$p) const
+\begin{DoxyCompactList}\small\item\em Get a portable unsigned long value. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ac40c991110ddc6fb30a72d90f4652762}{e\+Get\+Int16}} (const char $\ast$p) const
+\begin{DoxyCompactList}\small\item\em Get a portable short value. \end{DoxyCompactList}\item
+xb\+UInt16 \mbox{\hyperlink{classxb_1_1xbFile_a936ade458e6d5e6d29f9b5031888d189}{e\+Get\+UInt16}} (const char $\ast$p) const
+\begin{DoxyCompactList}\small\item\em Get a portable unsigned short value. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a98b6ff533ae93f90c977a2ba23eeb105}{e\+Put\+Double}} (char $\ast$p, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} d)
+\begin{DoxyCompactList}\small\item\em Write a portable double value to memory location. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a19c37f76a2ccbb45019cb0fc373d3f46}{e\+Put\+Int32}} (char $\ast$p, xb\+Int32 l)
+\begin{DoxyCompactList}\small\item\em Write a portable long value to memory location. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_aa3f6ceae4b96f24875d86848bf13a173}{e\+Put\+UInt32}} (char $\ast$p, xb\+UInt32 ul)
+\begin{DoxyCompactList}\small\item\em Write a portable unsigned long value to memory location. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a29130f12739ac8fa837f4eaedf1338b2}{e\+Put\+Int16}} (char $\ast$p, xb\+Int16 s)
+\begin{DoxyCompactList}\small\item\em Write a portable short value to memory location. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a65e9839f92b96eac7b0d071fac3bbe40}{e\+Put\+UInt16}} (char $\ast$p, xb\+UInt16 s)
+\begin{DoxyCompactList}\small\item\em Write a portable unsigned short value to memory location. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a18830b5755d74818f60d9c7ce38ddf2d}{xb\+Fclose}} ()
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fclose. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_af5b6356832d2a67212070a1aa605f170}{xb\+Feof}} ()
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary feof. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ad205184d43409f04216540ae22f15009}{xb\+Fflush}} ()
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fflush. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_afb1c584d2895ffb7834df80aea7eb1e4}{xb\+Fgetc}} (xb\+Int32 \&c)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fgetc. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a5ee229bda4d7d6695e122200e581e7a6}{xb\+Fgetc}} (char \&c)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fgetc. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a7cdfef5ede9ac98d44a28a6b7a70972c}{xb\+Fopen}} (xb\+Int16 i\+Open\+Mode)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a0548cedf0f26b7d8ac221f75b0cd048c}{xb\+Fopen}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Open\+Mode, xb\+Int16 i\+Share\+Mode)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fopen. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_aabd113333b49c36cad23244b392baab4}{xb\+Fopen}} (xb\+Int16 i\+Open\+Mode, xb\+Int16 i\+Share\+Mode)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fopen. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ab0fa19686ca8953ff4b556fb5b249135}{xb\+Fopen}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Mode, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, xb\+Int16 i\+Share\+Mode)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fopen. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_af2e940c78956e5cb6824f9a1bc404896}{xb\+Fputc}} (xb\+Int32 c)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fputc. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a863f74cf17df8186d88586b4d2a6441a}{xb\+Fputc}} (xb\+Int32 c, xb\+Int32 i\+No\+Times)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fputc. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a698f3b40216778562e639e6ca1a47573}{xb\+Fputs}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fputs. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ab4f6afaa1f77539f27a4f05c26e54e2f}{xb\+Fread}} (void $\ast$ptr, size\+\_\+t size, size\+\_\+t nmemb)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fread. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ad245955ace26e5dde85fd4373b30d026}{xb\+Fgets}} (size\+\_\+t l\+Size, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Line)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fgets. \end{DoxyCompactList}\item
+size\+\_\+t \mbox{\hyperlink{classxb_1_1xbFile_a0e1c06aedfa7fbcb92e117f891edd13b}{xb\+Ftell}} ()
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary ftell. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a5337ab8918df240910c0d19b4f298e3d}{xb\+Fseek}} (xb\+Int64 ll\+Offset, xb\+Int32 whence)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fseek. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a9891b792f585a696f38a5cf959e30918}{xb\+FTurn\+Off\+File\+Buffering}} ()
+\begin{DoxyCompactList}\small\item\em Turn off file buffering. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a6aadd871d1782944703fed773d44b85f}{xb\+Fwrite}} (const void $\ast$ptr, size\+\_\+t l\+Size, size\+\_\+t l\+Nmemb)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fwrite. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a08463f506f425c2385acbe1a561506e9}{xb\+Read\+Until}} (const char c\+Delim, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Out)
+\begin{DoxyCompactList}\small\item\em Read file until a particular character is encountered on input stream. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a6d919366c2ec95e529906bf8842cbf07}{xb\+Remove}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Delete file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a58f6a6751fdf7e9549c273bb75d93eb5}{xb\+Remove}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name)
+\begin{DoxyCompactList}\small\item\em Delete file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ab3c668a8570433188382d31d7c60bd48}{xb\+Remove}} ()
+\begin{DoxyCompactList}\small\item\em Delete file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_afc8ce113aa72611a278233f9bb170012}{xb\+Rename}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Old\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+New\+Name)
+\begin{DoxyCompactList}\small\item\em Rename file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ab0b2a2c88947921d98ebcb5b5ec34ed9}{xb\+Rename}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Old\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+New\+Name, xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Rename file. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a7996b6e084665c37c3892faea64b3505}{xb\+Rewind}} ()
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for rewind. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a518bfcbfa3699d883cf89affee383296}{xb\+Truncate}} (xb\+Int64 ll\+Size)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for ftruncate. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a361e3cc318bbf1c4d10f069e0800a24e}{Name\+Suffix\+Missing}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, xb\+Int16 i\+Option) const
+\begin{DoxyCompactList}\small\item\em Determines status of file extension. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}{Display\+Error}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Display error message on console for a given error number. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}{Get\+Default\+Date\+Format}} () const
+\begin{DoxyCompactList}\small\item\em Get the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}{Get\+Data\+Directory}} () const
+\begin{DoxyCompactList}\small\item\em Get the current data directory. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}{Get\+Endian\+Type}} () const
+\begin{DoxyCompactList}\small\item\em Get the Endian type. \end{DoxyCompactList}\item
+const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}{Get\+Error\+Message}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Get an error message. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}{Set\+Data\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Data\+Directory)
+\begin{DoxyCompactList}\small\item\em Set the data directory. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}{Set\+Default\+Date\+Format}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Date\+Format)
+\begin{DoxyCompactList}\small\item\em Set the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}{Bit\+Set}} (unsigned char c, xb\+Int16 i\+Bit\+No) const
+\begin{DoxyCompactList}\small\item\em Check a bit in a one byte field and see if it is set. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}{Get\+Default\+Auto\+Commit}} () const
+\begin{DoxyCompactList}\small\item\em Get the default auto commit setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}{Set\+Default\+Auto\+Commit}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Default\+Auto\+Commit)
+\begin{DoxyCompactList}\small\item\em Set the default auto commit. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}{Get\+Default\+Log\+Directory}} () const
+\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}{Get\+Default\+Log\+File\+Name}} () const
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}{Set\+Default\+Log\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Log\+Directory)
+\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}{Get\+Multi\+User}} () const
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}{Set\+Multi\+User}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Multi\+User)
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+static const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}{Error\+Code\+Text}} \mbox{[}$\,$\mbox{]}
+\end{DoxyCompactItemize}
+\doxysubsection*{Protected Member Functions}
+\begin{DoxyCompactItemize}
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_aabd146c0e1054ab905ec96aedd84b02e}{Get\+Raw\+Field}} (xb\+Int16 i\+Field\+No, char $\ast$Buf, xb\+UInt32 Buf\+Size, xb\+Int16 i\+Rec\+Buf\+Sw) const
+\begin{DoxyCompactList}\small\item\em Get raw field data for field number. \end{DoxyCompactList}\item
+virtual void \mbox{\hyperlink{classxb_1_1xbDbf_ad06fe0f7975fb81125d27d82504e6829}{Init\+Vars}} ()
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a7e63e852418f337eb7c44de5dcd50323}{Set\+Version}} ()=0
+\item
+virtual xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_aba5dcac3b4092261bc1669740cdd669d}{Validate\+Schema}} (\mbox{\hyperlink{structxb_1_1xbSchema}{xb\+Schema}} $\ast$s)=0
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a44e1410109ef7b3d11a6af4b704b62b2}{Write\+Header}} (xb\+Int16 i\+Position\+Option, xb\+Int16 i\+Write\+Option)
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}{Set\+Endian\+Type}} ()
+\begin{DoxyCompactList}\small\item\em Set the endian type. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Protected Attributes}
+\begin{DoxyCompactItemize}
+\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbDbf_afcd99924606be0a9e1e25180bcd1abf8}{ul\+Cur\+Rec}}
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_ab506450954bc86e7bf1d7c4efe681f43}{i\+Auto\+Commit}}
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a15f495446f0d75bcf2fa89e3b699d388}{i\+File\+Version}}
+\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbDbf_a73f9c792d0a769e2e604c1855245a276}{s\+Alias}}
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a5056757614c39f725cc775332494966a}{i\+No\+Of\+Fields}}
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbDbf_a6d8e193da3ca414eef1e8866ec5ca81b}{i\+Dbf\+Status}}
+\item
+xb\+Schema\+Rec $\ast$ \mbox{\hyperlink{classxb_1_1xbDbf_ad8c8b5eb12063bb898da1b2cc02cfce7}{Schema\+Ptr}}
+\item
+char $\ast$ \mbox{\hyperlink{classxb_1_1xbDbf_a8a9b3bce0b741e73473d3ebbd6e6f1cd}{Rec\+Buf}}
+\item
+char $\ast$ \mbox{\hyperlink{classxb_1_1xbDbf_a353ebfc8a2960ef827f429ec74025606}{Rec\+Buf2}}
+\item
+unsigned char \mbox{\hyperlink{classxb_1_1xbDbf_a3a262abf658e5fa968b57ef457a69470}{c\+Version}}
+\item
+char \mbox{\hyperlink{classxb_1_1xbDbf_a4fcd6a86ddd32d4a9d76a4074573440a}{c\+Update\+YY}}
+\item
+char \mbox{\hyperlink{classxb_1_1xbDbf_a9340a5e8ee53eb0f3b6601eec2d71e1b}{c\+Update\+MM}}
+\item
+char \mbox{\hyperlink{classxb_1_1xbDbf_a6021789d314cd41488991e708fcd0df2}{c\+Update\+DD}}
+\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbDbf_acb594ab61dd35b17bdf28394083f8e87}{ul\+No\+Of\+Recs}}
+\item
+xb\+UInt16 \mbox{\hyperlink{classxb_1_1xbDbf_a62f5fa9149ae0f6dc75642823de66918}{ui\+Header\+Len}}
+\item
+xb\+UInt16 \mbox{\hyperlink{classxb_1_1xbDbf_a1760e222567e2c849f9c799b9d896e91}{ui\+Record\+Len}}
+\item
+char \mbox{\hyperlink{classxb_1_1xbDbf_ac3c89fc3bc6a6abf385478a8adbed970}{c\+Transaction\+Flag}}
+\item
+char \mbox{\hyperlink{classxb_1_1xbDbf_a8734e799707582f022fc341d515650f4}{c\+Encryption\+Flag}}
+\item
+char \mbox{\hyperlink{classxb_1_1xbDbf_ad59074633641e03647e54d2b66c9102b}{c\+Index\+Flag}}
+\item
+char \mbox{\hyperlink{classxb_1_1xbDbf_aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1}{c\+Lang\+Driver}}
+\item
+\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$ \mbox{\hyperlink{classxb_1_1xbFile_ae39a67ea391b46055d4ca299cb222004}{xbase}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Static Protected Attributes}
+\begin{DoxyCompactItemize}
+\item
+static xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}{i\+Endian\+Type}} = 0
+\item
+static \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}{s\+Null\+String}} = \char`\"{}\char`\"{}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Base class for handling dbf files/tables.
+
+The \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} class is used as a base class for accessing dbf files. ~\newline
+ In line with relational theory, a each dbf file can be considered as a table. The documentation uses the terms dbf and table interchangeably.~\newline
+
+
+This module handles methods for accessing and updating dbf files.
+
+~\newline
+ The class is designed to support additional file layouts with a minimal amount of effort. If you are wanting to update the library to support a new dbf file type not currently supported by the library, create a derived class using \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} as a base class and modify methods needed to support the new dbf file version.~\newline
+ See the following for examples on how to start on this\+:~\newline
+ xb\+Dbf3 is a derived class from \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} and supports the original Dbase III+ file version.~\newline
+ xb\+Dbf4 is a derived class from \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} and supports the original Dbase IV file version.~\newline
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a84a75f80bc0e9b8a22b728767949c204}\label{classxb_1_1xbDbf_a84a75f80bc0e9b8a22b728767949c204}}
+\index{xb::xbDbf@{xb::xbDbf}!xbDbf@{xbDbf}}
+\index{xbDbf@{xbDbf}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbDbf()}{xbDbf()}}
+{\footnotesize\ttfamily xb\+::xb\+Dbf\+::xb\+Dbf (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$}]{x }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+
+\begin{DoxyParams}{Parameters}
+{\em x} & Pointer to xb\+Xbase \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a7eb87521fba8a939c613056d9918d880}\label{classxb_1_1xbDbf_a7eb87521fba8a939c613056d9918d880}}
+\index{xb::xbDbf@{xb::xbDbf}!````~xbDbf@{$\sim$xbDbf}}
+\index{````~xbDbf@{$\sim$xbDbf}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{$\sim$xbDbf()}{~xbDbf()}}
+{\footnotesize\ttfamily xb\+::xb\+Dbf\+::$\sim$xb\+Dbf (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Destructor.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a4edcf31390fbdc8c3558004770fd9f2f}\label{classxb_1_1xbDbf_a4edcf31390fbdc8c3558004770fd9f2f}}
+\index{xb::xbDbf@{xb::xbDbf}!Abort@{Abort}}
+\index{Abort@{Abort}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{Abort()}{Abort()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Abort (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Abort any uncommited changes for the current record buffer.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a5b412dd796241673eb1aa2c93513d69b}\label{classxb_1_1xbDbf_a5b412dd796241673eb1aa2c93513d69b}}
+\index{xb::xbDbf@{xb::xbDbf}!AppendRecord@{AppendRecord}}
+\index{AppendRecord@{AppendRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{AppendRecord()}{AppendRecord()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Append\+Record (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Append the current record to the data file.
+
+This method attempts to append the contents of the current record buffer to the end of the DBF file, updates the file date, number of records in the file and updates any open indices associated with this data file.~\newline
+
+
+To add a record, an application would typically blank the record buffer, update various fields in the record buffer, then append the record.~\newline
+
+
+The append method performs the following tasks\+:~\newline
+ 1) Create new index key values~\newline
+ 2) Lock the table~\newline
+ 3) Lock append bytes~\newline
+ 4) Lock indices~\newline
+ 5) Read the dbf header~\newline
+ 6) Check for dup keys~\newline
+ 7) Calc last update date, no of recs~\newline
+ 8) Add keys~\newline
+ 9) Unlock indices~\newline
+ 10) Update file header~\newline
+ 11) Unlock file header~\newline
+ 12) Append record~\newline
+ 13) Unlock append bytes~\newline
+
+
+Note\+: Locking memo files is not needed as the memo file updates are handled outside of the append method.~\newline
+
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}\label{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}}
+\index{xb::xbDbf@{xb::xbDbf}!BitSet@{BitSet}}
+\index{BitSet@{BitSet}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{BitSet()}{BitSet()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Bit\+Set (\begin{DoxyParamCaption}\item[{unsigned char}]{c, }\item[{xb\+Int16}]{i\+Bit\+No }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Check a bit in a one byte field and see if it is set.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & One byte char field to examine. \\
+\hline
+{\em i\+Bit\+No} & which bit to examine. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True Bit is set~\newline
+ xb\+False Bit is not set
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a78da5a3d2011a3f2e7618cbdd3ba02d6}\label{classxb_1_1xbDbf_a78da5a3d2011a3f2e7618cbdd3ba02d6}}
+\index{xb::xbDbf@{xb::xbDbf}!BlankRecord@{BlankRecord}}
+\index{BlankRecord@{BlankRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{BlankRecord()}{BlankRecord()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Blank\+Record (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Blank the record buffer.
+
+This method would typically be called to initialize the record buffer before updates are applied to append a new record.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ad68d73113e54e1b5f326e90f45e9989d}\label{classxb_1_1xbDbf_ad68d73113e54e1b5f326e90f45e9989d}}
+\index{xb::xbDbf@{xb::xbDbf}!Close@{Close}}
+\index{Close@{Close}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{Close()}{Close()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Close (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Close DBF file/table.
+
+This routine flushes any remaining updates to disk, closes the DBF file and any associated memo and index files.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_abd69532c885ab72bcf3fb5066b318f4f}\label{classxb_1_1xbDbf_abd69532c885ab72bcf3fb5066b318f4f}}
+\index{xb::xbDbf@{xb::xbDbf}!Commit@{Commit}}
+\index{Commit@{Commit}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{Commit()}{Commit()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Commit (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Commit updates to disk.
+
+This routine commits any pending updates to disk.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a829c615a130a1fdf609d93438d8a6264}\label{classxb_1_1xbDbf_a829c615a130a1fdf609d93438d8a6264}}
+\index{xb::xbDbf@{xb::xbDbf}!CopyDbfStructure@{CopyDbfStructure}}
+\index{CopyDbfStructure@{CopyDbfStructure}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{CopyDbfStructure()}{CopyDbfStructure()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Copy\+Dbf\+Structure (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d\+New\+Table, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+New\+Table\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+New\+Table\+Alias, }\item[{xb\+Int16}]{i\+Overlay, }\item[{xb\+Int16}]{i\+Share\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Copy table (dbf) file structure.
+
+This routine will copy the structure of a dbf file and if successful return a pointer to the new table in an open state.
+
+
+\begin{DoxyParams}{Parameters}
+{\em d\+New\+Table} & Reference to new table object. \\
+\hline
+{\em s\+New\+Table\+Name} & New table (dbf) name. \\
+\hline
+{\em s\+New\+Table\+Alias} & Alias name of new table. \\
+\hline
+{\em i\+Overlay} & xb\+True -\/ Overlay existing file.~\newline
+ xb\+False -\/ Don\textquotesingle{}t overlay existing file. \\
+\hline
+{\em i\+Share\+Mode} & XB\+\_\+\+SINGLE\+\_\+\+USER~\newline
+ XB\+\_\+\+MULTI\+\_\+\+USER \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}} Copy DBF structure
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a73e41bfe679dd06ab16c436652df93f1}\label{classxb_1_1xbDbf_a73e41bfe679dd06ab16c436652df93f1}}
+\index{xb::xbDbf@{xb::xbDbf}!CreateTable@{CreateTable}}
+\index{CreateTable@{CreateTable}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{CreateTable()}{CreateTable()}}
+{\footnotesize\ttfamily virtual xb\+Int16 xb\+::xb\+Dbf\+::\+Create\+Table (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Table\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Alias, }\item[{\mbox{\hyperlink{structxb_1_1xbSchema}{xb\+Schema}} $\ast$}]{p\+Schema, }\item[{xb\+Int16}]{i\+Overlay, }\item[{xb\+Int16}]{i\+Share\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_aae9a2ddb0adb8165b4ac2b6a28a932f7}\label{classxb_1_1xbFile_aae9a2ddb0adb8165b4ac2b6a28a932f7}}
+\index{xb::xbDbf@{xb::xbDbf}!CreateUniqueFileName@{CreateUniqueFileName}}
+\index{CreateUniqueFileName@{CreateUniqueFileName}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{CreateUniqueFileName()}{CreateUniqueFileName()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Create\+Unique\+File\+Name (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Dir\+In, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Ext\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Fqn\+Out }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Create a unique file name.
+
+Given a directory and file extension as inputs, create a unique file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Dir\+In} & Directory \\
+\hline
+{\em s\+Ext\+In} & File Extension \\
+\hline
+{\em s\+Fqn\+Out} & A fully qualifed unique file name as output \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ae5ffabde2c88ea58324f27e471f6bfc0}\label{classxb_1_1xbFile_ae5ffabde2c88ea58324f27e471f6bfc0}}
+\index{xb::xbDbf@{xb::xbDbf}!CreateUniqueFileName@{CreateUniqueFileName}}
+\index{CreateUniqueFileName@{CreateUniqueFileName}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{CreateUniqueFileName()}{CreateUniqueFileName()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Create\+Unique\+File\+Name (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Dir\+In, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Ext\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Fqn\+Out, }\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Create a unique file name.
+
+Given a directory and file extension as inputs, create a unique file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Dir\+In} & Directory \\
+\hline
+{\em s\+Ext\+In} & File Extension \\
+\hline
+{\em i\+Option} & 0 -\/ look only for one file for a given directory and extension~\newline
+ 1 -\/ if file name extension is \char`\"{}dbf\char`\"{} or \char`\"{}\+DBF\char`\"{}, verify unique dbt or DBT (memo) file is also available~\newline
+ \\
+\hline
+{\em s\+Fqn\+Out} & A fully qualifed unique file name as output \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a01c26b67e312be1e674b3da710e031b9}\label{classxb_1_1xbDbf_a01c26b67e312be1e674b3da710e031b9}}
+\index{xb::xbDbf@{xb::xbDbf}!DeleteAll@{DeleteAll}}
+\index{DeleteAll@{DeleteAll}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{DeleteAll()}{DeleteAll()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Delete\+All (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Delete or undelete all records in a dbf file (table).
+
+This routine deletes or un-\/deletes all records. The xbase file format contains a leading one byte character used for flagging a record as deleted. When a record is deleted, it\textquotesingle{}s not physically removed from the file, the first byte is flagged as deleted.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Option} & 0 -\/ Delete all records.~\newline
+ 1 -\/ Un-\/delete all deleted records. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a3067fdfa3a7a5c15651f6e89d1102176}\label{classxb_1_1xbDbf_a3067fdfa3a7a5c15651f6e89d1102176}}
+\index{xb::xbDbf@{xb::xbDbf}!DeleteAllRecords@{DeleteAllRecords}}
+\index{DeleteAllRecords@{DeleteAllRecords}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{DeleteAllRecords()}{DeleteAllRecords()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Delete\+All\+Records (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Delete all records.
+
+This routine deletes all the records in a table / dbf file.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_acd8c10579229f3a2e2c5fdb7fcef90db}\label{classxb_1_1xbDbf_acd8c10579229f3a2e2c5fdb7fcef90db}}
+\index{xb::xbDbf@{xb::xbDbf}!DeleteRecord@{DeleteRecord}}
+\index{DeleteRecord@{DeleteRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{DeleteRecord()}{DeleteRecord()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Delete\+Record (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Delete the current record.
+
+This routine flags the current record for deletion if it\textquotesingle{}s not already flagged.
+
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+ XB\+\_\+\+INVALID\+\_\+\+RECORD
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a4085ed4f049d976124d8edc3d3c56397}\label{classxb_1_1xbDbf_a4085ed4f049d976124d8edc3d3c56397}}
+\index{xb::xbDbf@{xb::xbDbf}!DeleteTable@{DeleteTable}}
+\index{DeleteTable@{DeleteTable}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{DeleteTable()}{DeleteTable()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Delete\+Table (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Delete a table.
+
+This routine deletes a given table, associated index files if any, the memo file if any and the .INF file if any. \begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a5a740033664c9ad2611c90e2a6d0c2d3}\label{classxb_1_1xbFile_a5a740033664c9ad2611c90e2a6d0c2d3}}
+\index{xb::xbDbf@{xb::xbDbf}!DetermineXbaseMemoVersion@{DetermineXbaseMemoVersion}}
+\index{DetermineXbaseMemoVersion@{DetermineXbaseMemoVersion}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{DetermineXbaseMemoVersion()}{DetermineXbaseMemoVersion()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Determine\+Xbase\+Memo\+Version (\begin{DoxyParamCaption}\item[{unsigned char}]{c\+File\+Type\+Byte }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Determine which version the memo (dbt) file is.
+
+This routine uses the first byte in the dbf file to determine which memo file version is in use. The main difference between version 3 and 4 is that version 4 will reuse blocks if they become available. Version 3 does not.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c\+File\+Type\+Byte} & is an output field and is one of\+:~\newline
+ ~\newline
+ 0 -\/ none~\newline
+ 3 -\/ Dbase III+~\newline
+ 4 -\/ Dbase IV~\newline
+\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ae2b6ac26018dc28f77afbb3f008c3f66}\label{classxb_1_1xbFile_ae2b6ac26018dc28f77afbb3f008c3f66}}
+\index{xb::xbDbf@{xb::xbDbf}!DetermineXbaseTableVersion@{DetermineXbaseTableVersion}}
+\index{DetermineXbaseTableVersion@{DetermineXbaseTableVersion}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{DetermineXbaseTableVersion()}{DetermineXbaseTableVersion()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Determine\+Xbase\+Table\+Version (\begin{DoxyParamCaption}\item[{unsigned char}]{c\+File\+Type\+Byte }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Determine xbase dbf version.
+
+This routine is used to determine which version of the Xbase classes can be used for a given DBF file.~\newline
+
+
+It attempts to use the highest version compiled into the library.~\newline
+
+
+References\+:~\newline
+ This routine uses the first byte from the dbf file.~\newline
+ Per DBase documentation\+:~\newline
+ Valid d\+BASE for Windows table file, bits 0-\/2 indicate version number\+: 3 for d\+BASE Level 5, 4 for d\+BASE Level 7.~\newline
+ Bit 3 and bit 7 indicate presence of a d\+BASE IV or d\+BASE for Windows memo file;~\newline
+ Bits 4-\/6 indicate the presence of a d\+BASE IV SQL table;~\newline
+ Bit 7 indicates the presence of any .DBT memo file (either a d\+BASE III PLUS type or a d\+BASE IV or d\+BASE for Windows memo file).~\newline
+ ~\newline
+ Bachmann spec (used extensively in library build), page 7 -\/ does not match DBase documentation~\newline
+ ~\newline
+ returns~\newline
+ 0 -\/ unknown~\newline
+ 3 -\/ Dbase level 3~\newline
+ 4 -\/ Dbase level 4~\newline
+ 5 -\/ Dbase Level 5 (future)~\newline
+ 7 -\/ Dbase Level 7 (future)~\newline
+ ~\newline
+ 1x -\/ Clipper files (future)~\newline
+ 2x -\/ Foxbase files (future)~\newline
+ ~\newline
+ \mbox{\Hypertarget{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}\label{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}}
+\index{xb::xbDbf@{xb::xbDbf}!DisplayError@{DisplayError}}
+\index{DisplayError@{DisplayError}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{DisplayError()}{DisplayError()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Display\+Error (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Display error message on console for a given error number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error number to reference \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ab1f4a515533402f872cedcd0322aabd4}\label{classxb_1_1xbDbf_ab1f4a515533402f872cedcd0322aabd4}}
+\index{xb::xbDbf@{xb::xbDbf}!DumpHeader@{DumpHeader}}
+\index{DumpHeader@{DumpHeader}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{DumpHeader()}{DumpHeader()}}
+{\footnotesize\ttfamily virtual xb\+Int16 xb\+::xb\+Dbf\+::\+Dump\+Header (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a3a6a068addffd06fc9a996639d6ca69e}\label{classxb_1_1xbDbf_a3a6a068addffd06fc9a996639d6ca69e}}
+\index{xb::xbDbf@{xb::xbDbf}!DumpRecord@{DumpRecord}}
+\index{DumpRecord@{DumpRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{DumpRecord()}{DumpRecord()}}
+{\footnotesize\ttfamily virtual xb\+Int16 xb\+::xb\+Dbf\+::\+Dump\+Record (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Rec\+No, }\item[{xb\+Int16}]{i\+Output\+Dest = {\ttfamily 0}, }\item[{xb\+Int16}]{i\+Output\+Fmt = {\ttfamily 0} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_ab14e4a11427f5efb81cba1dd32bd1aa1}\label{classxb_1_1xbFile_ab14e4a11427f5efb81cba1dd32bd1aa1}}
+\index{xb::xbDbf@{xb::xbDbf}!eGetDouble@{eGetDouble}}
+\index{eGetDouble@{eGetDouble}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{eGetDouble()}{eGetDouble()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} xb\+::xb\+File\+::e\+Get\+Double (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get a portable double value.
+
+This routine returns a double value from an 8 byte character stream, accounting for endian type.
+
+Converts a double (64 bit floating point) value stored at p from a portable format to the machine format.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & pointer to memory containing the portable double value\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+the double value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ac40c991110ddc6fb30a72d90f4652762}\label{classxb_1_1xbFile_ac40c991110ddc6fb30a72d90f4652762}}
+\index{xb::xbDbf@{xb::xbDbf}!eGetInt16@{eGetInt16}}
+\index{eGetInt16@{eGetInt16}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{eGetInt16()}{eGetInt16()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::e\+Get\+Int16 (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get a portable short value.
+
+This routine returns a short int value from a 2 byte character stream, accounting for endian type.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & pointer to memory containing the portable long value\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+the short value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a60b24a5afc984c586bf384c7e915ba0d}\label{classxb_1_1xbFile_a60b24a5afc984c586bf384c7e915ba0d}}
+\index{xb::xbDbf@{xb::xbDbf}!eGetInt32@{eGetInt32}}
+\index{eGetInt32@{eGetInt32}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{eGetInt32()}{eGetInt32()}}
+{\footnotesize\ttfamily xb\+Int32 xb\+::xb\+File\+::e\+Get\+Int32 (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get a portable long value.
+
+This routine returns a long int value from a 4 byte character stream, accounting for endian type.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & pointer to memory containing the portable long value\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+the long value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a936ade458e6d5e6d29f9b5031888d189}\label{classxb_1_1xbFile_a936ade458e6d5e6d29f9b5031888d189}}
+\index{xb::xbDbf@{xb::xbDbf}!eGetUInt16@{eGetUInt16}}
+\index{eGetUInt16@{eGetUInt16}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{eGetUInt16()}{eGetUInt16()}}
+{\footnotesize\ttfamily xb\+UInt16 xb\+::xb\+File\+::e\+Get\+UInt16 (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get a portable unsigned short value.
+
+This routine returns a short unsigned int value from a 2 byte character stream, accounting for endian type.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & pointer to memory containing the portable long value\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+the short value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a78f052529d39a18deaface5a0d47d0b0}\label{classxb_1_1xbFile_a78f052529d39a18deaface5a0d47d0b0}}
+\index{xb::xbDbf@{xb::xbDbf}!eGetUInt32@{eGetUInt32}}
+\index{eGetUInt32@{eGetUInt32}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{eGetUInt32()}{eGetUInt32()}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+File\+::e\+Get\+UInt32 (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get a portable unsigned long value.
+
+This routine returns an unsigned long int value from a 4 byte character stream, accounting for endian type.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & pointer to memory containing the portable long value\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+the unsigned long value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a98b6ff533ae93f90c977a2ba23eeb105}\label{classxb_1_1xbFile_a98b6ff533ae93f90c977a2ba23eeb105}}
+\index{xb::xbDbf@{xb::xbDbf}!ePutDouble@{ePutDouble}}
+\index{ePutDouble@{ePutDouble}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ePutDouble()}{ePutDouble()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::e\+Put\+Double (\begin{DoxyParamCaption}\item[{char $\ast$}]{c, }\item[{\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}}}]{d }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Write a portable double value to memory location.
+
+Converts a double (64 bit floating point) value from machine format to a portable format and stores the converted value in the memory referenced by c.
+
+This routine puts a double value to an 8 byte character stream
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Pointer to memory to hold converted value \\
+\hline
+{\em d} & Input value to be converted \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_a29130f12739ac8fa837f4eaedf1338b2}\label{classxb_1_1xbFile_a29130f12739ac8fa837f4eaedf1338b2}}
+\index{xb::xbDbf@{xb::xbDbf}!ePutInt16@{ePutInt16}}
+\index{ePutInt16@{ePutInt16}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ePutInt16()}{ePutInt16()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::e\+Put\+Int16 (\begin{DoxyParamCaption}\item[{char $\ast$}]{c, }\item[{xb\+Int16}]{s }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Write a portable short value to memory location.
+
+Converts a short (16 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.
+
+This routine puts a short value to a 2 byte character stream
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Pointer to memory to hold converted value \\
+\hline
+{\em s} & Input value to be converted \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_a19c37f76a2ccbb45019cb0fc373d3f46}\label{classxb_1_1xbFile_a19c37f76a2ccbb45019cb0fc373d3f46}}
+\index{xb::xbDbf@{xb::xbDbf}!ePutInt32@{ePutInt32}}
+\index{ePutInt32@{ePutInt32}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ePutInt32()}{ePutInt32()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::e\+Put\+Int32 (\begin{DoxyParamCaption}\item[{char $\ast$}]{c, }\item[{xb\+Int32}]{l }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Write a portable long value to memory location.
+
+Converts a long (32 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.
+
+This routine puts a long value to a 4 byte character stream.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Pointer to memory to hold converted value \\
+\hline
+{\em l} & Input value to be converted \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_a65e9839f92b96eac7b0d071fac3bbe40}\label{classxb_1_1xbFile_a65e9839f92b96eac7b0d071fac3bbe40}}
+\index{xb::xbDbf@{xb::xbDbf}!ePutUInt16@{ePutUInt16}}
+\index{ePutUInt16@{ePutUInt16}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ePutUInt16()}{ePutUInt16()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::e\+Put\+UInt16 (\begin{DoxyParamCaption}\item[{char $\ast$}]{c, }\item[{xb\+UInt16}]{s }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Write a portable unsigned short value to memory location.
+
+Converts an unsigned short (16 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.
+
+This routine puts an unsigned short value to a 2 byte character stream
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Pointer to memory to hold converted value \\
+\hline
+{\em s} & Input value to be converted \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_aa3f6ceae4b96f24875d86848bf13a173}\label{classxb_1_1xbFile_aa3f6ceae4b96f24875d86848bf13a173}}
+\index{xb::xbDbf@{xb::xbDbf}!ePutUInt32@{ePutUInt32}}
+\index{ePutUInt32@{ePutUInt32}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ePutUInt32()}{ePutUInt32()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::e\+Put\+UInt32 (\begin{DoxyParamCaption}\item[{char $\ast$}]{c, }\item[{xb\+UInt32}]{ul }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Write a portable unsigned long value to memory location.
+
+Converts an unsigned long (32 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.
+
+This routine puts an unsigned long value to a 4 byte character stream.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Pointer to memory to hold converted value \\
+\hline
+{\em ul} & Input value to be converted \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_a78bd8a11dce102647095baf3aff2b006}\label{classxb_1_1xbFile_a78bd8a11dce102647095baf3aff2b006}}
+\index{xb::xbDbf@{xb::xbDbf}!FileExists@{FileExists}}
+\index{FileExists@{FileExists}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{FileExists()}{FileExists()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+File\+::\+File\+Exists (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Determines if a file exists.
+
+\begin{DoxyReturn}{Returns}
+xb\+True if file exists~\newline
+ xb\+False if file does not exist
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a61130b4fbf4cf9d5972dcb4993de2f94}\label{classxb_1_1xbFile_a61130b4fbf4cf9d5972dcb4993de2f94}}
+\index{xb::xbDbf@{xb::xbDbf}!FileExists@{FileExists}}
+\index{FileExists@{FileExists}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{FileExists()}{FileExists()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+File\+::\+File\+Exists (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Determines if a file exists.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ file name to check for\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True if file exists~\newline
+ xb\+False if file does not exist
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a0592168f39a10f2a401a88ef781f6148}\label{classxb_1_1xbFile_a0592168f39a10f2a401a88ef781f6148}}
+\index{xb::xbDbf@{xb::xbDbf}!FileExists@{FileExists}}
+\index{FileExists@{FileExists}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{FileExists()}{FileExists()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+File\+::\+File\+Exists (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Determines if a file exists.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ file name to check for \\
+\hline
+{\em i\+Option} & if 1, assume this is a request for a dbf file and check for the a dbt memo file also, returns true if both files are found\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True if both dbf and dbt files exist~\newline
+ xb\+False if file does not exist
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a174d8a6aabc9cfcd32fedbd1e5b13ddd}\label{classxb_1_1xbFile_a174d8a6aabc9cfcd32fedbd1e5b13ddd}}
+\index{xb::xbDbf@{xb::xbDbf}!FileExists@{FileExists}}
+\index{FileExists@{FileExists}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{FileExists()}{FileExists()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+File\+::\+File\+Exists (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Determines if a file exists.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Option} & if 1, assume this is a request for a dbf file and check for the a dbt memo file also, returns true if both files are found\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True if both files exist~\newline
+ xb\+False if file does not exist
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a7fa837938a32dc9ca3fbc81cbaf50f59}\label{classxb_1_1xbFile_a7fa837938a32dc9ca3fbc81cbaf50f59}}
+\index{xb::xbDbf@{xb::xbDbf}!FileIsOpen@{FileIsOpen}}
+\index{FileIsOpen@{FileIsOpen}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{FileIsOpen()}{FileIsOpen()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+File\+::\+File\+Is\+Open (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Determines if file is open.
+
+\begin{DoxyReturn}{Returns}
+xb\+True if file is open~\newline
+ xb\+False if file is not open
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_abb9e20c5efacd4fea80f1515abbc6b55}\label{classxb_1_1xbDbf_abb9e20c5efacd4fea80f1515abbc6b55}}
+\index{xb::xbDbf@{xb::xbDbf}!GetAutoCommit@{GetAutoCommit}}
+\index{GetAutoCommit@{GetAutoCommit}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetAutoCommit()}{GetAutoCommit()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Auto\+Commit (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get auto commit setting.
+
+This routine returns the table setting if set, otherwise returns the system level setting.
+
+\begin{DoxyReturn}{Returns}
+Not 0 -\/ Auto commit on for this table.~\newline
+ 0 -\/ Auto commit off for this table.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ae0c00226fd2ea7a67f101e795467ed68}\label{classxb_1_1xbDbf_ae0c00226fd2ea7a67f101e795467ed68}}
+\index{xb::xbDbf@{xb::xbDbf}!GetAutoCommit@{GetAutoCommit}}
+\index{GetAutoCommit@{GetAutoCommit}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetAutoCommit()}{GetAutoCommit()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Auto\+Commit (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get auto commit setting.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Option} & 0 -\/ Specific setting for this table~\newline
+ 1 -\/ If this table should be auto updated (takes DBMS setting into account) \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Not 0 -\/ Auto commit on for this table.~\newline
+ 0 -\/ Auto commit off for this table.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a638e14262410a1627819f016a16cdce2}\label{classxb_1_1xbFile_a638e14262410a1627819f016a16cdce2}}
+\index{xb::xbDbf@{xb::xbDbf}!GetBlockSize@{GetBlockSize}}
+\index{GetBlockSize@{GetBlockSize}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetBlockSize()}{GetBlockSize()}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+File\+::\+Get\+Block\+Size (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the block size.
+
+\begin{DoxyReturn}{Returns}
+Block Size
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a643a80a3792a52760c8e09ba18719503}\label{classxb_1_1xbDbf_a643a80a3792a52760c8e09ba18719503}}
+\index{xb::xbDbf@{xb::xbDbf}!GetCurRecNo@{GetCurRecNo}}
+\index{GetCurRecNo@{GetCurRecNo}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetCurRecNo()}{GetCurRecNo()}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+Dbf\+::\+Get\+Cur\+Rec\+No (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get Auto Lock setting.
+
+\begin{DoxyReturn}{Returns}
+Auto lock setting.
+\end{DoxyReturn}
+Get a pointer to the current index object.
+
+\begin{DoxyReturn}{Returns}
+Pointer to current index.
+\end{DoxyReturn}
+Return the current record number.
+
+\begin{DoxyReturn}{Returns}
+Returns the current record number.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}\label{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDataDirectory@{GetDataDirectory}}
+\index{GetDataDirectory@{GetDataDirectory}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDataDirectory()}{GetDataDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Data\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the current data directory.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the current data directory where the database files are stored.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ac624e06a97666bfd64b4f252b4548b36}\label{classxb_1_1xbDbf_ac624e06a97666bfd64b4f252b4548b36}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDateField@{GetDateField}}
+\index{GetDateField@{GetDateField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDateField()}{GetDateField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Date\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{\mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to retrieve. \\
+\hline
+{\em dt\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_af78ef1fba949463ff7f829d3cffc4555}\label{classxb_1_1xbDbf_af78ef1fba949463ff7f829d3cffc4555}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDateField@{GetDateField}}
+\index{GetDateField@{GetDateField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDateField()}{GetDateField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Date\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em dt\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ac1110d867ba297a52c8b0e83e88f05e6}\label{classxb_1_1xbDbf_ac1110d867ba297a52c8b0e83e88f05e6}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDbfStatus@{GetDbfStatus}}
+\index{GetDbfStatus@{GetDbfStatus}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDbfStatus()}{GetDbfStatus()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Dbf\+Status (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Return the current dbf status.
+
+\begin{DoxyReturn}{Returns}
+0 = closed~\newline
+ 1 = open~\newline
+ 2 = updates pending~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}\label{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDefaultAutoCommit@{GetDefaultAutoCommit}}
+\index{GetDefaultAutoCommit@{GetDefaultAutoCommit}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDefaultAutoCommit()}{GetDefaultAutoCommit()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Default\+Auto\+Commit (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the default auto commit setting.
+
+When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}\mbox{\hyperlink{classxb_1_1xbDbf_a5b412dd796241673eb1aa2c93513d69b}{Append\+Record()}}.
+
+\begin{DoxyReturn}{Returns}
+xb\+True if auto commit is turned on~\newline
+ xb\+False is auto commit is turned off
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}\label{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDefaultDateFormat@{GetDefaultDateFormat}}
+\index{GetDefaultDateFormat@{GetDefaultDateFormat}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDefaultDateFormat()}{GetDefaultDateFormat()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Date\+Format (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the default date format.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the default date format.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}\label{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDefaultLogDirectory@{GetDefaultLogDirectory}}
+\index{GetDefaultLogDirectory@{GetDefaultLogDirectory}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogDirectory()}{GetDefaultLogDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}\label{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDefaultLogFileName@{GetDefaultLogFileName}}
+\index{GetDefaultLogFileName@{GetDefaultLogFileName}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogFileName()}{GetDefaultLogFileName()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_acd0fb2166b2bff7e8a1cf65a7bc8be1e}\label{classxb_1_1xbFile_acd0fb2166b2bff7e8a1cf65a7bc8be1e}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDirectory@{GetDirectory}}
+\index{GetDirectory@{GetDirectory}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDirectory()}{GetDirectory()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+File\+::\+Get\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the directory name.
+
+\begin{DoxyReturn}{Returns}
+the directory name of the file
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a6e6774df0f2d7733f4b25a9989596d95}\label{classxb_1_1xbDbf_a6e6774df0f2d7733f4b25a9989596d95}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDoubleField@{GetDoubleField}}
+\index{GetDoubleField@{GetDoubleField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDoubleField()}{GetDoubleField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Double\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} \&}]{d\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get xb\+Double field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to retrieve. \\
+\hline
+{\em d\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a4556041a7ff2f6b6f986729901c11f08}\label{classxb_1_1xbDbf_a4556041a7ff2f6b6f986729901c11f08}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDoubleField@{GetDoubleField}}
+\index{GetDoubleField@{GetDoubleField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDoubleField()}{GetDoubleField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Double\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} \&}]{d\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get xb\+Double field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em d\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a2370b5e736931441a5968649291b9ef4}\label{classxb_1_1xbDbf_a2370b5e736931441a5968649291b9ef4}}
+\index{xb::xbDbf@{xb::xbDbf}!GetDoubleField@{GetDoubleField}}
+\index{GetDoubleField@{GetDoubleField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetDoubleField()}{GetDoubleField()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Double\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} \&}]{d\+Field\+Value, }\item[{xb\+Int16}]{i\+Rec\+Buf\+Sw }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get xb\+Double field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em d\+Field\+Value} & Output field value. \\
+\hline
+{\em i\+Rec\+Buf\+Sw} & 0 -\/ Record buffer with any updates.~\newline
+1 -\/ Record buffer with original data. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}\label{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}}
+\index{xb::xbDbf@{xb::xbDbf}!GetEndianType@{GetEndianType}}
+\index{GetEndianType@{GetEndianType}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetEndianType()}{GetEndianType()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::\+Get\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the Endian type.
+
+\begin{DoxyReturn}{Returns}
+B -\/ Big endian~\newline
+ L -\/ Little endian~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}\label{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}}
+\index{xb::xbDbf@{xb::xbDbf}!GetErrorMessage@{GetErrorMessage}}
+\index{GetErrorMessage@{GetErrorMessage}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetErrorMessage()}{GetErrorMessage()}}
+{\footnotesize\ttfamily const char $\ast$ xb\+::xb\+Ssv\+::\+Get\+Error\+Message (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get an error message.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error\+Code is the error number of description to be returned. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Returns a pointer to a string containing a text description for the error code.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a9a0fcf7e2040ab483e3807927833cb26}\label{classxb_1_1xbDbf_a9a0fcf7e2040ab483e3807927833cb26}}
+\index{xb::xbDbf@{xb::xbDbf}!GetField@{GetField}}
+\index{GetField@{GetField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetField()}{GetField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to retrieve \\
+\hline
+{\em s\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ac81f078f3c932f0da60ad1fbdd848d3e}\label{classxb_1_1xbDbf_ac81f078f3c932f0da60ad1fbdd848d3e}}
+\index{xb::xbDbf@{xb::xbDbf}!GetField@{GetField}}
+\index{GetField@{GetField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetField()}{GetField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get field data for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em s\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ad245a26eb8b79610c9ae7bab19e05513}\label{classxb_1_1xbDbf_ad245a26eb8b79610c9ae7bab19e05513}}
+\index{xb::xbDbf@{xb::xbDbf}!GetField@{GetField}}
+\index{GetField@{GetField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetField()}{GetField()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Value, }\item[{xb\+Int16}]{i\+Rec\+Buf\+Sw }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get field data for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em s\+Field\+Value} & Output field value. \\
+\hline
+{\em i\+Rec\+Buf\+Sw} & 0 -\/ Record buffer with any updates.~\newline
+1 -\/ Record buffer with original data. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_add27d8ef555a13b336b8c804165dc15e}\label{classxb_1_1xbDbf_add27d8ef555a13b336b8c804165dc15e}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFieldCnt@{GetFieldCnt}}
+\index{GetFieldCnt@{GetFieldCnt}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFieldCnt()}{GetFieldCnt()}}
+{\footnotesize\ttfamily xb\+Int32 xb\+::xb\+Dbf\+::\+Get\+Field\+Cnt (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Return the number of fields in the table.
+
+\begin{DoxyReturn}{Returns}
+The number of fields in the table.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a607f774fcd6dc0b9913d7a7801b60db2}\label{classxb_1_1xbDbf_a607f774fcd6dc0b9913d7a7801b60db2}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFieldDecimal@{GetFieldDecimal}}
+\index{GetFieldDecimal@{GetFieldDecimal}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFieldDecimal()}{GetFieldDecimal()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field\+Decimal (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{xb\+Int16 \&}]{i\+Field\+Decimal }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get decimal for field name.
+
+This routine retreives a field\textquotesingle{}s decimal length.
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to retrieve \\
+\hline
+{\em i\+Field\+Decimal} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_abcb4defad2e1b6e67f63cc60737ad840}\label{classxb_1_1xbDbf_abcb4defad2e1b6e67f63cc60737ad840}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFieldDecimal@{GetFieldDecimal}}
+\index{GetFieldDecimal@{GetFieldDecimal}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFieldDecimal()}{GetFieldDecimal()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field\+Decimal (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{xb\+Int16 \&}]{i\+Field\+Decimal }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get decimal for field number.
+
+This routine retreives a field\textquotesingle{}s decimal length.
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve \\
+\hline
+{\em i\+Field\+Decimal} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_acf06dbccdba1a4bcd90fa0bea6cca59b}\label{classxb_1_1xbDbf_acf06dbccdba1a4bcd90fa0bea6cca59b}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFieldLen@{GetFieldLen}}
+\index{GetFieldLen@{GetFieldLen}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFieldLen()}{GetFieldLen()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field\+Len (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{xb\+Int16 \&}]{i\+Field\+Len }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get field length for field name.
+
+This function retrieves a field\textquotesingle{}s length.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to retrieve \\
+\hline
+{\em i\+Field\+Len} & Output field length value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_adda4302b58cc6109b048f19d9b68bbd4}\label{classxb_1_1xbDbf_adda4302b58cc6109b048f19d9b68bbd4}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFieldLen@{GetFieldLen}}
+\index{GetFieldLen@{GetFieldLen}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFieldLen()}{GetFieldLen()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field\+Len (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{xb\+Int16 \&}]{i\+Field\+Len }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get field length for field number.
+
+This function retrieves a field\textquotesingle{}s length.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Name of field to retrieve \\
+\hline
+{\em i\+Field\+Len} & Output field length value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a5e3e4368bfba1724c016b8859023e34c}\label{classxb_1_1xbDbf_a5e3e4368bfba1724c016b8859023e34c}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFieldName@{GetFieldName}}
+\index{GetFieldName@{GetFieldName}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFieldName()}{GetFieldName()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field\+Name (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Returns the name of the specified field.
+
+Returns a pointer to the name for the field specified by i\+Field\+No.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field. \\
+\hline
+{\em s\+Field\+Name} & Output variable containing the field name. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_aad9029e63909aeb77d8473256d88bea8}\label{classxb_1_1xbDbf_aad9029e63909aeb77d8473256d88bea8}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFieldNo@{GetFieldNo}}
+\index{GetFieldNo@{GetFieldNo}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFieldNo()}{GetFieldNo()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field\+No (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get field ID number for a given field name.
+
+Returns the field number for the named field.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Number of field or XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_aed9113b5095c6df1b9c854cbd0d8047b}\label{classxb_1_1xbDbf_aed9113b5095c6df1b9c854cbd0d8047b}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFieldNo@{GetFieldNo}}
+\index{GetFieldNo@{GetFieldNo}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFieldNo()}{GetFieldNo()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field\+No (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{xb\+Int16 \&}]{i\+Field\+No }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the field number for name.
+
+Returns the field number for the named field.
+
+All field get/put methods require either a field number or field name as one of the parameters. Using the methods that take the field numbers will yield slightly better performance because the methods that take a name, have to look up the number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field. \\
+\hline
+{\em i\+Field\+No} & Output field number for the given name. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Number of field named fld\+Name.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a181db879f1a75f93a34c03513a0b2fea}\label{classxb_1_1xbDbf_a181db879f1a75f93a34c03513a0b2fea}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFieldType@{GetFieldType}}
+\index{GetFieldType@{GetFieldType}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFieldType()}{GetFieldType()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field\+Type (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{char \&}]{c\+Field\+Type }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get field type for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Field name. \\
+\hline
+{\em c\+Field\+Type} & Output field type. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a5143973e4f165651152aa13c8fd45f84}\label{classxb_1_1xbDbf_a5143973e4f165651152aa13c8fd45f84}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFieldType@{GetFieldType}}
+\index{GetFieldType@{GetFieldType}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFieldType()}{GetFieldType()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Field\+Type (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{char \&}]{c\+Field\+Type }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get field type for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Field number. \\
+\hline
+{\em c\+Field\+Type} & Output field type. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_af5127c92892816e9bbc5c19653c4147a}\label{classxb_1_1xbFile_af5127c92892816e9bbc5c19653c4147a}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFileDirPart@{GetFileDirPart}}
+\index{GetFileDirPart@{GetFileDirPart}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFileDirPart()}{GetFileDirPart()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Dir\+Part (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Complete\+File\+Name\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Dir\+Part\+Out }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the directory part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Complete\+File\+Name\+In} & -\/ a fully qualfied input file name \\
+\hline
+{\em s\+File\+Dir\+Part\+Out} & -\/ the returned directory name part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a60c53998e3d1b694134b20a87bc9bf5a}\label{classxb_1_1xbFile_a60c53998e3d1b694134b20a87bc9bf5a}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFileDirPart@{GetFileDirPart}}
+\index{GetFileDirPart@{GetFileDirPart}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFileDirPart()}{GetFileDirPart()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Dir\+Part (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Dir\+Part\+Out }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the directory part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Dir\+Part\+Out} & -\/ the returned directory name \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab289b6ffe955321160c1f90220c22e25}\label{classxb_1_1xbFile_ab289b6ffe955321160c1f90220c22e25}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFileExtPart@{GetFileExtPart}}
+\index{GetFileExtPart@{GetFileExtPart}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFileExtPart()}{GetFileExtPart()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Ext\+Part (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Complete\+File\+Name\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Ext\+Part\+Out }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the extension part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Complete\+File\+Name\+In} & -\/ a fully qualfied input file name\\
+\hline
+{\em s\+File\+Ext\+Part\+Out} & -\/ the returned directory name part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a57a9222e5cbb51019d4eeb2c3ac89fa2}\label{classxb_1_1xbFile_a57a9222e5cbb51019d4eeb2c3ac89fa2}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFileExtPart@{GetFileExtPart}}
+\index{GetFileExtPart@{GetFileExtPart}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFileExtPart()}{GetFileExtPart()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Ext\+Part (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name\+Ext\+Out }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the extension part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name\+Ext\+Out} & -\/ the returned extension part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a02df78f4c90313243f508fc56b95aba8}\label{classxb_1_1xbFile_a02df78f4c90313243f508fc56b95aba8}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFileMtime@{GetFileMtime}}
+\index{GetFileMtime@{GetFileMtime}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFileMtime()}{GetFileMtime()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Mtime (\begin{DoxyParamCaption}\item[{time\+\_\+t \&}]{mtime }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the time of last file modification timestamp as reported by the OS.
+
+
+\begin{DoxyParams}{Parameters}
+{\em mtime} & -\/ returned time of last file modification \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ac95cb882ccbcdedc9a233c6ad9fed07a}\label{classxb_1_1xbFile_ac95cb882ccbcdedc9a233c6ad9fed07a}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFileName@{GetFileName}}
+\index{GetFileName@{GetFileName}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFileName()}{GetFileName()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+File\+::\+Get\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the file name.
+
+\begin{DoxyReturn}{Returns}
+the file name portion of the file
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a6110763c5ae996b72c7a62c15bdecc73}\label{classxb_1_1xbFile_a6110763c5ae996b72c7a62c15bdecc73}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFileNamePart@{GetFileNamePart}}
+\index{GetFileNamePart@{GetFileNamePart}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFileNamePart()}{GetFileNamePart()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Name\+Part (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Complete\+File\+Name\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name\+Part\+Out }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the name part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Complete\+File\+Name\+In} & -\/ a fully qualified input file name \\
+\hline
+{\em s\+File\+Name\+Part\+Out} & -\/ the returned file name part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a81422b3dd52763d2cc6c77237ec9af0a}\label{classxb_1_1xbFile_a81422b3dd52763d2cc6c77237ec9af0a}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFileNamePart@{GetFileNamePart}}
+\index{GetFileNamePart@{GetFileNamePart}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFileNamePart()}{GetFileNamePart()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Name\+Part (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name\+Part\+Out }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the name part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name\+Part\+Out} & -\/ the returned file name part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a50b63c39e49d44e52078038027b24cc5}\label{classxb_1_1xbFile_a50b63c39e49d44e52078038027b24cc5}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFileSize@{GetFileSize}}
+\index{GetFileSize@{GetFileSize}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFileSize()}{GetFileSize()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Size (\begin{DoxyParamCaption}\item[{xb\+UInt64 \&}]{ull\+File\+Size }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the size of the file as reported by the OS.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ull\+File\+Size} & -\/ unsigned long long field as output \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a5548236d38d43b89ae29b9a015b1f678}\label{classxb_1_1xbFile_a5548236d38d43b89ae29b9a015b1f678}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFileType@{GetFileType}}
+\index{GetFileType@{GetFileType}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFileType()}{GetFileType()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Type (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Type\+Out }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the file type aka Capitalized file extension.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Type\+Out} & -\/ the returned extension part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a6fc5b8a3e2f177d5ceaf9d975cbb5226}\label{classxb_1_1xbDbf_a6fc5b8a3e2f177d5ceaf9d975cbb5226}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFirstRecord@{GetFirstRecord}}
+\index{GetFirstRecord@{GetFirstRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFirstRecord()}{GetFirstRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+First\+Record (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the first record.
+
+Get the first not deleted record. This routines skips over any deleted records. \begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_acb78991e8435edd36318c653cb977c1a}\label{classxb_1_1xbDbf_acb78991e8435edd36318c653cb977c1a}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFirstRecord@{GetFirstRecord}}
+\index{GetFirstRecord@{GetFirstRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFirstRecord()}{GetFirstRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+First\+Record (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the first record.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Option} & XB\+\_\+\+ALL\+\_\+\+RECS -\/ Get the first record, deleted or not.~\newline
+ XB\+\_\+\+ACTIVE\+\_\+\+RECS -\/ Get the first active record.~\newline
+ XB\+\_\+\+DELETED\+\_\+\+RECS -\/ Get the first deleted record.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a81ef2f36f921d7ece066a592eb6393eb}\label{classxb_1_1xbDbf_a81ef2f36f921d7ece066a592eb6393eb}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFloatField@{GetFloatField}}
+\index{GetFloatField@{GetFloatField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFloatField()}{GetFloatField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Float\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{\mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+Float}} \&}]{f\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get xb\+Float field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Number of field to retrieve. \\
+\hline
+{\em f\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a3443f646038ced14425f067a59c0f2da}\label{classxb_1_1xbDbf_a3443f646038ced14425f067a59c0f2da}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFloatField@{GetFloatField}}
+\index{GetFloatField@{GetFloatField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFloatField()}{GetFloatField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Float\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+Float}} \&}]{f\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get xb\+Float field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em f\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a31b4e641f93206ba23e2a5a27491dcd4}\label{classxb_1_1xbFile_a31b4e641f93206ba23e2a5a27491dcd4}}
+\index{xb::xbDbf@{xb::xbDbf}!GetFqFileName@{GetFqFileName}}
+\index{GetFqFileName@{GetFqFileName}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetFqFileName()}{GetFqFileName()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+File\+::\+Get\+Fq\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the fully qualified file name.
+
+\begin{DoxyReturn}{Returns}
+the fully qualfied name of the file
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a49e667f9c8ee55c36444702663fc5964}\label{classxb_1_1xbDbf_a49e667f9c8ee55c36444702663fc5964}}
+\index{xb::xbDbf@{xb::xbDbf}!GetLastRecord@{GetLastRecord}}
+\index{GetLastRecord@{GetLastRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetLastRecord()}{GetLastRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Last\+Record (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the last record.
+
+Get the last not deleted record. This routines skips over any deleted records. \begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a8ccfa2291417412b6894940d1b92f9a6}\label{classxb_1_1xbDbf_a8ccfa2291417412b6894940d1b92f9a6}}
+\index{xb::xbDbf@{xb::xbDbf}!GetLastRecord@{GetLastRecord}}
+\index{GetLastRecord@{GetLastRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetLastRecord()}{GetLastRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Last\+Record (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the last record.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Option} & XB\+\_\+\+ALL\+\_\+\+RECS -\/ Get the last record, deleted or not.~\newline
+ XB\+\_\+\+ACTIVE\+\_\+\+RECS -\/ Get the last active record.~\newline
+ XB\+\_\+\+DELETED\+\_\+\+RECS -\/ Get the last deleted record.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a943cea7fde1b06c1a05184193eff8d2d}\label{classxb_1_1xbDbf_a943cea7fde1b06c1a05184193eff8d2d}}
+\index{xb::xbDbf@{xb::xbDbf}!GetLogicalField@{GetLogicalField}}
+\index{GetLogicalField@{GetLogicalField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetLogicalField()}{GetLogicalField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/5]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Logical\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \&}]{b\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get logical field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to retrieve. \\
+\hline
+{\em b\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a9cd6819bfd932ff8507e54d9cb9a624e}\label{classxb_1_1xbDbf_a9cd6819bfd932ff8507e54d9cb9a624e}}
+\index{xb::xbDbf@{xb::xbDbf}!GetLogicalField@{GetLogicalField}}
+\index{GetLogicalField@{GetLogicalField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetLogicalField()}{GetLogicalField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/5]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Logical\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get logical field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to retrieve. \\
+\hline
+{\em s\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_aaf615ddcf08f8cd14efc713c2a8d7ae1}\label{classxb_1_1xbDbf_aaf615ddcf08f8cd14efc713c2a8d7ae1}}
+\index{xb::xbDbf@{xb::xbDbf}!GetLogicalField@{GetLogicalField}}
+\index{GetLogicalField@{GetLogicalField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetLogicalField()}{GetLogicalField()}\hspace{0.1cm}{\footnotesize\ttfamily [3/5]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Logical\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \&}]{b\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get logical field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em b\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ab28feef20c988b0a6f1c1911a45377b0}\label{classxb_1_1xbDbf_ab28feef20c988b0a6f1c1911a45377b0}}
+\index{xb::xbDbf@{xb::xbDbf}!GetLogicalField@{GetLogicalField}}
+\index{GetLogicalField@{GetLogicalField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetLogicalField()}{GetLogicalField()}\hspace{0.1cm}{\footnotesize\ttfamily [4/5]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Logical\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \&}]{b\+Field\+Value, }\item[{xb\+Int16}]{i\+Rec\+Buf\+Sw }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get logical field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em b\+Field\+Value} & Output field value. \\
+\hline
+{\em i\+Rec\+Buf\+Sw} & 0 -\/ Record buffer with any updates.~\newline
+1 -\/ Record buffer with original data. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a3254f091fc4a1404abed3dd2bcdd6ce6}\label{classxb_1_1xbDbf_a3254f091fc4a1404abed3dd2bcdd6ce6}}
+\index{xb::xbDbf@{xb::xbDbf}!GetLogicalField@{GetLogicalField}}
+\index{GetLogicalField@{GetLogicalField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetLogicalField()}{GetLogicalField()}\hspace{0.1cm}{\footnotesize\ttfamily [5/5]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Logical\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get logical field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em s\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a7b8ef75b17941beac17e50e969b2d3db}\label{classxb_1_1xbDbf_a7b8ef75b17941beac17e50e969b2d3db}}
+\index{xb::xbDbf@{xb::xbDbf}!GetLongField@{GetLongField}}
+\index{GetLongField@{GetLongField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetLongField()}{GetLongField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Long\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{xb\+Int32 \&}]{l\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get long field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Number of field to retrieve. \\
+\hline
+{\em l\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_abe525c0820640e0a9e169d0b7913cfa1}\label{classxb_1_1xbDbf_abe525c0820640e0a9e169d0b7913cfa1}}
+\index{xb::xbDbf@{xb::xbDbf}!GetLongField@{GetLongField}}
+\index{GetLongField@{GetLongField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetLongField()}{GetLongField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Long\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{xb\+Int32 \&}]{l\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get long field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em l\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}\label{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}}
+\index{xb::xbDbf@{xb::xbDbf}!GetMultiUser@{GetMultiUser}}
+\index{GetMultiUser@{GetMultiUser}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetMultiUser()}{GetMultiUser()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Multi\+User (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the multi user setting.
+
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Multi user mode turned on.~\newline
+ xb\+False -\/ Multi user mode turned off.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ab896fe3b734f556de578d30f92b18fe2}\label{classxb_1_1xbDbf_ab896fe3b734f556de578d30f92b18fe2}}
+\index{xb::xbDbf@{xb::xbDbf}!GetNextRecord@{GetNextRecord}}
+\index{GetNextRecord@{GetNextRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetNextRecord()}{GetNextRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Next\+Record (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the next record.
+
+Get the next not deleted record. This routines skips over any deleted records. \begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a3191428a7a92d9107d8d42448884f2ac}\label{classxb_1_1xbDbf_a3191428a7a92d9107d8d42448884f2ac}}
+\index{xb::xbDbf@{xb::xbDbf}!GetNextRecord@{GetNextRecord}}
+\index{GetNextRecord@{GetNextRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetNextRecord()}{GetNextRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Next\+Record (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the next record.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Option} & XB\+\_\+\+ALL\+\_\+\+RECS -\/ Get the next record, deleted or not.~\newline
+ XB\+\_\+\+ACTIVE\+\_\+\+RECS -\/ Get the next active record.~\newline
+ XB\+\_\+\+DELETED\+\_\+\+RECS -\/ Get the next deleted record.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a18fdcb4ab15b36cd47fa6f6f7a540d1a}\label{classxb_1_1xbDbf_a18fdcb4ab15b36cd47fa6f6f7a540d1a}}
+\index{xb::xbDbf@{xb::xbDbf}!GetNextRecord@{GetNextRecord}}
+\index{GetNextRecord@{GetNextRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetNextRecord()}{GetNextRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Next\+Record (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Option, }\item[{xb\+UInt32}]{ul\+Start\+Rec }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the next record.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Option} & XB\+\_\+\+ALL\+\_\+\+RECS -\/ Get the next record, deleted or not.~\newline
+ XB\+\_\+\+ACTIVE\+\_\+\+RECS -\/ Get the next active record.~\newline
+ XB\+\_\+\+DELETED\+\_\+\+RECS -\/ Get the next deleted record.~\newline
+ \\
+\hline
+{\em ul\+Start\+Rec} & Get next record, starting from ul\+Start\+Rec. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a3c500dc9dac22c49496e4b29386b2dd3}\label{classxb_1_1xbFile_a3c500dc9dac22c49496e4b29386b2dd3}}
+\index{xb::xbDbf@{xb::xbDbf}!GetOpenMode@{GetOpenMode}}
+\index{GetOpenMode@{GetOpenMode}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetOpenMode()}{GetOpenMode()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+Open\+Mode (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the open mode of the file.
+
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+READ~\newline
+ XB\+\_\+\+READ\+\_\+\+WRITE~\newline
+ XB\+\_\+\+WRITE~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a13393704a8a191d4d6555ae31d3c3e92}\label{classxb_1_1xbDbf_a13393704a8a191d4d6555ae31d3c3e92}}
+\index{xb::xbDbf@{xb::xbDbf}!GetPhysicalIxCnt@{GetPhysicalIxCnt}}
+\index{GetPhysicalIxCnt@{GetPhysicalIxCnt}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetPhysicalIxCnt()}{GetPhysicalIxCnt()}}
+{\footnotesize\ttfamily virtual xb\+Int32 xb\+::xb\+Dbf\+::\+Get\+Physical\+Ix\+Cnt (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_ab3d248e5221b4f0809897cd43af17a1e}\label{classxb_1_1xbDbf_ab3d248e5221b4f0809897cd43af17a1e}}
+\index{xb::xbDbf@{xb::xbDbf}!GetPrevRecord@{GetPrevRecord}}
+\index{GetPrevRecord@{GetPrevRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetPrevRecord()}{GetPrevRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Prev\+Record (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the previous record.
+
+Get the previous not deleted record. This routine skips over any deleted records. \begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a7eadc7b08d73003802b90584f7b33387}\label{classxb_1_1xbDbf_a7eadc7b08d73003802b90584f7b33387}}
+\index{xb::xbDbf@{xb::xbDbf}!GetPrevRecord@{GetPrevRecord}}
+\index{GetPrevRecord@{GetPrevRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetPrevRecord()}{GetPrevRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Prev\+Record (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the previous record.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Option} & XB\+\_\+\+ALL\+\_\+\+RECS -\/ Get the previous record, deleted or not.~\newline
+ XB\+\_\+\+ACTIVE\+\_\+\+RECS -\/ Get the previous active record.~\newline
+ XB\+\_\+\+DELETED\+\_\+\+RECS -\/ Get the previous deleted record.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_aabd146c0e1054ab905ec96aedd84b02e}\label{classxb_1_1xbDbf_aabd146c0e1054ab905ec96aedd84b02e}}
+\index{xb::xbDbf@{xb::xbDbf}!GetRawField@{GetRawField}}
+\index{GetRawField@{GetRawField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetRawField()}{GetRawField()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Raw\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{char $\ast$}]{c\+Buf, }\item[{xb\+UInt32}]{ul\+Buf\+Size, }\item[{xb\+Int16}]{i\+Rec\+Buf\+Sw }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [protected]}, {\ttfamily [virtual]}}
+
+
+
+Get raw field data for field number.
+
+This is a protected method, used by other methods. This method would be subject to buffer overflows if made public.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em c\+Buf} & Pointer to buffer area provided by calling application program. \\
+\hline
+{\em ul\+Buf\+Size} & Size of data to copy \\
+\hline
+{\em i\+Rec\+Buf\+Sw} & 0 -\/ Record buffer with any updates.~\newline
+1 -\/ Record buffer with original data. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a26fba086b07caeab95066bf1c8d25161}\label{classxb_1_1xbDbf_a26fba086b07caeab95066bf1c8d25161}}
+\index{xb::xbDbf@{xb::xbDbf}!GetRecord@{GetRecord}}
+\index{GetRecord@{GetRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetRecord()}{GetRecord()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Record (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Rec\+No }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get record for specified record number.
+
+Retrieve a record from disk and load it into the record buffer. If auto commit is enabled and there are pending updates, this routine will flush the updates to disk before proceeding to ul\+Rec\+No.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Rec\+No} & -\/ Record number to retrieve. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_aa3e38c4057d726a28a27d07a1610d124}\label{classxb_1_1xbDbf_aa3e38c4057d726a28a27d07a1610d124}}
+\index{xb::xbDbf@{xb::xbDbf}!GetRecordBuf@{GetRecordBuf}}
+\index{GetRecordBuf@{GetRecordBuf}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetRecordBuf()}{GetRecordBuf()}}
+{\footnotesize\ttfamily char $\ast$ xb\+::xb\+Dbf\+::\+Get\+Record\+Buf (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Opt = {\ttfamily 0} }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get pointer to record buffer.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Opt} & 0 for Rec\+Buf (current) or 1 for Rec\+Buf2 (original contents)\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Pointer to record buffer.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ac196ad55335e1f4789d698748434dc89}\label{classxb_1_1xbDbf_ac196ad55335e1f4789d698748434dc89}}
+\index{xb::xbDbf@{xb::xbDbf}!GetRecordCnt@{GetRecordCnt}}
+\index{GetRecordCnt@{GetRecordCnt}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetRecordCnt()}{GetRecordCnt()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Record\+Cnt (\begin{DoxyParamCaption}\item[{xb\+UInt32 \&}]{ul\+Rec\+Cnt }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the current number of records in the dbf data file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Rec\+Cnt} & Output number of records in file. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ab50d76c6e29e81e347a6feb04c2f62bb}\label{classxb_1_1xbDbf_ab50d76c6e29e81e347a6feb04c2f62bb}}
+\index{xb::xbDbf@{xb::xbDbf}!GetRecordLen@{GetRecordLen}}
+\index{GetRecordLen@{GetRecordLen}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetRecordLen()}{GetRecordLen()}}
+{\footnotesize\ttfamily xb\+UInt16 xb\+::xb\+Dbf\+::\+Get\+Record\+Len (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the dbf record length.
+
+\begin{DoxyReturn}{Returns}
+Record length.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a9b63e05b77f477ff6109ff7b9432c1b6}\label{classxb_1_1xbFile_a9b63e05b77f477ff6109ff7b9432c1b6}}
+\index{xb::xbDbf@{xb::xbDbf}!GetShareMode@{GetShareMode}}
+\index{GetShareMode@{GetShareMode}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetShareMode()}{GetShareMode()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+Share\+Mode (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the share mode of the file.
+
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+SINGLE\+\_\+\+USER -\/ (file buffering on\texorpdfstring{$>$}{>}~\newline
+ XB\+\_\+\+MULTI\+\_\+\+USER -\/ (file buffering off)~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a27758a325c097f204247908b65ba7fbd}\label{classxb_1_1xbDbf_a27758a325c097f204247908b65ba7fbd}}
+\index{xb::xbDbf@{xb::xbDbf}!GetTblAlias@{GetTblAlias}}
+\index{GetTblAlias@{GetTblAlias}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetTblAlias()}{GetTblAlias()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Dbf\+::\+Get\+Tbl\+Alias (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the table alias.
+
+This routine returns the table alias. \begin{DoxyReturn}{Returns}
+Table alias
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a039eb02418ec4ca862adbc0f95b9cbec}\label{classxb_1_1xbDbf_a039eb02418ec4ca862adbc0f95b9cbec}}
+\index{xb::xbDbf@{xb::xbDbf}!GetULongField@{GetULongField}}
+\index{GetULongField@{GetULongField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetULongField()}{GetULongField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+ULong\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{xb\+UInt32 \&}]{ul\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get unsigned long field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Number of field to retrieve. \\
+\hline
+{\em ul\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a67e3a050f9090edf69eee75aef7f5d83}\label{classxb_1_1xbDbf_a67e3a050f9090edf69eee75aef7f5d83}}
+\index{xb::xbDbf@{xb::xbDbf}!GetULongField@{GetULongField}}
+\index{GetULongField@{GetULongField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetULongField()}{GetULongField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+ULong\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{xb\+UInt32 \&}]{ul\+Field\+Value }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get unsigned long field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to retrieve. \\
+\hline
+{\em ul\+Field\+Value} & Output field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a49212a9eb17f7fa9f303e08d5fc50fc6}\label{classxb_1_1xbDbf_a49212a9eb17f7fa9f303e08d5fc50fc6}}
+\index{xb::xbDbf@{xb::xbDbf}!GetVersion@{GetVersion}}
+\index{GetVersion@{GetVersion}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetVersion()}{GetVersion()}}
+{\footnotesize\ttfamily virtual xb\+Int16 xb\+::xb\+Dbf\+::\+Get\+Version (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [pure virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_a7af337808919680b90710ad5e8a99232}\label{classxb_1_1xbFile_a7af337808919680b90710ad5e8a99232}}
+\index{xb::xbDbf@{xb::xbDbf}!GetXbaseFileTypeByte@{GetXbaseFileTypeByte}}
+\index{GetXbaseFileTypeByte@{GetXbaseFileTypeByte}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetXbaseFileTypeByte()}{GetXbaseFileTypeByte()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+Xbase\+File\+Type\+Byte (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{unsigned char \&}]{c\+File\+Type\+Byte }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the file type byte and version of the dbf file.
+
+Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ Name of file to examine \\
+\hline
+{\em c\+File\+Type\+Byte} & -\/ Retruned first byte of dbf file \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a78aebdd21d3de46a450d5f835e3027f6}\label{classxb_1_1xbFile_a78aebdd21d3de46a450d5f835e3027f6}}
+\index{xb::xbDbf@{xb::xbDbf}!GetXbaseFileTypeByte@{GetXbaseFileTypeByte}}
+\index{GetXbaseFileTypeByte@{GetXbaseFileTypeByte}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetXbaseFileTypeByte()}{GetXbaseFileTypeByte()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+Xbase\+File\+Type\+Byte (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{unsigned char \&}]{c\+File\+Type\+Byte, }\item[{xb\+Int16 \&}]{i\+Version }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the file type byte and version of the dbf file.
+
+Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ Name of file to examine \\
+\hline
+{\em c\+File\+Type\+Byte} & -\/ Returned first byte of dbf file \\
+\hline
+{\em i\+Version} & -\/ Returned file version \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_aaf2e697751a0beff41432a66bb83fb5e}\label{classxb_1_1xbFile_aaf2e697751a0beff41432a66bb83fb5e}}
+\index{xb::xbDbf@{xb::xbDbf}!GetXbaseFileTypeByte@{GetXbaseFileTypeByte}}
+\index{GetXbaseFileTypeByte@{GetXbaseFileTypeByte}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetXbaseFileTypeByte()}{GetXbaseFileTypeByte()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+Xbase\+File\+Type\+Byte (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{xb\+Int16 \&}]{i\+Version }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the file type byte and version of the dbf file.
+
+Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ Name of file to examine \\
+\hline
+{\em i\+Version} & -\/ Returned file version \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ab21ec23c076b0c9affdc0f6672bd133f}\label{classxb_1_1xbDbf_ab21ec23c076b0c9affdc0f6672bd133f}}
+\index{xb::xbDbf@{xb::xbDbf}!GetXbasePtr@{GetXbasePtr}}
+\index{GetXbasePtr@{GetXbasePtr}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{GetXbasePtr()}{GetXbasePtr()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$ xb\+::xb\+Dbf\+::\+Get\+Xbase\+Ptr (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Get the pointer to the xb\+Xbase structure,.
+
+\begin{DoxyReturn}{Returns}
+Pointer to xb\+Xbase structure.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ad06fe0f7975fb81125d27d82504e6829}\label{classxb_1_1xbDbf_ad06fe0f7975fb81125d27d82504e6829}}
+\index{xb::xbDbf@{xb::xbDbf}!InitVars@{InitVars}}
+\index{InitVars@{InitVars}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{InitVars()}{InitVars()}}
+{\footnotesize\ttfamily void xb\+::xb\+Dbf\+::\+Init\+Vars (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}, {\ttfamily [virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_ac856fc1b110b46aefa1b2f5c0f530aa2}\label{classxb_1_1xbDbf_ac856fc1b110b46aefa1b2f5c0f530aa2}}
+\index{xb::xbDbf@{xb::xbDbf}!MemoFieldsExist@{MemoFieldsExist}}
+\index{MemoFieldsExist@{MemoFieldsExist}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{MemoFieldsExist()}{MemoFieldsExist()}}
+{\footnotesize\ttfamily virtual \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Dbf\+::\+Memo\+Fields\+Exist (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_a361e3cc318bbf1c4d10f069e0800a24e}\label{classxb_1_1xbFile_a361e3cc318bbf1c4d10f069e0800a24e}}
+\index{xb::xbDbf@{xb::xbDbf}!NameSuffixMissing@{NameSuffixMissing}}
+\index{NameSuffixMissing@{NameSuffixMissing}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{NameSuffixMissing()}{NameSuffixMissing()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Name\+Suffix\+Missing (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Determines status of file extension.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ Name of file to examine \\
+\hline
+{\em i\+Option} & -\/ Inspection type~\newline
+ 1 check for DBF~\newline
+ 2 check for NDX~\newline
+ 3 check for MDX~\newline
+ 4 check for NTX~\newline
+\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+0 if suffix found~\newline
+ 1 if suffix not found, lower case~\newline
+ 2 is suffix not found, upper case~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a97366c7362e409d7f09973a6aef8dad0}\label{classxb_1_1xbDbf_a97366c7362e409d7f09973a6aef8dad0}}
+\index{xb::xbDbf@{xb::xbDbf}!Open@{Open}}
+\index{Open@{Open}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{Open()}{Open()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily virtual xb\+Int16 xb\+::xb\+Dbf\+::\+Open (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Table\+Name }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_ac658818bf9b8f8ff7467d8d80495b324}\label{classxb_1_1xbDbf_ac658818bf9b8f8ff7467d8d80495b324}}
+\index{xb::xbDbf@{xb::xbDbf}!Open@{Open}}
+\index{Open@{Open}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{Open()}{Open()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily virtual xb\+Int16 xb\+::xb\+Dbf\+::\+Open (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Table\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Alias }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a4d018cbf44d8d8b2145c9acab02c8adf}\label{classxb_1_1xbDbf_a4d018cbf44d8d8b2145c9acab02c8adf}}
+\index{xb::xbDbf@{xb::xbDbf}!Open@{Open}}
+\index{Open@{Open}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{Open()}{Open()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily virtual xb\+Int16 xb\+::xb\+Dbf\+::\+Open (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Table\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Alias, }\item[{xb\+Int16}]{i\+Open\+Mode, }\item[{xb\+Int16}]{i\+Share\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [pure virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a8a52bf3ef2123c0d17e6b1f67bf0dc55}\label{classxb_1_1xbDbf_a8a52bf3ef2123c0d17e6b1f67bf0dc55}}
+\index{xb::xbDbf@{xb::xbDbf}!Pack@{Pack}}
+\index{Pack@{Pack}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{Pack()}{Pack()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Pack (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Pack dbf file.
+
+This routine eliminates all deleted records from the file. \begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a93bb14ad0451355bfa3379128120988a}\label{classxb_1_1xbDbf_a93bb14ad0451355bfa3379128120988a}}
+\index{xb::xbDbf@{xb::xbDbf}!Pack@{Pack}}
+\index{Pack@{Pack}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{Pack()}{Pack()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Pack (\begin{DoxyParamCaption}\item[{xb\+UInt32 \&}]{ul\+Deleted\+Rec\+Cnt }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Pack dbf file.
+
+This routine eliminates all deleted records from the file and clears out any unused blocks in the memo file if one exists.
+\begin{DoxyParams}{Parameters}
+{\em ul\+Deleted\+Rec\+Cnt} & -\/ Output -\/ number of recrods removed from the file. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a571b36b3a940b1a16d5e834f329b33b9}\label{classxb_1_1xbDbf_a571b36b3a940b1a16d5e834f329b33b9}}
+\index{xb::xbDbf@{xb::xbDbf}!PutDateField@{PutDateField}}
+\index{PutDateField@{PutDateField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutDateField()}{PutDateField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Date\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put date field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to update. \\
+\hline
+{\em dt\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a873f04af528a9d81e6a367a59d998ec5}\label{classxb_1_1xbDbf_a873f04af528a9d81e6a367a59d998ec5}}
+\index{xb::xbDbf@{xb::xbDbf}!PutDateField@{PutDateField}}
+\index{PutDateField@{PutDateField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutDateField()}{PutDateField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Date\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{const \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} \&}]{dt\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put date field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to update. \\
+\hline
+{\em dt\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ae695bbc71c19abc71c0c5f2ff2e1f971}\label{classxb_1_1xbDbf_ae695bbc71c19abc71c0c5f2ff2e1f971}}
+\index{xb::xbDbf@{xb::xbDbf}!PutDoubleField@{PutDoubleField}}
+\index{PutDoubleField@{PutDoubleField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutDoubleField()}{PutDoubleField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Double\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}}}]{d\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put double field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to update. \\
+\hline
+{\em d\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a4f34842d7e8ff1f16992c2ece2fc38a5}\label{classxb_1_1xbDbf_a4f34842d7e8ff1f16992c2ece2fc38a5}}
+\index{xb::xbDbf@{xb::xbDbf}!PutDoubleField@{PutDoubleField}}
+\index{PutDoubleField@{PutDoubleField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutDoubleField()}{PutDoubleField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Double\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}}}]{d\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put double field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to update. \\
+\hline
+{\em d\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a7862215dd2f83a1c488e539cd1f9aec0}\label{classxb_1_1xbDbf_a7862215dd2f83a1c488e539cd1f9aec0}}
+\index{xb::xbDbf@{xb::xbDbf}!PutField@{PutField}}
+\index{PutField@{PutField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutField()}{PutField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to update. \\
+\hline
+{\em s\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a142b0c0dc904917f3c68c5572c1237b5}\label{classxb_1_1xbDbf_a142b0c0dc904917f3c68c5572c1237b5}}
+\index{xb::xbDbf@{xb::xbDbf}!PutField@{PutField}}
+\index{PutField@{PutField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutField()}{PutField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to update. \\
+\hline
+{\em s\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a4ea3241bc710d57e5f755efda62288ad}\label{classxb_1_1xbDbf_a4ea3241bc710d57e5f755efda62288ad}}
+\index{xb::xbDbf@{xb::xbDbf}!PutFloatField@{PutFloatField}}
+\index{PutFloatField@{PutFloatField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutFloatField()}{PutFloatField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Float\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{\mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+Float}}}]{f\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put float field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to update. \\
+\hline
+{\em f\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a64161eb50d72e424b11bf3732657ebd8}\label{classxb_1_1xbDbf_a64161eb50d72e424b11bf3732657ebd8}}
+\index{xb::xbDbf@{xb::xbDbf}!PutFloatField@{PutFloatField}}
+\index{PutFloatField@{PutFloatField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutFloatField()}{PutFloatField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Float\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+Float}}}]{f\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put float field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to update. \\
+\hline
+{\em f\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a507e400ca6526a9e0391cf06dd6a014e}\label{classxb_1_1xbDbf_a507e400ca6526a9e0391cf06dd6a014e}}
+\index{xb::xbDbf@{xb::xbDbf}!PutLogicalField@{PutLogicalField}}
+\index{PutLogicalField@{PutLogicalField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutLogicalField()}{PutLogicalField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Logical\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put logical field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to update. \\
+\hline
+{\em s\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a623ca3ef5520c42308c1a16b518e7ff3}\label{classxb_1_1xbDbf_a623ca3ef5520c42308c1a16b518e7ff3}}
+\index{xb::xbDbf@{xb::xbDbf}!PutLogicalField@{PutLogicalField}}
+\index{PutLogicalField@{PutLogicalField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutLogicalField()}{PutLogicalField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Logical\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put logical field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to update. \\
+\hline
+{\em b\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ab39ac4269ac63bc7ea4f638733bb17f0}\label{classxb_1_1xbDbf_ab39ac4269ac63bc7ea4f638733bb17f0}}
+\index{xb::xbDbf@{xb::xbDbf}!PutLogicalField@{PutLogicalField}}
+\index{PutLogicalField@{PutLogicalField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutLogicalField()}{PutLogicalField()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Logical\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put logical field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to update. \\
+\hline
+{\em s\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a423a0cb7bd252cedf956ace4954f275d}\label{classxb_1_1xbDbf_a423a0cb7bd252cedf956ace4954f275d}}
+\index{xb::xbDbf@{xb::xbDbf}!PutLogicalField@{PutLogicalField}}
+\index{PutLogicalField@{PutLogicalField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutLogicalField()}{PutLogicalField()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Logical\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put logical field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to update. \\
+\hline
+{\em b\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ae7aad223119edb3d541e9f65e88c9f2f}\label{classxb_1_1xbDbf_ae7aad223119edb3d541e9f65e88c9f2f}}
+\index{xb::xbDbf@{xb::xbDbf}!PutLongField@{PutLongField}}
+\index{PutLongField@{PutLongField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutLongField()}{PutLongField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Long\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{xb\+Int32}]{l\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put long field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to update. \\
+\hline
+{\em l\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a56c8f924284bf88aabf90b7930b4eb47}\label{classxb_1_1xbDbf_a56c8f924284bf88aabf90b7930b4eb47}}
+\index{xb::xbDbf@{xb::xbDbf}!PutLongField@{PutLongField}}
+\index{PutLongField@{PutLongField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutLongField()}{PutLongField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Long\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{xb\+Int32}]{l\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put long field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to update. \\
+\hline
+{\em l\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a3c36a5ffbc7067a1abbcb526dd3b981d}\label{classxb_1_1xbDbf_a3c36a5ffbc7067a1abbcb526dd3b981d}}
+\index{xb::xbDbf@{xb::xbDbf}!PutRecord@{PutRecord}}
+\index{PutRecord@{PutRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutRecord()}{PutRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Record (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Write the current record to disk.
+
+This routine is used to write any updates to the current record buffer to disk.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_aacbc7bac3ea0c502ee75b838f4f0fcbf}\label{classxb_1_1xbDbf_aacbc7bac3ea0c502ee75b838f4f0fcbf}}
+\index{xb::xbDbf@{xb::xbDbf}!PutRecord@{PutRecord}}
+\index{PutRecord@{PutRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutRecord()}{PutRecord()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+Record (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Rec\+No }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Write record to disk.
+
+This routine is used to write a copy of the current record buffer to disk for a given record number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Rec\+No} & Record number to update. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_ac62cb97c4e678c83f41788b1ae4d0381}\label{classxb_1_1xbDbf_ac62cb97c4e678c83f41788b1ae4d0381}}
+\index{xb::xbDbf@{xb::xbDbf}!PutULongField@{PutULongField}}
+\index{PutULongField@{PutULongField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutULongField()}{PutULongField()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+ULong\+Field (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Field\+Name, }\item[{xb\+UInt32}]{ul\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put unsigned long field for field name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Field\+Name} & Name of field to update. \\
+\hline
+{\em ul\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_af5dec5c9ff903efffdb0490a44d296d2}\label{classxb_1_1xbDbf_af5dec5c9ff903efffdb0490a44d296d2}}
+\index{xb::xbDbf@{xb::xbDbf}!PutULongField@{PutULongField}}
+\index{PutULongField@{PutULongField}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{PutULongField()}{PutULongField()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Put\+ULong\+Field (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Field\+No, }\item[{xb\+UInt32}]{ul\+Field\+Value }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Put unsigned long field for field number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Field\+No} & Number of field to update. \\
+\hline
+{\em ul\+Field\+Value} & Field value. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The field routines return one of\+:~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~\newline
+XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~\newline
+ XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~\newline
+XB\+\_\+\+INVALID\+\_\+\+DATA
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_aa1bb80340abc7a5c22f87f878e9dc825}\label{classxb_1_1xbFile_aa1bb80340abc7a5c22f87f878e9dc825}}
+\index{xb::xbDbf@{xb::xbDbf}!ReadBlock@{ReadBlock}}
+\index{ReadBlock@{ReadBlock}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ReadBlock()}{ReadBlock()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Read\+Block (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Block\+No, }\item[{size\+\_\+t}]{l\+Read\+Size, }\item[{void $\ast$}]{buf }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Read a block of data from file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Block\+No} & -\/ block number to read \\
+\hline
+{\em l\+Read\+Size} & -\/ size of data to read at block location, set to 0 to read blocksize \\
+\hline
+{\em $\ast$buf} & -\/ pointer to buffer to write output data, assumed to be previosuly allocated and large enough to contain data \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_aef696b1c4c0ef5338e818599f695d485}\label{classxb_1_1xbFile_aef696b1c4c0ef5338e818599f695d485}}
+\index{xb::xbDbf@{xb::xbDbf}!ReadBlock@{ReadBlock}}
+\index{ReadBlock@{ReadBlock}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ReadBlock()}{ReadBlock()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Read\+Block (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Block\+No, }\item[{xb\+UInt32}]{ul\+Block\+Size, }\item[{size\+\_\+t}]{l\+Read\+Size, }\item[{void $\ast$}]{buf }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Read a block of data from file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Block\+No} & -\/ block number to read \\
+\hline
+{\em ul\+Block\+Size} & -\/ block size \\
+\hline
+{\em l\+Read\+Size} & -\/ size of data to read at block location, set to 0 to read blocksize \\
+\hline
+{\em buf} & -\/ pointer to buffer to write output data, assumed to be previosuly allocated and large enough to contain data \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a060541addb5bb1f0fe12959ed6f66fb9}\label{classxb_1_1xbDbf_a060541addb5bb1f0fe12959ed6f66fb9}}
+\index{xb::xbDbf@{xb::xbDbf}!ReadHeader@{ReadHeader}}
+\index{ReadHeader@{ReadHeader}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ReadHeader()}{ReadHeader()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Read\+Header (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Position\+Option, }\item[{xb\+Int16}]{i\+Read\+Option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Read dbf file header information.
+
+This method assumes the header has been locked appropriately in a multi user environment
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Position\+Option} & 0 -\/ Don\textquotesingle{}t fseek to beginning of file before read.~\newline
+ 1 -\/ Start from beginning of file.\\
+\hline
+{\em i\+Read\+Option} & 0 -\/ Read entire 32 byte header~\newline
+ 1 -\/ Read first eight bytes which includes the last update date and number of records.\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a94d7d626ba691fd4b740c034673e6fc6}\label{classxb_1_1xbDbf_a94d7d626ba691fd4b740c034673e6fc6}}
+\index{xb::xbDbf@{xb::xbDbf}!RecordDeleted@{RecordDeleted}}
+\index{RecordDeleted@{RecordDeleted}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{RecordDeleted()}{RecordDeleted()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Record\+Deleted (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Opt = {\ttfamily 0} }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Return record deletion status.
+
+This routine returns the record deletion status.
+\begin{DoxyParams}{Parameters}
+{\em i\+Opt} & 0 = Current record buffer, 1 = Original record buffer \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Record deleted.~\newline
+xb\+False -\/ Record not deleted.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a4cf7f0d423164f3cf074ae41f96f4e90}\label{classxb_1_1xbDbf_a4cf7f0d423164f3cf074ae41f96f4e90}}
+\index{xb::xbDbf@{xb::xbDbf}!SetAutoCommit@{SetAutoCommit}}
+\index{SetAutoCommit@{SetAutoCommit}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetAutoCommit()}{SetAutoCommit()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Set\+Auto\+Commit (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Auto\+Commit }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Set auto commit.
+
+This routine sets the auto commit setting for this table. \begin{DoxyReturn}{Returns}
+XB\+\_\+\+NO\+\_\+\+ERROR;
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a991c5676a6f38fa752435390989f413e}\label{classxb_1_1xbFile_a991c5676a6f38fa752435390989f413e}}
+\index{xb::xbDbf@{xb::xbDbf}!SetBlockSize@{SetBlockSize}}
+\index{SetBlockSize@{SetBlockSize}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetBlockSize()}{SetBlockSize()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Set\+Block\+Size (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Block\+Size }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the block size.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Block\+Size} & -\/ unsigned long block size, divisible by 512 \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}\label{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}}
+\index{xb::xbDbf@{xb::xbDbf}!SetDataDirectory@{SetDataDirectory}}
+\index{SetDataDirectory@{SetDataDirectory}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetDataDirectory()}{SetDataDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Data\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Data\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the data directory.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Data\+Directory} & Set the data direcroty. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}\label{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}}
+\index{xb::xbDbf@{xb::xbDbf}!SetDefaultAutoCommit@{SetDefaultAutoCommit}}
+\index{SetDefaultAutoCommit@{SetDefaultAutoCommit}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetDefaultAutoCommit()}{SetDefaultAutoCommit()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Auto\+Commit (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Default\+Auto\+Commit }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the default auto commit.
+
+Disabling auto commit requires the application execute explicit updates using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}\mbox{\hyperlink{classxb_1_1xbDbf_a5b412dd796241673eb1aa2c93513d69b}{Append\+Record()}}. With auto commit on, the library posts updates automatically when moving off the current record or closing a file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Default\+Auto\+Commit} & xb\+True -\/ Enable default auto commit.~\newline
+ xb\+False -\/ Disable default auto commit.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}\label{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}}
+\index{xb::xbDbf@{xb::xbDbf}!SetDefaultDateFormat@{SetDefaultDateFormat}}
+\index{SetDefaultDateFormat@{SetDefaultDateFormat}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetDefaultDateFormat()}{SetDefaultDateFormat()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Date\+Format (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Date\+Format }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the default date format.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Default\+Date\+Format} & Set the default date format. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}\label{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}}
+\index{xb::xbDbf@{xb::xbDbf}!SetDefaultLogDirectory@{SetDefaultLogDirectory}}
+\index{SetDefaultLogDirectory@{SetDefaultLogDirectory}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetDefaultLogDirectory()}{SetDefaultLogDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Log\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Log\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_ae78a85255488bc78964c16946dbaead3}\label{classxb_1_1xbFile_ae78a85255488bc78964c16946dbaead3}}
+\index{xb::xbDbf@{xb::xbDbf}!SetDirectory@{SetDirectory}}
+\index{SetDirectory@{SetDirectory}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetDirectory()}{SetDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::\+Set\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the directory.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Directory} & -\/ Valid directory name \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}\label{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}}
+\index{xb::xbDbf@{xb::xbDbf}!SetEndianType@{SetEndianType}}
+\index{SetEndianType@{SetEndianType}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetEndianType()}{SetEndianType()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+
+
+Set the endian type.
+
+This routine determines the Endian-\/ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. \mbox{\Hypertarget{classxb_1_1xbFile_a5419eb27e56822f828b2b88a9502a636}\label{classxb_1_1xbFile_a5419eb27e56822f828b2b88a9502a636}}
+\index{xb::xbDbf@{xb::xbDbf}!SetFileName@{SetFileName}}
+\index{SetFileName@{SetFileName}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetFileName()}{SetFileName()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::\+Set\+File\+Name (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the filename.
+
+This routine builds out two internal variables from the input file name~\newline
+ s\+File\+Name -\/ the file name part~\newline
+ s\+Fq\+File\+Name -\/ the fully qualified file name~\newline
+
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ Input file name \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_aee832fa11db2077a532f49e1329bd05a}\label{classxb_1_1xbFile_aee832fa11db2077a532f49e1329bd05a}}
+\index{xb::xbDbf@{xb::xbDbf}!SetFqFileName@{SetFqFileName}}
+\index{SetFqFileName@{SetFqFileName}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetFqFileName()}{SetFqFileName()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::\+Set\+Fq\+File\+Name (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Fq\+File\+Name }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the fully qualifed filename.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Fq\+File\+Name} & -\/ Fully qualifed input file name \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}\label{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}}
+\index{xb::xbDbf@{xb::xbDbf}!SetMultiUser@{SetMultiUser}}
+\index{SetMultiUser@{SetMultiUser}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetMultiUser()}{SetMultiUser()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Multi\+User (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Multi\+User }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the multi user setting.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Multi\+User} & xb\+True -\/ Turn on Multi user mode.~\newline
+ xb\+False -\/ Turn off Multi user mode.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a7e63e852418f337eb7c44de5dcd50323}\label{classxb_1_1xbDbf_a7e63e852418f337eb7c44de5dcd50323}}
+\index{xb::xbDbf@{xb::xbDbf}!SetVersion@{SetVersion}}
+\index{SetVersion@{SetVersion}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SetVersion()}{SetVersion()}}
+{\footnotesize\ttfamily virtual xb\+Int16 xb\+::xb\+Dbf\+::\+Set\+Version (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}, {\ttfamily [pure virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_ae94cb1bf9f75184f39d9e1a80ab49d4a}\label{classxb_1_1xbDbf_ae94cb1bf9f75184f39d9e1a80ab49d4a}}
+\index{xb::xbDbf@{xb::xbDbf}!UndeleteAllRecords@{UndeleteAllRecords}}
+\index{UndeleteAllRecords@{UndeleteAllRecords}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{UndeleteAllRecords()}{UndeleteAllRecords()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Undelete\+All\+Records (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Undelete all records.
+
+This routine will remove the deletion flag on any deleted records in the table. \begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a255681976a04fc722538bb630507b3a0}\label{classxb_1_1xbDbf_a255681976a04fc722538bb630507b3a0}}
+\index{xb::xbDbf@{xb::xbDbf}!UndeleteRecord@{UndeleteRecord}}
+\index{UndeleteRecord@{UndeleteRecord}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{UndeleteRecord()}{UndeleteRecord()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Undelete\+Record (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Undelete one record.
+
+This routine will undelete the current record, if it is deleted. \begin{DoxyReturn}{Returns}
+XB\+\_\+\+NO\+\_\+\+ERROR~\newline
+XB\+\_\+\+INVALID\+\_\+\+RECORD
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_aba5dcac3b4092261bc1669740cdd669d}\label{classxb_1_1xbDbf_aba5dcac3b4092261bc1669740cdd669d}}
+\index{xb::xbDbf@{xb::xbDbf}!ValidateSchema@{ValidateSchema}}
+\index{ValidateSchema@{ValidateSchema}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ValidateSchema()}{ValidateSchema()}}
+{\footnotesize\ttfamily virtual xb\+Int16 xb\+::xb\+Dbf\+::\+Validate\+Schema (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{structxb_1_1xbSchema}{xb\+Schema}} $\ast$}]{s }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}, {\ttfamily [pure virtual]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_a5d871dcfecc2b4338f7a13722aab766c}\label{classxb_1_1xbFile_a5d871dcfecc2b4338f7a13722aab766c}}
+\index{xb::xbDbf@{xb::xbDbf}!WriteBlock@{WriteBlock}}
+\index{WriteBlock@{WriteBlock}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{WriteBlock()}{WriteBlock()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Write\+Block (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Block\+No, }\item[{size\+\_\+t}]{l\+Write\+Size, }\item[{void $\ast$}]{buf }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Write a block of data to file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Block\+No} & -\/ block number to write \\
+\hline
+{\em l\+Write\+Size} & -\/ size of data to write, set to 0 to write blocksize \\
+\hline
+{\em $\ast$buf} & -\/ pointer to buffer of data to be written \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a44e1410109ef7b3d11a6af4b704b62b2}\label{classxb_1_1xbDbf_a44e1410109ef7b3d11a6af4b704b62b2}}
+\index{xb::xbDbf@{xb::xbDbf}!WriteHeader@{WriteHeader}}
+\index{WriteHeader@{WriteHeader}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{WriteHeader()}{WriteHeader()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Write\+Header (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Position\+Option, }\item[{xb\+Int16}]{i\+Write\+Option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_a18830b5755d74818f60d9c7ce38ddf2d}\label{classxb_1_1xbFile_a18830b5755d74818f60d9c7ce38ddf2d}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFclose@{xbFclose}}
+\index{xbFclose@{xbFclose}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFclose()}{xbFclose()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fclose (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fclose.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_af5b6356832d2a67212070a1aa605f170}\label{classxb_1_1xbFile_af5b6356832d2a67212070a1aa605f170}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFeof@{xbFeof}}
+\index{xbFeof@{xbFeof}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFeof()}{xbFeof()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Feof (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary feof.
+
+\begin{DoxyReturn}{Returns}
+non zero if end-\/of-\/file is set for the stream.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ad205184d43409f04216540ae22f15009}\label{classxb_1_1xbFile_ad205184d43409f04216540ae22f15009}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFflush@{xbFflush}}
+\index{xbFflush@{xbFflush}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFflush()}{xbFflush()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fflush (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fflush.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a5ee229bda4d7d6695e122200e581e7a6}\label{classxb_1_1xbFile_a5ee229bda4d7d6695e122200e581e7a6}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFgetc@{xbFgetc}}
+\index{xbFgetc@{xbFgetc}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFgetc()}{xbFgetc()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fgetc (\begin{DoxyParamCaption}\item[{char \&}]{c }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fgetc.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & -\/ output character returned by fgetc \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_afb1c584d2895ffb7834df80aea7eb1e4}\label{classxb_1_1xbFile_afb1c584d2895ffb7834df80aea7eb1e4}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFgetc@{xbFgetc}}
+\index{xbFgetc@{xbFgetc}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFgetc()}{xbFgetc()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fgetc (\begin{DoxyParamCaption}\item[{xb\+Int32 \&}]{c }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fgetc.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & -\/ output integer returned by fgetc \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ad245955ace26e5dde85fd4373b30d026}\label{classxb_1_1xbFile_ad245955ace26e5dde85fd4373b30d026}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFgets@{xbFgets}}
+\index{xbFgets@{xbFgets}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFgets()}{xbFgets()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fgets (\begin{DoxyParamCaption}\item[{size\+\_\+t}]{l\+Size, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fgets.
+
+
+\begin{DoxyParams}{Parameters}
+{\em l\+Size} & -\/ reads in at most, one character less than l\+Size \\
+\hline
+{\em s} & -\/ an \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing data returned by fseek \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab0fa19686ca8953ff4b556fb5b249135}\label{classxb_1_1xbFile_ab0fa19686ca8953ff4b556fb5b249135}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFopen@{xbFopen}}
+\index{xbFopen@{xbFopen}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFopen()}{xbFopen()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fopen (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Open\+Mode, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{xb\+Int16}]{i\+Share\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fopen.
+
+This routine supports all the standard C library open modes. The Xbase routines only use \char`\"{}r\char`\"{} and \char`\"{}r+b\char`\"{}.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Open\+Mode} & {\begin{tabularx}{\linewidth}{|*{2}{>{\raggedright\arraybackslash}X|}}\hline
+\cellcolor{\tableheadbgcolor}\textbf{ Open\+Mode}&\cellcolor{\tableheadbgcolor}\textbf{ Description }\\\cline{1-2}
+r&Reading \\\cline{1-2}
+r+&Reading and Writing \\\cline{1-2}
+w&Open for writing. Truncate to zero bytes if it exists \\\cline{1-2}
+w+&Open for reading and writing, truncate to zero bytes if it exists \\\cline{1-2}
+a&Open for append \\\cline{1-2}
+a+&Open for reading and writing (at end). \\\cline{1-2}
+\end{tabularx}}
+The mode can also include the letter \char`\"{}b\char`\"{} for binary ie; \char`\"{}r+b\char`\"{}. The \char`\"{}b\char`\"{} is ignored on POSIX compliant systems, but is included for cross platform compatibility. \\
+\hline
+{\em s\+File\+Name} & File name to open \\
+\hline
+{\em i\+Share\+Mode} & XB\+\_\+\+SINGLE\+\_\+\+USER~\newline
+ XB\+\_\+\+MULTI\+\_\+\+USER~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a0548cedf0f26b7d8ac221f75b0cd048c}\label{classxb_1_1xbFile_a0548cedf0f26b7d8ac221f75b0cd048c}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFopen@{xbFopen}}
+\index{xbFopen@{xbFopen}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFopen()}{xbFopen()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fopen (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Open\+Mode, }\item[{xb\+Int16}]{i\+Share\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fopen.
+
+This routine supports all the standard C library open modes. The Xbase routines only use \char`\"{}r\char`\"{} and \char`\"{}r+\char`\"{}.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Open\+Mode} & {\begin{tabularx}{\linewidth}{|*{2}{>{\raggedright\arraybackslash}X|}}\hline
+\cellcolor{\tableheadbgcolor}\textbf{ Open\+Mode}&\cellcolor{\tableheadbgcolor}\textbf{ Description }\\\cline{1-2}
+r&Reading \\\cline{1-2}
+r+&Reading and Writing \\\cline{1-2}
+w&Open for writing. Truncate to zero bytes if it exists \\\cline{1-2}
+w+&Open for reading and writing, truncate to zero bytes if it exists \\\cline{1-2}
+a&Open for append \\\cline{1-2}
+a+&Open for reading and writing (at end). \\\cline{1-2}
+\end{tabularx}}
+The mode can also include the letter \char`\"{}b\char`\"{} for binary ie; \char`\"{}r+b\char`\"{}. The \char`\"{}b\char`\"{} is ignored on POSIX compliant systems, but is included for cross platform compatibility. \\
+\hline
+{\em i\+Share\+Mode} & XB\+\_\+\+SINGLE\+\_\+\+USER~\newline
+ XB\+\_\+\+MULTI\+\_\+\+USER~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a7cdfef5ede9ac98d44a28a6b7a70972c}\label{classxb_1_1xbFile_a7cdfef5ede9ac98d44a28a6b7a70972c}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFopen@{xbFopen}}
+\index{xbFopen@{xbFopen}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFopen()}{xbFopen()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fopen (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Open\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_aabd113333b49c36cad23244b392baab4}\label{classxb_1_1xbFile_aabd113333b49c36cad23244b392baab4}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFopen@{xbFopen}}
+\index{xbFopen@{xbFopen}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFopen()}{xbFopen()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fopen (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Open\+Mode, }\item[{xb\+Int16}]{i\+Share\+Mode }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fopen.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Open\+Mode} & XB\+\_\+\+READ~\newline
+ XB\+\_\+\+READ\+\_\+\+WRITE~\newline
+ \\
+\hline
+{\em i\+Share\+Mode} & XB\+\_\+\+SINGLE\+\_\+\+USER~\newline
+ XB\+\_\+\+MULTI\+\_\+\+USER~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_af2e940c78956e5cb6824f9a1bc404896}\label{classxb_1_1xbFile_af2e940c78956e5cb6824f9a1bc404896}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFputc@{xbFputc}}
+\index{xbFputc@{xbFputc}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFputc()}{xbFputc()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fputc (\begin{DoxyParamCaption}\item[{xb\+Int32}]{c }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fputc.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Character to write \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a863f74cf17df8186d88586b4d2a6441a}\label{classxb_1_1xbFile_a863f74cf17df8186d88586b4d2a6441a}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFputc@{xbFputc}}
+\index{xbFputc@{xbFputc}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFputc()}{xbFputc()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fputc (\begin{DoxyParamCaption}\item[{xb\+Int32}]{c, }\item[{xb\+Int32}]{i\+No\+Of\+Times }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fputc.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Character to write \\
+\hline
+{\em i\+No\+Of\+Times} & Number of times to write the character \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a698f3b40216778562e639e6ca1a47573}\label{classxb_1_1xbFile_a698f3b40216778562e639e6ca1a47573}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFputs@{xbFputs}}
+\index{xbFputs@{xbFputs}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFputs()}{xbFputs()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fputs (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fputs.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} to write to file \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab4f6afaa1f77539f27a4f05c26e54e2f}\label{classxb_1_1xbFile_ab4f6afaa1f77539f27a4f05c26e54e2f}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFread@{xbFread}}
+\index{xbFread@{xbFread}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFread()}{xbFread()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fread (\begin{DoxyParamCaption}\item[{void $\ast$}]{p, }\item[{size\+\_\+t}]{size, }\item[{size\+\_\+t}]{nmemb }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fread.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & Pointer to data to write \\
+\hline
+{\em size} & size of write \\
+\hline
+{\em nmemb} & Number of times to write it \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a5337ab8918df240910c0d19b4f298e3d}\label{classxb_1_1xbFile_a5337ab8918df240910c0d19b4f298e3d}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFseek@{xbFseek}}
+\index{xbFseek@{xbFseek}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFseek()}{xbFseek()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fseek (\begin{DoxyParamCaption}\item[{xb\+Int64}]{l\+Offset, }\item[{xb\+Int32}]{i\+Whence }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fseek.
+
+
+\begin{DoxyParams}{Parameters}
+{\em l\+Offset} & Position in file to seek to \\
+\hline
+{\em i\+Whence} & SEEK\+\_\+\+SET -\/ from beginning of file~\newline
+ SEEK\+\_\+\+CUR -\/ from current position~\newline
+ SEEK\+\_\+\+END -\/ from end of file~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a0e1c06aedfa7fbcb92e117f891edd13b}\label{classxb_1_1xbFile_a0e1c06aedfa7fbcb92e117f891edd13b}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFtell@{xbFtell}}
+\index{xbFtell@{xbFtell}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFtell()}{xbFtell()}}
+{\footnotesize\ttfamily size\+\_\+t xb\+::xb\+File\+::xb\+Ftell (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary ftell.
+
+Returns the current file position. \begin{DoxyReturn}{Returns}
+Current file position.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a9891b792f585a696f38a5cf959e30918}\label{classxb_1_1xbFile_a9891b792f585a696f38a5cf959e30918}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFTurnOffFileBuffering@{xbFTurnOffFileBuffering}}
+\index{xbFTurnOffFileBuffering@{xbFTurnOffFileBuffering}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFTurnOffFileBuffering()}{xbFTurnOffFileBuffering()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::xb\+FTurn\+Off\+File\+Buffering (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Turn off file buffering.
+
+Turns off file buffering. File buffering can\textquotesingle{}t be used while in multi user mode. \mbox{\Hypertarget{classxb_1_1xbFile_a6aadd871d1782944703fed773d44b85f}\label{classxb_1_1xbFile_a6aadd871d1782944703fed773d44b85f}}
+\index{xb::xbDbf@{xb::xbDbf}!xbFwrite@{xbFwrite}}
+\index{xbFwrite@{xbFwrite}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbFwrite()}{xbFwrite()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fwrite (\begin{DoxyParamCaption}\item[{const void $\ast$}]{p, }\item[{size\+\_\+t}]{size, }\item[{size\+\_\+t}]{nmemb }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for standard libary fwrite.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & Pointer to data buffer to write \\
+\hline
+{\em size} & Size of data to write \\
+\hline
+{\em nmemb} & Number of times to write data buffer \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a08463f506f425c2385acbe1a561506e9}\label{classxb_1_1xbFile_a08463f506f425c2385acbe1a561506e9}}
+\index{xb::xbDbf@{xb::xbDbf}!xbReadUntil@{xbReadUntil}}
+\index{xbReadUntil@{xbReadUntil}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbReadUntil()}{xbReadUntil()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Read\+Until (\begin{DoxyParamCaption}\item[{const char}]{c\+Delim, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Out }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Read file until a particular character is encountered on input stream.
+
+This routine will read until c\+Delim is encountered or eof, which ever occurs first.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c\+Delim} & Delimiter to stop writing at. \\
+\hline
+{\em s\+Out} & Output \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing data read \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab3c668a8570433188382d31d7c60bd48}\label{classxb_1_1xbFile_ab3c668a8570433188382d31d7c60bd48}}
+\index{xb::xbDbf@{xb::xbDbf}!xbRemove@{xbRemove}}
+\index{xbRemove@{xbRemove}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbRemove()}{xbRemove()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Remove (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Delete file.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a58f6a6751fdf7e9549c273bb75d93eb5}\label{classxb_1_1xbFile_a58f6a6751fdf7e9549c273bb75d93eb5}}
+\index{xb::xbDbf@{xb::xbDbf}!xbRemove@{xbRemove}}
+\index{xbRemove@{xbRemove}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbRemove()}{xbRemove()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Remove (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name\+In }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Delete file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name\+In} & Name of file to delete \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a6d919366c2ec95e529906bf8842cbf07}\label{classxb_1_1xbFile_a6d919366c2ec95e529906bf8842cbf07}}
+\index{xb::xbDbf@{xb::xbDbf}!xbRemove@{xbRemove}}
+\index{xbRemove@{xbRemove}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbRemove()}{xbRemove()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Remove (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name\+In, }\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Delete file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name\+In} & Name of file to delete \\
+\hline
+{\em i\+Option} & If Set to 1, assume this is a delete request for a dbf file, and should rename the dbt file also \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_afc8ce113aa72611a278233f9bb170012}\label{classxb_1_1xbFile_afc8ce113aa72611a278233f9bb170012}}
+\index{xb::xbDbf@{xb::xbDbf}!xbRename@{xbRename}}
+\index{xbRename@{xbRename}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbRename()}{xbRename()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Rename (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Old\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+New\+Name }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Rename file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Old\+Name} & Original file name \\
+\hline
+{\em s\+New\+Name} & New file name \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab0b2a2c88947921d98ebcb5b5ec34ed9}\label{classxb_1_1xbFile_ab0b2a2c88947921d98ebcb5b5ec34ed9}}
+\index{xb::xbDbf@{xb::xbDbf}!xbRename@{xbRename}}
+\index{xbRename@{xbRename}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbRename()}{xbRename()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Rename (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Old\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+New\+Name, }\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Rename file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Old\+Name} & Original file name \\
+\hline
+{\em s\+New\+Name} & New file name \\
+\hline
+{\em i\+Option} & If Set to 1, assume this is a rename request for a dbf file, and should rename the dbt file also \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a7996b6e084665c37c3892faea64b3505}\label{classxb_1_1xbFile_a7996b6e084665c37c3892faea64b3505}}
+\index{xb::xbDbf@{xb::xbDbf}!xbRewind@{xbRewind}}
+\index{xbRewind@{xbRewind}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbRewind()}{xbRewind()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::xb\+Rewind (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for rewind.
+
+Set file pointer at beginning of file. \mbox{\Hypertarget{classxb_1_1xbFile_a518bfcbfa3699d883cf89affee383296}\label{classxb_1_1xbFile_a518bfcbfa3699d883cf89affee383296}}
+\index{xb::xbDbf@{xb::xbDbf}!xbTruncate@{xbTruncate}}
+\index{xbTruncate@{xbTruncate}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbTruncate()}{xbTruncate()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Truncate (\begin{DoxyParamCaption}\item[{xb\+Int64}]{ll\+Size }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Xbase wrapper for ftruncate.
+
+Set file size to ll\+Size
+\begin{DoxyParams}{Parameters}
+{\em ll\+Size} & New file size. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a8ed0693b10b95aaa4e46037758d160ed}\label{classxb_1_1xbDbf_a8ed0693b10b95aaa4e46037758d160ed}}
+\index{xb::xbDbf@{xb::xbDbf}!Zap@{Zap}}
+\index{Zap@{Zap}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{Zap()}{Zap()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::\+Zap (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [virtual]}}
+
+
+
+Zap (remove) everything from the file,.
+
+This routine eliminates everything from the dbf file and dbt memo file. \begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+
+
+\doxysubsection{Field Documentation}
+\mbox{\Hypertarget{classxb_1_1xbDbf_a8734e799707582f022fc341d515650f4}\label{classxb_1_1xbDbf_a8734e799707582f022fc341d515650f4}}
+\index{xb::xbDbf@{xb::xbDbf}!cEncryptionFlag@{cEncryptionFlag}}
+\index{cEncryptionFlag@{cEncryptionFlag}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{cEncryptionFlag}{cEncryptionFlag}}
+{\footnotesize\ttfamily char xb\+::xb\+Dbf\+::c\+Encryption\+Flag\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_ad59074633641e03647e54d2b66c9102b}\label{classxb_1_1xbDbf_ad59074633641e03647e54d2b66c9102b}}
+\index{xb::xbDbf@{xb::xbDbf}!cIndexFlag@{cIndexFlag}}
+\index{cIndexFlag@{cIndexFlag}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{cIndexFlag}{cIndexFlag}}
+{\footnotesize\ttfamily char xb\+::xb\+Dbf\+::c\+Index\+Flag\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1}\label{classxb_1_1xbDbf_aea1dfe5cbd1f9cdbcfc8eb04b2c3d5f1}}
+\index{xb::xbDbf@{xb::xbDbf}!cLangDriver@{cLangDriver}}
+\index{cLangDriver@{cLangDriver}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{cLangDriver}{cLangDriver}}
+{\footnotesize\ttfamily char xb\+::xb\+Dbf\+::c\+Lang\+Driver\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_ac3c89fc3bc6a6abf385478a8adbed970}\label{classxb_1_1xbDbf_ac3c89fc3bc6a6abf385478a8adbed970}}
+\index{xb::xbDbf@{xb::xbDbf}!cTransactionFlag@{cTransactionFlag}}
+\index{cTransactionFlag@{cTransactionFlag}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{cTransactionFlag}{cTransactionFlag}}
+{\footnotesize\ttfamily char xb\+::xb\+Dbf\+::c\+Transaction\+Flag\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a6021789d314cd41488991e708fcd0df2}\label{classxb_1_1xbDbf_a6021789d314cd41488991e708fcd0df2}}
+\index{xb::xbDbf@{xb::xbDbf}!cUpdateDD@{cUpdateDD}}
+\index{cUpdateDD@{cUpdateDD}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{cUpdateDD}{cUpdateDD}}
+{\footnotesize\ttfamily char xb\+::xb\+Dbf\+::c\+Update\+DD\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a9340a5e8ee53eb0f3b6601eec2d71e1b}\label{classxb_1_1xbDbf_a9340a5e8ee53eb0f3b6601eec2d71e1b}}
+\index{xb::xbDbf@{xb::xbDbf}!cUpdateMM@{cUpdateMM}}
+\index{cUpdateMM@{cUpdateMM}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{cUpdateMM}{cUpdateMM}}
+{\footnotesize\ttfamily char xb\+::xb\+Dbf\+::c\+Update\+MM\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a4fcd6a86ddd32d4a9d76a4074573440a}\label{classxb_1_1xbDbf_a4fcd6a86ddd32d4a9d76a4074573440a}}
+\index{xb::xbDbf@{xb::xbDbf}!cUpdateYY@{cUpdateYY}}
+\index{cUpdateYY@{cUpdateYY}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{cUpdateYY}{cUpdateYY}}
+{\footnotesize\ttfamily char xb\+::xb\+Dbf\+::c\+Update\+YY\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a3a262abf658e5fa968b57ef457a69470}\label{classxb_1_1xbDbf_a3a262abf658e5fa968b57ef457a69470}}
+\index{xb::xbDbf@{xb::xbDbf}!cVersion@{cVersion}}
+\index{cVersion@{cVersion}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{cVersion}{cVersion}}
+{\footnotesize\ttfamily unsigned char xb\+::xb\+Dbf\+::c\+Version\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}\label{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}}
+\index{xb::xbDbf@{xb::xbDbf}!ErrorCodeText@{ErrorCodeText}}
+\index{ErrorCodeText@{ErrorCodeText}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ErrorCodeText}{ErrorCodeText}}
+{\footnotesize\ttfamily const char$\ast$ xb\+::xb\+Ssv\+::\+Error\+Code\+Text\mbox{[}$\,$\mbox{]}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_ab506450954bc86e7bf1d7c4efe681f43}\label{classxb_1_1xbDbf_ab506450954bc86e7bf1d7c4efe681f43}}
+\index{xb::xbDbf@{xb::xbDbf}!iAutoCommit@{iAutoCommit}}
+\index{iAutoCommit@{iAutoCommit}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{iAutoCommit}{iAutoCommit}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::i\+Auto\+Commit\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a6d8e193da3ca414eef1e8866ec5ca81b}\label{classxb_1_1xbDbf_a6d8e193da3ca414eef1e8866ec5ca81b}}
+\index{xb::xbDbf@{xb::xbDbf}!iDbfStatus@{iDbfStatus}}
+\index{iDbfStatus@{iDbfStatus}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{iDbfStatus}{iDbfStatus}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::i\+Dbf\+Status\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}\label{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}}
+\index{xb::xbDbf@{xb::xbDbf}!iEndianType@{iEndianType}}
+\index{iEndianType@{iEndianType}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{iEndianType}{iEndianType}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::i\+Endian\+Type = 0\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a15f495446f0d75bcf2fa89e3b699d388}\label{classxb_1_1xbDbf_a15f495446f0d75bcf2fa89e3b699d388}}
+\index{xb::xbDbf@{xb::xbDbf}!iFileVersion@{iFileVersion}}
+\index{iFileVersion@{iFileVersion}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{iFileVersion}{iFileVersion}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::i\+File\+Version\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a5056757614c39f725cc775332494966a}\label{classxb_1_1xbDbf_a5056757614c39f725cc775332494966a}}
+\index{xb::xbDbf@{xb::xbDbf}!iNoOfFields@{iNoOfFields}}
+\index{iNoOfFields@{iNoOfFields}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{iNoOfFields}{iNoOfFields}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Dbf\+::i\+No\+Of\+Fields\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a8a9b3bce0b741e73473d3ebbd6e6f1cd}\label{classxb_1_1xbDbf_a8a9b3bce0b741e73473d3ebbd6e6f1cd}}
+\index{xb::xbDbf@{xb::xbDbf}!RecBuf@{RecBuf}}
+\index{RecBuf@{RecBuf}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{RecBuf}{RecBuf}}
+{\footnotesize\ttfamily char$\ast$ xb\+::xb\+Dbf\+::\+Rec\+Buf\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a353ebfc8a2960ef827f429ec74025606}\label{classxb_1_1xbDbf_a353ebfc8a2960ef827f429ec74025606}}
+\index{xb::xbDbf@{xb::xbDbf}!RecBuf2@{RecBuf2}}
+\index{RecBuf2@{RecBuf2}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{RecBuf2}{RecBuf2}}
+{\footnotesize\ttfamily char$\ast$ xb\+::xb\+Dbf\+::\+Rec\+Buf2\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a73f9c792d0a769e2e604c1855245a276}\label{classxb_1_1xbDbf_a73f9c792d0a769e2e604c1855245a276}}
+\index{xb::xbDbf@{xb::xbDbf}!sAlias@{sAlias}}
+\index{sAlias@{sAlias}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{sAlias}{sAlias}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+Dbf\+::s\+Alias\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_ad8c8b5eb12063bb898da1b2cc02cfce7}\label{classxb_1_1xbDbf_ad8c8b5eb12063bb898da1b2cc02cfce7}}
+\index{xb::xbDbf@{xb::xbDbf}!SchemaPtr@{SchemaPtr}}
+\index{SchemaPtr@{SchemaPtr}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{SchemaPtr}{SchemaPtr}}
+{\footnotesize\ttfamily xb\+Schema\+Rec$\ast$ xb\+::xb\+Dbf\+::\+Schema\+Ptr\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}\label{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}}
+\index{xb::xbDbf@{xb::xbDbf}!sNullString@{sNullString}}
+\index{sNullString@{sNullString}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{sNullString}{sNullString}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+Ssv\+::s\+Null\+String = \char`\"{}\char`\"{}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a62f5fa9149ae0f6dc75642823de66918}\label{classxb_1_1xbDbf_a62f5fa9149ae0f6dc75642823de66918}}
+\index{xb::xbDbf@{xb::xbDbf}!uiHeaderLen@{uiHeaderLen}}
+\index{uiHeaderLen@{uiHeaderLen}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{uiHeaderLen}{uiHeaderLen}}
+{\footnotesize\ttfamily xb\+UInt16 xb\+::xb\+Dbf\+::ui\+Header\+Len\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_a1760e222567e2c849f9c799b9d896e91}\label{classxb_1_1xbDbf_a1760e222567e2c849f9c799b9d896e91}}
+\index{xb::xbDbf@{xb::xbDbf}!uiRecordLen@{uiRecordLen}}
+\index{uiRecordLen@{uiRecordLen}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{uiRecordLen}{uiRecordLen}}
+{\footnotesize\ttfamily xb\+UInt16 xb\+::xb\+Dbf\+::ui\+Record\+Len\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_afcd99924606be0a9e1e25180bcd1abf8}\label{classxb_1_1xbDbf_afcd99924606be0a9e1e25180bcd1abf8}}
+\index{xb::xbDbf@{xb::xbDbf}!ulCurRec@{ulCurRec}}
+\index{ulCurRec@{ulCurRec}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ulCurRec}{ulCurRec}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+Dbf\+::ul\+Cur\+Rec\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbDbf_acb594ab61dd35b17bdf28394083f8e87}\label{classxb_1_1xbDbf_acb594ab61dd35b17bdf28394083f8e87}}
+\index{xb::xbDbf@{xb::xbDbf}!ulNoOfRecs@{ulNoOfRecs}}
+\index{ulNoOfRecs@{ulNoOfRecs}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{ulNoOfRecs}{ulNoOfRecs}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+Dbf\+::ul\+No\+Of\+Recs\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_ae39a67ea391b46055d4ca299cb222004}\label{classxb_1_1xbFile_ae39a67ea391b46055d4ca299cb222004}}
+\index{xb::xbDbf@{xb::xbDbf}!xbase@{xbase}}
+\index{xbase@{xbase}!xb::xbDbf@{xb::xbDbf}}
+\doxysubsubsection{\texorpdfstring{xbase}{xbase}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}}$\ast$ xb\+::xb\+File\+::xbase\hspace{0.3cm}{\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbdbf_8h}{xbdbf.\+h}}\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbdbf_8cpp}{xbdbf.\+cpp}}\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbfields_8cpp}{xbfields.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/classxb_1_1xbFile.eps b/docs/doxygen/latex/classxb_1_1xbFile.eps
new file mode 100644
index 0000000..defac03
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbFile.eps
@@ -0,0 +1,203 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: ClassName
+%%Creator: Doxygen
+%%CreationDate: Time
+%%For:
+%Magnification: 1.00
+%%Orientation: Portrait
+%%BoundingBox: 0 0 500 821.917786
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%EndComments
+
+% ----- variables -----
+
+/boxwidth 0 def
+/boxheight 40 def
+/fontheight 24 def
+/marginwidth 10 def
+/distx 20 def
+/disty 40 def
+/boundaspect 0.608333 def % aspect ratio of the BoundingBox (width/height)
+/boundx 500 def
+/boundy boundx boundaspect div def
+/xspacing 0 def
+/yspacing 0 def
+/rows 3 def
+/cols 1 def
+/scalefactor 0 def
+/boxfont /Times-Roman findfont fontheight scalefont def
+
+% ----- procedures -----
+
+/dotted { [1 4] 0 setdash } def
+/dashed { [5] 0 setdash } def
+/solid { [] 0 setdash } def
+
+/max % result = MAX(arg1,arg2)
+{
+ /a exch def
+ /b exch def
+ a b gt {a} {b} ifelse
+} def
+
+/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)
+{
+ 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max
+} def
+
+/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))
+{
+ /str exch def
+ /boxwidth boxwidth str stringwidth pop max def
+} def
+
+/box % draws a box with text 'arg1' at grid pos (arg2,arg3)
+{ gsave
+ 2 setlinewidth
+ newpath
+ exch xspacing mul xoffset add
+ exch yspacing mul
+ moveto
+ boxwidth 0 rlineto
+ 0 boxheight rlineto
+ boxwidth neg 0 rlineto
+ 0 boxheight neg rlineto
+ closepath
+ dup stringwidth pop neg boxwidth add 2 div
+ boxheight fontheight 2 div sub 2 div
+ rmoveto show stroke
+ grestore
+} def
+
+/mark
+{ newpath
+ exch xspacing mul xoffset add boxwidth add
+ exch yspacing mul
+ moveto
+ 0 boxheight 4 div rlineto
+ boxheight neg 4 div boxheight neg 4 div rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/arrow
+{ newpath
+ moveto
+ 3 -8 rlineto
+ -6 0 rlineto
+ 3 8 rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/out % draws an output connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight add
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/in % draws an input connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul disty 2 div sub
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/hedge
+{
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight 2 div sub
+ /y exch def
+ /x exch def
+ newpath
+ x y moveto
+ boxwidth 2 div distx add 0 rlineto
+ stroke
+ 1 eq
+ { newpath x boxwidth 2 div distx add add y moveto
+ -8 3 rlineto
+ 0 -6 rlineto
+ 8 3 rlineto
+ closepath
+ eofill
+ stroke
+ } if
+} def
+
+/vedge
+{
+ /ye exch def
+ /ys exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add dup
+ ys yspacing mul boxheight 2 div sub
+ moveto
+ ye yspacing mul boxheight 2 div sub
+ lineto
+ stroke
+} def
+
+/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3'
+{
+ /ys exch def
+ /xe exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add
+ ys yspacing mul disty 2 div sub
+ moveto
+ xspacing xe xs sub mul 0
+ rlineto
+ stroke
+} def
+
+% ----- main ------
+
+boxfont setfont
+1 boundaspect scale
+(xb::xbFile) cw
+(xb::xbSsv) cw
+(xb::xbDbf) cw
+/boxwidth boxwidth marginwidth 2 mul add def
+/xspacing boxwidth distx add def
+/yspacing boxheight disty add def
+/scalefactor
+ boxwidth cols mul distx cols 1 sub mul add
+ boxheight rows mul disty rows 1 sub mul add boundaspect mul
+ max def
+boundx scalefactor div boundy scalefactor div scale
+
+% ----- classes -----
+
+ (xb::xbFile) 0.000000 1.000000 box
+ (xb::xbSsv) 0.000000 2.000000 box
+ (xb::xbDbf) 0.000000 0.000000 box
+
+% ----- relations -----
+
+solid
+0 0.000000 1.000000 out
+solid
+1 0.000000 2.000000 in
+solid
+1 0.000000 0.250000 out
+solid
+0 0.000000 0.750000 in
diff --git a/docs/doxygen/latex/classxb_1_1xbFile.pdf b/docs/doxygen/latex/classxb_1_1xbFile.pdf
new file mode 100644
index 0000000..40f098c
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbFile.pdf
Binary files differ
diff --git a/docs/doxygen/latex/classxb_1_1xbFile.tex b/docs/doxygen/latex/classxb_1_1xbFile.tex
new file mode 100644
index 0000000..21d0680
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbFile.tex
@@ -0,0 +1,1882 @@
+\hypertarget{classxb_1_1xbFile}{}\doxysection{xb\+::xb\+File Class Reference}
+\label{classxb_1_1xbFile}\index{xb::xbFile@{xb::xbFile}}
+
+
+Class for handling low level file I/O.
+
+
+
+
+{\ttfamily \#include $<$xbfile.\+h$>$}
+
+Inheritance diagram for xb\+::xb\+File\+:\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[height=3.000000cm]{classxb_1_1xbFile}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classxb_1_1xbFile_a869eedd74c6eddc308852eb546c87176}{xb\+File}} (\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$x)
+\begin{DoxyCompactList}\small\item\em Class Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbFile_a491f6c48076e89da2e791a42b2727a90}{$\sim$xb\+File}} ()
+\begin{DoxyCompactList}\small\item\em Class Destructor. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_aae9a2ddb0adb8165b4ac2b6a28a932f7}{Create\+Unique\+File\+Name}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Dir\+In, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Ext\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Fqn\+Out)
+\begin{DoxyCompactList}\small\item\em Create a unique file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ae5ffabde2c88ea58324f27e471f6bfc0}{Create\+Unique\+File\+Name}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Dir\+In, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Ext\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Fqn\+Out, xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Create a unique file name. \end{DoxyCompactList}\item
+const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbFile_acd0fb2166b2bff7e8a1cf65a7bc8be1e}{Get\+Directory}} () const
+\begin{DoxyCompactList}\small\item\em Get the directory name. \end{DoxyCompactList}\item
+const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbFile_ac95cb882ccbcdedc9a233c6ad9fed07a}{Get\+File\+Name}} () const
+\begin{DoxyCompactList}\small\item\em Get the file name. \end{DoxyCompactList}\item
+const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbFile_a31b4e641f93206ba23e2a5a27491dcd4}{Get\+Fq\+File\+Name}} () const
+\begin{DoxyCompactList}\small\item\em Get the fully qualified file name. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_ae78a85255488bc78964c16946dbaead3}{Set\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Directory)
+\begin{DoxyCompactList}\small\item\em Set the directory. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a5419eb27e56822f828b2b88a9502a636}{Set\+File\+Name}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name)
+\begin{DoxyCompactList}\small\item\em Set the filename. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_aee832fa11db2077a532f49e1329bd05a}{Set\+Fq\+File\+Name}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Fq\+Name)
+\begin{DoxyCompactList}\small\item\em Set the fully qualifed filename. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbFile_a638e14262410a1627819f016a16cdce2}{Get\+Block\+Size}} () const
+\begin{DoxyCompactList}\small\item\em Get the block size. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a991c5676a6f38fa752435390989f413e}{Set\+Block\+Size}} (xb\+UInt32 ul\+Block\+Size)
+\begin{DoxyCompactList}\small\item\em Set the block size. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a3c500dc9dac22c49496e4b29386b2dd3}{Get\+Open\+Mode}} () const
+\begin{DoxyCompactList}\small\item\em Get the open mode of the file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a9b63e05b77f477ff6109ff7b9432c1b6}{Get\+Share\+Mode}} () const
+\begin{DoxyCompactList}\small\item\em Get the share mode of the file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a60c53998e3d1b694134b20a87bc9bf5a}{Get\+File\+Dir\+Part}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Dir\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the directory part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_af5127c92892816e9bbc5c19653c4147a}{Get\+File\+Dir\+Part}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Complete\+File\+Name\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Dir\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the directory part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a57a9222e5cbb51019d4eeb2c3ac89fa2}{Get\+File\+Ext\+Part}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Ext\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the extension part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ab289b6ffe955321160c1f90220c22e25}{Get\+File\+Ext\+Part}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Complete\+File\+Name\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Ext\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the extension part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a81422b3dd52763d2cc6c77237ec9af0a}{Get\+File\+Name\+Part}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the name part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a6110763c5ae996b72c7a62c15bdecc73}{Get\+File\+Name\+Part}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Complete\+File\+Name\+In, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name\+Part\+Out) const
+\begin{DoxyCompactList}\small\item\em Get the name part of the file name. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a5548236d38d43b89ae29b9a015b1f678}{Get\+File\+Type}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Type) const
+\begin{DoxyCompactList}\small\item\em Get the file type aka Capitalized file extension. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_aaf2e697751a0beff41432a66bb83fb5e}{Get\+Xbase\+File\+Type\+Byte}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, xb\+Int16 \&i\+Version)
+\begin{DoxyCompactList}\small\item\em Get the file type byte and version of the dbf file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a7af337808919680b90710ad5e8a99232}{Get\+Xbase\+File\+Type\+Byte}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, unsigned char \&c\+File\+Type\+Byte)
+\begin{DoxyCompactList}\small\item\em Get the file type byte and version of the dbf file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a78aebdd21d3de46a450d5f835e3027f6}{Get\+Xbase\+File\+Type\+Byte}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, unsigned char \&c\+File\+Type\+Byte, xb\+Int16 \&i\+Version)
+\begin{DoxyCompactList}\small\item\em Get the file type byte and version of the dbf file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ae2b6ac26018dc28f77afbb3f008c3f66}{Determine\+Xbase\+Table\+Version}} (unsigned char c\+File\+Type\+Byte) const
+\begin{DoxyCompactList}\small\item\em Determine xbase dbf version. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a5a740033664c9ad2611c90e2a6d0c2d3}{Determine\+Xbase\+Memo\+Version}} (unsigned char c\+File\+Type\+Byte) const
+\begin{DoxyCompactList}\small\item\em Determine which version the memo (dbt) file is. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbFile_a78bd8a11dce102647095baf3aff2b006}{File\+Exists}} () const
+\begin{DoxyCompactList}\small\item\em Determines if a file exists. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbFile_a174d8a6aabc9cfcd32fedbd1e5b13ddd}{File\+Exists}} (xb\+Int16 i\+Option) const
+\begin{DoxyCompactList}\small\item\em Determines if a file exists. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbFile_a61130b4fbf4cf9d5972dcb4993de2f94}{File\+Exists}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name) const
+\begin{DoxyCompactList}\small\item\em Determines if a file exists. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbFile_a0592168f39a10f2a401a88ef781f6148}{File\+Exists}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, xb\+Int16 i\+Option) const
+\begin{DoxyCompactList}\small\item\em Determines if a file exists. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbFile_a7fa837938a32dc9ca3fbc81cbaf50f59}{File\+Is\+Open}} () const
+\begin{DoxyCompactList}\small\item\em Determines if file is open. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_aa1bb80340abc7a5c22f87f878e9dc825}{Read\+Block}} (xb\+UInt32 ul\+Block\+No, size\+\_\+t read\+Size, void $\ast$buf)
+\begin{DoxyCompactList}\small\item\em Read a block of data from file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_aef696b1c4c0ef5338e818599f695d485}{Read\+Block}} (xb\+UInt32 ul\+Block\+No, xb\+UInt32 ul\+Block\+Size, size\+\_\+t read\+Size, void $\ast$buf)
+\begin{DoxyCompactList}\small\item\em Read a block of data from file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a5d871dcfecc2b4338f7a13722aab766c}{Write\+Block}} (xb\+UInt32 ul\+Block\+No, size\+\_\+t write\+Size, void $\ast$buf)
+\begin{DoxyCompactList}\small\item\em Write a block of data to file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a50b63c39e49d44e52078038027b24cc5}{Get\+File\+Size}} (xb\+UInt64 \&ull\+File\+Size)
+\begin{DoxyCompactList}\small\item\em Get the size of the file as reported by the OS. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a02df78f4c90313243f508fc56b95aba8}{Get\+File\+Mtime}} (time\+\_\+t \&mtime)
+\begin{DoxyCompactList}\small\item\em Get the time of last file modification timestamp as reported by the OS. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} \mbox{\hyperlink{classxb_1_1xbFile_ab14e4a11427f5efb81cba1dd32bd1aa1}{e\+Get\+Double}} (const char $\ast$p) const
+\begin{DoxyCompactList}\small\item\em Get a portable double value. \end{DoxyCompactList}\item
+xb\+Int32 \mbox{\hyperlink{classxb_1_1xbFile_a60b24a5afc984c586bf384c7e915ba0d}{e\+Get\+Int32}} (const char $\ast$p) const
+\begin{DoxyCompactList}\small\item\em Get a portable long value. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbFile_a78f052529d39a18deaface5a0d47d0b0}{e\+Get\+UInt32}} (const char $\ast$p) const
+\begin{DoxyCompactList}\small\item\em Get a portable unsigned long value. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ac40c991110ddc6fb30a72d90f4652762}{e\+Get\+Int16}} (const char $\ast$p) const
+\begin{DoxyCompactList}\small\item\em Get a portable short value. \end{DoxyCompactList}\item
+xb\+UInt16 \mbox{\hyperlink{classxb_1_1xbFile_a936ade458e6d5e6d29f9b5031888d189}{e\+Get\+UInt16}} (const char $\ast$p) const
+\begin{DoxyCompactList}\small\item\em Get a portable unsigned short value. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a98b6ff533ae93f90c977a2ba23eeb105}{e\+Put\+Double}} (char $\ast$p, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} d)
+\begin{DoxyCompactList}\small\item\em Write a portable double value to memory location. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a19c37f76a2ccbb45019cb0fc373d3f46}{e\+Put\+Int32}} (char $\ast$p, xb\+Int32 l)
+\begin{DoxyCompactList}\small\item\em Write a portable long value to memory location. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_aa3f6ceae4b96f24875d86848bf13a173}{e\+Put\+UInt32}} (char $\ast$p, xb\+UInt32 ul)
+\begin{DoxyCompactList}\small\item\em Write a portable unsigned long value to memory location. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a29130f12739ac8fa837f4eaedf1338b2}{e\+Put\+Int16}} (char $\ast$p, xb\+Int16 s)
+\begin{DoxyCompactList}\small\item\em Write a portable short value to memory location. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a65e9839f92b96eac7b0d071fac3bbe40}{e\+Put\+UInt16}} (char $\ast$p, xb\+UInt16 s)
+\begin{DoxyCompactList}\small\item\em Write a portable unsigned short value to memory location. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a18830b5755d74818f60d9c7ce38ddf2d}{xb\+Fclose}} ()
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fclose. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_af5b6356832d2a67212070a1aa605f170}{xb\+Feof}} ()
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary feof. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ad205184d43409f04216540ae22f15009}{xb\+Fflush}} ()
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fflush. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_afb1c584d2895ffb7834df80aea7eb1e4}{xb\+Fgetc}} (xb\+Int32 \&c)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fgetc. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a5ee229bda4d7d6695e122200e581e7a6}{xb\+Fgetc}} (char \&c)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fgetc. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a7cdfef5ede9ac98d44a28a6b7a70972c}{xb\+Fopen}} (xb\+Int16 i\+Open\+Mode)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a0548cedf0f26b7d8ac221f75b0cd048c}{xb\+Fopen}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Open\+Mode, xb\+Int16 i\+Share\+Mode)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fopen. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_aabd113333b49c36cad23244b392baab4}{xb\+Fopen}} (xb\+Int16 i\+Open\+Mode, xb\+Int16 i\+Share\+Mode)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fopen. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ab0fa19686ca8953ff4b556fb5b249135}{xb\+Fopen}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Mode, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, xb\+Int16 i\+Share\+Mode)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fopen. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_af2e940c78956e5cb6824f9a1bc404896}{xb\+Fputc}} (xb\+Int32 c)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fputc. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a863f74cf17df8186d88586b4d2a6441a}{xb\+Fputc}} (xb\+Int32 c, xb\+Int32 i\+No\+Times)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fputc. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a698f3b40216778562e639e6ca1a47573}{xb\+Fputs}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fputs. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ab4f6afaa1f77539f27a4f05c26e54e2f}{xb\+Fread}} (void $\ast$ptr, size\+\_\+t size, size\+\_\+t nmemb)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fread. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ad245955ace26e5dde85fd4373b30d026}{xb\+Fgets}} (size\+\_\+t l\+Size, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Line)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fgets. \end{DoxyCompactList}\item
+size\+\_\+t \mbox{\hyperlink{classxb_1_1xbFile_a0e1c06aedfa7fbcb92e117f891edd13b}{xb\+Ftell}} ()
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary ftell. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a5337ab8918df240910c0d19b4f298e3d}{xb\+Fseek}} (xb\+Int64 ll\+Offset, xb\+Int32 whence)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fseek. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a9891b792f585a696f38a5cf959e30918}{xb\+FTurn\+Off\+File\+Buffering}} ()
+\begin{DoxyCompactList}\small\item\em Turn off file buffering. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a6aadd871d1782944703fed773d44b85f}{xb\+Fwrite}} (const void $\ast$ptr, size\+\_\+t l\+Size, size\+\_\+t l\+Nmemb)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for standard libary fwrite. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a08463f506f425c2385acbe1a561506e9}{xb\+Read\+Until}} (const char c\+Delim, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Out)
+\begin{DoxyCompactList}\small\item\em Read file until a particular character is encountered on input stream. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a6d919366c2ec95e529906bf8842cbf07}{xb\+Remove}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Delete file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a58f6a6751fdf7e9549c273bb75d93eb5}{xb\+Remove}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name)
+\begin{DoxyCompactList}\small\item\em Delete file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ab3c668a8570433188382d31d7c60bd48}{xb\+Remove}} ()
+\begin{DoxyCompactList}\small\item\em Delete file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_afc8ce113aa72611a278233f9bb170012}{xb\+Rename}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Old\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+New\+Name)
+\begin{DoxyCompactList}\small\item\em Rename file. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_ab0b2a2c88947921d98ebcb5b5ec34ed9}{xb\+Rename}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Old\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+New\+Name, xb\+Int16 i\+Option)
+\begin{DoxyCompactList}\small\item\em Rename file. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbFile_a7996b6e084665c37c3892faea64b3505}{xb\+Rewind}} ()
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for rewind. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a518bfcbfa3699d883cf89affee383296}{xb\+Truncate}} (xb\+Int64 ll\+Size)
+\begin{DoxyCompactList}\small\item\em Xbase wrapper for ftruncate. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbFile_a361e3cc318bbf1c4d10f069e0800a24e}{Name\+Suffix\+Missing}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+File\+Name, xb\+Int16 i\+Option) const
+\begin{DoxyCompactList}\small\item\em Determines status of file extension. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}{Display\+Error}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Display error message on console for a given error number. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}{Get\+Default\+Date\+Format}} () const
+\begin{DoxyCompactList}\small\item\em Get the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}{Get\+Data\+Directory}} () const
+\begin{DoxyCompactList}\small\item\em Get the current data directory. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}{Get\+Endian\+Type}} () const
+\begin{DoxyCompactList}\small\item\em Get the Endian type. \end{DoxyCompactList}\item
+const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}{Get\+Error\+Message}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Get an error message. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}{Set\+Data\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Data\+Directory)
+\begin{DoxyCompactList}\small\item\em Set the data directory. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}{Set\+Default\+Date\+Format}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Date\+Format)
+\begin{DoxyCompactList}\small\item\em Set the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}{Bit\+Set}} (unsigned char c, xb\+Int16 i\+Bit\+No) const
+\begin{DoxyCompactList}\small\item\em Check a bit in a one byte field and see if it is set. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}{Get\+Default\+Auto\+Commit}} () const
+\begin{DoxyCompactList}\small\item\em Get the default auto commit setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}{Set\+Default\+Auto\+Commit}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Default\+Auto\+Commit)
+\begin{DoxyCompactList}\small\item\em Set the default auto commit. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}{Get\+Default\+Log\+Directory}} () const
+\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}{Get\+Default\+Log\+File\+Name}} () const
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}{Set\+Default\+Log\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Log\+Directory)
+\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}{Get\+Multi\+User}} () const
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}{Set\+Multi\+User}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Multi\+User)
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+static const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}{Error\+Code\+Text}} \mbox{[}$\,$\mbox{]}
+\end{DoxyCompactItemize}
+\doxysubsection*{Protected Member Functions}
+\begin{DoxyCompactItemize}
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}{Set\+Endian\+Type}} ()
+\begin{DoxyCompactList}\small\item\em Set the endian type. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Protected Attributes}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$ \mbox{\hyperlink{classxb_1_1xbFile_ae39a67ea391b46055d4ca299cb222004}{xbase}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Static Protected Attributes}
+\begin{DoxyCompactItemize}
+\item
+static xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}{i\+Endian\+Type}} = 0
+\item
+static \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}{s\+Null\+String}} = \char`\"{}\char`\"{}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Class for handling low level file I/O.
+
+The \mbox{\hyperlink{classxb_1_1xbFile}{xb\+File}} class is used as an abstraction layer to isolate the library from the nuances of different operating systems and machine architectures.
+
+This module handles low level file I/O and is a base class for the (dbf) table, (dbt) memo and (ndx,mdx) index classes. Files are opened and manipulated via methods in the \mbox{\hyperlink{classxb_1_1xbFile}{xb\+File}} class.~\newline
+ This class handles\+:~\newline
+ 1) Big and little endian reads/writes~\newline
+ 2) 32 or 64 bit system calls, depending on OS~\newline
+ 3) Various different c/c++ calls to open/close/read/write based on OS and compiler version~\newline
+ ~\newline
+ If you are wanting to port this library to a new platform, start with this class. This class could be used if you want to write a platform independent program that needs R/W file access.
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classxb_1_1xbFile_a869eedd74c6eddc308852eb546c87176}\label{classxb_1_1xbFile_a869eedd74c6eddc308852eb546c87176}}
+\index{xb::xbFile@{xb::xbFile}!xbFile@{xbFile}}
+\index{xbFile@{xbFile}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFile()}{xbFile()}}
+{\footnotesize\ttfamily xb\+::xb\+File\+::xb\+File (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$}]{x }\end{DoxyParamCaption})}
+
+
+
+Class Constructor.
+
+\mbox{\Hypertarget{classxb_1_1xbFile_a491f6c48076e89da2e791a42b2727a90}\label{classxb_1_1xbFile_a491f6c48076e89da2e791a42b2727a90}}
+\index{xb::xbFile@{xb::xbFile}!````~xbFile@{$\sim$xbFile}}
+\index{````~xbFile@{$\sim$xbFile}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{$\sim$xbFile()}{~xbFile()}}
+{\footnotesize\ttfamily xb\+::xb\+File\+::$\sim$xb\+File (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Class Destructor.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}\label{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}}
+\index{xb::xbFile@{xb::xbFile}!BitSet@{BitSet}}
+\index{BitSet@{BitSet}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{BitSet()}{BitSet()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Bit\+Set (\begin{DoxyParamCaption}\item[{unsigned char}]{c, }\item[{xb\+Int16}]{i\+Bit\+No }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Check a bit in a one byte field and see if it is set.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & One byte char field to examine. \\
+\hline
+{\em i\+Bit\+No} & which bit to examine. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True Bit is set~\newline
+ xb\+False Bit is not set
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_aae9a2ddb0adb8165b4ac2b6a28a932f7}\label{classxb_1_1xbFile_aae9a2ddb0adb8165b4ac2b6a28a932f7}}
+\index{xb::xbFile@{xb::xbFile}!CreateUniqueFileName@{CreateUniqueFileName}}
+\index{CreateUniqueFileName@{CreateUniqueFileName}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{CreateUniqueFileName()}{CreateUniqueFileName()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Create\+Unique\+File\+Name (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Dir\+In, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Ext\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Fqn\+Out }\end{DoxyParamCaption})}
+
+
+
+Create a unique file name.
+
+Given a directory and file extension as inputs, create a unique file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Dir\+In} & Directory \\
+\hline
+{\em s\+Ext\+In} & File Extension \\
+\hline
+{\em s\+Fqn\+Out} & A fully qualifed unique file name as output \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ae5ffabde2c88ea58324f27e471f6bfc0}\label{classxb_1_1xbFile_ae5ffabde2c88ea58324f27e471f6bfc0}}
+\index{xb::xbFile@{xb::xbFile}!CreateUniqueFileName@{CreateUniqueFileName}}
+\index{CreateUniqueFileName@{CreateUniqueFileName}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{CreateUniqueFileName()}{CreateUniqueFileName()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Create\+Unique\+File\+Name (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Dir\+In, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Ext\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Fqn\+Out, }\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})}
+
+
+
+Create a unique file name.
+
+Given a directory and file extension as inputs, create a unique file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Dir\+In} & Directory \\
+\hline
+{\em s\+Ext\+In} & File Extension \\
+\hline
+{\em i\+Option} & 0 -\/ look only for one file for a given directory and extension~\newline
+ 1 -\/ if file name extension is \char`\"{}dbf\char`\"{} or \char`\"{}\+DBF\char`\"{}, verify unique dbt or DBT (memo) file is also available~\newline
+ \\
+\hline
+{\em s\+Fqn\+Out} & A fully qualifed unique file name as output \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a5a740033664c9ad2611c90e2a6d0c2d3}\label{classxb_1_1xbFile_a5a740033664c9ad2611c90e2a6d0c2d3}}
+\index{xb::xbFile@{xb::xbFile}!DetermineXbaseMemoVersion@{DetermineXbaseMemoVersion}}
+\index{DetermineXbaseMemoVersion@{DetermineXbaseMemoVersion}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{DetermineXbaseMemoVersion()}{DetermineXbaseMemoVersion()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Determine\+Xbase\+Memo\+Version (\begin{DoxyParamCaption}\item[{unsigned char}]{c\+File\+Type\+Byte }\end{DoxyParamCaption}) const}
+
+
+
+Determine which version the memo (dbt) file is.
+
+This routine uses the first byte in the dbf file to determine which memo file version is in use. The main difference between version 3 and 4 is that version 4 will reuse blocks if they become available. Version 3 does not.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c\+File\+Type\+Byte} & is an output field and is one of\+:~\newline
+ ~\newline
+ 0 -\/ none~\newline
+ 3 -\/ Dbase III+~\newline
+ 4 -\/ Dbase IV~\newline
+\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ae2b6ac26018dc28f77afbb3f008c3f66}\label{classxb_1_1xbFile_ae2b6ac26018dc28f77afbb3f008c3f66}}
+\index{xb::xbFile@{xb::xbFile}!DetermineXbaseTableVersion@{DetermineXbaseTableVersion}}
+\index{DetermineXbaseTableVersion@{DetermineXbaseTableVersion}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{DetermineXbaseTableVersion()}{DetermineXbaseTableVersion()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Determine\+Xbase\+Table\+Version (\begin{DoxyParamCaption}\item[{unsigned char}]{c\+File\+Type\+Byte }\end{DoxyParamCaption}) const}
+
+
+
+Determine xbase dbf version.
+
+This routine is used to determine which version of the Xbase classes can be used for a given DBF file.~\newline
+
+
+It attempts to use the highest version compiled into the library.~\newline
+
+
+References\+:~\newline
+ This routine uses the first byte from the dbf file.~\newline
+ Per DBase documentation\+:~\newline
+ Valid d\+BASE for Windows table file, bits 0-\/2 indicate version number\+: 3 for d\+BASE Level 5, 4 for d\+BASE Level 7.~\newline
+ Bit 3 and bit 7 indicate presence of a d\+BASE IV or d\+BASE for Windows memo file;~\newline
+ Bits 4-\/6 indicate the presence of a d\+BASE IV SQL table;~\newline
+ Bit 7 indicates the presence of any .DBT memo file (either a d\+BASE III PLUS type or a d\+BASE IV or d\+BASE for Windows memo file).~\newline
+ ~\newline
+ Bachmann spec (used extensively in library build), page 7 -\/ does not match DBase documentation~\newline
+ ~\newline
+ returns~\newline
+ 0 -\/ unknown~\newline
+ 3 -\/ Dbase level 3~\newline
+ 4 -\/ Dbase level 4~\newline
+ 5 -\/ Dbase Level 5 (future)~\newline
+ 7 -\/ Dbase Level 7 (future)~\newline
+ ~\newline
+ 1x -\/ Clipper files (future)~\newline
+ 2x -\/ Foxbase files (future)~\newline
+ ~\newline
+ \mbox{\Hypertarget{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}\label{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}}
+\index{xb::xbFile@{xb::xbFile}!DisplayError@{DisplayError}}
+\index{DisplayError@{DisplayError}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{DisplayError()}{DisplayError()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Display\+Error (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Display error message on console for a given error number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error number to reference \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab14e4a11427f5efb81cba1dd32bd1aa1}\label{classxb_1_1xbFile_ab14e4a11427f5efb81cba1dd32bd1aa1}}
+\index{xb::xbFile@{xb::xbFile}!eGetDouble@{eGetDouble}}
+\index{eGetDouble@{eGetDouble}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{eGetDouble()}{eGetDouble()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} xb\+::xb\+File\+::e\+Get\+Double (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p }\end{DoxyParamCaption}) const}
+
+
+
+Get a portable double value.
+
+This routine returns a double value from an 8 byte character stream, accounting for endian type.
+
+Converts a double (64 bit floating point) value stored at p from a portable format to the machine format.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & pointer to memory containing the portable double value\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+the double value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ac40c991110ddc6fb30a72d90f4652762}\label{classxb_1_1xbFile_ac40c991110ddc6fb30a72d90f4652762}}
+\index{xb::xbFile@{xb::xbFile}!eGetInt16@{eGetInt16}}
+\index{eGetInt16@{eGetInt16}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{eGetInt16()}{eGetInt16()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::e\+Get\+Int16 (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p }\end{DoxyParamCaption}) const}
+
+
+
+Get a portable short value.
+
+This routine returns a short int value from a 2 byte character stream, accounting for endian type.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & pointer to memory containing the portable long value\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+the short value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a60b24a5afc984c586bf384c7e915ba0d}\label{classxb_1_1xbFile_a60b24a5afc984c586bf384c7e915ba0d}}
+\index{xb::xbFile@{xb::xbFile}!eGetInt32@{eGetInt32}}
+\index{eGetInt32@{eGetInt32}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{eGetInt32()}{eGetInt32()}}
+{\footnotesize\ttfamily xb\+Int32 xb\+::xb\+File\+::e\+Get\+Int32 (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p }\end{DoxyParamCaption}) const}
+
+
+
+Get a portable long value.
+
+This routine returns a long int value from a 4 byte character stream, accounting for endian type.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & pointer to memory containing the portable long value\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+the long value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a936ade458e6d5e6d29f9b5031888d189}\label{classxb_1_1xbFile_a936ade458e6d5e6d29f9b5031888d189}}
+\index{xb::xbFile@{xb::xbFile}!eGetUInt16@{eGetUInt16}}
+\index{eGetUInt16@{eGetUInt16}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{eGetUInt16()}{eGetUInt16()}}
+{\footnotesize\ttfamily xb\+UInt16 xb\+::xb\+File\+::e\+Get\+UInt16 (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p }\end{DoxyParamCaption}) const}
+
+
+
+Get a portable unsigned short value.
+
+This routine returns a short unsigned int value from a 2 byte character stream, accounting for endian type.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & pointer to memory containing the portable long value\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+the short value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a78f052529d39a18deaface5a0d47d0b0}\label{classxb_1_1xbFile_a78f052529d39a18deaface5a0d47d0b0}}
+\index{xb::xbFile@{xb::xbFile}!eGetUInt32@{eGetUInt32}}
+\index{eGetUInt32@{eGetUInt32}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{eGetUInt32()}{eGetUInt32()}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+File\+::e\+Get\+UInt32 (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p }\end{DoxyParamCaption}) const}
+
+
+
+Get a portable unsigned long value.
+
+This routine returns an unsigned long int value from a 4 byte character stream, accounting for endian type.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & pointer to memory containing the portable long value\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+the unsigned long value.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a98b6ff533ae93f90c977a2ba23eeb105}\label{classxb_1_1xbFile_a98b6ff533ae93f90c977a2ba23eeb105}}
+\index{xb::xbFile@{xb::xbFile}!ePutDouble@{ePutDouble}}
+\index{ePutDouble@{ePutDouble}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{ePutDouble()}{ePutDouble()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::e\+Put\+Double (\begin{DoxyParamCaption}\item[{char $\ast$}]{c, }\item[{\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}}}]{d }\end{DoxyParamCaption})}
+
+
+
+Write a portable double value to memory location.
+
+Converts a double (64 bit floating point) value from machine format to a portable format and stores the converted value in the memory referenced by c.
+
+This routine puts a double value to an 8 byte character stream
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Pointer to memory to hold converted value \\
+\hline
+{\em d} & Input value to be converted \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_a29130f12739ac8fa837f4eaedf1338b2}\label{classxb_1_1xbFile_a29130f12739ac8fa837f4eaedf1338b2}}
+\index{xb::xbFile@{xb::xbFile}!ePutInt16@{ePutInt16}}
+\index{ePutInt16@{ePutInt16}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{ePutInt16()}{ePutInt16()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::e\+Put\+Int16 (\begin{DoxyParamCaption}\item[{char $\ast$}]{c, }\item[{xb\+Int16}]{s }\end{DoxyParamCaption})}
+
+
+
+Write a portable short value to memory location.
+
+Converts a short (16 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.
+
+This routine puts a short value to a 2 byte character stream
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Pointer to memory to hold converted value \\
+\hline
+{\em s} & Input value to be converted \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_a19c37f76a2ccbb45019cb0fc373d3f46}\label{classxb_1_1xbFile_a19c37f76a2ccbb45019cb0fc373d3f46}}
+\index{xb::xbFile@{xb::xbFile}!ePutInt32@{ePutInt32}}
+\index{ePutInt32@{ePutInt32}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{ePutInt32()}{ePutInt32()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::e\+Put\+Int32 (\begin{DoxyParamCaption}\item[{char $\ast$}]{c, }\item[{xb\+Int32}]{l }\end{DoxyParamCaption})}
+
+
+
+Write a portable long value to memory location.
+
+Converts a long (32 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.
+
+This routine puts a long value to a 4 byte character stream.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Pointer to memory to hold converted value \\
+\hline
+{\em l} & Input value to be converted \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_a65e9839f92b96eac7b0d071fac3bbe40}\label{classxb_1_1xbFile_a65e9839f92b96eac7b0d071fac3bbe40}}
+\index{xb::xbFile@{xb::xbFile}!ePutUInt16@{ePutUInt16}}
+\index{ePutUInt16@{ePutUInt16}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{ePutUInt16()}{ePutUInt16()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::e\+Put\+UInt16 (\begin{DoxyParamCaption}\item[{char $\ast$}]{c, }\item[{xb\+UInt16}]{s }\end{DoxyParamCaption})}
+
+
+
+Write a portable unsigned short value to memory location.
+
+Converts an unsigned short (16 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.
+
+This routine puts an unsigned short value to a 2 byte character stream
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Pointer to memory to hold converted value \\
+\hline
+{\em s} & Input value to be converted \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_aa3f6ceae4b96f24875d86848bf13a173}\label{classxb_1_1xbFile_aa3f6ceae4b96f24875d86848bf13a173}}
+\index{xb::xbFile@{xb::xbFile}!ePutUInt32@{ePutUInt32}}
+\index{ePutUInt32@{ePutUInt32}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{ePutUInt32()}{ePutUInt32()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::e\+Put\+UInt32 (\begin{DoxyParamCaption}\item[{char $\ast$}]{c, }\item[{xb\+UInt32}]{ul }\end{DoxyParamCaption})}
+
+
+
+Write a portable unsigned long value to memory location.
+
+Converts an unsigned long (32 bit integer) value from machine format to a portable format and stores the converted value in the memory referenced by c.
+
+This routine puts an unsigned long value to a 4 byte character stream.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Pointer to memory to hold converted value \\
+\hline
+{\em ul} & Input value to be converted \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_a78bd8a11dce102647095baf3aff2b006}\label{classxb_1_1xbFile_a78bd8a11dce102647095baf3aff2b006}}
+\index{xb::xbFile@{xb::xbFile}!FileExists@{FileExists}}
+\index{FileExists@{FileExists}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{FileExists()}{FileExists()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+File\+::\+File\+Exists (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Determines if a file exists.
+
+\begin{DoxyReturn}{Returns}
+xb\+True if file exists~\newline
+ xb\+False if file does not exist
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a61130b4fbf4cf9d5972dcb4993de2f94}\label{classxb_1_1xbFile_a61130b4fbf4cf9d5972dcb4993de2f94}}
+\index{xb::xbFile@{xb::xbFile}!FileExists@{FileExists}}
+\index{FileExists@{FileExists}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{FileExists()}{FileExists()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+File\+::\+File\+Exists (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name }\end{DoxyParamCaption}) const}
+
+
+
+Determines if a file exists.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ file name to check for\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True if file exists~\newline
+ xb\+False if file does not exist
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a0592168f39a10f2a401a88ef781f6148}\label{classxb_1_1xbFile_a0592168f39a10f2a401a88ef781f6148}}
+\index{xb::xbFile@{xb::xbFile}!FileExists@{FileExists}}
+\index{FileExists@{FileExists}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{FileExists()}{FileExists()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+File\+::\+File\+Exists (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption}) const}
+
+
+
+Determines if a file exists.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ file name to check for \\
+\hline
+{\em i\+Option} & if 1, assume this is a request for a dbf file and check for the a dbt memo file also, returns true if both files are found\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True if both dbf and dbt files exist~\newline
+ xb\+False if file does not exist
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a174d8a6aabc9cfcd32fedbd1e5b13ddd}\label{classxb_1_1xbFile_a174d8a6aabc9cfcd32fedbd1e5b13ddd}}
+\index{xb::xbFile@{xb::xbFile}!FileExists@{FileExists}}
+\index{FileExists@{FileExists}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{FileExists()}{FileExists()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+File\+::\+File\+Exists (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption}) const}
+
+
+
+Determines if a file exists.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Option} & if 1, assume this is a request for a dbf file and check for the a dbt memo file also, returns true if both files are found\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True if both files exist~\newline
+ xb\+False if file does not exist
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a7fa837938a32dc9ca3fbc81cbaf50f59}\label{classxb_1_1xbFile_a7fa837938a32dc9ca3fbc81cbaf50f59}}
+\index{xb::xbFile@{xb::xbFile}!FileIsOpen@{FileIsOpen}}
+\index{FileIsOpen@{FileIsOpen}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{FileIsOpen()}{FileIsOpen()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+File\+::\+File\+Is\+Open (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Determines if file is open.
+
+\begin{DoxyReturn}{Returns}
+xb\+True if file is open~\newline
+ xb\+False if file is not open
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a638e14262410a1627819f016a16cdce2}\label{classxb_1_1xbFile_a638e14262410a1627819f016a16cdce2}}
+\index{xb::xbFile@{xb::xbFile}!GetBlockSize@{GetBlockSize}}
+\index{GetBlockSize@{GetBlockSize}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetBlockSize()}{GetBlockSize()}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+File\+::\+Get\+Block\+Size (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the block size.
+
+\begin{DoxyReturn}{Returns}
+Block Size
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}\label{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}}
+\index{xb::xbFile@{xb::xbFile}!GetDataDirectory@{GetDataDirectory}}
+\index{GetDataDirectory@{GetDataDirectory}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetDataDirectory()}{GetDataDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Data\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the current data directory.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the current data directory where the database files are stored.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}\label{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}}
+\index{xb::xbFile@{xb::xbFile}!GetDefaultAutoCommit@{GetDefaultAutoCommit}}
+\index{GetDefaultAutoCommit@{GetDefaultAutoCommit}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetDefaultAutoCommit()}{GetDefaultAutoCommit()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Default\+Auto\+Commit (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the default auto commit setting.
+
+When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}Append\+Record().
+
+\begin{DoxyReturn}{Returns}
+xb\+True if auto commit is turned on~\newline
+ xb\+False is auto commit is turned off
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}\label{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}}
+\index{xb::xbFile@{xb::xbFile}!GetDefaultDateFormat@{GetDefaultDateFormat}}
+\index{GetDefaultDateFormat@{GetDefaultDateFormat}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetDefaultDateFormat()}{GetDefaultDateFormat()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Date\+Format (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the default date format.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the default date format.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}\label{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}}
+\index{xb::xbFile@{xb::xbFile}!GetDefaultLogDirectory@{GetDefaultLogDirectory}}
+\index{GetDefaultLogDirectory@{GetDefaultLogDirectory}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogDirectory()}{GetDefaultLogDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}\label{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}}
+\index{xb::xbFile@{xb::xbFile}!GetDefaultLogFileName@{GetDefaultLogFileName}}
+\index{GetDefaultLogFileName@{GetDefaultLogFileName}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogFileName()}{GetDefaultLogFileName()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_acd0fb2166b2bff7e8a1cf65a7bc8be1e}\label{classxb_1_1xbFile_acd0fb2166b2bff7e8a1cf65a7bc8be1e}}
+\index{xb::xbFile@{xb::xbFile}!GetDirectory@{GetDirectory}}
+\index{GetDirectory@{GetDirectory}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetDirectory()}{GetDirectory()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+File\+::\+Get\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the directory name.
+
+\begin{DoxyReturn}{Returns}
+the directory name of the file
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}\label{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}}
+\index{xb::xbFile@{xb::xbFile}!GetEndianType@{GetEndianType}}
+\index{GetEndianType@{GetEndianType}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetEndianType()}{GetEndianType()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::\+Get\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the Endian type.
+
+\begin{DoxyReturn}{Returns}
+B -\/ Big endian~\newline
+ L -\/ Little endian~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}\label{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}}
+\index{xb::xbFile@{xb::xbFile}!GetErrorMessage@{GetErrorMessage}}
+\index{GetErrorMessage@{GetErrorMessage}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetErrorMessage()}{GetErrorMessage()}}
+{\footnotesize\ttfamily const char $\ast$ xb\+::xb\+Ssv\+::\+Get\+Error\+Message (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get an error message.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error\+Code is the error number of description to be returned. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Returns a pointer to a string containing a text description for the error code.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_af5127c92892816e9bbc5c19653c4147a}\label{classxb_1_1xbFile_af5127c92892816e9bbc5c19653c4147a}}
+\index{xb::xbFile@{xb::xbFile}!GetFileDirPart@{GetFileDirPart}}
+\index{GetFileDirPart@{GetFileDirPart}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFileDirPart()}{GetFileDirPart()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Dir\+Part (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Complete\+File\+Name\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Dir\+Part\+Out }\end{DoxyParamCaption}) const}
+
+
+
+Get the directory part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Complete\+File\+Name\+In} & -\/ a fully qualfied input file name \\
+\hline
+{\em s\+File\+Dir\+Part\+Out} & -\/ the returned directory name part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a60c53998e3d1b694134b20a87bc9bf5a}\label{classxb_1_1xbFile_a60c53998e3d1b694134b20a87bc9bf5a}}
+\index{xb::xbFile@{xb::xbFile}!GetFileDirPart@{GetFileDirPart}}
+\index{GetFileDirPart@{GetFileDirPart}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFileDirPart()}{GetFileDirPart()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Dir\+Part (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Dir\+Part\+Out }\end{DoxyParamCaption}) const}
+
+
+
+Get the directory part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Dir\+Part\+Out} & -\/ the returned directory name \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab289b6ffe955321160c1f90220c22e25}\label{classxb_1_1xbFile_ab289b6ffe955321160c1f90220c22e25}}
+\index{xb::xbFile@{xb::xbFile}!GetFileExtPart@{GetFileExtPart}}
+\index{GetFileExtPart@{GetFileExtPart}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFileExtPart()}{GetFileExtPart()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Ext\+Part (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Complete\+File\+Name\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Ext\+Part\+Out }\end{DoxyParamCaption}) const}
+
+
+
+Get the extension part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Complete\+File\+Name\+In} & -\/ a fully qualfied input file name\\
+\hline
+{\em s\+File\+Ext\+Part\+Out} & -\/ the returned directory name part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a57a9222e5cbb51019d4eeb2c3ac89fa2}\label{classxb_1_1xbFile_a57a9222e5cbb51019d4eeb2c3ac89fa2}}
+\index{xb::xbFile@{xb::xbFile}!GetFileExtPart@{GetFileExtPart}}
+\index{GetFileExtPart@{GetFileExtPart}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFileExtPart()}{GetFileExtPart()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Ext\+Part (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name\+Ext\+Out }\end{DoxyParamCaption}) const}
+
+
+
+Get the extension part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name\+Ext\+Out} & -\/ the returned extension part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a02df78f4c90313243f508fc56b95aba8}\label{classxb_1_1xbFile_a02df78f4c90313243f508fc56b95aba8}}
+\index{xb::xbFile@{xb::xbFile}!GetFileMtime@{GetFileMtime}}
+\index{GetFileMtime@{GetFileMtime}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFileMtime()}{GetFileMtime()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Mtime (\begin{DoxyParamCaption}\item[{time\+\_\+t \&}]{mtime }\end{DoxyParamCaption})}
+
+
+
+Get the time of last file modification timestamp as reported by the OS.
+
+
+\begin{DoxyParams}{Parameters}
+{\em mtime} & -\/ returned time of last file modification \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ac95cb882ccbcdedc9a233c6ad9fed07a}\label{classxb_1_1xbFile_ac95cb882ccbcdedc9a233c6ad9fed07a}}
+\index{xb::xbFile@{xb::xbFile}!GetFileName@{GetFileName}}
+\index{GetFileName@{GetFileName}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFileName()}{GetFileName()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+File\+::\+Get\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the file name.
+
+\begin{DoxyReturn}{Returns}
+the file name portion of the file
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a6110763c5ae996b72c7a62c15bdecc73}\label{classxb_1_1xbFile_a6110763c5ae996b72c7a62c15bdecc73}}
+\index{xb::xbFile@{xb::xbFile}!GetFileNamePart@{GetFileNamePart}}
+\index{GetFileNamePart@{GetFileNamePart}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFileNamePart()}{GetFileNamePart()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Name\+Part (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Complete\+File\+Name\+In, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name\+Part\+Out }\end{DoxyParamCaption}) const}
+
+
+
+Get the name part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Complete\+File\+Name\+In} & -\/ a fully qualified input file name \\
+\hline
+{\em s\+File\+Name\+Part\+Out} & -\/ the returned file name part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a81422b3dd52763d2cc6c77237ec9af0a}\label{classxb_1_1xbFile_a81422b3dd52763d2cc6c77237ec9af0a}}
+\index{xb::xbFile@{xb::xbFile}!GetFileNamePart@{GetFileNamePart}}
+\index{GetFileNamePart@{GetFileNamePart}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFileNamePart()}{GetFileNamePart()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Name\+Part (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name\+Part\+Out }\end{DoxyParamCaption}) const}
+
+
+
+Get the name part of the file name.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name\+Part\+Out} & -\/ the returned file name part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a50b63c39e49d44e52078038027b24cc5}\label{classxb_1_1xbFile_a50b63c39e49d44e52078038027b24cc5}}
+\index{xb::xbFile@{xb::xbFile}!GetFileSize@{GetFileSize}}
+\index{GetFileSize@{GetFileSize}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFileSize()}{GetFileSize()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Size (\begin{DoxyParamCaption}\item[{xb\+UInt64 \&}]{ull\+File\+Size }\end{DoxyParamCaption})}
+
+
+
+Get the size of the file as reported by the OS.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ull\+File\+Size} & -\/ unsigned long long field as output \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a5548236d38d43b89ae29b9a015b1f678}\label{classxb_1_1xbFile_a5548236d38d43b89ae29b9a015b1f678}}
+\index{xb::xbFile@{xb::xbFile}!GetFileType@{GetFileType}}
+\index{GetFileType@{GetFileType}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFileType()}{GetFileType()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+File\+Type (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Type\+Out }\end{DoxyParamCaption}) const}
+
+
+
+Get the file type aka Capitalized file extension.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Type\+Out} & -\/ the returned extension part out of s\+Complete\+File\+Name\+In \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a31b4e641f93206ba23e2a5a27491dcd4}\label{classxb_1_1xbFile_a31b4e641f93206ba23e2a5a27491dcd4}}
+\index{xb::xbFile@{xb::xbFile}!GetFqFileName@{GetFqFileName}}
+\index{GetFqFileName@{GetFqFileName}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetFqFileName()}{GetFqFileName()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+File\+::\+Get\+Fq\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the fully qualified file name.
+
+\begin{DoxyReturn}{Returns}
+the fully qualfied name of the file
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}\label{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}}
+\index{xb::xbFile@{xb::xbFile}!GetMultiUser@{GetMultiUser}}
+\index{GetMultiUser@{GetMultiUser}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetMultiUser()}{GetMultiUser()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Multi\+User (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the multi user setting.
+
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Multi user mode turned on.~\newline
+ xb\+False -\/ Multi user mode turned off.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a3c500dc9dac22c49496e4b29386b2dd3}\label{classxb_1_1xbFile_a3c500dc9dac22c49496e4b29386b2dd3}}
+\index{xb::xbFile@{xb::xbFile}!GetOpenMode@{GetOpenMode}}
+\index{GetOpenMode@{GetOpenMode}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetOpenMode()}{GetOpenMode()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+Open\+Mode (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the open mode of the file.
+
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+READ~\newline
+ XB\+\_\+\+READ\+\_\+\+WRITE~\newline
+ XB\+\_\+\+WRITE~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a9b63e05b77f477ff6109ff7b9432c1b6}\label{classxb_1_1xbFile_a9b63e05b77f477ff6109ff7b9432c1b6}}
+\index{xb::xbFile@{xb::xbFile}!GetShareMode@{GetShareMode}}
+\index{GetShareMode@{GetShareMode}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetShareMode()}{GetShareMode()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+Share\+Mode (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the share mode of the file.
+
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+SINGLE\+\_\+\+USER -\/ (file buffering on\texorpdfstring{$>$}{>}~\newline
+ XB\+\_\+\+MULTI\+\_\+\+USER -\/ (file buffering off)~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a7af337808919680b90710ad5e8a99232}\label{classxb_1_1xbFile_a7af337808919680b90710ad5e8a99232}}
+\index{xb::xbFile@{xb::xbFile}!GetXbaseFileTypeByte@{GetXbaseFileTypeByte}}
+\index{GetXbaseFileTypeByte@{GetXbaseFileTypeByte}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetXbaseFileTypeByte()}{GetXbaseFileTypeByte()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+Xbase\+File\+Type\+Byte (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{unsigned char \&}]{c\+File\+Type\+Byte }\end{DoxyParamCaption})}
+
+
+
+Get the file type byte and version of the dbf file.
+
+Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ Name of file to examine \\
+\hline
+{\em c\+File\+Type\+Byte} & -\/ Retruned first byte of dbf file \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a78aebdd21d3de46a450d5f835e3027f6}\label{classxb_1_1xbFile_a78aebdd21d3de46a450d5f835e3027f6}}
+\index{xb::xbFile@{xb::xbFile}!GetXbaseFileTypeByte@{GetXbaseFileTypeByte}}
+\index{GetXbaseFileTypeByte@{GetXbaseFileTypeByte}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetXbaseFileTypeByte()}{GetXbaseFileTypeByte()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+Xbase\+File\+Type\+Byte (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{unsigned char \&}]{c\+File\+Type\+Byte, }\item[{xb\+Int16 \&}]{i\+Version }\end{DoxyParamCaption})}
+
+
+
+Get the file type byte and version of the dbf file.
+
+Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ Name of file to examine \\
+\hline
+{\em c\+File\+Type\+Byte} & -\/ Returned first byte of dbf file \\
+\hline
+{\em i\+Version} & -\/ Returned file version \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_aaf2e697751a0beff41432a66bb83fb5e}\label{classxb_1_1xbFile_aaf2e697751a0beff41432a66bb83fb5e}}
+\index{xb::xbFile@{xb::xbFile}!GetXbaseFileTypeByte@{GetXbaseFileTypeByte}}
+\index{GetXbaseFileTypeByte@{GetXbaseFileTypeByte}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{GetXbaseFileTypeByte()}{GetXbaseFileTypeByte()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Get\+Xbase\+File\+Type\+Byte (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{xb\+Int16 \&}]{i\+Version }\end{DoxyParamCaption})}
+
+
+
+Get the file type byte and version of the dbf file.
+
+Pull the first bye off the DBF file for further inspection. First byte has various bits set to determine what the file format is.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ Name of file to examine \\
+\hline
+{\em i\+Version} & -\/ Returned file version \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a361e3cc318bbf1c4d10f069e0800a24e}\label{classxb_1_1xbFile_a361e3cc318bbf1c4d10f069e0800a24e}}
+\index{xb::xbFile@{xb::xbFile}!NameSuffixMissing@{NameSuffixMissing}}
+\index{NameSuffixMissing@{NameSuffixMissing}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{NameSuffixMissing()}{NameSuffixMissing()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Name\+Suffix\+Missing (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption}) const}
+
+
+
+Determines status of file extension.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ Name of file to examine \\
+\hline
+{\em i\+Option} & -\/ Inspection type~\newline
+ 1 check for DBF~\newline
+ 2 check for NDX~\newline
+ 3 check for MDX~\newline
+ 4 check for NTX~\newline
+\\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+0 if suffix found~\newline
+ 1 if suffix not found, lower case~\newline
+ 2 is suffix not found, upper case~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_aa1bb80340abc7a5c22f87f878e9dc825}\label{classxb_1_1xbFile_aa1bb80340abc7a5c22f87f878e9dc825}}
+\index{xb::xbFile@{xb::xbFile}!ReadBlock@{ReadBlock}}
+\index{ReadBlock@{ReadBlock}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{ReadBlock()}{ReadBlock()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Read\+Block (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Block\+No, }\item[{size\+\_\+t}]{l\+Read\+Size, }\item[{void $\ast$}]{buf }\end{DoxyParamCaption})}
+
+
+
+Read a block of data from file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Block\+No} & -\/ block number to read \\
+\hline
+{\em l\+Read\+Size} & -\/ size of data to read at block location, set to 0 to read blocksize \\
+\hline
+{\em $\ast$buf} & -\/ pointer to buffer to write output data, assumed to be previosuly allocated and large enough to contain data \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_aef696b1c4c0ef5338e818599f695d485}\label{classxb_1_1xbFile_aef696b1c4c0ef5338e818599f695d485}}
+\index{xb::xbFile@{xb::xbFile}!ReadBlock@{ReadBlock}}
+\index{ReadBlock@{ReadBlock}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{ReadBlock()}{ReadBlock()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Read\+Block (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Block\+No, }\item[{xb\+UInt32}]{ul\+Block\+Size, }\item[{size\+\_\+t}]{l\+Read\+Size, }\item[{void $\ast$}]{buf }\end{DoxyParamCaption})}
+
+
+
+Read a block of data from file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Block\+No} & -\/ block number to read \\
+\hline
+{\em ul\+Block\+Size} & -\/ block size \\
+\hline
+{\em l\+Read\+Size} & -\/ size of data to read at block location, set to 0 to read blocksize \\
+\hline
+{\em buf} & -\/ pointer to buffer to write output data, assumed to be previosuly allocated and large enough to contain data \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a991c5676a6f38fa752435390989f413e}\label{classxb_1_1xbFile_a991c5676a6f38fa752435390989f413e}}
+\index{xb::xbFile@{xb::xbFile}!SetBlockSize@{SetBlockSize}}
+\index{SetBlockSize@{SetBlockSize}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{SetBlockSize()}{SetBlockSize()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Set\+Block\+Size (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Block\+Size }\end{DoxyParamCaption})}
+
+
+
+Set the block size.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Block\+Size} & -\/ unsigned long block size, divisible by 512 \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}\label{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}}
+\index{xb::xbFile@{xb::xbFile}!SetDataDirectory@{SetDataDirectory}}
+\index{SetDataDirectory@{SetDataDirectory}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{SetDataDirectory()}{SetDataDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Data\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Data\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the data directory.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Data\+Directory} & Set the data direcroty. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}\label{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}}
+\index{xb::xbFile@{xb::xbFile}!SetDefaultAutoCommit@{SetDefaultAutoCommit}}
+\index{SetDefaultAutoCommit@{SetDefaultAutoCommit}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{SetDefaultAutoCommit()}{SetDefaultAutoCommit()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Auto\+Commit (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Default\+Auto\+Commit }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the default auto commit.
+
+Disabling auto commit requires the application execute explicit updates using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}Append\+Record(). With auto commit on, the library posts updates automatically when moving off the current record or closing a file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Default\+Auto\+Commit} & xb\+True -\/ Enable default auto commit.~\newline
+ xb\+False -\/ Disable default auto commit.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}\label{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}}
+\index{xb::xbFile@{xb::xbFile}!SetDefaultDateFormat@{SetDefaultDateFormat}}
+\index{SetDefaultDateFormat@{SetDefaultDateFormat}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{SetDefaultDateFormat()}{SetDefaultDateFormat()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Date\+Format (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Date\+Format }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the default date format.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Default\+Date\+Format} & Set the default date format. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}\label{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}}
+\index{xb::xbFile@{xb::xbFile}!SetDefaultLogDirectory@{SetDefaultLogDirectory}}
+\index{SetDefaultLogDirectory@{SetDefaultLogDirectory}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{SetDefaultLogDirectory()}{SetDefaultLogDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Log\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Log\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_ae78a85255488bc78964c16946dbaead3}\label{classxb_1_1xbFile_ae78a85255488bc78964c16946dbaead3}}
+\index{xb::xbFile@{xb::xbFile}!SetDirectory@{SetDirectory}}
+\index{SetDirectory@{SetDirectory}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{SetDirectory()}{SetDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::\+Set\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Directory }\end{DoxyParamCaption})}
+
+
+
+Set the directory.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Directory} & -\/ Valid directory name \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}\label{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}}
+\index{xb::xbFile@{xb::xbFile}!SetEndianType@{SetEndianType}}
+\index{SetEndianType@{SetEndianType}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{SetEndianType()}{SetEndianType()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+
+
+Set the endian type.
+
+This routine determines the Endian-\/ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. \mbox{\Hypertarget{classxb_1_1xbFile_a5419eb27e56822f828b2b88a9502a636}\label{classxb_1_1xbFile_a5419eb27e56822f828b2b88a9502a636}}
+\index{xb::xbFile@{xb::xbFile}!SetFileName@{SetFileName}}
+\index{SetFileName@{SetFileName}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{SetFileName()}{SetFileName()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::\+Set\+File\+Name (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name }\end{DoxyParamCaption})}
+
+
+
+Set the filename.
+
+This routine builds out two internal variables from the input file name~\newline
+ s\+File\+Name -\/ the file name part~\newline
+ s\+Fq\+File\+Name -\/ the fully qualified file name~\newline
+
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name} & -\/ Input file name \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_aee832fa11db2077a532f49e1329bd05a}\label{classxb_1_1xbFile_aee832fa11db2077a532f49e1329bd05a}}
+\index{xb::xbFile@{xb::xbFile}!SetFqFileName@{SetFqFileName}}
+\index{SetFqFileName@{SetFqFileName}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{SetFqFileName()}{SetFqFileName()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::\+Set\+Fq\+File\+Name (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Fq\+File\+Name }\end{DoxyParamCaption})}
+
+
+
+Set the fully qualifed filename.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Fq\+File\+Name} & -\/ Fully qualifed input file name \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}\label{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}}
+\index{xb::xbFile@{xb::xbFile}!SetMultiUser@{SetMultiUser}}
+\index{SetMultiUser@{SetMultiUser}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{SetMultiUser()}{SetMultiUser()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Multi\+User (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Multi\+User }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the multi user setting.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Multi\+User} & xb\+True -\/ Turn on Multi user mode.~\newline
+ xb\+False -\/ Turn off Multi user mode.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbFile_a5d871dcfecc2b4338f7a13722aab766c}\label{classxb_1_1xbFile_a5d871dcfecc2b4338f7a13722aab766c}}
+\index{xb::xbFile@{xb::xbFile}!WriteBlock@{WriteBlock}}
+\index{WriteBlock@{WriteBlock}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{WriteBlock()}{WriteBlock()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::\+Write\+Block (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Block\+No, }\item[{size\+\_\+t}]{l\+Write\+Size, }\item[{void $\ast$}]{buf }\end{DoxyParamCaption})}
+
+
+
+Write a block of data to file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Block\+No} & -\/ block number to write \\
+\hline
+{\em l\+Write\+Size} & -\/ size of data to write, set to 0 to write blocksize \\
+\hline
+{\em $\ast$buf} & -\/ pointer to buffer of data to be written \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a18830b5755d74818f60d9c7ce38ddf2d}\label{classxb_1_1xbFile_a18830b5755d74818f60d9c7ce38ddf2d}}
+\index{xb::xbFile@{xb::xbFile}!xbFclose@{xbFclose}}
+\index{xbFclose@{xbFclose}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFclose()}{xbFclose()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fclose (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fclose.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_af5b6356832d2a67212070a1aa605f170}\label{classxb_1_1xbFile_af5b6356832d2a67212070a1aa605f170}}
+\index{xb::xbFile@{xb::xbFile}!xbFeof@{xbFeof}}
+\index{xbFeof@{xbFeof}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFeof()}{xbFeof()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Feof (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary feof.
+
+\begin{DoxyReturn}{Returns}
+non zero if end-\/of-\/file is set for the stream.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ad205184d43409f04216540ae22f15009}\label{classxb_1_1xbFile_ad205184d43409f04216540ae22f15009}}
+\index{xb::xbFile@{xb::xbFile}!xbFflush@{xbFflush}}
+\index{xbFflush@{xbFflush}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFflush()}{xbFflush()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fflush (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fflush.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a5ee229bda4d7d6695e122200e581e7a6}\label{classxb_1_1xbFile_a5ee229bda4d7d6695e122200e581e7a6}}
+\index{xb::xbFile@{xb::xbFile}!xbFgetc@{xbFgetc}}
+\index{xbFgetc@{xbFgetc}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFgetc()}{xbFgetc()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fgetc (\begin{DoxyParamCaption}\item[{char \&}]{c }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fgetc.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & -\/ output character returned by fgetc \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_afb1c584d2895ffb7834df80aea7eb1e4}\label{classxb_1_1xbFile_afb1c584d2895ffb7834df80aea7eb1e4}}
+\index{xb::xbFile@{xb::xbFile}!xbFgetc@{xbFgetc}}
+\index{xbFgetc@{xbFgetc}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFgetc()}{xbFgetc()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fgetc (\begin{DoxyParamCaption}\item[{xb\+Int32 \&}]{c }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fgetc.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & -\/ output integer returned by fgetc \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ad245955ace26e5dde85fd4373b30d026}\label{classxb_1_1xbFile_ad245955ace26e5dde85fd4373b30d026}}
+\index{xb::xbFile@{xb::xbFile}!xbFgets@{xbFgets}}
+\index{xbFgets@{xbFgets}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFgets()}{xbFgets()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fgets (\begin{DoxyParamCaption}\item[{size\+\_\+t}]{l\+Size, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fgets.
+
+
+\begin{DoxyParams}{Parameters}
+{\em l\+Size} & -\/ reads in at most, one character less than l\+Size \\
+\hline
+{\em s} & -\/ an \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing data returned by fseek \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab0fa19686ca8953ff4b556fb5b249135}\label{classxb_1_1xbFile_ab0fa19686ca8953ff4b556fb5b249135}}
+\index{xb::xbFile@{xb::xbFile}!xbFopen@{xbFopen}}
+\index{xbFopen@{xbFopen}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFopen()}{xbFopen()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fopen (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Open\+Mode, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name, }\item[{xb\+Int16}]{i\+Share\+Mode }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fopen.
+
+This routine supports all the standard C library open modes. The Xbase routines only use \char`\"{}r\char`\"{} and \char`\"{}r+b\char`\"{}.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Open\+Mode} & {\begin{tabularx}{\linewidth}{|*{2}{>{\raggedright\arraybackslash}X|}}\hline
+\cellcolor{\tableheadbgcolor}\textbf{ Open\+Mode}&\cellcolor{\tableheadbgcolor}\textbf{ Description }\\\cline{1-2}
+r&Reading \\\cline{1-2}
+r+&Reading and Writing \\\cline{1-2}
+w&Open for writing. Truncate to zero bytes if it exists \\\cline{1-2}
+w+&Open for reading and writing, truncate to zero bytes if it exists \\\cline{1-2}
+a&Open for append \\\cline{1-2}
+a+&Open for reading and writing (at end). \\\cline{1-2}
+\end{tabularx}}
+The mode can also include the letter \char`\"{}b\char`\"{} for binary ie; \char`\"{}r+b\char`\"{}. The \char`\"{}b\char`\"{} is ignored on POSIX compliant systems, but is included for cross platform compatibility. \\
+\hline
+{\em s\+File\+Name} & File name to open \\
+\hline
+{\em i\+Share\+Mode} & XB\+\_\+\+SINGLE\+\_\+\+USER~\newline
+ XB\+\_\+\+MULTI\+\_\+\+USER~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a0548cedf0f26b7d8ac221f75b0cd048c}\label{classxb_1_1xbFile_a0548cedf0f26b7d8ac221f75b0cd048c}}
+\index{xb::xbFile@{xb::xbFile}!xbFopen@{xbFopen}}
+\index{xbFopen@{xbFopen}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFopen()}{xbFopen()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fopen (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Open\+Mode, }\item[{xb\+Int16}]{i\+Share\+Mode }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fopen.
+
+This routine supports all the standard C library open modes. The Xbase routines only use \char`\"{}r\char`\"{} and \char`\"{}r+\char`\"{}.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Open\+Mode} & {\begin{tabularx}{\linewidth}{|*{2}{>{\raggedright\arraybackslash}X|}}\hline
+\cellcolor{\tableheadbgcolor}\textbf{ Open\+Mode}&\cellcolor{\tableheadbgcolor}\textbf{ Description }\\\cline{1-2}
+r&Reading \\\cline{1-2}
+r+&Reading and Writing \\\cline{1-2}
+w&Open for writing. Truncate to zero bytes if it exists \\\cline{1-2}
+w+&Open for reading and writing, truncate to zero bytes if it exists \\\cline{1-2}
+a&Open for append \\\cline{1-2}
+a+&Open for reading and writing (at end). \\\cline{1-2}
+\end{tabularx}}
+The mode can also include the letter \char`\"{}b\char`\"{} for binary ie; \char`\"{}r+b\char`\"{}. The \char`\"{}b\char`\"{} is ignored on POSIX compliant systems, but is included for cross platform compatibility. \\
+\hline
+{\em i\+Share\+Mode} & XB\+\_\+\+SINGLE\+\_\+\+USER~\newline
+ XB\+\_\+\+MULTI\+\_\+\+USER~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a7cdfef5ede9ac98d44a28a6b7a70972c}\label{classxb_1_1xbFile_a7cdfef5ede9ac98d44a28a6b7a70972c}}
+\index{xb::xbFile@{xb::xbFile}!xbFopen@{xbFopen}}
+\index{xbFopen@{xbFopen}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFopen()}{xbFopen()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fopen (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Open\+Mode }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_aabd113333b49c36cad23244b392baab4}\label{classxb_1_1xbFile_aabd113333b49c36cad23244b392baab4}}
+\index{xb::xbFile@{xb::xbFile}!xbFopen@{xbFopen}}
+\index{xbFopen@{xbFopen}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFopen()}{xbFopen()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fopen (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Open\+Mode, }\item[{xb\+Int16}]{i\+Share\+Mode }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fopen.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Open\+Mode} & XB\+\_\+\+READ~\newline
+ XB\+\_\+\+READ\+\_\+\+WRITE~\newline
+ \\
+\hline
+{\em i\+Share\+Mode} & XB\+\_\+\+SINGLE\+\_\+\+USER~\newline
+ XB\+\_\+\+MULTI\+\_\+\+USER~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_af2e940c78956e5cb6824f9a1bc404896}\label{classxb_1_1xbFile_af2e940c78956e5cb6824f9a1bc404896}}
+\index{xb::xbFile@{xb::xbFile}!xbFputc@{xbFputc}}
+\index{xbFputc@{xbFputc}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFputc()}{xbFputc()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fputc (\begin{DoxyParamCaption}\item[{xb\+Int32}]{c }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fputc.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Character to write \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a863f74cf17df8186d88586b4d2a6441a}\label{classxb_1_1xbFile_a863f74cf17df8186d88586b4d2a6441a}}
+\index{xb::xbFile@{xb::xbFile}!xbFputc@{xbFputc}}
+\index{xbFputc@{xbFputc}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFputc()}{xbFputc()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fputc (\begin{DoxyParamCaption}\item[{xb\+Int32}]{c, }\item[{xb\+Int32}]{i\+No\+Of\+Times }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fputc.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Character to write \\
+\hline
+{\em i\+No\+Of\+Times} & Number of times to write the character \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a698f3b40216778562e639e6ca1a47573}\label{classxb_1_1xbFile_a698f3b40216778562e639e6ca1a47573}}
+\index{xb::xbFile@{xb::xbFile}!xbFputs@{xbFputs}}
+\index{xbFputs@{xbFputs}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFputs()}{xbFputs()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fputs (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fputs.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} to write to file \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab4f6afaa1f77539f27a4f05c26e54e2f}\label{classxb_1_1xbFile_ab4f6afaa1f77539f27a4f05c26e54e2f}}
+\index{xb::xbFile@{xb::xbFile}!xbFread@{xbFread}}
+\index{xbFread@{xbFread}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFread()}{xbFread()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fread (\begin{DoxyParamCaption}\item[{void $\ast$}]{p, }\item[{size\+\_\+t}]{size, }\item[{size\+\_\+t}]{nmemb }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fread.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & Pointer to data to write \\
+\hline
+{\em size} & size of write \\
+\hline
+{\em nmemb} & Number of times to write it \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a5337ab8918df240910c0d19b4f298e3d}\label{classxb_1_1xbFile_a5337ab8918df240910c0d19b4f298e3d}}
+\index{xb::xbFile@{xb::xbFile}!xbFseek@{xbFseek}}
+\index{xbFseek@{xbFseek}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFseek()}{xbFseek()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fseek (\begin{DoxyParamCaption}\item[{xb\+Int64}]{l\+Offset, }\item[{xb\+Int32}]{i\+Whence }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fseek.
+
+
+\begin{DoxyParams}{Parameters}
+{\em l\+Offset} & Position in file to seek to \\
+\hline
+{\em i\+Whence} & SEEK\+\_\+\+SET -\/ from beginning of file~\newline
+ SEEK\+\_\+\+CUR -\/ from current position~\newline
+ SEEK\+\_\+\+END -\/ from end of file~\newline
+ \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a0e1c06aedfa7fbcb92e117f891edd13b}\label{classxb_1_1xbFile_a0e1c06aedfa7fbcb92e117f891edd13b}}
+\index{xb::xbFile@{xb::xbFile}!xbFtell@{xbFtell}}
+\index{xbFtell@{xbFtell}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFtell()}{xbFtell()}}
+{\footnotesize\ttfamily size\+\_\+t xb\+::xb\+File\+::xb\+Ftell (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary ftell.
+
+Returns the current file position. \begin{DoxyReturn}{Returns}
+Current file position.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a9891b792f585a696f38a5cf959e30918}\label{classxb_1_1xbFile_a9891b792f585a696f38a5cf959e30918}}
+\index{xb::xbFile@{xb::xbFile}!xbFTurnOffFileBuffering@{xbFTurnOffFileBuffering}}
+\index{xbFTurnOffFileBuffering@{xbFTurnOffFileBuffering}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFTurnOffFileBuffering()}{xbFTurnOffFileBuffering()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::xb\+FTurn\+Off\+File\+Buffering (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Turn off file buffering.
+
+Turns off file buffering. File buffering can\textquotesingle{}t be used while in multi user mode. \mbox{\Hypertarget{classxb_1_1xbFile_a6aadd871d1782944703fed773d44b85f}\label{classxb_1_1xbFile_a6aadd871d1782944703fed773d44b85f}}
+\index{xb::xbFile@{xb::xbFile}!xbFwrite@{xbFwrite}}
+\index{xbFwrite@{xbFwrite}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbFwrite()}{xbFwrite()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Fwrite (\begin{DoxyParamCaption}\item[{const void $\ast$}]{p, }\item[{size\+\_\+t}]{size, }\item[{size\+\_\+t}]{nmemb }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for standard libary fwrite.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p} & Pointer to data buffer to write \\
+\hline
+{\em size} & Size of data to write \\
+\hline
+{\em nmemb} & Number of times to write data buffer \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a08463f506f425c2385acbe1a561506e9}\label{classxb_1_1xbFile_a08463f506f425c2385acbe1a561506e9}}
+\index{xb::xbFile@{xb::xbFile}!xbReadUntil@{xbReadUntil}}
+\index{xbReadUntil@{xbReadUntil}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbReadUntil()}{xbReadUntil()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Read\+Until (\begin{DoxyParamCaption}\item[{const char}]{c\+Delim, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Out }\end{DoxyParamCaption})}
+
+
+
+Read file until a particular character is encountered on input stream.
+
+This routine will read until c\+Delim is encountered or eof, which ever occurs first.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c\+Delim} & Delimiter to stop writing at. \\
+\hline
+{\em s\+Out} & Output \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing data read \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab3c668a8570433188382d31d7c60bd48}\label{classxb_1_1xbFile_ab3c668a8570433188382d31d7c60bd48}}
+\index{xb::xbFile@{xb::xbFile}!xbRemove@{xbRemove}}
+\index{xbRemove@{xbRemove}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbRemove()}{xbRemove()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Remove (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Delete file.
+
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a58f6a6751fdf7e9549c273bb75d93eb5}\label{classxb_1_1xbFile_a58f6a6751fdf7e9549c273bb75d93eb5}}
+\index{xb::xbFile@{xb::xbFile}!xbRemove@{xbRemove}}
+\index{xbRemove@{xbRemove}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbRemove()}{xbRemove()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Remove (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name\+In }\end{DoxyParamCaption})}
+
+
+
+Delete file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name\+In} & Name of file to delete \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a6d919366c2ec95e529906bf8842cbf07}\label{classxb_1_1xbFile_a6d919366c2ec95e529906bf8842cbf07}}
+\index{xb::xbFile@{xb::xbFile}!xbRemove@{xbRemove}}
+\index{xbRemove@{xbRemove}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbRemove()}{xbRemove()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Remove (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+File\+Name\+In, }\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})}
+
+
+
+Delete file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+File\+Name\+In} & Name of file to delete \\
+\hline
+{\em i\+Option} & If Set to 1, assume this is a delete request for a dbf file, and should rename the dbt file also \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_afc8ce113aa72611a278233f9bb170012}\label{classxb_1_1xbFile_afc8ce113aa72611a278233f9bb170012}}
+\index{xb::xbFile@{xb::xbFile}!xbRename@{xbRename}}
+\index{xbRename@{xbRename}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbRename()}{xbRename()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Rename (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Old\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+New\+Name }\end{DoxyParamCaption})}
+
+
+
+Rename file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Old\+Name} & Original file name \\
+\hline
+{\em s\+New\+Name} & New file name \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_ab0b2a2c88947921d98ebcb5b5ec34ed9}\label{classxb_1_1xbFile_ab0b2a2c88947921d98ebcb5b5ec34ed9}}
+\index{xb::xbFile@{xb::xbFile}!xbRename@{xbRename}}
+\index{xbRename@{xbRename}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbRename()}{xbRename()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Rename (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Old\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+New\+Name, }\item[{xb\+Int16}]{i\+Option }\end{DoxyParamCaption})}
+
+
+
+Rename file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Old\+Name} & Original file name \\
+\hline
+{\em s\+New\+Name} & New file name \\
+\hline
+{\em i\+Option} & If Set to 1, assume this is a rename request for a dbf file, and should rename the dbt file also \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbFile_a7996b6e084665c37c3892faea64b3505}\label{classxb_1_1xbFile_a7996b6e084665c37c3892faea64b3505}}
+\index{xb::xbFile@{xb::xbFile}!xbRewind@{xbRewind}}
+\index{xbRewind@{xbRewind}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbRewind()}{xbRewind()}}
+{\footnotesize\ttfamily void xb\+::xb\+File\+::xb\+Rewind (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for rewind.
+
+Set file pointer at beginning of file. \mbox{\Hypertarget{classxb_1_1xbFile_a518bfcbfa3699d883cf89affee383296}\label{classxb_1_1xbFile_a518bfcbfa3699d883cf89affee383296}}
+\index{xb::xbFile@{xb::xbFile}!xbTruncate@{xbTruncate}}
+\index{xbTruncate@{xbTruncate}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbTruncate()}{xbTruncate()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+File\+::xb\+Truncate (\begin{DoxyParamCaption}\item[{xb\+Int64}]{ll\+Size }\end{DoxyParamCaption})}
+
+
+
+Xbase wrapper for ftruncate.
+
+Set file size to ll\+Size
+\begin{DoxyParams}{Parameters}
+{\em ll\+Size} & New file size. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+
+
+\doxysubsection{Field Documentation}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}\label{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}}
+\index{xb::xbFile@{xb::xbFile}!ErrorCodeText@{ErrorCodeText}}
+\index{ErrorCodeText@{ErrorCodeText}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{ErrorCodeText}{ErrorCodeText}}
+{\footnotesize\ttfamily const char$\ast$ xb\+::xb\+Ssv\+::\+Error\+Code\+Text\mbox{[}$\,$\mbox{]}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}\label{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}}
+\index{xb::xbFile@{xb::xbFile}!iEndianType@{iEndianType}}
+\index{iEndianType@{iEndianType}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{iEndianType}{iEndianType}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::i\+Endian\+Type = 0\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}\label{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}}
+\index{xb::xbFile@{xb::xbFile}!sNullString@{sNullString}}
+\index{sNullString@{sNullString}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{sNullString}{sNullString}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+Ssv\+::s\+Null\+String = \char`\"{}\char`\"{}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbFile_ae39a67ea391b46055d4ca299cb222004}\label{classxb_1_1xbFile_ae39a67ea391b46055d4ca299cb222004}}
+\index{xb::xbFile@{xb::xbFile}!xbase@{xbase}}
+\index{xbase@{xbase}!xb::xbFile@{xb::xbFile}}
+\doxysubsubsection{\texorpdfstring{xbase}{xbase}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}}$\ast$ xb\+::xb\+File\+::xbase\hspace{0.3cm}{\ttfamily [protected]}}
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbfile_8h}{xbfile.\+h}}\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbfile_8cpp}{xbfile.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/classxb_1_1xbSsv.eps b/docs/doxygen/latex/classxb_1_1xbSsv.eps
new file mode 100644
index 0000000..2cceb9d
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbSsv.eps
@@ -0,0 +1,219 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: ClassName
+%%Creator: Doxygen
+%%CreationDate: Time
+%%For:
+%Magnification: 1.00
+%%Orientation: Portrait
+%%BoundingBox: 0 0 500 217.391312
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%EndComments
+
+% ----- variables -----
+
+/boxwidth 0 def
+/boxheight 40 def
+/fontheight 24 def
+/marginwidth 10 def
+/distx 20 def
+/disty 40 def
+/boundaspect 2.300000 def % aspect ratio of the BoundingBox (width/height)
+/boundx 500 def
+/boundy boundx boundaspect div def
+/xspacing 0 def
+/yspacing 0 def
+/rows 3 def
+/cols 3 def
+/scalefactor 0 def
+/boxfont /Times-Roman findfont fontheight scalefont def
+
+% ----- procedures -----
+
+/dotted { [1 4] 0 setdash } def
+/dashed { [5] 0 setdash } def
+/solid { [] 0 setdash } def
+
+/max % result = MAX(arg1,arg2)
+{
+ /a exch def
+ /b exch def
+ a b gt {a} {b} ifelse
+} def
+
+/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)
+{
+ 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max
+} def
+
+/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))
+{
+ /str exch def
+ /boxwidth boxwidth str stringwidth pop max def
+} def
+
+/box % draws a box with text 'arg1' at grid pos (arg2,arg3)
+{ gsave
+ 2 setlinewidth
+ newpath
+ exch xspacing mul xoffset add
+ exch yspacing mul
+ moveto
+ boxwidth 0 rlineto
+ 0 boxheight rlineto
+ boxwidth neg 0 rlineto
+ 0 boxheight neg rlineto
+ closepath
+ dup stringwidth pop neg boxwidth add 2 div
+ boxheight fontheight 2 div sub 2 div
+ rmoveto show stroke
+ grestore
+} def
+
+/mark
+{ newpath
+ exch xspacing mul xoffset add boxwidth add
+ exch yspacing mul
+ moveto
+ 0 boxheight 4 div rlineto
+ boxheight neg 4 div boxheight neg 4 div rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/arrow
+{ newpath
+ moveto
+ 3 -8 rlineto
+ -6 0 rlineto
+ 3 8 rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/out % draws an output connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight add
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/in % draws an input connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul disty 2 div sub
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/hedge
+{
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight 2 div sub
+ /y exch def
+ /x exch def
+ newpath
+ x y moveto
+ boxwidth 2 div distx add 0 rlineto
+ stroke
+ 1 eq
+ { newpath x boxwidth 2 div distx add add y moveto
+ -8 3 rlineto
+ 0 -6 rlineto
+ 8 3 rlineto
+ closepath
+ eofill
+ stroke
+ } if
+} def
+
+/vedge
+{
+ /ye exch def
+ /ys exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add dup
+ ys yspacing mul boxheight 2 div sub
+ moveto
+ ye yspacing mul boxheight 2 div sub
+ lineto
+ stroke
+} def
+
+/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3'
+{
+ /ys exch def
+ /xe exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add
+ ys yspacing mul disty 2 div sub
+ moveto
+ xspacing xe xs sub mul 0
+ rlineto
+ stroke
+} def
+
+% ----- main ------
+
+boxfont setfont
+1 boundaspect scale
+(xb::xbSsv) cw
+(xb::xbDate) cw
+(xb::xbFile) cw
+(xb::xbTblMgr) cw
+(xb::xbDbf) cw
+(xb::xbXBase) cw
+/boxwidth boxwidth marginwidth 2 mul add def
+/xspacing boxwidth distx add def
+/yspacing boxheight disty add def
+/scalefactor
+ boxwidth cols mul distx cols 1 sub mul add
+ boxheight rows mul disty rows 1 sub mul add boundaspect mul
+ max def
+boundx scalefactor div boundy scalefactor div scale
+
+% ----- classes -----
+
+ (xb::xbSsv) 1.000000 2.000000 box
+ (xb::xbDate) 0.000000 1.000000 box
+ (xb::xbFile) 1.000000 1.000000 box
+ (xb::xbTblMgr) 2.000000 1.000000 box
+ (xb::xbDbf) 1.000000 0.000000 box
+ (xb::xbXBase) 2.000000 0.000000 box
+
+% ----- relations -----
+
+solid
+1 1.000000 1.250000 out
+solid
+0.000000 2.000000 2.000000 conn
+solid
+0 0.000000 1.750000 in
+solid
+0 1.000000 1.750000 in
+solid
+1 1.000000 0.250000 out
+solid
+0 2.000000 1.750000 in
+solid
+1 2.000000 0.250000 out
+solid
+0 1.000000 0.750000 in
+solid
+0 2.000000 0.750000 in
diff --git a/docs/doxygen/latex/classxb_1_1xbSsv.pdf b/docs/doxygen/latex/classxb_1_1xbSsv.pdf
new file mode 100644
index 0000000..9e9391f
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbSsv.pdf
Binary files differ
diff --git a/docs/doxygen/latex/classxb_1_1xbSsv.tex b/docs/doxygen/latex/classxb_1_1xbSsv.tex
new file mode 100644
index 0000000..fd829bb
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbSsv.tex
@@ -0,0 +1,339 @@
+\hypertarget{classxb_1_1xbSsv}{}\doxysection{xb\+::xb\+Ssv Class Reference}
+\label{classxb_1_1xbSsv}\index{xb::xbSsv@{xb::xbSsv}}
+
+
+Class for handling shared system variables.
+
+
+
+
+{\ttfamily \#include $<$xbssv.\+h$>$}
+
+Inheritance diagram for xb\+::xb\+Ssv\+:\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[height=3.000000cm]{classxb_1_1xbSsv}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classxb_1_1xbSsv_a58f85692c3167af20b1a7c17c621523b}{xb\+Ssv}} ()
+\begin{DoxyCompactList}\small\item\em Class Constructor. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}{Display\+Error}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Display error message on console for a given error number. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}{Get\+Default\+Date\+Format}} () const
+\begin{DoxyCompactList}\small\item\em Get the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}{Get\+Data\+Directory}} () const
+\begin{DoxyCompactList}\small\item\em Get the current data directory. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}{Get\+Endian\+Type}} () const
+\begin{DoxyCompactList}\small\item\em Get the Endian type. \end{DoxyCompactList}\item
+const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}{Get\+Error\+Message}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Get an error message. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}{Set\+Data\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Data\+Directory)
+\begin{DoxyCompactList}\small\item\em Set the data directory. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}{Set\+Default\+Date\+Format}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Date\+Format)
+\begin{DoxyCompactList}\small\item\em Set the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}{Bit\+Set}} (unsigned char c, xb\+Int16 i\+Bit\+No) const
+\begin{DoxyCompactList}\small\item\em Check a bit in a one byte field and see if it is set. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}{Get\+Default\+Auto\+Commit}} () const
+\begin{DoxyCompactList}\small\item\em Get the default auto commit setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}{Set\+Default\+Auto\+Commit}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Default\+Auto\+Commit)
+\begin{DoxyCompactList}\small\item\em Set the default auto commit. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}{Get\+Default\+Log\+Directory}} () const
+\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}{Get\+Default\+Log\+File\+Name}} () const
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}{Set\+Default\+Log\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Log\+Directory)
+\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}{Get\+Multi\+User}} () const
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}{Set\+Multi\+User}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Multi\+User)
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+static const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}{Error\+Code\+Text}} \mbox{[}$\,$\mbox{]}
+\end{DoxyCompactItemize}
+\doxysubsection*{Protected Member Functions}
+\begin{DoxyCompactItemize}
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}{Set\+Endian\+Type}} ()
+\begin{DoxyCompactList}\small\item\em Set the endian type. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Protected Attributes}
+\begin{DoxyCompactItemize}
+\item
+static xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}{i\+Endian\+Type}} = 0
+\item
+static \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}{s\+Null\+String}} = \char`\"{}\char`\"{}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Class for handling shared system variables.
+
+This class defines static variables which are referenced across class instances.
+
+This class is designed to have the variables set when the \mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} class constructor is called (\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} is a derived class). The xb\+Xbase class is designed to be called first in an application programs, and it is only called once. The static values in this class are typically initialized at program startup and don\textquotesingle{}t require additional updates.
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a58f85692c3167af20b1a7c17c621523b}\label{classxb_1_1xbSsv_a58f85692c3167af20b1a7c17c621523b}}
+\index{xb::xbSsv@{xb::xbSsv}!xbSsv@{xbSsv}}
+\index{xbSsv@{xbSsv}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{xbSsv()}{xbSsv()}}
+{\footnotesize\ttfamily xb\+::xb\+Ssv\+::xb\+Ssv (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Class Constructor.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}\label{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}}
+\index{xb::xbSsv@{xb::xbSsv}!BitSet@{BitSet}}
+\index{BitSet@{BitSet}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{BitSet()}{BitSet()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Bit\+Set (\begin{DoxyParamCaption}\item[{unsigned char}]{c, }\item[{xb\+Int16}]{i\+Bit\+No }\end{DoxyParamCaption}) const}
+
+
+
+Check a bit in a one byte field and see if it is set.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & One byte char field to examine. \\
+\hline
+{\em i\+Bit\+No} & which bit to examine. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True Bit is set~\newline
+ xb\+False Bit is not set
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}\label{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}}
+\index{xb::xbSsv@{xb::xbSsv}!DisplayError@{DisplayError}}
+\index{DisplayError@{DisplayError}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{DisplayError()}{DisplayError()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Display\+Error (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const}
+
+
+
+Display error message on console for a given error number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error number to reference \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}\label{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}}
+\index{xb::xbSsv@{xb::xbSsv}!GetDataDirectory@{GetDataDirectory}}
+\index{GetDataDirectory@{GetDataDirectory}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{GetDataDirectory()}{GetDataDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Data\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the current data directory.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the current data directory where the database files are stored.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}\label{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}}
+\index{xb::xbSsv@{xb::xbSsv}!GetDefaultAutoCommit@{GetDefaultAutoCommit}}
+\index{GetDefaultAutoCommit@{GetDefaultAutoCommit}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{GetDefaultAutoCommit()}{GetDefaultAutoCommit()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Default\+Auto\+Commit (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the default auto commit setting.
+
+When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}Append\+Record().
+
+\begin{DoxyReturn}{Returns}
+xb\+True if auto commit is turned on~\newline
+ xb\+False is auto commit is turned off
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}\label{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}}
+\index{xb::xbSsv@{xb::xbSsv}!GetDefaultDateFormat@{GetDefaultDateFormat}}
+\index{GetDefaultDateFormat@{GetDefaultDateFormat}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{GetDefaultDateFormat()}{GetDefaultDateFormat()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Date\+Format (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the default date format.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the default date format.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}\label{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}}
+\index{xb::xbSsv@{xb::xbSsv}!GetDefaultLogDirectory@{GetDefaultLogDirectory}}
+\index{GetDefaultLogDirectory@{GetDefaultLogDirectory}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogDirectory()}{GetDefaultLogDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}\label{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}}
+\index{xb::xbSsv@{xb::xbSsv}!GetDefaultLogFileName@{GetDefaultLogFileName}}
+\index{GetDefaultLogFileName@{GetDefaultLogFileName}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogFileName()}{GetDefaultLogFileName()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}\label{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}}
+\index{xb::xbSsv@{xb::xbSsv}!GetEndianType@{GetEndianType}}
+\index{GetEndianType@{GetEndianType}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{GetEndianType()}{GetEndianType()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::\+Get\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the Endian type.
+
+\begin{DoxyReturn}{Returns}
+B -\/ Big endian~\newline
+ L -\/ Little endian~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}\label{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}}
+\index{xb::xbSsv@{xb::xbSsv}!GetErrorMessage@{GetErrorMessage}}
+\index{GetErrorMessage@{GetErrorMessage}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{GetErrorMessage()}{GetErrorMessage()}}
+{\footnotesize\ttfamily const char $\ast$ xb\+::xb\+Ssv\+::\+Get\+Error\+Message (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const}
+
+
+
+Get an error message.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error\+Code is the error number of description to be returned. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Returns a pointer to a string containing a text description for the error code.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}\label{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}}
+\index{xb::xbSsv@{xb::xbSsv}!GetMultiUser@{GetMultiUser}}
+\index{GetMultiUser@{GetMultiUser}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{GetMultiUser()}{GetMultiUser()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Multi\+User (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the multi user setting.
+
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Multi user mode turned on.~\newline
+ xb\+False -\/ Multi user mode turned off.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}\label{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}}
+\index{xb::xbSsv@{xb::xbSsv}!SetDataDirectory@{SetDataDirectory}}
+\index{SetDataDirectory@{SetDataDirectory}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{SetDataDirectory()}{SetDataDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Data\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Data\+Directory }\end{DoxyParamCaption})}
+
+
+
+Set the data directory.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Data\+Directory} & Set the data direcroty. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}\label{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}}
+\index{xb::xbSsv@{xb::xbSsv}!SetDefaultAutoCommit@{SetDefaultAutoCommit}}
+\index{SetDefaultAutoCommit@{SetDefaultAutoCommit}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{SetDefaultAutoCommit()}{SetDefaultAutoCommit()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Auto\+Commit (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Default\+Auto\+Commit }\end{DoxyParamCaption})}
+
+
+
+Set the default auto commit.
+
+Disabling auto commit requires the application execute explicit updates using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}Append\+Record(). With auto commit on, the library posts updates automatically when moving off the current record or closing a file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Default\+Auto\+Commit} & xb\+True -\/ Enable default auto commit.~\newline
+ xb\+False -\/ Disable default auto commit.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}\label{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}}
+\index{xb::xbSsv@{xb::xbSsv}!SetDefaultDateFormat@{SetDefaultDateFormat}}
+\index{SetDefaultDateFormat@{SetDefaultDateFormat}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{SetDefaultDateFormat()}{SetDefaultDateFormat()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Date\+Format (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Date\+Format }\end{DoxyParamCaption})}
+
+
+
+Set the default date format.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Default\+Date\+Format} & Set the default date format. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}\label{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}}
+\index{xb::xbSsv@{xb::xbSsv}!SetDefaultLogDirectory@{SetDefaultLogDirectory}}
+\index{SetDefaultLogDirectory@{SetDefaultLogDirectory}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{SetDefaultLogDirectory()}{SetDefaultLogDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Log\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Log\+Directory }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}\label{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}}
+\index{xb::xbSsv@{xb::xbSsv}!SetEndianType@{SetEndianType}}
+\index{SetEndianType@{SetEndianType}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{SetEndianType()}{SetEndianType()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}}
+
+
+
+Set the endian type.
+
+This routine determines the Endian-\/ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. \mbox{\Hypertarget{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}\label{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}}
+\index{xb::xbSsv@{xb::xbSsv}!SetMultiUser@{SetMultiUser}}
+\index{SetMultiUser@{SetMultiUser}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{SetMultiUser()}{SetMultiUser()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Multi\+User (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Multi\+User }\end{DoxyParamCaption})}
+
+
+
+Get the multi user setting.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Multi\+User} & xb\+True -\/ Turn on Multi user mode.~\newline
+ xb\+False -\/ Turn off Multi user mode.~\newline
+ \\
+\hline
+\end{DoxyParams}
+
+
+\doxysubsection{Field Documentation}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}\label{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}}
+\index{xb::xbSsv@{xb::xbSsv}!ErrorCodeText@{ErrorCodeText}}
+\index{ErrorCodeText@{ErrorCodeText}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{ErrorCodeText}{ErrorCodeText}}
+{\footnotesize\ttfamily const char$\ast$ xb\+::xb\+Ssv\+::\+Error\+Code\+Text\mbox{[}$\,$\mbox{]}\hspace{0.3cm}{\ttfamily [static]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}\label{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}}
+\index{xb::xbSsv@{xb::xbSsv}!iEndianType@{iEndianType}}
+\index{iEndianType@{iEndianType}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{iEndianType}{iEndianType}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::i\+Endian\+Type = 0\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}\label{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}}
+\index{xb::xbSsv@{xb::xbSsv}!sNullString@{sNullString}}
+\index{sNullString@{sNullString}!xb::xbSsv@{xb::xbSsv}}
+\doxysubsubsection{\texorpdfstring{sNullString}{sNullString}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+Ssv\+::s\+Null\+String = \char`\"{}\char`\"{}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}}
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbssv_8h}{xbssv.\+h}}\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbssv_8cpp}{xbssv.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/classxb_1_1xbString.tex b/docs/doxygen/latex/classxb_1_1xbString.tex
new file mode 100644
index 0000000..1665042
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbString.tex
@@ -0,0 +1,1702 @@
+\hypertarget{classxb_1_1xbString}{}\doxysection{xb\+::xb\+String Class Reference}
+\label{classxb_1_1xbString}\index{xb::xbString@{xb::xbString}}
+
+
+Class for handling string data.
+
+
+
+
+{\ttfamily \#include $<$xbstring.\+h$>$}
+
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classxb_1_1xbString_a63f9313217e0ff3c9789ec59316216a1}{xb\+String}} (xb\+UInt32 size)
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString_a14bbaa293c8d40dd6c64332f2668a92e}{xb\+String}} (char c)
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString_a18f3598dcdf2ec5692274fc8ee769ad7}{xb\+String}} (const char $\ast$s, xb\+UInt32 l\+Max\+Len)
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString_a0d81016b93fc36ebbbafacf35c677f07}{xb\+String}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString_a25856311106c5fb15d39017b63f0ddc7}{xb\+String}} (const char $\ast$=\char`\"{}\char`\"{})
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString_ad865b55e3b08dffd527afee8e7e8e3fe}{xb\+String}} (\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} d)
+\begin{DoxyCompactList}\small\item\em Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString_a10a6549efab02bc76ab33b15916b1eb1}{$\sim$xb\+String}} ()
+\begin{DoxyCompactList}\small\item\em Destructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a4f69d11cbd43edf71725a606d0ca8f40}{operator=}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Set operator =. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a84ae7d16c5d73c5aa2270aa9895a7f7c}{operator=}} (const char $\ast$s)
+\begin{DoxyCompactList}\small\item\em Set operator =. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString_a545df0ae9590f0ea5844a165e38a6388}{operator const char $\ast$}} () const
+\begin{DoxyCompactList}\small\item\em Operator const char $\ast$. \end{DoxyCompactList}\item
+char \& \mbox{\hyperlink{classxb_1_1xbString_abe45e463226ac8e18550ced18c5a9df3}{operator\mbox{[}$\,$\mbox{]}}} (xb\+UInt32 n) const
+\begin{DoxyCompactList}\small\item\em operator \mbox{[}\mbox{]} \end{DoxyCompactList}\item
+char \& \mbox{\hyperlink{classxb_1_1xbString_a4deaa68d9571753349c29baacb5613e8}{operator\mbox{[}$\,$\mbox{]}}} (xb\+Int32 n) const
+\begin{DoxyCompactList}\small\item\em operator \mbox{[}\mbox{]} \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a76a47af239797a266ada6141c150001c}{operator+=}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Append operator +=. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_ab319120dbad9107e1e7090139c956100}{operator+=}} (const char $\ast$s)
+\begin{DoxyCompactList}\small\item\em Append operator +=. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_ae12f45b8be84e438e032c0b860f985c6}{operator+=}} (char c)
+\begin{DoxyCompactList}\small\item\em Append operator +=. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_aa7f4db1b4eae9dfad46346db6e17ea15}{operator-\/=}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Append operator -\/=. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_aaae97e6eda3d18c9f463993ade985bf4}{operator-\/=}} (const char $\ast$s)
+\begin{DoxyCompactList}\small\item\em Append operator -\/=. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_adcafd019df23bb5724c46e34f3f31194}{operator-\/=}} (char c)
+\begin{DoxyCompactList}\small\item\em Append operator -\/=. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_a2df3ed2fc9456214f5fd2fcf77b69bc1}{operator==}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&) const
+\begin{DoxyCompactList}\small\item\em operator == \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_a94031269af3c433393d4cf0ff9b4be38}{operator==}} (const char $\ast$) const
+\begin{DoxyCompactList}\small\item\em operator == \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_acf89691607050b0505dc6af28d059c38}{operator!=}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&) const
+\begin{DoxyCompactList}\small\item\em operator != \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_a822448f2a0ce653473d4c1de5763a3a6}{operator!=}} (const char $\ast$) const
+\begin{DoxyCompactList}\small\item\em operator != \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_a71c7aafa0d523c72cbe58c474be2270a}{operator$<$}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&) const
+\begin{DoxyCompactList}\small\item\em operator \texorpdfstring{$<$}{<} \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_ae46f6a45da5686b607a4edf2786a2fff}{operator$>$}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&) const
+\begin{DoxyCompactList}\small\item\em operator \texorpdfstring{$>$}{>} \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_a461f245e60cddfdf5f78a972a46e5880}{operator$<$=}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&) const
+\begin{DoxyCompactList}\small\item\em operator \texorpdfstring{$<$}{<}= \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_a8f16643cb7ba3ee9cf685422c9ea0e67}{operator$>$=}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&) const
+\begin{DoxyCompactList}\small\item\em operator \texorpdfstring{$>$}{>}= \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbString_a06abec236b95f6933ba17bf67089f7cf}{operator-\/}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Concatonate operator -\/. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbString_aab556e8c3cb478dd95643327d72a48bd}{operator+}} (const char $\ast$s)
+\begin{DoxyCompactList}\small\item\em Concatonate operator +. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbString_a1f289d577ba90c500bc1be3ec7bb0206}{operator+}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Concatonate operator +. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbString_af559654baba81c3c0c19823c0b7a69d3}{operator+}} (const char c)
+\begin{DoxyCompactList}\small\item\em Concatonate operator +. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a6c4fdb689d27a9d19a0b5b4236e1ca62}{Add\+Back\+Slash}} (char c)
+\begin{DoxyCompactList}\small\item\em Add a prefixing back slash to specified characters in the string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a8f202e4798491f2ae9ce51ff58dd5815}{Append}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Append data to string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a1922319303feb6da1f40b5994c5e8240}{Append}} (const char $\ast$s)
+\begin{DoxyCompactList}\small\item\em Append data to string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a097453cb71fbf0b5511cf1259ddce4fb}{Append}} (const char $\ast$s, xb\+UInt32 i\+Byte\+Count)
+\begin{DoxyCompactList}\small\item\em Append data to string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a093c6ab5df375a2589755bb8f48fa5c7}{Append}} (char c)
+\begin{DoxyCompactList}\small\item\em Append data to string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a85bef82dfa22122a1ab8dfe58a107d96}{Assign}} (const char $\ast$src\+Str, xb\+UInt32 l\+Start\+Pos, xb\+UInt32 l\+Copy\+Len)
+\begin{DoxyCompactList}\small\item\em Assign portion of string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a08eb7ca6740423acab4e8bd7a6c8043d}{Assign}} (const char $\ast$src\+Str, xb\+UInt32 l\+Start\+Pos)
+\begin{DoxyCompactList}\small\item\em Assign portion of string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a210707223fffc7b3ab31eca4ef29f731}{Assign}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s, xb\+UInt32 pos, xb\+UInt32 n)
+\begin{DoxyCompactList}\small\item\em Assign portion of string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_ab9045442e57293843652dfce6522ff83}{Assign}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s, xb\+UInt32 n)
+\begin{DoxyCompactList}\small\item\em Assign portion of string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbString_ac7a8466b03c04df838bd182ef244f792}{Copy}} () const
+\begin{DoxyCompactList}\small\item\em Copy a string. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbString_a26bc14d92dc7ce1f2bf31cd74af0db0f}{Count\+Char}} (char c) const
+\begin{DoxyCompactList}\small\item\em Count the number of characters in the string. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbString_adc0204bcfd1c052b9aea9229b10acf72}{Count\+Char}} (char c, xb\+Int16 i\+Opt) const
+\begin{DoxyCompactList}\small\item\em Count the number of characters in the string. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbString_a0a737bd408a94903f214eb2879eb56de}{Cvt\+Hex\+Char}} (char \&c\+Out)
+\begin{DoxyCompactList}\small\item\em Convert hex character to string. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbString_ab5eb6918a0ae9ab6c0e961318f3d1eb0}{Cvt\+Hex\+String}} (\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Out)
+\begin{DoxyCompactList}\small\item\em Convert string of hex characters to string. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbString_a1528b30b84a41c3564ef31d1f4496b15}{Cvt\+ULong\+Long}} (xb\+UInt64 \&ull\+Out)
+\begin{DoxyCompactList}\small\item\em Convert string to xb\+UInt64 number. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbString_ae3ab18365e132323f8ae4c99eb72181c}{Cvt\+Long\+Long}} (xb\+Int64 \&ll\+Out)
+\begin{DoxyCompactList}\small\item\em Convert string to xb\+Int64 number. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a77195fc4957952625cb33bb503517a3e}{Extract\+Element}} (const char $\ast$src, char delim, xb\+UInt32 i\+Cnt, xb\+Int16 i\+Opt=0)
+\begin{DoxyCompactList}\small\item\em Extract an element out of a delimited string. \end{DoxyCompactList}\item
+char \mbox{\hyperlink{classxb_1_1xbString_a685187a5f8401b322fc61f3fbe56330d}{Get\+Character}} (xb\+UInt32 l\+Pos) const
+\begin{DoxyCompactList}\small\item\em Get a character by position. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbString_ac7698665f44413a5e99a5b5bc573c6df}{Get\+Last\+Pos}} (char c) const
+\begin{DoxyCompactList}\small\item\em Get the position of the last occurrence of a given character. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbString_a1c55587904fe7e534290559d0ecb8646}{Get\+Last\+Pos}} (const char $\ast$s) const
+\begin{DoxyCompactList}\small\item\em Get the position of the last occurrence of a given string. \end{DoxyCompactList}\item
+char \mbox{\hyperlink{classxb_1_1xbString_af8b8b808cf43cd352321b43f500142db}{Get\+Path\+Separator}} () const
+\begin{DoxyCompactList}\small\item\em Get the path separator out of the string. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbString_a6c33e73659f8e98819289d2661c7271c}{Get\+Size}} () const
+\begin{DoxyCompactList}\small\item\em Retrieve the size of the string buffer. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_aa13f6b72e5a529eab04545892bbc98b4}{Has\+Alpha\+Chars}} () const
+\begin{DoxyCompactList}\small\item\em Determine if the string has any alpha characters. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_a4a255a30d683acd62ea09c1617b53cb3}{Is\+Empty}} () const
+\begin{DoxyCompactList}\small\item\em Determine if string is empty. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_a3fa34fa31bcb7244ecb054ab628ad500}{Is\+Null}} () const
+\begin{DoxyCompactList}\small\item\em Determine if string is NULL. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_acdc3a6d6955b99f0a6b1d181fb3098b9}{Left}} (xb\+UInt32 ul\+Len)
+\begin{DoxyCompactList}\small\item\em Retain left part of string, drop rightmost characters. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbString_a998b240eedac311aea5843047f55649b}{Len}} () const
+\begin{DoxyCompactList}\small\item\em Retrieve length of current string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a90e0d0be4fd0d82dd2ebbe689adf18ee}{Ltrim}} ()
+\begin{DoxyCompactList}\small\item\em Left trim white space from string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a656f5854f74064b7257ff96d96dfb68b}{Ltrunc}} (xb\+UInt32 ul\+Cnt)
+\begin{DoxyCompactList}\small\item\em Left truncate string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a0f9eefc836b24c4ee7c5a316c5d812b7}{Mid}} (xb\+UInt32 ul\+Pos, xb\+UInt32 l\+Len)
+\begin{DoxyCompactList}\small\item\em Extract portion of data from string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a6a09cfed22066b0c72432f26960f9e7b}{Pad\+Left}} (char c, xb\+UInt32 ul\+Len)
+\begin{DoxyCompactList}\small\item\em Left pad string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_aba13f0c77eb6c4a22996039569fad284}{Pad\+Right}} (char c, xb\+UInt32 ul\+Len)
+\begin{DoxyCompactList}\small\item\em Right pad string. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbString_a3baf59d15099589ff631995f129e582b}{Pos}} (char c) const
+\begin{DoxyCompactList}\small\item\em Determine position of a given character. \end{DoxyCompactList}\item
+xb\+UInt32 \mbox{\hyperlink{classxb_1_1xbString_a8705d7277b72f5aa98021e84438914da}{Pos}} (const char $\ast$s) const
+\begin{DoxyCompactList}\small\item\em Determine position of a given substring. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a1bae6fa8f608261f6e889616482f6e39}{Put\+At}} (xb\+UInt32 ul\+Pos, char c)
+\begin{DoxyCompactList}\small\item\em Insert character into string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_afaac65eaa6d9ef1596d6a0e7b91ed0f2}{Remove}} (xb\+UInt32 ul\+Pos, xb\+UInt32 ulN)
+\begin{DoxyCompactList}\small\item\em Remove portion of string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_aa6d346ab04e5bb8852f0bb996163a35e}{Resize}} (xb\+UInt32 l\+Size)
+\begin{DoxyCompactList}\small\item\em Resize a string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_aaf330188d67c347ecae0d16f65b22077}{Rtrim}} ()
+\begin{DoxyCompactList}\small\item\em Right trim the string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_ab85753d2c39882e946a8468cbb587700}{Set}} (const char $\ast$s)
+\begin{DoxyCompactList}\small\item\em Set the value of the string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_ac0d08bd688fd0e3707e32886d0dfeb09}{Set}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Set the value of the string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a6eba6ccd0c805a22516de2c18a30f8a3}{Set}} (const char $\ast$s, xb\+UInt32 ul\+Size)
+\begin{DoxyCompactList}\small\item\em Set the value of the string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a3af5b1f111f94b0667551fcbd1d97abd}{Set\+Num}} (xb\+Int32 l\+Num)
+\begin{DoxyCompactList}\small\item\em Set the string to long integer numeric value. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a9e9bfa29d86377b915f1628aeb0e9195}{Sprintf}} (const char $\ast$format,...)
+\begin{DoxyCompactList}\small\item\em Printf routine for formatting a string. \end{DoxyCompactList}\item
+const char $\ast$ \mbox{\hyperlink{classxb_1_1xbString_a6715f4c0010f3ab487c9d787838a29b3}{Str}} () const
+\begin{DoxyCompactList}\small\item\em Return string data. \end{DoxyCompactList}\item
+char $\ast$ \mbox{\hyperlink{classxb_1_1xbString_a3bc9e856c34f0c240a6e36e5b6e3ea7b}{strncpy}} (char $\ast$c\+Dest, xb\+UInt32 n) const
+\begin{DoxyCompactList}\small\item\em Copy all or part of string to character array. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a054683872e1f05d11c2cf8683a63a6fe}{Swap\+Chars}} (char from, char to)
+\begin{DoxyCompactList}\small\item\em Swap characters. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a602cac1a6ef3f6b52f587ac4c0ef4fb2}{To\+Lower\+Case}} ()
+\begin{DoxyCompactList}\small\item\em Replace all upper case charaters with lower case characters. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a68001d0a44e6b4fe61e29a4e41ded9d4}{To\+Upper\+Case}} ()
+\begin{DoxyCompactList}\small\item\em Replace all lower case charaters with lower case characters. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_abc9bd33687d4e03ca52d77885721d626}{Trim}} ()
+\begin{DoxyCompactList}\small\item\em Trim all leading and trailing white space from string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_a72b16c15fd8822efaa5f158c34df7b1e}{Valid\+Logical\+Value}} () const
+\begin{DoxyCompactList}\small\item\em Check for valid logical field data. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbString_aeed920d2a25111f776ddde2d530eb81b}{Valid\+Numeric\+Value}} () const
+\begin{DoxyCompactList}\small\item\em This function returns true if the data is valid numeric data. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_a2fd30956a26a260d1ef6fdbe73dd93f9}{Zap\+Char}} (char c)
+\begin{DoxyCompactList}\small\item\em Remove every instance of a character from a string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_addc3a470f6cd85d4c21bf9da38cf5ac9}{Zap\+Leading\+Char}} (char c)
+\begin{DoxyCompactList}\small\item\em Remove leading character from a string. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbString_afe3415bfa2e1089b792aeda0462fb99e}{Zap\+Trailing\+Char}} (char c)
+\begin{DoxyCompactList}\small\item\em Remove trailing character from a string. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Friends}
+\begin{DoxyCompactItemize}
+\item
+std\+::ostream \& \mbox{\hyperlink{classxb_1_1xbString_a3fa915061156521e9dd772a8d7e5f8fb}{operator$<$$<$}} (std\+::ostream \&os, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Stream insertion operator \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<}. \end{DoxyCompactList}\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Class for handling string data.
+
+This class defines a basic string class with all the functions one would expect in a string class.
+
+For purposes of the \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} class, a string is defined as a variable sized array of one byte characters terminated with a null (0x00 or \textbackslash{}0) byte.~\newline
+~\newline
+
+
+This version of the \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} class does not support wide (wchar\+\_\+t) characters. Perhaps you would be interested in creating a class for supporting wide characters.~\newline
+~\newline
+
+
+This string class handle strings in a 1-\/based (not 0 based) fashion. Any string routines taking an offset use a 1-\/based value. That is, the first position of the string is position 1, not 0.~\newline
+~\newline
+ ~\newline
+
+
+Position 1 (not 0) is considered the first position in a string. ~\newline
+ A return of 0 would indicate a not found condition. A return of 1, would be the first byte.
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classxb_1_1xbString_a63f9313217e0ff3c9789ec59316216a1}\label{classxb_1_1xbString_a63f9313217e0ff3c9789ec59316216a1}}
+\index{xb::xbString@{xb::xbString}!xbString@{xbString}}
+\index{xbString@{xbString}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{xbString()}{xbString()}\hspace{0.1cm}{\footnotesize\ttfamily [1/6]}}
+{\footnotesize\ttfamily xb\+::xb\+String\+::xb\+String (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Size }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Size} & -\/ Allocation size. The allocation size is normally handled internally by the class, but it can be set in this constructor. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a14bbaa293c8d40dd6c64332f2668a92e}\label{classxb_1_1xbString_a14bbaa293c8d40dd6c64332f2668a92e}}
+\index{xb::xbString@{xb::xbString}!xbString@{xbString}}
+\index{xbString@{xbString}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{xbString()}{xbString()}\hspace{0.1cm}{\footnotesize\ttfamily [2/6]}}
+{\footnotesize\ttfamily xb\+::xb\+String\+::xb\+String (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & -\/ Initialize string to c. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a18f3598dcdf2ec5692274fc8ee769ad7}\label{classxb_1_1xbString_a18f3598dcdf2ec5692274fc8ee769ad7}}
+\index{xb::xbString@{xb::xbString}!xbString@{xbString}}
+\index{xbString@{xbString}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{xbString()}{xbString()}\hspace{0.1cm}{\footnotesize\ttfamily [3/6]}}
+{\footnotesize\ttfamily xb\+::xb\+String\+::xb\+String (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s, }\item[{xb\+UInt32}]{ul\+Max\+Len }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & Initialize string to s. \\
+\hline
+{\em ul\+Max\+Len} & Maximum length of string. Truncate any characters greater than ul\+Max\+Len. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a0d81016b93fc36ebbbafacf35c677f07}\label{classxb_1_1xbString_a0d81016b93fc36ebbbafacf35c677f07}}
+\index{xb::xbString@{xb::xbString}!xbString@{xbString}}
+\index{xbString@{xbString}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{xbString()}{xbString()}\hspace{0.1cm}{\footnotesize\ttfamily [4/6]}}
+{\footnotesize\ttfamily xb\+::xb\+String\+::xb\+String (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & Initialize string to s. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a25856311106c5fb15d39017b63f0ddc7}\label{classxb_1_1xbString_a25856311106c5fb15d39017b63f0ddc7}}
+\index{xb::xbString@{xb::xbString}!xbString@{xbString}}
+\index{xbString@{xbString}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{xbString()}{xbString()}\hspace{0.1cm}{\footnotesize\ttfamily [5/6]}}
+{\footnotesize\ttfamily xb\+::xb\+String\+::xb\+String (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s = {\ttfamily \char`\"{}\char`\"{}} }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & -\/ Initialize string to s. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_ad865b55e3b08dffd527afee8e7e8e3fe}\label{classxb_1_1xbString_ad865b55e3b08dffd527afee8e7e8e3fe}}
+\index{xb::xbString@{xb::xbString}!xbString@{xbString}}
+\index{xbString@{xbString}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{xbString()}{xbString()}\hspace{0.1cm}{\footnotesize\ttfamily [6/6]}}
+{\footnotesize\ttfamily xb\+::xb\+String\+::xb\+String (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}}}]{d }\end{DoxyParamCaption})}
+
+
+
+Constructor.
+
+
+\begin{DoxyParams}{Parameters}
+{\em d} & -\/ Initiailize string to d. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a10a6549efab02bc76ab33b15916b1eb1}\label{classxb_1_1xbString_a10a6549efab02bc76ab33b15916b1eb1}}
+\index{xb::xbString@{xb::xbString}!````~xbString@{$\sim$xbString}}
+\index{````~xbString@{$\sim$xbString}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{$\sim$xbString()}{~xbString()}}
+{\footnotesize\ttfamily xb\+::xb\+String\+::$\sim$xb\+String (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Destructor.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classxb_1_1xbString_a6c4fdb689d27a9d19a0b5b4236e1ca62}\label{classxb_1_1xbString_a6c4fdb689d27a9d19a0b5b4236e1ca62}}
+\index{xb::xbString@{xb::xbString}!AddBackSlash@{AddBackSlash}}
+\index{AddBackSlash@{AddBackSlash}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{AddBackSlash()}{AddBackSlash()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Add\+Back\+Slash (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption})}
+
+
+
+Add a prefixing back slash to specified characters in the string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Character to prefix with a backslash. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a093c6ab5df375a2589755bb8f48fa5c7}\label{classxb_1_1xbString_a093c6ab5df375a2589755bb8f48fa5c7}}
+\index{xb::xbString@{xb::xbString}!Append@{Append}}
+\index{Append@{Append}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Append()}{Append()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Append (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption})}
+
+
+
+Append data to string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & String data to append. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a1922319303feb6da1f40b5994c5e8240}\label{classxb_1_1xbString_a1922319303feb6da1f40b5994c5e8240}}
+\index{xb::xbString@{xb::xbString}!Append@{Append}}
+\index{Append@{Append}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Append()}{Append()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Append (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s }\end{DoxyParamCaption})}
+
+
+
+Append data to string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String data to append. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a097453cb71fbf0b5511cf1259ddce4fb}\label{classxb_1_1xbString_a097453cb71fbf0b5511cf1259ddce4fb}}
+\index{xb::xbString@{xb::xbString}!Append@{Append}}
+\index{Append@{Append}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Append()}{Append()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Append (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s, }\item[{xb\+UInt32}]{ul\+Byte\+Count }\end{DoxyParamCaption})}
+
+
+
+Append data to string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String data to append. \\
+\hline
+{\em ul\+Byte\+Count} & Maximum number of bytes to append. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a8f202e4798491f2ae9ce51ff58dd5815}\label{classxb_1_1xbString_a8f202e4798491f2ae9ce51ff58dd5815}}
+\index{xb::xbString@{xb::xbString}!Append@{Append}}
+\index{Append@{Append}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Append()}{Append()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Append (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})}
+
+
+
+Append data to string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String data to append. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a08eb7ca6740423acab4e8bd7a6c8043d}\label{classxb_1_1xbString_a08eb7ca6740423acab4e8bd7a6c8043d}}
+\index{xb::xbString@{xb::xbString}!Assign@{Assign}}
+\index{Assign@{Assign}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Assign()}{Assign()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Assign (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s\+Str, }\item[{xb\+UInt32}]{ul\+Start\+Pos }\end{DoxyParamCaption})}
+
+
+
+Assign portion of string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Str} & -\/ Source string for copy operation. s\+Str needs to be a Null terminated string. \\
+\hline
+{\em ul\+Start\+Pos} & -\/ Starting position within source string. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a85bef82dfa22122a1ab8dfe58a107d96}\label{classxb_1_1xbString_a85bef82dfa22122a1ab8dfe58a107d96}}
+\index{xb::xbString@{xb::xbString}!Assign@{Assign}}
+\index{Assign@{Assign}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Assign()}{Assign()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Assign (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s\+Str, }\item[{xb\+UInt32}]{ul\+Start\+Pos, }\item[{xb\+UInt32}]{ul\+Copy\+Len }\end{DoxyParamCaption})}
+
+
+
+Assign portion of string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Str} & -\/ Source string for copy operation. s\+Str needs to be a Null terminated string. \\
+\hline
+{\em ul\+Start\+Pos} & -\/ Starting position within source string. \\
+\hline
+{\em ul\+Copy\+Len} & -\/ Length of data to copy. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_ab9045442e57293843652dfce6522ff83}\label{classxb_1_1xbString_ab9045442e57293843652dfce6522ff83}}
+\index{xb::xbString@{xb::xbString}!Assign@{Assign}}
+\index{Assign@{Assign}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Assign()}{Assign()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Assign (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Str, }\item[{xb\+UInt32}]{ul\+Start\+Pos }\end{DoxyParamCaption})}
+
+
+
+Assign portion of string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Str} & -\/ Source string for copy operation. s\+Str needs to be a Null terminated string. \\
+\hline
+{\em ul\+Start\+Pos} & -\/ Starting position within source string. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a210707223fffc7b3ab31eca4ef29f731}\label{classxb_1_1xbString_a210707223fffc7b3ab31eca4ef29f731}}
+\index{xb::xbString@{xb::xbString}!Assign@{Assign}}
+\index{Assign@{Assign}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Assign()}{Assign()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Assign (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Str, }\item[{xb\+UInt32}]{ul\+Start\+Pos, }\item[{xb\+UInt32}]{ul\+Copy\+Len }\end{DoxyParamCaption})}
+
+
+
+Assign portion of string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Str} & -\/ Source string for copy operation. s\+Str needs to be a Null terminated string. \\
+\hline
+{\em ul\+Start\+Pos} & -\/ Starting position within source string. \\
+\hline
+{\em ul\+Copy\+Len} & -\/ Length of data to copy. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_ac7a8466b03c04df838bd182ef244f792}\label{classxb_1_1xbString_ac7a8466b03c04df838bd182ef244f792}}
+\index{xb::xbString@{xb::xbString}!Copy@{Copy}}
+\index{Copy@{Copy}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Copy()}{Copy()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+String\+::\+Copy (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Copy a string.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}}.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a26bc14d92dc7ce1f2bf31cd74af0db0f}\label{classxb_1_1xbString_a26bc14d92dc7ce1f2bf31cd74af0db0f}}
+\index{xb::xbString@{xb::xbString}!CountChar@{CountChar}}
+\index{CountChar@{CountChar}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{CountChar()}{CountChar()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+String\+::\+Count\+Char (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption}) const}
+
+
+
+Count the number of characters in the string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Character to count. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The number of characters.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_adc0204bcfd1c052b9aea9229b10acf72}\label{classxb_1_1xbString_adc0204bcfd1c052b9aea9229b10acf72}}
+\index{xb::xbString@{xb::xbString}!CountChar@{CountChar}}
+\index{CountChar@{CountChar}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{CountChar()}{CountChar()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+String\+::\+Count\+Char (\begin{DoxyParamCaption}\item[{char}]{c, }\item[{xb\+Int16}]{i\+Opt }\end{DoxyParamCaption}) const}
+
+
+
+Count the number of characters in the string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Character to count. \\
+\hline
+{\em i\+Opt} & 0 -\/ Count the number of characters.~\newline
+ 1 -\/ Count the number of characters not between single or double quotes. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+The number of characters.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a0a737bd408a94903f214eb2879eb56de}\label{classxb_1_1xbString_a0a737bd408a94903f214eb2879eb56de}}
+\index{xb::xbString@{xb::xbString}!CvtHexChar@{CvtHexChar}}
+\index{CvtHexChar@{CvtHexChar}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{CvtHexChar()}{CvtHexChar()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+String\+::\+Cvt\+Hex\+Char (\begin{DoxyParamCaption}\item[{char \&}]{c\+Out }\end{DoxyParamCaption})}
+
+
+
+Convert hex character to string.
+
+This routine converts a four byte string in the format of 0x00 to a one byte char value. The first four bytes of the string must be in the format 0x00. Anything past the first four bytes is disregarded.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c\+Out} & Output character. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+INVALID\+\_\+\+PARM on error~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR on success.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_ab5eb6918a0ae9ab6c0e961318f3d1eb0}\label{classxb_1_1xbString_ab5eb6918a0ae9ab6c0e961318f3d1eb0}}
+\index{xb::xbString@{xb::xbString}!CvtHexString@{CvtHexString}}
+\index{CvtHexString@{CvtHexString}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{CvtHexString()}{CvtHexString()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+String\+::\+Cvt\+Hex\+String (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Out }\end{DoxyParamCaption})}
+
+
+
+Convert string of hex characters to string.
+
+This routine converts a string of four byte format of 0x00 to a string of one byte chars.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Out} & Output string of converted characters. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+INVALID\+\_\+\+PARM on error~\newline
+ XB\+\_\+\+NO\+\_\+\+ERROR on success.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_ae3ab18365e132323f8ae4c99eb72181c}\label{classxb_1_1xbString_ae3ab18365e132323f8ae4c99eb72181c}}
+\index{xb::xbString@{xb::xbString}!CvtLongLong@{CvtLongLong}}
+\index{CvtLongLong@{CvtLongLong}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{CvtLongLong()}{CvtLongLong()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+String\+::\+Cvt\+Long\+Long (\begin{DoxyParamCaption}\item[{xb\+Int64 \&}]{ll\+Out }\end{DoxyParamCaption})}
+
+
+
+Convert string to xb\+Int64 number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ll\+Out} & -\/ output long long. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+NO\+\_\+\+ERROR
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a1528b30b84a41c3564ef31d1f4496b15}\label{classxb_1_1xbString_a1528b30b84a41c3564ef31d1f4496b15}}
+\index{xb::xbString@{xb::xbString}!CvtULongLong@{CvtULongLong}}
+\index{CvtULongLong@{CvtULongLong}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{CvtULongLong()}{CvtULongLong()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+String\+::\+Cvt\+ULong\+Long (\begin{DoxyParamCaption}\item[{xb\+UInt64 \&}]{ull\+Out }\end{DoxyParamCaption})}
+
+
+
+Convert string to xb\+UInt64 number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ull\+Out} & -\/ output unsigned long long. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+XB\+\_\+\+NO\+\_\+\+ERROR
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a77195fc4957952625cb33bb503517a3e}\label{classxb_1_1xbString_a77195fc4957952625cb33bb503517a3e}}
+\index{xb::xbString@{xb::xbString}!ExtractElement@{ExtractElement}}
+\index{ExtractElement@{ExtractElement}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{ExtractElement()}{ExtractElement()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Extract\+Element (\begin{DoxyParamCaption}\item[{const char $\ast$}]{p\+Src, }\item[{char}]{c\+Delim, }\item[{xb\+UInt32}]{l\+Skip\+Cnt, }\item[{xb\+Int16}]{i\+Opt = {\ttfamily 0} }\end{DoxyParamCaption})}
+
+
+
+Extract an element out of a delimited string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em p\+Src} & Source string. \\
+\hline
+{\em c\+Delim} & Delimiter. \\
+\hline
+{\em l\+Skip\+Cnt} & Number of delimiters to skip. \\
+\hline
+{\em i\+Opt} & 0 -\/ ignore single and double quotes.~\newline
+ 1 -\/ ignore delimiters between single or double quotes. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to string extracted from element.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a685187a5f8401b322fc61f3fbe56330d}\label{classxb_1_1xbString_a685187a5f8401b322fc61f3fbe56330d}}
+\index{xb::xbString@{xb::xbString}!GetCharacter@{GetCharacter}}
+\index{GetCharacter@{GetCharacter}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{GetCharacter()}{GetCharacter()}}
+{\footnotesize\ttfamily char xb\+::xb\+String\+::\+Get\+Character (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{n }\end{DoxyParamCaption}) const}
+
+
+
+Get a character by position.
+
+
+\begin{DoxyParams}{Parameters}
+{\em n} & -\/ Position in string to extract. First position is 1 (not 0). \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Character from position n, or null.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_ac7698665f44413a5e99a5b5bc573c6df}\label{classxb_1_1xbString_ac7698665f44413a5e99a5b5bc573c6df}}
+\index{xb::xbString@{xb::xbString}!GetLastPos@{GetLastPos}}
+\index{GetLastPos@{GetLastPos}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{GetLastPos()}{GetLastPos()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+String\+::\+Get\+Last\+Pos (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption}) const}
+
+
+
+Get the position of the last occurrence of a given character.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & -\/ Character to search for. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Last position of character in the string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a1c55587904fe7e534290559d0ecb8646}\label{classxb_1_1xbString_a1c55587904fe7e534290559d0ecb8646}}
+\index{xb::xbString@{xb::xbString}!GetLastPos@{GetLastPos}}
+\index{GetLastPos@{GetLastPos}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{GetLastPos()}{GetLastPos()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+String\+::\+Get\+Last\+Pos (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s }\end{DoxyParamCaption}) const}
+
+
+
+Get the position of the last occurrence of a given string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & -\/ String to search for. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Last position of character in the string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_af8b8b808cf43cd352321b43f500142db}\label{classxb_1_1xbString_af8b8b808cf43cd352321b43f500142db}}
+\index{xb::xbString@{xb::xbString}!GetPathSeparator@{GetPathSeparator}}
+\index{GetPathSeparator@{GetPathSeparator}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{GetPathSeparator()}{GetPathSeparator()}}
+{\footnotesize\ttfamily char xb\+::xb\+String\+::\+Get\+Path\+Separator (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Get the path separator out of the string.
+
+\begin{DoxyReturn}{Returns}
+Char value containing either / or \textbackslash{} depending on OS.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a6c33e73659f8e98819289d2661c7271c}\label{classxb_1_1xbString_a6c33e73659f8e98819289d2661c7271c}}
+\index{xb::xbString@{xb::xbString}!GetSize@{GetSize}}
+\index{GetSize@{GetSize}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{GetSize()}{GetSize()}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+String\+::\+Get\+Size (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Retrieve the size of the string buffer.
+
+\begin{DoxyReturn}{Returns}
+Size of string buffer including the null terminating byte.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_aa13f6b72e5a529eab04545892bbc98b4}\label{classxb_1_1xbString_aa13f6b72e5a529eab04545892bbc98b4}}
+\index{xb::xbString@{xb::xbString}!HasAlphaChars@{HasAlphaChars}}
+\index{HasAlphaChars@{HasAlphaChars}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{HasAlphaChars()}{HasAlphaChars()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::\+Has\+Alpha\+Chars (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Determine if the string has any alpha characters.
+
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ String contains one or more aloha characters.~\newline
+ xb\+False -\/ String contains no alpha characters.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a4a255a30d683acd62ea09c1617b53cb3}\label{classxb_1_1xbString_a4a255a30d683acd62ea09c1617b53cb3}}
+\index{xb::xbString@{xb::xbString}!IsEmpty@{IsEmpty}}
+\index{IsEmpty@{IsEmpty}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{IsEmpty()}{IsEmpty()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::\+Is\+Empty (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Determine if string is empty.
+
+\begin{DoxyReturn}{Returns}
+xb\+True if string is empty.~\newline
+ xb\+False if string is not empty.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a3fa34fa31bcb7244ecb054ab628ad500}\label{classxb_1_1xbString_a3fa34fa31bcb7244ecb054ab628ad500}}
+\index{xb::xbString@{xb::xbString}!IsNull@{IsNull}}
+\index{IsNull@{IsNull}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{IsNull()}{IsNull()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::\+Is\+Null (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Determine if string is NULL.
+
+\begin{DoxyReturn}{Returns}
+xb\+True if string is NULL.~\newline
+ xb\+False if string is not NULL.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_acdc3a6d6955b99f0a6b1d181fb3098b9}\label{classxb_1_1xbString_acdc3a6d6955b99f0a6b1d181fb3098b9}}
+\index{xb::xbString@{xb::xbString}!Left@{Left}}
+\index{Left@{Left}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Left()}{Left()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Left (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Len }\end{DoxyParamCaption})}
+
+
+
+Retain left part of string, drop rightmost characters.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Len} & New string length, truncate rightmost excess. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a998b240eedac311aea5843047f55649b}\label{classxb_1_1xbString_a998b240eedac311aea5843047f55649b}}
+\index{xb::xbString@{xb::xbString}!Len@{Len}}
+\index{Len@{Len}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Len()}{Len()}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+String\+::\+Len (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Retrieve length of current string.
+
+\begin{DoxyReturn}{Returns}
+String length, excluding the terminating null byte.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a90e0d0be4fd0d82dd2ebbe689adf18ee}\label{classxb_1_1xbString_a90e0d0be4fd0d82dd2ebbe689adf18ee}}
+\index{xb::xbString@{xb::xbString}!Ltrim@{Ltrim}}
+\index{Ltrim@{Ltrim}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Ltrim()}{Ltrim()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Ltrim (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Left trim white space from string.
+
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a656f5854f74064b7257ff96d96dfb68b}\label{classxb_1_1xbString_a656f5854f74064b7257ff96d96dfb68b}}
+\index{xb::xbString@{xb::xbString}!Ltrunc@{Ltrunc}}
+\index{Ltrunc@{Ltrunc}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Ltrunc()}{Ltrunc()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Ltrunc (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Cnt }\end{DoxyParamCaption})}
+
+
+
+Left truncate string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Cnt} & Number of bytes to remove from the left. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a0f9eefc836b24c4ee7c5a316c5d812b7}\label{classxb_1_1xbString_a0f9eefc836b24c4ee7c5a316c5d812b7}}
+\index{xb::xbString@{xb::xbString}!Mid@{Mid}}
+\index{Mid@{Mid}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Mid()}{Mid()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Mid (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Start\+Pos, }\item[{xb\+UInt32}]{ul\+Targ\+Len }\end{DoxyParamCaption})}
+
+
+
+Extract portion of data from string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Start\+Pos} & Starting position \\
+\hline
+{\em ul\+Targ\+Len} & Length \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to string
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a545df0ae9590f0ea5844a165e38a6388}\label{classxb_1_1xbString_a545df0ae9590f0ea5844a165e38a6388}}
+\index{xb::xbString@{xb::xbString}!operator const char $\ast$@{operator const char $\ast$}}
+\index{operator const char $\ast$@{operator const char $\ast$}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator const char $\ast$()}{operator const char *()}}
+{\footnotesize\ttfamily xb\+::xb\+String\+::operator const char $\ast$ (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Operator const char $\ast$.
+
+\begin{DoxyReturn}{Returns}
+Pointer to string data.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a822448f2a0ce653473d4c1de5763a3a6}\label{classxb_1_1xbString_a822448f2a0ce653473d4c1de5763a3a6}}
+\index{xb::xbString@{xb::xbString}!operator"!=@{operator"!=}}
+\index{operator"!=@{operator"!=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator"!=()}{operator!=()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::operator!= (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s }\end{DoxyParamCaption}) const}
+
+
+
+operator !=
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String to compare \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Strings don\textquotesingle{}t match.~\newline
+ zb\+False -\/ Strings match.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_acf89691607050b0505dc6af28d059c38}\label{classxb_1_1xbString_acf89691607050b0505dc6af28d059c38}}
+\index{xb::xbString@{xb::xbString}!operator"!=@{operator"!=}}
+\index{operator"!=@{operator"!=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator"!=()}{operator!=()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::operator!= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption}) const}
+
+
+
+operator !=
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String to compare \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Strings don\textquotesingle{}t match.~\newline
+ xb\+False -\/ Strings match.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_aab556e8c3cb478dd95643327d72a48bd}\label{classxb_1_1xbString_aab556e8c3cb478dd95643327d72a48bd}}
+\index{xb::xbString@{xb::xbString}!operator+@{operator+}}
+\index{operator+@{operator+}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator+()}{operator+()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+String\+::operator+ (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s1 }\end{DoxyParamCaption})}
+
+
+
+Concatonate operator +.
+
+Concatonate left string with right string returning reference to new string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s1} & Right string operator. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_af559654baba81c3c0c19823c0b7a69d3}\label{classxb_1_1xbString_af559654baba81c3c0c19823c0b7a69d3}}
+\index{xb::xbString@{xb::xbString}!operator+@{operator+}}
+\index{operator+@{operator+}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator+()}{operator+()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+String\+::operator+ (\begin{DoxyParamCaption}\item[{const char}]{c }\end{DoxyParamCaption})}
+
+
+
+Concatonate operator +.
+
+Concatonate left string with right string returning reference to new string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Right string operator. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a1f289d577ba90c500bc1be3ec7bb0206}\label{classxb_1_1xbString_a1f289d577ba90c500bc1be3ec7bb0206}}
+\index{xb::xbString@{xb::xbString}!operator+@{operator+}}
+\index{operator+@{operator+}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator+()}{operator+()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+String\+::operator+ (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s1 }\end{DoxyParamCaption})}
+
+
+
+Concatonate operator +.
+
+Concatonate left string with right string returning reference to new string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s1} & Right string operator. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_ae12f45b8be84e438e032c0b860f985c6}\label{classxb_1_1xbString_ae12f45b8be84e438e032c0b860f985c6}}
+\index{xb::xbString@{xb::xbString}!operator+=@{operator+=}}
+\index{operator+=@{operator+=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator+=()}{operator+=()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::operator+= (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption})}
+
+
+
+Append operator +=.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & -\/ Append c to the string. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_ab319120dbad9107e1e7090139c956100}\label{classxb_1_1xbString_ab319120dbad9107e1e7090139c956100}}
+\index{xb::xbString@{xb::xbString}!operator+=@{operator+=}}
+\index{operator+=@{operator+=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator+=()}{operator+=()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::operator+= (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s }\end{DoxyParamCaption})}
+
+
+
+Append operator +=.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & -\/ Append s to the string. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a76a47af239797a266ada6141c150001c}\label{classxb_1_1xbString_a76a47af239797a266ada6141c150001c}}
+\index{xb::xbString@{xb::xbString}!operator+=@{operator+=}}
+\index{operator+=@{operator+=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator+=()}{operator+=()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::operator+= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})}
+
+
+
+Append operator +=.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & -\/ Append s to the string. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a06abec236b95f6933ba17bf67089f7cf}\label{classxb_1_1xbString_a06abec236b95f6933ba17bf67089f7cf}}
+\index{xb::xbString@{xb::xbString}!operator-\/@{operator-\/}}
+\index{operator-\/@{operator-\/}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator-\/()}{operator-()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+String\+::operator-\/ (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s1 }\end{DoxyParamCaption})}
+
+
+
+Concatonate operator -\/.
+
+Concatonate left string with right string returning reference to new string. Both strings are trimmed.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s1} & Right string operator. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_adcafd019df23bb5724c46e34f3f31194}\label{classxb_1_1xbString_adcafd019df23bb5724c46e34f3f31194}}
+\index{xb::xbString@{xb::xbString}!operator-\/=@{operator-\/=}}
+\index{operator-\/=@{operator-\/=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator-\/=()}{operator-=()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::operator-\/= (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption})}
+
+
+
+Append operator -\/=.
+
+Append c to the right of this string, trimming right space on this string first.
+\begin{DoxyParams}{Parameters}
+{\em c} & -\/ Append s to the right of the string value. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_aaae97e6eda3d18c9f463993ade985bf4}\label{classxb_1_1xbString_aaae97e6eda3d18c9f463993ade985bf4}}
+\index{xb::xbString@{xb::xbString}!operator-\/=@{operator-\/=}}
+\index{operator-\/=@{operator-\/=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator-\/=()}{operator-=()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::operator-\/= (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s }\end{DoxyParamCaption})}
+
+
+
+Append operator -\/=.
+
+Append s to the right of this string, right trimming both strings.
+\begin{DoxyParams}{Parameters}
+{\em s} & -\/ Append s to the right of the string value. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_aa7f4db1b4eae9dfad46346db6e17ea15}\label{classxb_1_1xbString_aa7f4db1b4eae9dfad46346db6e17ea15}}
+\index{xb::xbString@{xb::xbString}!operator-\/=@{operator-\/=}}
+\index{operator-\/=@{operator-\/=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator-\/=()}{operator-=()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::operator-\/= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})}
+
+
+
+Append operator -\/=.
+
+Append s to the right of this string, right trimming both strings.
+\begin{DoxyParams}{Parameters}
+{\em s} & -\/ Append s to the right of the string value. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a71c7aafa0d523c72cbe58c474be2270a}\label{classxb_1_1xbString_a71c7aafa0d523c72cbe58c474be2270a}}
+\index{xb::xbString@{xb::xbString}!operator$<$@{operator$<$}}
+\index{operator$<$@{operator$<$}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator$<$()}{operator<()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::operator$<$ (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption}) const}
+
+
+
+operator \texorpdfstring{$<$}{<}
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String to compare \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Left string is less than the right string.~\newline
+ zb\+False -\/ Left string is not less than the right string.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a461f245e60cddfdf5f78a972a46e5880}\label{classxb_1_1xbString_a461f245e60cddfdf5f78a972a46e5880}}
+\index{xb::xbString@{xb::xbString}!operator$<$=@{operator$<$=}}
+\index{operator$<$=@{operator$<$=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator$<$=()}{operator<=()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::operator$<$= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption}) const}
+
+
+
+operator \texorpdfstring{$<$}{<}=
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String to compare \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Left string is less than or equal to the right string.~\newline
+ zb\+False -\/ Left string is not less than or equal to the right string.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a84ae7d16c5d73c5aa2270aa9895a7f7c}\label{classxb_1_1xbString_a84ae7d16c5d73c5aa2270aa9895a7f7c}}
+\index{xb::xbString@{xb::xbString}!operator=@{operator=}}
+\index{operator=@{operator=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator=()}{operator=()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::operator= (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s }\end{DoxyParamCaption})}
+
+
+
+Set operator =.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & -\/ Set the string to the string on the right of the equal sign. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a4f69d11cbd43edf71725a606d0ca8f40}\label{classxb_1_1xbString_a4f69d11cbd43edf71725a606d0ca8f40}}
+\index{xb::xbString@{xb::xbString}!operator=@{operator=}}
+\index{operator=@{operator=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator=()}{operator=()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::operator= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})}
+
+
+
+Set operator =.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & -\/ Set the string to the string on the right of the equal sign. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbString_a94031269af3c433393d4cf0ff9b4be38}\label{classxb_1_1xbString_a94031269af3c433393d4cf0ff9b4be38}}
+\index{xb::xbString@{xb::xbString}!operator==@{operator==}}
+\index{operator==@{operator==}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator==()}{operator==()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::operator== (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s }\end{DoxyParamCaption}) const}
+
+
+
+operator ==
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String to compare \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Strings match.~\newline
+ zb\+False -\/ Strings don\textquotesingle{}t match.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a2df3ed2fc9456214f5fd2fcf77b69bc1}\label{classxb_1_1xbString_a2df3ed2fc9456214f5fd2fcf77b69bc1}}
+\index{xb::xbString@{xb::xbString}!operator==@{operator==}}
+\index{operator==@{operator==}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator==()}{operator==()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::operator== (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption}) const}
+
+
+
+operator ==
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String to compare \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Strings match.~\newline
+ zb\+False -\/ Strings don\textquotesingle{}t match.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_ae46f6a45da5686b607a4edf2786a2fff}\label{classxb_1_1xbString_ae46f6a45da5686b607a4edf2786a2fff}}
+\index{xb::xbString@{xb::xbString}!operator$>$@{operator$>$}}
+\index{operator$>$@{operator$>$}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator$>$()}{operator>()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::operator$>$ (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption}) const}
+
+
+
+operator \texorpdfstring{$>$}{>}
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String to compare \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Left string is greater than the right string.~\newline
+ zb\+False -\/ Left string is not greater than the right string.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a8f16643cb7ba3ee9cf685422c9ea0e67}\label{classxb_1_1xbString_a8f16643cb7ba3ee9cf685422c9ea0e67}}
+\index{xb::xbString@{xb::xbString}!operator$>$=@{operator$>$=}}
+\index{operator$>$=@{operator$>$=}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator$>$=()}{operator>=()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::operator$>$= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption}) const}
+
+
+
+operator \texorpdfstring{$>$}{>}=
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & String to compare \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Left string is greater than or equal to the right string.~\newline
+ zb\+False -\/ Left string is not greater than or equal to the right string.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a4deaa68d9571753349c29baacb5613e8}\label{classxb_1_1xbString_a4deaa68d9571753349c29baacb5613e8}}
+\index{xb::xbString@{xb::xbString}!operator\mbox{[}\mbox{]}@{operator[]}}
+\index{operator\mbox{[}\mbox{]}@{operator[]}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator[]()}{operator[]()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily char \& xb\+::xb\+String\+::operator\mbox{[}$\,$\mbox{]} (\begin{DoxyParamCaption}\item[{xb\+Int32}]{n }\end{DoxyParamCaption}) const}
+
+
+
+operator \mbox{[}\mbox{]}
+
+
+\begin{DoxyParams}{Parameters}
+{\em n} & -\/ Offset into the string of the byte to retrieve. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+c -\/ The character to return from the offset within the \mbox{[}\mbox{]} brackets.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_abe45e463226ac8e18550ced18c5a9df3}\label{classxb_1_1xbString_abe45e463226ac8e18550ced18c5a9df3}}
+\index{xb::xbString@{xb::xbString}!operator\mbox{[}\mbox{]}@{operator[]}}
+\index{operator\mbox{[}\mbox{]}@{operator[]}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator[]()}{operator[]()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily char \& xb\+::xb\+String\+::operator\mbox{[}$\,$\mbox{]} (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{n }\end{DoxyParamCaption}) const}
+
+
+
+operator \mbox{[}\mbox{]}
+
+
+\begin{DoxyParams}{Parameters}
+{\em n} & -\/ Offset into the string of the byte to retrieve. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+c -\/ The character to return from the offset within the \mbox{[}\mbox{]} brackets.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a6a09cfed22066b0c72432f26960f9e7b}\label{classxb_1_1xbString_a6a09cfed22066b0c72432f26960f9e7b}}
+\index{xb::xbString@{xb::xbString}!PadLeft@{PadLeft}}
+\index{PadLeft@{PadLeft}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{PadLeft()}{PadLeft()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Pad\+Left (\begin{DoxyParamCaption}\item[{char}]{c, }\item[{xb\+UInt32}]{ul\+New\+Len }\end{DoxyParamCaption})}
+
+
+
+Left pad string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Padding character. \\
+\hline
+{\em ul\+New\+Len} & New string length. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_aba13f0c77eb6c4a22996039569fad284}\label{classxb_1_1xbString_aba13f0c77eb6c4a22996039569fad284}}
+\index{xb::xbString@{xb::xbString}!PadRight@{PadRight}}
+\index{PadRight@{PadRight}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{PadRight()}{PadRight()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Pad\+Right (\begin{DoxyParamCaption}\item[{char}]{c, }\item[{xb\+UInt32}]{ul\+New\+Len }\end{DoxyParamCaption})}
+
+
+
+Right pad string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Padding character. \\
+\hline
+{\em ul\+New\+Len} & New string length. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a3baf59d15099589ff631995f129e582b}\label{classxb_1_1xbString_a3baf59d15099589ff631995f129e582b}}
+\index{xb::xbString@{xb::xbString}!Pos@{Pos}}
+\index{Pos@{Pos}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Pos()}{Pos()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+String\+::\+Pos (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption}) const}
+
+
+
+Determine position of a given character.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & Seek character \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Position within string. Returns 0 if not found.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a8705d7277b72f5aa98021e84438914da}\label{classxb_1_1xbString_a8705d7277b72f5aa98021e84438914da}}
+\index{xb::xbString@{xb::xbString}!Pos@{Pos}}
+\index{Pos@{Pos}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Pos()}{Pos()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+UInt32 xb\+::xb\+String\+::\+Pos (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s }\end{DoxyParamCaption}) const}
+
+
+
+Determine position of a given substring.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & Substring \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Position within string. Returns 0 if not found.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a1bae6fa8f608261f6e889616482f6e39}\label{classxb_1_1xbString_a1bae6fa8f608261f6e889616482f6e39}}
+\index{xb::xbString@{xb::xbString}!PutAt@{PutAt}}
+\index{PutAt@{PutAt}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{PutAt()}{PutAt()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Put\+At (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Pos, }\item[{char}]{c }\end{DoxyParamCaption})}
+
+
+
+Insert character into string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Pos} & Insertion position. \\
+\hline
+{\em c} & Character to insert. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_afaac65eaa6d9ef1596d6a0e7b91ed0f2}\label{classxb_1_1xbString_afaac65eaa6d9ef1596d6a0e7b91ed0f2}}
+\index{xb::xbString@{xb::xbString}!Remove@{Remove}}
+\index{Remove@{Remove}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Remove()}{Remove()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Remove (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Start\+Pos, }\item[{xb\+UInt32}]{ul\+Del\+Size }\end{DoxyParamCaption})}
+
+
+
+Remove portion of string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Start\+Pos} & Starting position for removal operation. \\
+\hline
+{\em ul\+Del\+Size} & Size of deletion. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_aa6d346ab04e5bb8852f0bb996163a35e}\label{classxb_1_1xbString_aa6d346ab04e5bb8852f0bb996163a35e}}
+\index{xb::xbString@{xb::xbString}!Resize@{Resize}}
+\index{Resize@{Resize}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Resize()}{Resize()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Resize (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{ul\+Size }\end{DoxyParamCaption})}
+
+
+
+Resize a string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em ul\+Size} & -\/ New string size, including null termination byte. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_aaf330188d67c347ecae0d16f65b22077}\label{classxb_1_1xbString_aaf330188d67c347ecae0d16f65b22077}}
+\index{xb::xbString@{xb::xbString}!Rtrim@{Rtrim}}
+\index{Rtrim@{Rtrim}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Rtrim()}{Rtrim()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Rtrim (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Right trim the string.
+
+This routine removes any trailing white space on the string.
+
+\begin{DoxyReturn}{Returns}
+Reference to string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_ab85753d2c39882e946a8468cbb587700}\label{classxb_1_1xbString_ab85753d2c39882e946a8468cbb587700}}
+\index{xb::xbString@{xb::xbString}!Set@{Set}}
+\index{Set@{Set}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Set()}{Set()}\hspace{0.1cm}{\footnotesize\ttfamily [1/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Set (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s }\end{DoxyParamCaption})}
+
+
+
+Set the value of the string.
+
+Note\+: This routine fails if you try to set the string to itself or some part of itself.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & Value to set the string. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a6eba6ccd0c805a22516de2c18a30f8a3}\label{classxb_1_1xbString_a6eba6ccd0c805a22516de2c18a30f8a3}}
+\index{xb::xbString@{xb::xbString}!Set@{Set}}
+\index{Set@{Set}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Set()}{Set()}\hspace{0.1cm}{\footnotesize\ttfamily [2/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Set (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s, }\item[{xb\+UInt32}]{ul\+Size }\end{DoxyParamCaption})}
+
+
+
+Set the value of the string.
+
+Note\+: This routine fails if you try to set the string to itself or some part of itself.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & Value to set the string. \\
+\hline
+{\em ul\+Size} & Maximum size of resultant string. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_ac0d08bd688fd0e3707e32886d0dfeb09}\label{classxb_1_1xbString_ac0d08bd688fd0e3707e32886d0dfeb09}}
+\index{xb::xbString@{xb::xbString}!Set@{Set}}
+\index{Set@{Set}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Set()}{Set()}\hspace{0.1cm}{\footnotesize\ttfamily [3/3]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Set (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})}
+
+
+
+Set the value of the string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s} & Value to set the string. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a3af5b1f111f94b0667551fcbd1d97abd}\label{classxb_1_1xbString_a3af5b1f111f94b0667551fcbd1d97abd}}
+\index{xb::xbString@{xb::xbString}!SetNum@{SetNum}}
+\index{SetNum@{SetNum}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{SetNum()}{SetNum()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Set\+Num (\begin{DoxyParamCaption}\item[{xb\+Int32}]{l\+Num }\end{DoxyParamCaption})}
+
+
+
+Set the string to long integer numeric value.
+
+
+\begin{DoxyParams}{Parameters}
+{\em l\+Num} & Value to set the string \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a9e9bfa29d86377b915f1628aeb0e9195}\label{classxb_1_1xbString_a9e9bfa29d86377b915f1628aeb0e9195}}
+\index{xb::xbString@{xb::xbString}!Sprintf@{Sprintf}}
+\index{Sprintf@{Sprintf}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Sprintf()}{Sprintf()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Sprintf (\begin{DoxyParamCaption}\item[{const char $\ast$}]{s\+Format, }\item[{}]{... }\end{DoxyParamCaption})}
+
+
+
+Printf routine for formatting a string.
+
+See documentation on the standard C printf function for how to use this.
+
+My\+String.\+Sprintf( \char`\"{}a number \%d some text \%s\char`\"{}, 100, \char`\"{}test text data\char`\"{} );
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Format} & A format specifier \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to a formatted string
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a6715f4c0010f3ab487c9d787838a29b3}\label{classxb_1_1xbString_a6715f4c0010f3ab487c9d787838a29b3}}
+\index{xb::xbString@{xb::xbString}!Str@{Str}}
+\index{Str@{Str}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Str()}{Str()}}
+{\footnotesize\ttfamily const char $\ast$ xb\+::xb\+String\+::\+Str (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Return string data.
+
+\begin{DoxyReturn}{Returns}
+char $\ast$ to string data or NULL if string is empty
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a3bc9e856c34f0c240a6e36e5b6e3ea7b}\label{classxb_1_1xbString_a3bc9e856c34f0c240a6e36e5b6e3ea7b}}
+\index{xb::xbString@{xb::xbString}!strncpy@{strncpy}}
+\index{strncpy@{strncpy}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{strncpy()}{strncpy()}}
+{\footnotesize\ttfamily char $\ast$ xb\+::xb\+String\+::strncpy (\begin{DoxyParamCaption}\item[{char $\ast$}]{c\+Dest, }\item[{xb\+UInt32}]{n }\end{DoxyParamCaption}) const}
+
+
+
+Copy all or part of string to character array.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c\+Dest} & pointer to destination buffer. \\
+\hline
+{\em n} & Number of bytest to copy. It is the responsibility of the application to verify the buffer is large enough to hold the string contents. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+char $\ast$ to result
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a054683872e1f05d11c2cf8683a63a6fe}\label{classxb_1_1xbString_a054683872e1f05d11c2cf8683a63a6fe}}
+\index{xb::xbString@{xb::xbString}!SwapChars@{SwapChars}}
+\index{SwapChars@{SwapChars}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{SwapChars()}{SwapChars()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Swap\+Chars (\begin{DoxyParamCaption}\item[{char}]{c\+From, }\item[{char}]{c\+To }\end{DoxyParamCaption})}
+
+
+
+Swap characters.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c\+From} & character to replace. \\
+\hline
+{\em c\+To} & character to replace with. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a602cac1a6ef3f6b52f587ac4c0ef4fb2}\label{classxb_1_1xbString_a602cac1a6ef3f6b52f587ac4c0ef4fb2}}
+\index{xb::xbString@{xb::xbString}!ToLowerCase@{ToLowerCase}}
+\index{ToLowerCase@{ToLowerCase}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{ToLowerCase()}{ToLowerCase()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+To\+Lower\+Case (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Replace all upper case charaters with lower case characters.
+
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a68001d0a44e6b4fe61e29a4e41ded9d4}\label{classxb_1_1xbString_a68001d0a44e6b4fe61e29a4e41ded9d4}}
+\index{xb::xbString@{xb::xbString}!ToUpperCase@{ToUpperCase}}
+\index{ToUpperCase@{ToUpperCase}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{ToUpperCase()}{ToUpperCase()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+To\+Upper\+Case (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Replace all lower case charaters with lower case characters.
+
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_abc9bd33687d4e03ca52d77885721d626}\label{classxb_1_1xbString_abc9bd33687d4e03ca52d77885721d626}}
+\index{xb::xbString@{xb::xbString}!Trim@{Trim}}
+\index{Trim@{Trim}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{Trim()}{Trim()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Trim (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Trim all leading and trailing white space from string.
+
+\begin{DoxyReturn}{Returns}
+Reference to string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a72b16c15fd8822efaa5f158c34df7b1e}\label{classxb_1_1xbString_a72b16c15fd8822efaa5f158c34df7b1e}}
+\index{xb::xbString@{xb::xbString}!ValidLogicalValue@{ValidLogicalValue}}
+\index{ValidLogicalValue@{ValidLogicalValue}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{ValidLogicalValue()}{ValidLogicalValue()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::\+Valid\+Logical\+Value (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+Check for valid logical field data.
+
+Valid logical data is one \textquotesingle{}T\textquotesingle{}, \textquotesingle{}F\textquotesingle{}, \textquotesingle{}N\textquotesingle{} or \textquotesingle{}Y\textquotesingle{}.~\newline
+
+
+\begin{DoxyReturn}{Returns}
+xb\+True if the data is valid logical data.~\newline
+ xb\+False if not valid logical data.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_aeed920d2a25111f776ddde2d530eb81b}\label{classxb_1_1xbString_aeed920d2a25111f776ddde2d530eb81b}}
+\index{xb::xbString@{xb::xbString}!ValidNumericValue@{ValidNumericValue}}
+\index{ValidNumericValue@{ValidNumericValue}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{ValidNumericValue()}{ValidNumericValue()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+String\+::\+Valid\+Numeric\+Value (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+
+
+This function returns true if the data is valid numeric data.
+
+\begin{DoxyReturn}{Returns}
+xb\+True if valid numeric data.~\newline
+ xb\+False if not valid numeric daata.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_a2fd30956a26a260d1ef6fdbe73dd93f9}\label{classxb_1_1xbString_a2fd30956a26a260d1ef6fdbe73dd93f9}}
+\index{xb::xbString@{xb::xbString}!ZapChar@{ZapChar}}
+\index{ZapChar@{ZapChar}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{ZapChar()}{ZapChar()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Zap\+Char (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption})}
+
+
+
+Remove every instance of a character from a string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & character to remove from string. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this stirng.\+void
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_addc3a470f6cd85d4c21bf9da38cf5ac9}\label{classxb_1_1xbString_addc3a470f6cd85d4c21bf9da38cf5ac9}}
+\index{xb::xbString@{xb::xbString}!ZapLeadingChar@{ZapLeadingChar}}
+\index{ZapLeadingChar@{ZapLeadingChar}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{ZapLeadingChar()}{ZapLeadingChar()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Zap\+Leading\+Char (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption})}
+
+
+
+Remove leading character from a string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & character to remove from beginning of string. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbString_afe3415bfa2e1089b792aeda0462fb99e}\label{classxb_1_1xbString_afe3415bfa2e1089b792aeda0462fb99e}}
+\index{xb::xbString@{xb::xbString}!ZapTrailingChar@{ZapTrailingChar}}
+\index{ZapTrailingChar@{ZapTrailingChar}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{ZapTrailingChar()}{ZapTrailingChar()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+String\+::\+Zap\+Trailing\+Char (\begin{DoxyParamCaption}\item[{char}]{c }\end{DoxyParamCaption})}
+
+
+
+Remove trailing character from a string.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & character to remove from ending of string. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Reference to this string.
+\end{DoxyReturn}
+
+
+\doxysubsection{Friends And Related Function Documentation}
+\mbox{\Hypertarget{classxb_1_1xbString_a3fa915061156521e9dd772a8d7e5f8fb}\label{classxb_1_1xbString_a3fa915061156521e9dd772a8d7e5f8fb}}
+\index{xb::xbString@{xb::xbString}!operator$<$$<$@{operator$<$$<$}}
+\index{operator$<$$<$@{operator$<$$<$}!xb::xbString@{xb::xbString}}
+\doxysubsubsection{\texorpdfstring{operator$<$$<$}{operator<<}}
+{\footnotesize\ttfamily std\+::ostream \& operator$<$$<$ (\begin{DoxyParamCaption}\item[{std\+::ostream \&}]{os, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [friend]}}
+
+
+
+Stream insertion operator \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<}.
+
+std\+::cout \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<} My\+String \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<} std\+::endl;
+
+
+\begin{DoxyParams}{Parameters}
+{\em os} & Output stream \\
+\hline
+{\em s} & String to send to output stream \\
+\hline
+\end{DoxyParams}
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbstring_8h}{xbstring.\+h}}\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbstring_8cpp}{xbstring.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/classxb_1_1xbTblMgr.eps b/docs/doxygen/latex/classxb_1_1xbTblMgr.eps
new file mode 100644
index 0000000..12fb841
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbTblMgr.eps
@@ -0,0 +1,203 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: ClassName
+%%Creator: Doxygen
+%%CreationDate: Time
+%%For:
+%Magnification: 1.00
+%%Orientation: Portrait
+%%BoundingBox: 0 0 500 652.173889
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%EndComments
+
+% ----- variables -----
+
+/boxwidth 0 def
+/boxheight 40 def
+/fontheight 24 def
+/marginwidth 10 def
+/distx 20 def
+/disty 40 def
+/boundaspect 0.766667 def % aspect ratio of the BoundingBox (width/height)
+/boundx 500 def
+/boundy boundx boundaspect div def
+/xspacing 0 def
+/yspacing 0 def
+/rows 3 def
+/cols 1 def
+/scalefactor 0 def
+/boxfont /Times-Roman findfont fontheight scalefont def
+
+% ----- procedures -----
+
+/dotted { [1 4] 0 setdash } def
+/dashed { [5] 0 setdash } def
+/solid { [] 0 setdash } def
+
+/max % result = MAX(arg1,arg2)
+{
+ /a exch def
+ /b exch def
+ a b gt {a} {b} ifelse
+} def
+
+/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)
+{
+ 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max
+} def
+
+/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))
+{
+ /str exch def
+ /boxwidth boxwidth str stringwidth pop max def
+} def
+
+/box % draws a box with text 'arg1' at grid pos (arg2,arg3)
+{ gsave
+ 2 setlinewidth
+ newpath
+ exch xspacing mul xoffset add
+ exch yspacing mul
+ moveto
+ boxwidth 0 rlineto
+ 0 boxheight rlineto
+ boxwidth neg 0 rlineto
+ 0 boxheight neg rlineto
+ closepath
+ dup stringwidth pop neg boxwidth add 2 div
+ boxheight fontheight 2 div sub 2 div
+ rmoveto show stroke
+ grestore
+} def
+
+/mark
+{ newpath
+ exch xspacing mul xoffset add boxwidth add
+ exch yspacing mul
+ moveto
+ 0 boxheight 4 div rlineto
+ boxheight neg 4 div boxheight neg 4 div rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/arrow
+{ newpath
+ moveto
+ 3 -8 rlineto
+ -6 0 rlineto
+ 3 8 rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/out % draws an output connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight add
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/in % draws an input connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul disty 2 div sub
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/hedge
+{
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight 2 div sub
+ /y exch def
+ /x exch def
+ newpath
+ x y moveto
+ boxwidth 2 div distx add 0 rlineto
+ stroke
+ 1 eq
+ { newpath x boxwidth 2 div distx add add y moveto
+ -8 3 rlineto
+ 0 -6 rlineto
+ 8 3 rlineto
+ closepath
+ eofill
+ stroke
+ } if
+} def
+
+/vedge
+{
+ /ye exch def
+ /ys exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add dup
+ ys yspacing mul boxheight 2 div sub
+ moveto
+ ye yspacing mul boxheight 2 div sub
+ lineto
+ stroke
+} def
+
+/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3'
+{
+ /ys exch def
+ /xe exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add
+ ys yspacing mul disty 2 div sub
+ moveto
+ xspacing xe xs sub mul 0
+ rlineto
+ stroke
+} def
+
+% ----- main ------
+
+boxfont setfont
+1 boundaspect scale
+(xb::xbTblMgr) cw
+(xb::xbSsv) cw
+(xb::xbXBase) cw
+/boxwidth boxwidth marginwidth 2 mul add def
+/xspacing boxwidth distx add def
+/yspacing boxheight disty add def
+/scalefactor
+ boxwidth cols mul distx cols 1 sub mul add
+ boxheight rows mul disty rows 1 sub mul add boundaspect mul
+ max def
+boundx scalefactor div boundy scalefactor div scale
+
+% ----- classes -----
+
+ (xb::xbTblMgr) 0.000000 1.000000 box
+ (xb::xbSsv) 0.000000 2.000000 box
+ (xb::xbXBase) 0.000000 0.000000 box
+
+% ----- relations -----
+
+solid
+0 0.000000 1.000000 out
+solid
+1 0.000000 2.000000 in
+solid
+1 0.000000 0.250000 out
+solid
+0 0.000000 0.750000 in
diff --git a/docs/doxygen/latex/classxb_1_1xbTblMgr.pdf b/docs/doxygen/latex/classxb_1_1xbTblMgr.pdf
new file mode 100644
index 0000000..61ec0f3
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbTblMgr.pdf
Binary files differ
diff --git a/docs/doxygen/latex/classxb_1_1xbTblMgr.tex b/docs/doxygen/latex/classxb_1_1xbTblMgr.tex
new file mode 100644
index 0000000..6cb56a0
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbTblMgr.tex
@@ -0,0 +1,395 @@
+\hypertarget{classxb_1_1xbTblMgr}{}\doxysection{xb\+::xb\+Tbl\+Mgr Class Reference}
+\label{classxb_1_1xbTblMgr}\index{xb::xbTblMgr@{xb::xbTblMgr}}
+
+
+{\ttfamily \#include $<$xbtblmgr.\+h$>$}
+
+Inheritance diagram for xb\+::xb\+Tbl\+Mgr\+:\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[height=3.000000cm]{classxb_1_1xbTblMgr}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classxb_1_1xbTblMgr_aad83f5ecc184ca6cbdfc6f356b598d6c}{xb\+Tbl\+Mgr}} ()
+\item
+\mbox{\hyperlink{classxb_1_1xbTblMgr_aad6be32d7b3378c71d47fa27ebfe6cbf}{$\sim$xb\+Tbl\+Mgr}} ()
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_a721f69ccc7893842422a043468ffccea}{Add\+Tbl\+To\+Tbl\+List}} (\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Tbl\+Name)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_a62f6841849dbe5c1768f7e90f1b7e766}{Add\+Tbl\+To\+Tbl\+List}} (\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Tbl\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Tbl\+Alias)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_a5eebffb9e8cc64141e35c2622045cb50}{Display\+Table\+List}} () const
+\item
+\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ \mbox{\hyperlink{classxb_1_1xbTblMgr_ad8a5d28a2ee6720a9aa74bcb45662cf5}{Get\+Dbf\+Ptr}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Tbl\+Alias) const
+\item
+\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ \mbox{\hyperlink{classxb_1_1xbTblMgr_a801dfecf7fc216954b4197b2c31b25d6}{Get\+Dbf\+Ptr}} (xb\+Int16 s\+Item\+No) const
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_ad0d2d4adabc0dc0e761cfdee63c84069}{Get\+Open\+Table\+Count}} () const
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_ac8eaef41acf08911b90f900aac8e70af}{Remove\+Tbl\+From\+Tbl\+List}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Tbl\+Alias)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_a3d82b6e73d5c0bc8cac22b9a260389c1}{Remove\+Tbl\+From\+Tbl\+List}} (\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d)
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}{Display\+Error}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Display error message on console for a given error number. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}{Get\+Default\+Date\+Format}} () const
+\begin{DoxyCompactList}\small\item\em Get the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}{Get\+Data\+Directory}} () const
+\begin{DoxyCompactList}\small\item\em Get the current data directory. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}{Get\+Endian\+Type}} () const
+\begin{DoxyCompactList}\small\item\em Get the Endian type. \end{DoxyCompactList}\item
+const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}{Get\+Error\+Message}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Get an error message. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}{Set\+Data\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Data\+Directory)
+\begin{DoxyCompactList}\small\item\em Set the data directory. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}{Set\+Default\+Date\+Format}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Date\+Format)
+\begin{DoxyCompactList}\small\item\em Set the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}{Bit\+Set}} (unsigned char c, xb\+Int16 i\+Bit\+No) const
+\begin{DoxyCompactList}\small\item\em Check a bit in a one byte field and see if it is set. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}{Get\+Default\+Auto\+Commit}} () const
+\begin{DoxyCompactList}\small\item\em Get the default auto commit setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}{Set\+Default\+Auto\+Commit}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Default\+Auto\+Commit)
+\begin{DoxyCompactList}\small\item\em Set the default auto commit. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}{Get\+Default\+Log\+Directory}} () const
+\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}{Get\+Default\+Log\+File\+Name}} () const
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}{Set\+Default\+Log\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Log\+Directory)
+\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}{Get\+Multi\+User}} () const
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}{Set\+Multi\+User}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Multi\+User)
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+static const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}{Error\+Code\+Text}} \mbox{[}$\,$\mbox{]}
+\end{DoxyCompactItemize}
+\doxysubsection*{Protected Member Functions}
+\begin{DoxyCompactItemize}
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}{Set\+Endian\+Type}} ()
+\begin{DoxyCompactList}\small\item\em Set the endian type. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Protected Attributes}
+\begin{DoxyCompactItemize}
+\item
+static xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}{i\+Endian\+Type}} = 0
+\item
+static \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}{s\+Null\+String}} = \char`\"{}\char`\"{}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_aad83f5ecc184ca6cbdfc6f356b598d6c}\label{classxb_1_1xbTblMgr_aad83f5ecc184ca6cbdfc6f356b598d6c}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!xbTblMgr@{xbTblMgr}}
+\index{xbTblMgr@{xbTblMgr}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{xbTblMgr()}{xbTblMgr()}}
+{\footnotesize\ttfamily xb\+::xb\+Tbl\+Mgr\+::xb\+Tbl\+Mgr (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_aad6be32d7b3378c71d47fa27ebfe6cbf}\label{classxb_1_1xbTblMgr_aad6be32d7b3378c71d47fa27ebfe6cbf}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!````~xbTblMgr@{$\sim$xbTblMgr}}
+\index{````~xbTblMgr@{$\sim$xbTblMgr}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{$\sim$xbTblMgr()}{~xbTblMgr()}}
+{\footnotesize\ttfamily xb\+::xb\+Tbl\+Mgr\+::$\sim$xb\+Tbl\+Mgr (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_a721f69ccc7893842422a043468ffccea}\label{classxb_1_1xbTblMgr_a721f69ccc7893842422a043468ffccea}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!AddTblToTblList@{AddTblToTblList}}
+\index{AddTblToTblList@{AddTblToTblList}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{AddTblToTblList()}{AddTblToTblList()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Add\+Tbl\+To\+Tbl\+List (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Tbl\+Name }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_a62f6841849dbe5c1768f7e90f1b7e766}\label{classxb_1_1xbTblMgr_a62f6841849dbe5c1768f7e90f1b7e766}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!AddTblToTblList@{AddTblToTblList}}
+\index{AddTblToTblList@{AddTblToTblList}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{AddTblToTblList()}{AddTblToTblList()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Add\+Tbl\+To\+Tbl\+List (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Tbl\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Tbl\+Alias }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}\label{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!BitSet@{BitSet}}
+\index{BitSet@{BitSet}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{BitSet()}{BitSet()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Bit\+Set (\begin{DoxyParamCaption}\item[{unsigned char}]{c, }\item[{xb\+Int16}]{i\+Bit\+No }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Check a bit in a one byte field and see if it is set.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & One byte char field to examine. \\
+\hline
+{\em i\+Bit\+No} & which bit to examine. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True Bit is set~\newline
+ xb\+False Bit is not set
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}\label{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!DisplayError@{DisplayError}}
+\index{DisplayError@{DisplayError}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{DisplayError()}{DisplayError()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Display\+Error (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Display error message on console for a given error number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error number to reference \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_a5eebffb9e8cc64141e35c2622045cb50}\label{classxb_1_1xbTblMgr_a5eebffb9e8cc64141e35c2622045cb50}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!DisplayTableList@{DisplayTableList}}
+\index{DisplayTableList@{DisplayTableList}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{DisplayTableList()}{DisplayTableList()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Display\+Table\+List (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}\label{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetDataDirectory@{GetDataDirectory}}
+\index{GetDataDirectory@{GetDataDirectory}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetDataDirectory()}{GetDataDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Data\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the current data directory.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the current data directory where the database files are stored.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_ad8a5d28a2ee6720a9aa74bcb45662cf5}\label{classxb_1_1xbTblMgr_ad8a5d28a2ee6720a9aa74bcb45662cf5}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetDbfPtr@{GetDbfPtr}}
+\index{GetDbfPtr@{GetDbfPtr}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetDbfPtr()}{GetDbfPtr()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ xb\+::xb\+Tbl\+Mgr\+::\+Get\+Dbf\+Ptr (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Tbl\+Alias }\end{DoxyParamCaption}) const}
+
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_a801dfecf7fc216954b4197b2c31b25d6}\label{classxb_1_1xbTblMgr_a801dfecf7fc216954b4197b2c31b25d6}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetDbfPtr@{GetDbfPtr}}
+\index{GetDbfPtr@{GetDbfPtr}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetDbfPtr()}{GetDbfPtr()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ xb\+::xb\+Tbl\+Mgr\+::\+Get\+Dbf\+Ptr (\begin{DoxyParamCaption}\item[{xb\+Int16}]{s\+Item\+No }\end{DoxyParamCaption}) const}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}\label{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetDefaultAutoCommit@{GetDefaultAutoCommit}}
+\index{GetDefaultAutoCommit@{GetDefaultAutoCommit}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetDefaultAutoCommit()}{GetDefaultAutoCommit()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Default\+Auto\+Commit (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the default auto commit setting.
+
+When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}Append\+Record().
+
+\begin{DoxyReturn}{Returns}
+xb\+True if auto commit is turned on~\newline
+ xb\+False is auto commit is turned off
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}\label{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetDefaultDateFormat@{GetDefaultDateFormat}}
+\index{GetDefaultDateFormat@{GetDefaultDateFormat}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetDefaultDateFormat()}{GetDefaultDateFormat()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Date\+Format (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the default date format.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the default date format.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}\label{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetDefaultLogDirectory@{GetDefaultLogDirectory}}
+\index{GetDefaultLogDirectory@{GetDefaultLogDirectory}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogDirectory()}{GetDefaultLogDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}\label{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetDefaultLogFileName@{GetDefaultLogFileName}}
+\index{GetDefaultLogFileName@{GetDefaultLogFileName}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogFileName()}{GetDefaultLogFileName()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}\label{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetEndianType@{GetEndianType}}
+\index{GetEndianType@{GetEndianType}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetEndianType()}{GetEndianType()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::\+Get\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the Endian type.
+
+\begin{DoxyReturn}{Returns}
+B -\/ Big endian~\newline
+ L -\/ Little endian~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}\label{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetErrorMessage@{GetErrorMessage}}
+\index{GetErrorMessage@{GetErrorMessage}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetErrorMessage()}{GetErrorMessage()}}
+{\footnotesize\ttfamily const char $\ast$ xb\+::xb\+Ssv\+::\+Get\+Error\+Message (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get an error message.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error\+Code is the error number of description to be returned. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Returns a pointer to a string containing a text description for the error code.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}\label{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetMultiUser@{GetMultiUser}}
+\index{GetMultiUser@{GetMultiUser}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetMultiUser()}{GetMultiUser()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Multi\+User (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the multi user setting.
+
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Multi user mode turned on.~\newline
+ xb\+False -\/ Multi user mode turned off.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_ad0d2d4adabc0dc0e761cfdee63c84069}\label{classxb_1_1xbTblMgr_ad0d2d4adabc0dc0e761cfdee63c84069}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!GetOpenTableCount@{GetOpenTableCount}}
+\index{GetOpenTableCount@{GetOpenTableCount}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{GetOpenTableCount()}{GetOpenTableCount()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Get\+Open\+Table\+Count (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_ac8eaef41acf08911b90f900aac8e70af}\label{classxb_1_1xbTblMgr_ac8eaef41acf08911b90f900aac8e70af}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!RemoveTblFromTblList@{RemoveTblFromTblList}}
+\index{RemoveTblFromTblList@{RemoveTblFromTblList}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{RemoveTblFromTblList()}{RemoveTblFromTblList()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Remove\+Tbl\+From\+Tbl\+List (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Tbl\+Alias }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_a3d82b6e73d5c0bc8cac22b9a260389c1}\label{classxb_1_1xbTblMgr_a3d82b6e73d5c0bc8cac22b9a260389c1}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!RemoveTblFromTblList@{RemoveTblFromTblList}}
+\index{RemoveTblFromTblList@{RemoveTblFromTblList}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{RemoveTblFromTblList()}{RemoveTblFromTblList()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Remove\+Tbl\+From\+Tbl\+List (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}\label{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!SetDataDirectory@{SetDataDirectory}}
+\index{SetDataDirectory@{SetDataDirectory}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{SetDataDirectory()}{SetDataDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Data\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Data\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the data directory.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Data\+Directory} & Set the data direcroty. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}\label{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!SetDefaultAutoCommit@{SetDefaultAutoCommit}}
+\index{SetDefaultAutoCommit@{SetDefaultAutoCommit}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{SetDefaultAutoCommit()}{SetDefaultAutoCommit()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Auto\+Commit (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Default\+Auto\+Commit }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the default auto commit.
+
+Disabling auto commit requires the application execute explicit updates using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}Append\+Record(). With auto commit on, the library posts updates automatically when moving off the current record or closing a file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Default\+Auto\+Commit} & xb\+True -\/ Enable default auto commit.~\newline
+ xb\+False -\/ Disable default auto commit.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}\label{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!SetDefaultDateFormat@{SetDefaultDateFormat}}
+\index{SetDefaultDateFormat@{SetDefaultDateFormat}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{SetDefaultDateFormat()}{SetDefaultDateFormat()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Date\+Format (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Date\+Format }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the default date format.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Default\+Date\+Format} & Set the default date format. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}\label{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!SetDefaultLogDirectory@{SetDefaultLogDirectory}}
+\index{SetDefaultLogDirectory@{SetDefaultLogDirectory}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{SetDefaultLogDirectory()}{SetDefaultLogDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Log\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Log\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}\label{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!SetEndianType@{SetEndianType}}
+\index{SetEndianType@{SetEndianType}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{SetEndianType()}{SetEndianType()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+
+
+Set the endian type.
+
+This routine determines the Endian-\/ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. \mbox{\Hypertarget{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}\label{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!SetMultiUser@{SetMultiUser}}
+\index{SetMultiUser@{SetMultiUser}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{SetMultiUser()}{SetMultiUser()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Multi\+User (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Multi\+User }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the multi user setting.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Multi\+User} & xb\+True -\/ Turn on Multi user mode.~\newline
+ xb\+False -\/ Turn off Multi user mode.~\newline
+ \\
+\hline
+\end{DoxyParams}
+
+
+\doxysubsection{Field Documentation}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}\label{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!ErrorCodeText@{ErrorCodeText}}
+\index{ErrorCodeText@{ErrorCodeText}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{ErrorCodeText}{ErrorCodeText}}
+{\footnotesize\ttfamily const char$\ast$ xb\+::xb\+Ssv\+::\+Error\+Code\+Text\mbox{[}$\,$\mbox{]}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}\label{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!iEndianType@{iEndianType}}
+\index{iEndianType@{iEndianType}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{iEndianType}{iEndianType}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::i\+Endian\+Type = 0\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}\label{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}}
+\index{xb::xbTblMgr@{xb::xbTblMgr}!sNullString@{sNullString}}
+\index{sNullString@{sNullString}!xb::xbTblMgr@{xb::xbTblMgr}}
+\doxysubsubsection{\texorpdfstring{sNullString}{sNullString}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+Ssv\+::s\+Null\+String = \char`\"{}\char`\"{}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbtblmgr_8h}{xbtblmgr.\+h}}\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbtblmgr_8cpp}{xbtblmgr.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/classxb_1_1xbXBase.eps b/docs/doxygen/latex/classxb_1_1xbXBase.eps
new file mode 100644
index 0000000..c5ffd19
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbXBase.eps
@@ -0,0 +1,203 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: ClassName
+%%Creator: Doxygen
+%%CreationDate: Time
+%%For:
+%Magnification: 1.00
+%%Orientation: Portrait
+%%BoundingBox: 0 0 500 652.173889
+%%Pages: 0
+%%BeginSetup
+%%EndSetup
+%%EndComments
+
+% ----- variables -----
+
+/boxwidth 0 def
+/boxheight 40 def
+/fontheight 24 def
+/marginwidth 10 def
+/distx 20 def
+/disty 40 def
+/boundaspect 0.766667 def % aspect ratio of the BoundingBox (width/height)
+/boundx 500 def
+/boundy boundx boundaspect div def
+/xspacing 0 def
+/yspacing 0 def
+/rows 3 def
+/cols 1 def
+/scalefactor 0 def
+/boxfont /Times-Roman findfont fontheight scalefont def
+
+% ----- procedures -----
+
+/dotted { [1 4] 0 setdash } def
+/dashed { [5] 0 setdash } def
+/solid { [] 0 setdash } def
+
+/max % result = MAX(arg1,arg2)
+{
+ /a exch def
+ /b exch def
+ a b gt {a} {b} ifelse
+} def
+
+/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)
+{
+ 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max
+} def
+
+/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))
+{
+ /str exch def
+ /boxwidth boxwidth str stringwidth pop max def
+} def
+
+/box % draws a box with text 'arg1' at grid pos (arg2,arg3)
+{ gsave
+ 2 setlinewidth
+ newpath
+ exch xspacing mul xoffset add
+ exch yspacing mul
+ moveto
+ boxwidth 0 rlineto
+ 0 boxheight rlineto
+ boxwidth neg 0 rlineto
+ 0 boxheight neg rlineto
+ closepath
+ dup stringwidth pop neg boxwidth add 2 div
+ boxheight fontheight 2 div sub 2 div
+ rmoveto show stroke
+ grestore
+} def
+
+/mark
+{ newpath
+ exch xspacing mul xoffset add boxwidth add
+ exch yspacing mul
+ moveto
+ 0 boxheight 4 div rlineto
+ boxheight neg 4 div boxheight neg 4 div rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/arrow
+{ newpath
+ moveto
+ 3 -8 rlineto
+ -6 0 rlineto
+ 3 8 rlineto
+ closepath
+ eofill
+ stroke
+} def
+
+/out % draws an output connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight add
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/in % draws an input connector for the block at (arg1,arg2)
+{
+ newpath
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul disty 2 div sub
+ /y exch def
+ /x exch def
+ x y moveto
+ 0 disty 2 div rlineto
+ stroke
+ 1 eq { x y disty 2 div add arrow } if
+} def
+
+/hedge
+{
+ exch xspacing mul xoffset add boxwidth 2 div add
+ exch yspacing mul boxheight 2 div sub
+ /y exch def
+ /x exch def
+ newpath
+ x y moveto
+ boxwidth 2 div distx add 0 rlineto
+ stroke
+ 1 eq
+ { newpath x boxwidth 2 div distx add add y moveto
+ -8 3 rlineto
+ 0 -6 rlineto
+ 8 3 rlineto
+ closepath
+ eofill
+ stroke
+ } if
+} def
+
+/vedge
+{
+ /ye exch def
+ /ys exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add dup
+ ys yspacing mul boxheight 2 div sub
+ moveto
+ ye yspacing mul boxheight 2 div sub
+ lineto
+ stroke
+} def
+
+/conn % connections the blocks from col 'arg1' to 'arg2' of row 'arg3'
+{
+ /ys exch def
+ /xe exch def
+ /xs exch def
+ newpath
+ xs xspacing mul xoffset add boxwidth 2 div add
+ ys yspacing mul disty 2 div sub
+ moveto
+ xspacing xe xs sub mul 0
+ rlineto
+ stroke
+} def
+
+% ----- main ------
+
+boxfont setfont
+1 boundaspect scale
+(xb::xbXBase) cw
+(xb::xbTblMgr) cw
+(xb::xbSsv) cw
+/boxwidth boxwidth marginwidth 2 mul add def
+/xspacing boxwidth distx add def
+/yspacing boxheight disty add def
+/scalefactor
+ boxwidth cols mul distx cols 1 sub mul add
+ boxheight rows mul disty rows 1 sub mul add boundaspect mul
+ max def
+boundx scalefactor div boundy scalefactor div scale
+
+% ----- classes -----
+
+ (xb::xbXBase) 0.000000 0.000000 box
+ (xb::xbTblMgr) 0.000000 1.000000 box
+ (xb::xbSsv) 0.000000 2.000000 box
+
+% ----- relations -----
+
+solid
+0 0.000000 0.000000 out
+solid
+1 0.000000 1.000000 in
+solid
+0 0.000000 1.000000 out
+solid
+1 0.000000 2.000000 in
diff --git a/docs/doxygen/latex/classxb_1_1xbXBase.pdf b/docs/doxygen/latex/classxb_1_1xbXBase.pdf
new file mode 100644
index 0000000..8896f3c
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbXBase.pdf
Binary files differ
diff --git a/docs/doxygen/latex/classxb_1_1xbXBase.tex b/docs/doxygen/latex/classxb_1_1xbXBase.tex
new file mode 100644
index 0000000..4cdec63
--- /dev/null
+++ b/docs/doxygen/latex/classxb_1_1xbXBase.tex
@@ -0,0 +1,663 @@
+\hypertarget{classxb_1_1xbXBase}{}\doxysection{xb\+::xb\+XBase Class Reference}
+\label{classxb_1_1xbXBase}\index{xb::xbXBase@{xb::xbXBase}}
+
+
+xb\+Xbase class.
+
+
+
+
+{\ttfamily \#include $<$xbxbase.\+h$>$}
+
+Inheritance diagram for xb\+::xb\+XBase\+:\begin{figure}[H]
+\begin{center}
+\leavevmode
+\includegraphics[height=3.000000cm]{classxb_1_1xbXBase}
+\end{center}
+\end{figure}
+\doxysubsection*{Public Member Functions}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{classxb_1_1xbXBase_a6c68588e33946fb5416af3f86fe83224}{xb\+XBase}} ()
+\begin{DoxyCompactList}\small\item\em Class Constructor. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbXBase_a204f8634894ac2066d3209117803306d}{$\sim$xb\+XBase}} ()
+\begin{DoxyCompactList}\small\item\em Class Deconstructor. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbXBase_afccb552ca0daff779c0500ff20d22c2b}{Close\+All\+Tables}} ()
+\begin{DoxyCompactList}\small\item\em Close all tables / files. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbXBase_ae357fac4fdebdf49e46563cf611caf65}{Disable\+Msg\+Logging}} ()
+\item
+void \mbox{\hyperlink{classxb_1_1xbXBase_a470e6eb0ed0be60338f9b40976d3ad48}{Enable\+Msg\+Logging}} ()
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbXBase_a5a5ecaed9777978344902446c9ae3b8e}{Flush\+Log}} ()
+\item
+const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbXBase_a51d49b4d699740194b28c6ec0d0ee07b}{Get\+Log\+Directory}} () const
+\item
+const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbXBase_ac0744edf9e4aa959d8cf2daa874376af}{Get\+Log\+File\+Name}} () const
+\item
+const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbXBase_ab5d63cd7d9137eba8a1d4d9c3df522b7}{Get\+Log\+Fq\+File\+Name}} () const
+\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbXBase_ade34cd72c2a7e70fb55429a8a6f6c028}{Get\+Log\+Status}} () const
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbXBase_aa957eb502ecd076e5df89e7415cb094b}{Open\+Highest\+Version}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Table\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Alias, \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} \&dbf, int dummy)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbXBase_afa7bbac08a4601f49cd53b457196ee0e}{Open\+Highest\+Version}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Table\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Alias, \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$$\ast$dbf)
+\item
+\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ \mbox{\hyperlink{classxb_1_1xbXBase_aafb1abd6b6124cddf635adaf9f615a4a}{Open}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Table\+Name, xb\+Int16 \&i\+Rc)
+\begin{DoxyCompactList}\small\item\em Open highest qualified class available for dbf file. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ \mbox{\hyperlink{classxb_1_1xbXBase_ab35cec5ac8f0fa95f10653ca7ac817f6}{Open}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Table\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Alias, xb\+Int16 i\+Open\+Mode, xb\+Int16 i\+Share\+Mode, xb\+Int16 i\+Version, xb\+Int16 \&i\+Rc)
+\begin{DoxyCompactList}\small\item\em Open highest qualified class available for dbf file. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbXBase_a48d82dbe298c6f4cf68a63ac82dd8292}{Set\+Log\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Log\+File\+Directory)
+\item
+void \mbox{\hyperlink{classxb_1_1xbXBase_a94010b88a309315ef980715eb581336c}{Set\+Log\+File\+Name}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Log\+File\+Name)
+\item
+void \mbox{\hyperlink{classxb_1_1xbXBase_a666a0cb5b76ec7a9a3677d339e0c6b42}{Set\+Log\+Size}} (size\+\_\+t l\+Size)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbXBase_a9ca5be73abffd0fdd18bdc799877272a}{Write\+Log\+Message}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Log\+Message, xb\+Int16 i\+Output\+Opt=0)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbXBase_a0dff00b9ee3c288841e137ca01168116}{Write\+Log\+Bytes}} (xb\+UInt32 l\+Cnt, const char $\ast$p)
+\item
+void \mbox{\hyperlink{classxb_1_1xbXBase_a0915aff7be4b2dd3e881f3c5d0da4baf}{xb\+Sleep}} (xb\+Int32 l\+Millisecs)
+\begin{DoxyCompactList}\small\item\em Cross platform sleep function. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_a721f69ccc7893842422a043468ffccea}{Add\+Tbl\+To\+Tbl\+List}} (\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Tbl\+Name)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_a62f6841849dbe5c1768f7e90f1b7e766}{Add\+Tbl\+To\+Tbl\+List}} (\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Tbl\+Name, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Tbl\+Alias)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_a5eebffb9e8cc64141e35c2622045cb50}{Display\+Table\+List}} () const
+\item
+\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ \mbox{\hyperlink{classxb_1_1xbTblMgr_ad8a5d28a2ee6720a9aa74bcb45662cf5}{Get\+Dbf\+Ptr}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Tbl\+Alias) const
+\item
+\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ \mbox{\hyperlink{classxb_1_1xbTblMgr_a801dfecf7fc216954b4197b2c31b25d6}{Get\+Dbf\+Ptr}} (xb\+Int16 s\+Item\+No) const
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_ad0d2d4adabc0dc0e761cfdee63c84069}{Get\+Open\+Table\+Count}} () const
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_ac8eaef41acf08911b90f900aac8e70af}{Remove\+Tbl\+From\+Tbl\+List}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Tbl\+Alias)
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbTblMgr_a3d82b6e73d5c0bc8cac22b9a260389c1}{Remove\+Tbl\+From\+Tbl\+List}} (\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d)
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}{Display\+Error}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Display error message on console for a given error number. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}{Get\+Default\+Date\+Format}} () const
+\begin{DoxyCompactList}\small\item\em Get the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}{Get\+Data\+Directory}} () const
+\begin{DoxyCompactList}\small\item\em Get the current data directory. \end{DoxyCompactList}\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}{Get\+Endian\+Type}} () const
+\begin{DoxyCompactList}\small\item\em Get the Endian type. \end{DoxyCompactList}\item
+const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}{Get\+Error\+Message}} (xb\+Int16 Error\+Code) const
+\begin{DoxyCompactList}\small\item\em Get an error message. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}{Set\+Data\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Data\+Directory)
+\begin{DoxyCompactList}\small\item\em Set the data directory. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}{Set\+Default\+Date\+Format}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Date\+Format)
+\begin{DoxyCompactList}\small\item\em Set the default date format. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}{Bit\+Set}} (unsigned char c, xb\+Int16 i\+Bit\+No) const
+\begin{DoxyCompactList}\small\item\em Check a bit in a one byte field and see if it is set. \end{DoxyCompactList}\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}{Get\+Default\+Auto\+Commit}} () const
+\begin{DoxyCompactList}\small\item\em Get the default auto commit setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}{Set\+Default\+Auto\+Commit}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Default\+Auto\+Commit)
+\begin{DoxyCompactList}\small\item\em Set the default auto commit. \end{DoxyCompactList}\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}{Get\+Default\+Log\+Directory}} () const
+\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& \mbox{\hyperlink{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}{Get\+Default\+Log\+File\+Name}} () const
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}{Set\+Default\+Log\+Directory}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Default\+Log\+Directory)
+\item
+\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} \mbox{\hyperlink{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}{Get\+Multi\+User}} () const
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}{Set\+Multi\+User}} (\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Multi\+User)
+\begin{DoxyCompactList}\small\item\em Get the multi user setting. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Public Attributes}
+\begin{DoxyCompactItemize}
+\item
+static const char $\ast$ \mbox{\hyperlink{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}{Error\+Code\+Text}} \mbox{[}$\,$\mbox{]}
+\end{DoxyCompactItemize}
+\doxysubsection*{Protected Member Functions}
+\begin{DoxyCompactItemize}
+\item
+xb\+Int16 \mbox{\hyperlink{classxb_1_1xbXBase_ae52e53340593b4253936c1372ec15ee1}{Get\+Function\+Info}} (const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Exp\+Line, char \&c\+Return\+Type, xb\+Int16 \&i\+Return\+Len\+Calc, xb\+Int32 \&l\+Return\+Len\+Val) const
+\item
+void \mbox{\hyperlink{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}{Set\+Endian\+Type}} ()
+\begin{DoxyCompactList}\small\item\em Set the endian type. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Protected Member Functions}
+\begin{DoxyCompactItemize}
+\item
+static xb\+Int16 \mbox{\hyperlink{classxb_1_1xbXBase_a1b239c021358476382942522911b5c66}{xb\+Memcmp}} (const unsigned char $\ast$s1, const unsigned char $\ast$s2, size\+\_\+t n)
+\begin{DoxyCompactList}\small\item\em Cross memcmp function. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Static Protected Attributes}
+\begin{DoxyCompactItemize}
+\item
+static xb\+Int16 \mbox{\hyperlink{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}{i\+Endian\+Type}} = 0
+\item
+static \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \mbox{\hyperlink{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}{s\+Null\+String}} = \char`\"{}\char`\"{}
+\end{DoxyCompactItemize}
+\doxysubsection*{Friends}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classxb_1_1xbXBase_a86a53ce3efbf910996df0f853f1c0add}{xb\+Bcd}}
+\item
+class \mbox{\hyperlink{classxb_1_1xbXBase_a3c3e5617be811d732472fe2cc8fb18cc}{xb\+Exp}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+xb\+Xbase class.
+
+The \mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} class is the core class that needs to be in every application program.
+
+\doxysubsection{Constructor \& Destructor Documentation}
+\mbox{\Hypertarget{classxb_1_1xbXBase_a6c68588e33946fb5416af3f86fe83224}\label{classxb_1_1xbXBase_a6c68588e33946fb5416af3f86fe83224}}
+\index{xb::xbXBase@{xb::xbXBase}!xbXBase@{xbXBase}}
+\index{xbXBase@{xbXBase}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{xbXBase()}{xbXBase()}}
+{\footnotesize\ttfamily xb\+::xb\+XBase\+::xb\+XBase (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Class Constructor.
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_a204f8634894ac2066d3209117803306d}\label{classxb_1_1xbXBase_a204f8634894ac2066d3209117803306d}}
+\index{xb::xbXBase@{xb::xbXBase}!````~xbXBase@{$\sim$xbXBase}}
+\index{````~xbXBase@{$\sim$xbXBase}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{$\sim$xbXBase()}{~xbXBase()}}
+{\footnotesize\ttfamily xb\+::xb\+XBase\+::$\sim$xb\+XBase (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Class Deconstructor.
+
+
+
+\doxysubsection{Member Function Documentation}
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_a721f69ccc7893842422a043468ffccea}\label{classxb_1_1xbTblMgr_a721f69ccc7893842422a043468ffccea}}
+\index{xb::xbXBase@{xb::xbXBase}!AddTblToTblList@{AddTblToTblList}}
+\index{AddTblToTblList@{AddTblToTblList}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{AddTblToTblList()}{AddTblToTblList()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Add\+Tbl\+To\+Tbl\+List (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Tbl\+Name }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_a62f6841849dbe5c1768f7e90f1b7e766}\label{classxb_1_1xbTblMgr_a62f6841849dbe5c1768f7e90f1b7e766}}
+\index{xb::xbXBase@{xb::xbXBase}!AddTblToTblList@{AddTblToTblList}}
+\index{AddTblToTblList@{AddTblToTblList}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{AddTblToTblList()}{AddTblToTblList()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Add\+Tbl\+To\+Tbl\+List (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Tbl\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Tbl\+Alias }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}\label{classxb_1_1xbSsv_a62e4fd0a5888665c76bbbad962794e72}}
+\index{xb::xbXBase@{xb::xbXBase}!BitSet@{BitSet}}
+\index{BitSet@{BitSet}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{BitSet()}{BitSet()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Bit\+Set (\begin{DoxyParamCaption}\item[{unsigned char}]{c, }\item[{xb\+Int16}]{i\+Bit\+No }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Check a bit in a one byte field and see if it is set.
+
+
+\begin{DoxyParams}{Parameters}
+{\em c} & One byte char field to examine. \\
+\hline
+{\em i\+Bit\+No} & which bit to examine. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+xb\+True Bit is set~\newline
+ xb\+False Bit is not set
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbXBase_afccb552ca0daff779c0500ff20d22c2b}\label{classxb_1_1xbXBase_afccb552ca0daff779c0500ff20d22c2b}}
+\index{xb::xbXBase@{xb::xbXBase}!CloseAllTables@{CloseAllTables}}
+\index{CloseAllTables@{CloseAllTables}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{CloseAllTables()}{CloseAllTables()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+XBase\+::\+Close\+All\+Tables (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+
+
+Close all tables / files.
+
+This closes everything. \begin{DoxyReturn}{Returns}
+\href{xbretcod_8h.html}{\texttt{ Return Codes}}
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbXBase_ae357fac4fdebdf49e46563cf611caf65}\label{classxb_1_1xbXBase_ae357fac4fdebdf49e46563cf611caf65}}
+\index{xb::xbXBase@{xb::xbXBase}!DisableMsgLogging@{DisableMsgLogging}}
+\index{DisableMsgLogging@{DisableMsgLogging}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{DisableMsgLogging()}{DisableMsgLogging()}}
+{\footnotesize\ttfamily void xb\+::xb\+XBase\+::\+Disable\+Msg\+Logging (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}\label{classxb_1_1xbSsv_a97dfa59ab9a8e9f17454da0faceb023d}}
+\index{xb::xbXBase@{xb::xbXBase}!DisplayError@{DisplayError}}
+\index{DisplayError@{DisplayError}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{DisplayError()}{DisplayError()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Display\+Error (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Display error message on console for a given error number.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error number to reference \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_a5eebffb9e8cc64141e35c2622045cb50}\label{classxb_1_1xbTblMgr_a5eebffb9e8cc64141e35c2622045cb50}}
+\index{xb::xbXBase@{xb::xbXBase}!DisplayTableList@{DisplayTableList}}
+\index{DisplayTableList@{DisplayTableList}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{DisplayTableList()}{DisplayTableList()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Display\+Table\+List (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_a470e6eb0ed0be60338f9b40976d3ad48}\label{classxb_1_1xbXBase_a470e6eb0ed0be60338f9b40976d3ad48}}
+\index{xb::xbXBase@{xb::xbXBase}!EnableMsgLogging@{EnableMsgLogging}}
+\index{EnableMsgLogging@{EnableMsgLogging}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{EnableMsgLogging()}{EnableMsgLogging()}}
+{\footnotesize\ttfamily void xb\+::xb\+XBase\+::\+Enable\+Msg\+Logging (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_a5a5ecaed9777978344902446c9ae3b8e}\label{classxb_1_1xbXBase_a5a5ecaed9777978344902446c9ae3b8e}}
+\index{xb::xbXBase@{xb::xbXBase}!FlushLog@{FlushLog}}
+\index{FlushLog@{FlushLog}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{FlushLog()}{FlushLog()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+XBase\+::\+Flush\+Log (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}\label{classxb_1_1xbSsv_a1d803a4bfc8ba0561267a0bf9e51f7d9}}
+\index{xb::xbXBase@{xb::xbXBase}!GetDataDirectory@{GetDataDirectory}}
+\index{GetDataDirectory@{GetDataDirectory}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetDataDirectory()}{GetDataDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Data\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the current data directory.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the current data directory where the database files are stored.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_ad8a5d28a2ee6720a9aa74bcb45662cf5}\label{classxb_1_1xbTblMgr_ad8a5d28a2ee6720a9aa74bcb45662cf5}}
+\index{xb::xbXBase@{xb::xbXBase}!GetDbfPtr@{GetDbfPtr}}
+\index{GetDbfPtr@{GetDbfPtr}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetDbfPtr()}{GetDbfPtr()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ xb\+::xb\+Tbl\+Mgr\+::\+Get\+Dbf\+Ptr (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Tbl\+Alias }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_a801dfecf7fc216954b4197b2c31b25d6}\label{classxb_1_1xbTblMgr_a801dfecf7fc216954b4197b2c31b25d6}}
+\index{xb::xbXBase@{xb::xbXBase}!GetDbfPtr@{GetDbfPtr}}
+\index{GetDbfPtr@{GetDbfPtr}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetDbfPtr()}{GetDbfPtr()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ xb\+::xb\+Tbl\+Mgr\+::\+Get\+Dbf\+Ptr (\begin{DoxyParamCaption}\item[{xb\+Int16}]{s\+Item\+No }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}\label{classxb_1_1xbSsv_a6982f973e81587b04916f4509746aaf5}}
+\index{xb::xbXBase@{xb::xbXBase}!GetDefaultAutoCommit@{GetDefaultAutoCommit}}
+\index{GetDefaultAutoCommit@{GetDefaultAutoCommit}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetDefaultAutoCommit()}{GetDefaultAutoCommit()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Default\+Auto\+Commit (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the default auto commit setting.
+
+When auto commit is enabled, the library will automatically post any updates when moving off an updated record or closing files. If auto commit is disabled, the application program will need to explicitly update the tables using using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}Append\+Record().
+
+\begin{DoxyReturn}{Returns}
+xb\+True if auto commit is turned on~\newline
+ xb\+False is auto commit is turned off
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}\label{classxb_1_1xbSsv_a6fbb9c3a550ab0b3378f9586a57791d2}}
+\index{xb::xbXBase@{xb::xbXBase}!GetDefaultDateFormat@{GetDefaultDateFormat}}
+\index{GetDefaultDateFormat@{GetDefaultDateFormat}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetDefaultDateFormat()}{GetDefaultDateFormat()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Date\+Format (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the default date format.
+
+\begin{DoxyReturn}{Returns}
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} containing the default date format.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}\label{classxb_1_1xbSsv_abf3763faf6a8917a963213cd53af529c}}
+\index{xb::xbXBase@{xb::xbXBase}!GetDefaultLogDirectory@{GetDefaultLogDirectory}}
+\index{GetDefaultLogDirectory@{GetDefaultLogDirectory}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogDirectory()}{GetDefaultLogDirectory()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}\label{classxb_1_1xbSsv_a43878d4dc041f2a5e2398a118ccfaf79}}
+\index{xb::xbXBase@{xb::xbXBase}!GetDefaultLogFileName@{GetDefaultLogFileName}}
+\index{GetDefaultLogFileName@{GetDefaultLogFileName}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetDefaultLogFileName()}{GetDefaultLogFileName()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+Ssv\+::\+Get\+Default\+Log\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}\label{classxb_1_1xbSsv_a49cd162f066eef2b829ba7c9f6620243}}
+\index{xb::xbXBase@{xb::xbXBase}!GetEndianType@{GetEndianType}}
+\index{GetEndianType@{GetEndianType}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetEndianType()}{GetEndianType()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::\+Get\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the Endian type.
+
+\begin{DoxyReturn}{Returns}
+B -\/ Big endian~\newline
+ L -\/ Little endian~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}\label{classxb_1_1xbSsv_a56961d2a67b8e7470098626ac4dac7e4}}
+\index{xb::xbXBase@{xb::xbXBase}!GetErrorMessage@{GetErrorMessage}}
+\index{GetErrorMessage@{GetErrorMessage}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetErrorMessage()}{GetErrorMessage()}}
+{\footnotesize\ttfamily const char $\ast$ xb\+::xb\+Ssv\+::\+Get\+Error\+Message (\begin{DoxyParamCaption}\item[{xb\+Int16}]{i\+Error\+Code }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get an error message.
+
+
+\begin{DoxyParams}{Parameters}
+{\em i\+Error\+Code} & Error\+Code is the error number of description to be returned. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+Returns a pointer to a string containing a text description for the error code.
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbXBase_ae52e53340593b4253936c1372ec15ee1}\label{classxb_1_1xbXBase_ae52e53340593b4253936c1372ec15ee1}}
+\index{xb::xbXBase@{xb::xbXBase}!GetFunctionInfo@{GetFunctionInfo}}
+\index{GetFunctionInfo@{GetFunctionInfo}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetFunctionInfo()}{GetFunctionInfo()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+XBase\+::\+Get\+Function\+Info (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Exp\+Line, }\item[{char \&}]{c\+Return\+Type, }\item[{xb\+Int16 \&}]{i\+Return\+Len\+Calc, }\item[{xb\+Int32 \&}]{l\+Return\+Len\+Val }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [protected]}}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_a51d49b4d699740194b28c6ec0d0ee07b}\label{classxb_1_1xbXBase_a51d49b4d699740194b28c6ec0d0ee07b}}
+\index{xb::xbXBase@{xb::xbXBase}!GetLogDirectory@{GetLogDirectory}}
+\index{GetLogDirectory@{GetLogDirectory}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetLogDirectory()}{GetLogDirectory()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+XBase\+::\+Get\+Log\+Directory (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_ac0744edf9e4aa959d8cf2daa874376af}\label{classxb_1_1xbXBase_ac0744edf9e4aa959d8cf2daa874376af}}
+\index{xb::xbXBase@{xb::xbXBase}!GetLogFileName@{GetLogFileName}}
+\index{GetLogFileName@{GetLogFileName}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetLogFileName()}{GetLogFileName()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+XBase\+::\+Get\+Log\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_ab5d63cd7d9137eba8a1d4d9c3df522b7}\label{classxb_1_1xbXBase_ab5d63cd7d9137eba8a1d4d9c3df522b7}}
+\index{xb::xbXBase@{xb::xbXBase}!GetLogFqFileName@{GetLogFqFileName}}
+\index{GetLogFqFileName@{GetLogFqFileName}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetLogFqFileName()}{GetLogFqFileName()}}
+{\footnotesize\ttfamily const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \& xb\+::xb\+XBase\+::\+Get\+Log\+Fq\+File\+Name (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_ade34cd72c2a7e70fb55429a8a6f6c028}\label{classxb_1_1xbXBase_ade34cd72c2a7e70fb55429a8a6f6c028}}
+\index{xb::xbXBase@{xb::xbXBase}!GetLogStatus@{GetLogStatus}}
+\index{GetLogStatus@{GetLogStatus}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetLogStatus()}{GetLogStatus()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+XBase\+::\+Get\+Log\+Status (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}\label{classxb_1_1xbSsv_abd58031c5f1c3766c24d47a82e6fd9c5}}
+\index{xb::xbXBase@{xb::xbXBase}!GetMultiUser@{GetMultiUser}}
+\index{GetMultiUser@{GetMultiUser}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetMultiUser()}{GetMultiUser()}}
+{\footnotesize\ttfamily \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} xb\+::xb\+Ssv\+::\+Get\+Multi\+User (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the multi user setting.
+
+\begin{DoxyReturn}{Returns}
+xb\+True -\/ Multi user mode turned on.~\newline
+ xb\+False -\/ Multi user mode turned off.~\newline
+
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_ad0d2d4adabc0dc0e761cfdee63c84069}\label{classxb_1_1xbTblMgr_ad0d2d4adabc0dc0e761cfdee63c84069}}
+\index{xb::xbXBase@{xb::xbXBase}!GetOpenTableCount@{GetOpenTableCount}}
+\index{GetOpenTableCount@{GetOpenTableCount}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{GetOpenTableCount()}{GetOpenTableCount()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Get\+Open\+Table\+Count (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_ab35cec5ac8f0fa95f10653ca7ac817f6}\label{classxb_1_1xbXBase_ab35cec5ac8f0fa95f10653ca7ac817f6}}
+\index{xb::xbXBase@{xb::xbXBase}!Open@{Open}}
+\index{Open@{Open}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{Open()}{Open()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ xb\+::xb\+XBase\+::\+Open (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Table\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Alias, }\item[{xb\+Int16}]{i\+Open\+Mode, }\item[{xb\+Int16}]{i\+Share\+Mode, }\item[{xb\+Int16}]{i\+Request\+Version, }\item[{xb\+Int16 \&}]{i\+Rc }\end{DoxyParamCaption})}
+
+
+
+Open highest qualified class available for dbf file.
+
+This routine can open various versions of the dbf file dependent on the i\+Version field
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Table\+Name} & -\/ Table name to open. \\
+\hline
+{\em s\+Alias} & -\/ Optional alias name. \\
+\hline
+{\em i\+Open\+Mode} & -\/ XB\+\_\+\+READ\+\_\+\+WRITE or XB\+\_\+\+READ \\
+\hline
+{\em i\+Share\+Mode} & -\/ XB\+\_\+\+SINGLE\+\_\+\+USER or XB\+\_\+\+MULTI\+\_\+\+USER \\
+\hline
+{\em i\+Request\+Version} & 0 -\/ Highest available 4 -\/ Version four dbf 3 -\/ Version three dbf \\
+\hline
+{\em i\+Rc} & -\/ Return code from open request \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+param dbf -\/ Output pointer to dbf file opened or null if error
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbXBase_aafb1abd6b6124cddf635adaf9f615a4a}\label{classxb_1_1xbXBase_aafb1abd6b6124cddf635adaf9f615a4a}}
+\index{xb::xbXBase@{xb::xbXBase}!Open@{Open}}
+\index{Open@{Open}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{Open()}{Open()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ xb\+::xb\+XBase\+::\+Open (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Table\+Name, }\item[{xb\+Int16 \&}]{i\+Rc }\end{DoxyParamCaption})}
+
+
+
+Open highest qualified class available for dbf file.
+
+This routine opens the highest available version of the dbf file. Defaults to XB\+\_\+\+READ\+\_\+\+WRITE and XB\+\_\+\+MULTI\+\_\+\+USER mode. \begin{DoxyReturn}{Returns}
+param dbf -\/ Output pointer to dbf file opened or null if error
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbXBase_aa957eb502ecd076e5df89e7415cb094b}\label{classxb_1_1xbXBase_aa957eb502ecd076e5df89e7415cb094b}}
+\index{xb::xbXBase@{xb::xbXBase}!OpenHighestVersion@{OpenHighestVersion}}
+\index{OpenHighestVersion@{OpenHighestVersion}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{OpenHighestVersion()}{OpenHighestVersion()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+XBase\+::\+Open\+Highest\+Version (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Table\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Alias, }\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} \&}]{dbf, }\item[{int}]{dummy }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_afa7bbac08a4601f49cd53b457196ee0e}\label{classxb_1_1xbXBase_afa7bbac08a4601f49cd53b457196ee0e}}
+\index{xb::xbXBase@{xb::xbXBase}!OpenHighestVersion@{OpenHighestVersion}}
+\index{OpenHighestVersion@{OpenHighestVersion}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{OpenHighestVersion()}{OpenHighestVersion()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+XBase\+::\+Open\+Highest\+Version (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Table\+Name, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Alias, }\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$$\ast$}]{dbf }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_ac8eaef41acf08911b90f900aac8e70af}\label{classxb_1_1xbTblMgr_ac8eaef41acf08911b90f900aac8e70af}}
+\index{xb::xbXBase@{xb::xbXBase}!RemoveTblFromTblList@{RemoveTblFromTblList}}
+\index{RemoveTblFromTblList@{RemoveTblFromTblList}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{RemoveTblFromTblList()}{RemoveTblFromTblList()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Remove\+Tbl\+From\+Tbl\+List (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Tbl\+Alias }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbTblMgr_a3d82b6e73d5c0bc8cac22b9a260389c1}\label{classxb_1_1xbTblMgr_a3d82b6e73d5c0bc8cac22b9a260389c1}}
+\index{xb::xbXBase@{xb::xbXBase}!RemoveTblFromTblList@{RemoveTblFromTblList}}
+\index{RemoveTblFromTblList@{RemoveTblFromTblList}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{RemoveTblFromTblList()}{RemoveTblFromTblList()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Tbl\+Mgr\+::\+Remove\+Tbl\+From\+Tbl\+List (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}\label{classxb_1_1xbSsv_a57caaaadfbd089d9a58ecfcb50c88a6c}}
+\index{xb::xbXBase@{xb::xbXBase}!SetDataDirectory@{SetDataDirectory}}
+\index{SetDataDirectory@{SetDataDirectory}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{SetDataDirectory()}{SetDataDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Data\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Data\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the data directory.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Data\+Directory} & Set the data direcroty. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}\label{classxb_1_1xbSsv_a25542afadaaf39b4fb5a1772a29cc0bd}}
+\index{xb::xbXBase@{xb::xbXBase}!SetDefaultAutoCommit@{SetDefaultAutoCommit}}
+\index{SetDefaultAutoCommit@{SetDefaultAutoCommit}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{SetDefaultAutoCommit()}{SetDefaultAutoCommit()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Auto\+Commit (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Default\+Auto\+Commit }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the default auto commit.
+
+Disabling auto commit requires the application execute explicit updates using dbf-\/\texorpdfstring{$>$}{>}Put() and dbf-\/\texorpdfstring{$>$}{>}Append\+Record(). With auto commit on, the library posts updates automatically when moving off the current record or closing a file.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Default\+Auto\+Commit} & xb\+True -\/ Enable default auto commit.~\newline
+ xb\+False -\/ Disable default auto commit.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}\label{classxb_1_1xbSsv_a5f74db23f8902846d581935c7db73f9c}}
+\index{xb::xbXBase@{xb::xbXBase}!SetDefaultDateFormat@{SetDefaultDateFormat}}
+\index{SetDefaultDateFormat@{SetDefaultDateFormat}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{SetDefaultDateFormat()}{SetDefaultDateFormat()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Date\+Format (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Date\+Format }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Set the default date format.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s\+Default\+Date\+Format} & Set the default date format. \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}\label{classxb_1_1xbSsv_a84343b8645790791512d6bc22ee6c8eb}}
+\index{xb::xbXBase@{xb::xbXBase}!SetDefaultLogDirectory@{SetDefaultLogDirectory}}
+\index{SetDefaultLogDirectory@{SetDefaultLogDirectory}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{SetDefaultLogDirectory()}{SetDefaultLogDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Default\+Log\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Default\+Log\+Directory }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}\label{classxb_1_1xbSsv_a904ec348fd029d4a76e72b8fde636108}}
+\index{xb::xbXBase@{xb::xbXBase}!SetEndianType@{SetEndianType}}
+\index{SetEndianType@{SetEndianType}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{SetEndianType()}{SetEndianType()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Endian\+Type (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+
+
+Set the endian type.
+
+This routine determines the Endian-\/ness at run time instead of compile time as some processers (ie; Sparc,ARM) can be switched either way. This routine is called automatically by the library at startup and does not need to be called in an application program. \mbox{\Hypertarget{classxb_1_1xbXBase_a48d82dbe298c6f4cf68a63ac82dd8292}\label{classxb_1_1xbXBase_a48d82dbe298c6f4cf68a63ac82dd8292}}
+\index{xb::xbXBase@{xb::xbXBase}!SetLogDirectory@{SetLogDirectory}}
+\index{SetLogDirectory@{SetLogDirectory}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{SetLogDirectory()}{SetLogDirectory()}}
+{\footnotesize\ttfamily void xb\+::xb\+XBase\+::\+Set\+Log\+Directory (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Log\+File\+Directory }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_a94010b88a309315ef980715eb581336c}\label{classxb_1_1xbXBase_a94010b88a309315ef980715eb581336c}}
+\index{xb::xbXBase@{xb::xbXBase}!SetLogFileName@{SetLogFileName}}
+\index{SetLogFileName@{SetLogFileName}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{SetLogFileName()}{SetLogFileName()}}
+{\footnotesize\ttfamily void xb\+::xb\+XBase\+::\+Set\+Log\+File\+Name (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Log\+File\+Name }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_a666a0cb5b76ec7a9a3677d339e0c6b42}\label{classxb_1_1xbXBase_a666a0cb5b76ec7a9a3677d339e0c6b42}}
+\index{xb::xbXBase@{xb::xbXBase}!SetLogSize@{SetLogSize}}
+\index{SetLogSize@{SetLogSize}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{SetLogSize()}{SetLogSize()}}
+{\footnotesize\ttfamily void xb\+::xb\+XBase\+::\+Set\+Log\+Size (\begin{DoxyParamCaption}\item[{size\+\_\+t}]{l\+Size }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}\label{classxb_1_1xbSsv_aba6e59512f7172dd55dcf92059e5928c}}
+\index{xb::xbXBase@{xb::xbXBase}!SetMultiUser@{SetMultiUser}}
+\index{SetMultiUser@{SetMultiUser}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{SetMultiUser()}{SetMultiUser()}}
+{\footnotesize\ttfamily void xb\+::xb\+Ssv\+::\+Set\+Multi\+User (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Multi\+User }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inherited]}}
+
+
+
+Get the multi user setting.
+
+
+\begin{DoxyParams}{Parameters}
+{\em b\+Multi\+User} & xb\+True -\/ Turn on Multi user mode.~\newline
+ xb\+False -\/ Turn off Multi user mode.~\newline
+ \\
+\hline
+\end{DoxyParams}
+\mbox{\Hypertarget{classxb_1_1xbXBase_a0dff00b9ee3c288841e137ca01168116}\label{classxb_1_1xbXBase_a0dff00b9ee3c288841e137ca01168116}}
+\index{xb::xbXBase@{xb::xbXBase}!WriteLogBytes@{WriteLogBytes}}
+\index{WriteLogBytes@{WriteLogBytes}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{WriteLogBytes()}{WriteLogBytes()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+XBase\+::\+Write\+Log\+Bytes (\begin{DoxyParamCaption}\item[{xb\+UInt32}]{l\+Cnt, }\item[{const char $\ast$}]{p }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_a9ca5be73abffd0fdd18bdc799877272a}\label{classxb_1_1xbXBase_a9ca5be73abffd0fdd18bdc799877272a}}
+\index{xb::xbXBase@{xb::xbXBase}!WriteLogMessage@{WriteLogMessage}}
+\index{WriteLogMessage@{WriteLogMessage}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{WriteLogMessage()}{WriteLogMessage()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+XBase\+::\+Write\+Log\+Message (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Log\+Message, }\item[{xb\+Int16}]{i\+Output\+Opt = {\ttfamily 0} }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_a1b239c021358476382942522911b5c66}\label{classxb_1_1xbXBase_a1b239c021358476382942522911b5c66}}
+\index{xb::xbXBase@{xb::xbXBase}!xbMemcmp@{xbMemcmp}}
+\index{xbMemcmp@{xbMemcmp}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{xbMemcmp()}{xbMemcmp()}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+XBase\+::xb\+Memcmp (\begin{DoxyParamCaption}\item[{const unsigned char $\ast$}]{s1, }\item[{const unsigned char $\ast$}]{s2, }\item[{size\+\_\+t}]{n }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}}
+
+
+
+Cross memcmp function.
+
+
+\begin{DoxyParams}{Parameters}
+{\em s1} & Left operand to compare. \\
+\hline
+{\em s2} & Right operand to compare. \\
+\hline
+{\em n} & Number of bytes to compare. \\
+\hline
+\end{DoxyParams}
+\begin{DoxyReturn}{Returns}
+1 s1 \texorpdfstring{$>$}{>} s2~\newline
+ 0 s1 == s2~\newline
+ -\/1 s1 \texorpdfstring{$<$}{<} s2
+\end{DoxyReturn}
+\mbox{\Hypertarget{classxb_1_1xbXBase_a0915aff7be4b2dd3e881f3c5d0da4baf}\label{classxb_1_1xbXBase_a0915aff7be4b2dd3e881f3c5d0da4baf}}
+\index{xb::xbXBase@{xb::xbXBase}!xbSleep@{xbSleep}}
+\index{xbSleep@{xbSleep}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{xbSleep()}{xbSleep()}}
+{\footnotesize\ttfamily void xb\+::xb\+XBase\+::xb\+Sleep (\begin{DoxyParamCaption}\item[{xb\+Int32}]{l\+Millisecs }\end{DoxyParamCaption})}
+
+
+
+Cross platform sleep function.
+
+
+\begin{DoxyParams}{Parameters}
+{\em l\+Millisecs} & Milliseconds to sleep. \\
+\hline
+\end{DoxyParams}
+
+
+\doxysubsection{Friends And Related Function Documentation}
+\mbox{\Hypertarget{classxb_1_1xbXBase_a86a53ce3efbf910996df0f853f1c0add}\label{classxb_1_1xbXBase_a86a53ce3efbf910996df0f853f1c0add}}
+\index{xb::xbXBase@{xb::xbXBase}!xbBcd@{xbBcd}}
+\index{xbBcd@{xbBcd}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{xbBcd}{xbBcd}}
+{\footnotesize\ttfamily friend class xb\+Bcd\hspace{0.3cm}{\ttfamily [friend]}}
+
+\mbox{\Hypertarget{classxb_1_1xbXBase_a3c3e5617be811d732472fe2cc8fb18cc}\label{classxb_1_1xbXBase_a3c3e5617be811d732472fe2cc8fb18cc}}
+\index{xb::xbXBase@{xb::xbXBase}!xbExp@{xbExp}}
+\index{xbExp@{xbExp}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{xbExp}{xbExp}}
+{\footnotesize\ttfamily friend class xb\+Exp\hspace{0.3cm}{\ttfamily [friend]}}
+
+
+
+\doxysubsection{Field Documentation}
+\mbox{\Hypertarget{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}\label{classxb_1_1xbSsv_a6219f1b5e24ea12fe158cd5aea56988e}}
+\index{xb::xbXBase@{xb::xbXBase}!ErrorCodeText@{ErrorCodeText}}
+\index{ErrorCodeText@{ErrorCodeText}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{ErrorCodeText}{ErrorCodeText}}
+{\footnotesize\ttfamily const char$\ast$ xb\+::xb\+Ssv\+::\+Error\+Code\+Text\mbox{[}$\,$\mbox{]}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}\label{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}}
+\index{xb::xbXBase@{xb::xbXBase}!iEndianType@{iEndianType}}
+\index{iEndianType@{iEndianType}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{iEndianType}{iEndianType}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Ssv\+::i\+Endian\+Type = 0\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+\mbox{\Hypertarget{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}\label{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}}
+\index{xb::xbXBase@{xb::xbXBase}!sNullString@{sNullString}}
+\index{sNullString@{sNullString}!xb::xbXBase@{xb::xbXBase}}
+\doxysubsubsection{\texorpdfstring{sNullString}{sNullString}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} xb\+::xb\+Ssv\+::s\+Null\+String = \char`\"{}\char`\"{}\hspace{0.3cm}{\ttfamily [static]}, {\ttfamily [protected]}, {\ttfamily [inherited]}}
+
+
+
+The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}
+\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbxbase_8h}{xbxbase.\+h}}\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbxbase_8cpp}{xbxbase.\+cpp}}\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/dbfxtrct_8cpp.tex b/docs/doxygen/latex/dbfxtrct_8cpp.tex
new file mode 100644
index 0000000..dafa6b6
--- /dev/null
+++ b/docs/doxygen/latex/dbfxtrct_8cpp.tex
@@ -0,0 +1,25 @@
+\hypertarget{dbfxtrct_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/dbfxtrct.cpp File Reference}
+\label{dbfxtrct_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/dbfxtrct.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/dbfxtrct.cpp}}
+{\ttfamily \#include $<$xbase64/xbase64.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+void \mbox{\hyperlink{dbfxtrct_8cpp_a5ae07f63d6b390e42068d941038dadf2}{Usage}} ()
+\item
+int \mbox{\hyperlink{dbfxtrct_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{dbfxtrct_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{dbfxtrct_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{dbfxtrct.cpp@{dbfxtrct.cpp}!main@{main}}
+\index{main@{main}!dbfxtrct.cpp@{dbfxtrct.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{dbfxtrct_8cpp_a5ae07f63d6b390e42068d941038dadf2}\label{dbfxtrct_8cpp_a5ae07f63d6b390e42068d941038dadf2}}
+\index{dbfxtrct.cpp@{dbfxtrct.cpp}!Usage@{Usage}}
+\index{Usage@{Usage}!dbfxtrct.cpp@{dbfxtrct.cpp}}
+\doxysubsubsection{\texorpdfstring{Usage()}{Usage()}}
+{\footnotesize\ttfamily void Usage (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/dir_25b94c3afce00ed38231227d8141f932.tex b/docs/doxygen/latex/dir_25b94c3afce00ed38231227d8141f932.tex
new file mode 100644
index 0000000..172d234
--- /dev/null
+++ b/docs/doxygen/latex/dir_25b94c3afce00ed38231227d8141f932.tex
@@ -0,0 +1,19 @@
+\hypertarget{dir_25b94c3afce00ed38231227d8141f932}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/sql Directory Reference}
+\label{dir_25b94c3afce00ed38231227d8141f932}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql Directory Reference@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql Directory Reference}}
+\doxysubsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \mbox{\hyperlink{xbcrix_8cpp}{xbcrix.\+cpp}}
+\item
+file \mbox{\hyperlink{xbcrtbl_8cpp}{xbcrtbl.\+cpp}}
+\item
+file \mbox{\hyperlink{xbdrpix_8cpp}{xbdrpix.\+cpp}}
+\item
+file \mbox{\hyperlink{xbdrptbl_8cpp}{xbdrptbl.\+cpp}}
+\item
+file \mbox{\hyperlink{xbinsert_8cpp}{xbinsert.\+cpp}}
+\item
+file \mbox{\hyperlink{xbset_8cpp}{xbset.\+cpp}}
+\item
+file \mbox{\hyperlink{xbsql_8cpp}{xbsql.\+cpp}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/dir_313caf1132e152dd9b58bea13a4052ca.tex b/docs/doxygen/latex/dir_313caf1132e152dd9b58bea13a4052ca.tex
new file mode 100644
index 0000000..d66d38b
--- /dev/null
+++ b/docs/doxygen/latex/dir_313caf1132e152dd9b58bea13a4052ca.tex
@@ -0,0 +1,37 @@
+\hypertarget{dir_313caf1132e152dd9b58bea13a4052ca}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils Directory Reference}
+\label{dir_313caf1132e152dd9b58bea13a4052ca}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils Directory Reference@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils Directory Reference}}
+\doxysubsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \mbox{\hyperlink{checkndx_8cpp}{checkndx.\+cpp}}
+\item
+file \mbox{\hyperlink{dbfxtrct_8cpp}{dbfxtrct.\+cpp}}
+\item
+file \mbox{\hyperlink{reindex_8cpp}{reindex.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__cfg__check_8cpp}{xb\+\_\+cfg\+\_\+check.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__copydbf_8cpp}{xb\+\_\+copydbf.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__dbfutil_8cpp}{xb\+\_\+dbfutil.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__deletall_8cpp}{xb\+\_\+deletall.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__dumpdbt_8cpp}{xb\+\_\+dumpdbt.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__dumphdr_8cpp}{xb\+\_\+dumphdr.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__dumpix_8cpp}{xb\+\_\+dumpix.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__dumprecs_8cpp}{xb\+\_\+dumprecs.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__execsql_8cpp}{xb\+\_\+execsql.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__pack_8cpp}{xb\+\_\+pack.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__tblinfo_8cpp}{xb\+\_\+tblinfo.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__undelall_8cpp}{xb\+\_\+undelall.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__zap_8cpp}{xb\+\_\+zap.\+cpp}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/dir_68267d1309a1af8e8297ef4c3efbcdba.tex b/docs/doxygen/latex/dir_68267d1309a1af8e8297ef4c3efbcdba.tex
new file mode 100644
index 0000000..29fcc9d
--- /dev/null
+++ b/docs/doxygen/latex/dir_68267d1309a1af8e8297ef4c3efbcdba.tex
@@ -0,0 +1,17 @@
+\hypertarget{dir_68267d1309a1af8e8297ef4c3efbcdba}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src Directory Reference}
+\label{dir_68267d1309a1af8e8297ef4c3efbcdba}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src Directory Reference@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src Directory Reference}}
+\doxysubsection*{Directories}
+\begin{DoxyCompactItemize}
+\item
+directory \mbox{\hyperlink{dir_aebb8dcc11953d78e620bbef0b9e2183}{core}}
+\item
+directory \mbox{\hyperlink{dir_e931c1a3f0014e624d0645a271726ad2}{examples}}
+\item
+directory \mbox{\hyperlink{dir_b0856f6b0d80ccb263b2f415c91f9e17}{include}}
+\item
+directory \mbox{\hyperlink{dir_25b94c3afce00ed38231227d8141f932}{sql}}
+\item
+directory \mbox{\hyperlink{dir_d93a1d4020dea85bb71b237545b5e722}{tests}}
+\item
+directory \mbox{\hyperlink{dir_313caf1132e152dd9b58bea13a4052ca}{utils}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/dir_aebb8dcc11953d78e620bbef0b9e2183.tex b/docs/doxygen/latex/dir_aebb8dcc11953d78e620bbef0b9e2183.tex
new file mode 100644
index 0000000..36bf939
--- /dev/null
+++ b/docs/doxygen/latex/dir_aebb8dcc11953d78e620bbef0b9e2183.tex
@@ -0,0 +1,53 @@
+\hypertarget{dir_aebb8dcc11953d78e620bbef0b9e2183}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core Directory Reference}
+\label{dir_aebb8dcc11953d78e620bbef0b9e2183}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core Directory Reference@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core Directory Reference}}
+\doxysubsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \mbox{\hyperlink{xbbcd_8cpp}{xbbcd.\+cpp}}
+\item
+file \mbox{\hyperlink{xbdate_8cpp}{xbdate.\+cpp}}
+\item
+file \mbox{\hyperlink{xbdbf_8cpp}{xbdbf.\+cpp}}
+\item
+file \mbox{\hyperlink{xbdbf3_8cpp}{xbdbf3.\+cpp}}
+\item
+file \mbox{\hyperlink{xbdbf4_8cpp}{xbdbf4.\+cpp}}
+\item
+file \mbox{\hyperlink{xbexp_8cpp}{xbexp.\+cpp}}
+\item
+file \mbox{\hyperlink{xbexpnode_8cpp}{xbexpnode.\+cpp}}
+\item
+file \mbox{\hyperlink{xbfields_8cpp}{xbfields.\+cpp}}
+\item
+file \mbox{\hyperlink{xbfile_8cpp}{xbfile.\+cpp}}
+\item
+file \mbox{\hyperlink{xbfilter_8cpp}{xbfilter.\+cpp}}
+\item
+file \mbox{\hyperlink{xbfuncs_8cpp}{xbfuncs.\+cpp}}
+\item
+file \mbox{\hyperlink{xbixbase_8cpp}{xbixbase.\+cpp}}
+\item
+file \mbox{\hyperlink{xbixmdx_8cpp}{xbixmdx.\+cpp}}
+\item
+file \mbox{\hyperlink{xbixndx_8cpp}{xbixndx.\+cpp}}
+\item
+file \mbox{\hyperlink{xblog_8cpp}{xblog.\+cpp}}
+\item
+file \mbox{\hyperlink{xbmemo_8cpp}{xbmemo.\+cpp}}
+\item
+file \mbox{\hyperlink{xbmemo3_8cpp}{xbmemo3.\+cpp}}
+\item
+file \mbox{\hyperlink{xbmemo4_8cpp}{xbmemo4.\+cpp}}
+\item
+file \mbox{\hyperlink{xbssv_8cpp}{xbssv.\+cpp}}
+\item
+file \mbox{\hyperlink{xbstring_8cpp}{xbstring.\+cpp}}
+\item
+file \mbox{\hyperlink{xbtag_8cpp}{xbtag.\+cpp}}
+\item
+file \mbox{\hyperlink{xbtblmgr_8cpp}{xbtblmgr.\+cpp}}
+\item
+file \mbox{\hyperlink{xbuda_8cpp}{xbuda.\+cpp}}
+\item
+file \mbox{\hyperlink{xbxbase_8cpp}{xbxbase.\+cpp}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/dir_b0856f6b0d80ccb263b2f415c91f9e17.tex b/docs/doxygen/latex/dir_b0856f6b0d80ccb263b2f415c91f9e17.tex
new file mode 100644
index 0000000..ffaa610
--- /dev/null
+++ b/docs/doxygen/latex/dir_b0856f6b0d80ccb263b2f415c91f9e17.tex
@@ -0,0 +1,51 @@
+\hypertarget{dir_b0856f6b0d80ccb263b2f415c91f9e17}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include Directory Reference}
+\label{dir_b0856f6b0d80ccb263b2f415c91f9e17}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include Directory Reference@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include Directory Reference}}
+\doxysubsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \mbox{\hyperlink{xbase_8h}{xbase.\+h}}
+\item
+file \mbox{\hyperlink{xbbcd_8h}{xbbcd.\+h}}
+\item
+file \mbox{\hyperlink{xbdate_8h}{xbdate.\+h}}
+\item
+file \mbox{\hyperlink{xbdbf_8h}{xbdbf.\+h}}
+\item
+file \mbox{\hyperlink{xbexp_8h}{xbexp.\+h}}
+\item
+file \mbox{\hyperlink{xbexpnode_8h}{xbexpnode.\+h}}
+\item
+file \mbox{\hyperlink{xbfile_8h}{xbfile.\+h}}
+\item
+file \mbox{\hyperlink{xbfilter_8h}{xbfilter.\+h}}
+\item
+file \mbox{\hyperlink{xbindex_8h}{xbindex.\+h}}
+\item
+file \mbox{\hyperlink{xblnklst_8h}{xblnklst.\+h}}
+\item
+file \mbox{\hyperlink{xblnklstord_8h}{xblnklstord.\+h}}
+\item
+file \mbox{\hyperlink{xblnknod_8h}{xblnknod.\+h}}
+\item
+file \mbox{\hyperlink{xblog_8h}{xblog.\+h}}
+\item
+file \mbox{\hyperlink{xbmemo_8h}{xbmemo.\+h}}
+\item
+file \mbox{\hyperlink{xbretcod_8h}{xbretcod.\+h}}
+\item
+file \mbox{\hyperlink{xbsql_8h}{xbsql.\+h}}
+\item
+file \mbox{\hyperlink{xbssv_8h}{xbssv.\+h}}
+\item
+file \mbox{\hyperlink{xbstring_8h}{xbstring.\+h}}
+\item
+file \mbox{\hyperlink{xbtag_8h}{xbtag.\+h}}
+\item
+file \mbox{\hyperlink{xbtblmgr_8h}{xbtblmgr.\+h}}
+\item
+file \mbox{\hyperlink{xbtypes_8h}{xbtypes.\+h}}
+\item
+file \mbox{\hyperlink{xbuda_8h}{xbuda.\+h}}
+\item
+file \mbox{\hyperlink{xbxbase_8h}{xbxbase.\+h}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/dir_d93a1d4020dea85bb71b237545b5e722.tex b/docs/doxygen/latex/dir_d93a1d4020dea85bb71b237545b5e722.tex
new file mode 100644
index 0000000..b6da6b1
--- /dev/null
+++ b/docs/doxygen/latex/dir_d93a1d4020dea85bb71b237545b5e722.tex
@@ -0,0 +1,53 @@
+\hypertarget{dir_d93a1d4020dea85bb71b237545b5e722}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests Directory Reference}
+\label{dir_d93a1d4020dea85bb71b237545b5e722}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests Directory Reference@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests Directory Reference}}
+\doxysubsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \mbox{\hyperlink{tstfuncs_8cpp}{tstfuncs.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__bcd_8cpp}{xb\+\_\+test\+\_\+bcd.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__date_8cpp}{xb\+\_\+test\+\_\+date.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__dbf__v3__memos_8cpp}{xb\+\_\+test\+\_\+dbf\+\_\+v3\+\_\+memos.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__dbf__v3__nomemos_8cpp}{xb\+\_\+test\+\_\+dbf\+\_\+v3\+\_\+nomemos.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__dbf__v4__memos_8cpp}{xb\+\_\+test\+\_\+dbf\+\_\+v4\+\_\+memos.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__dbf__v4__nomemos_8cpp}{xb\+\_\+test\+\_\+dbf\+\_\+v4\+\_\+nomemos.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__expnode_8cpp}{xb\+\_\+test\+\_\+expnode.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__expression_8cpp}{xb\+\_\+test\+\_\+expression.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__file_8cpp}{xb\+\_\+test\+\_\+file.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__filter_8cpp}{xb\+\_\+test\+\_\+filter.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__funcs_8cpp}{xb\+\_\+test\+\_\+funcs.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__linklist_8cpp}{xb\+\_\+test\+\_\+linklist.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__lock_8cpp}{xb\+\_\+test\+\_\+lock.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__lock2_8cpp}{xb\+\_\+test\+\_\+lock2.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__log_8cpp}{xb\+\_\+test\+\_\+log.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__mdx_8cpp}{xb\+\_\+test\+\_\+mdx.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__ndx_8cpp}{xb\+\_\+test\+\_\+ndx.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__ndx2_8cpp}{xb\+\_\+test\+\_\+ndx2.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__sql_8cpp}{xb\+\_\+test\+\_\+sql.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__string_8cpp}{xb\+\_\+test\+\_\+string.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__tblmgr_8cpp}{xb\+\_\+test\+\_\+tblmgr.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__uda_8cpp}{xb\+\_\+test\+\_\+uda.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__test__xbase_8cpp}{xb\+\_\+test\+\_\+xbase.\+cpp}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/dir_e931c1a3f0014e624d0645a271726ad2.tex b/docs/doxygen/latex/dir_e931c1a3f0014e624d0645a271726ad2.tex
new file mode 100644
index 0000000..95a3031
--- /dev/null
+++ b/docs/doxygen/latex/dir_e931c1a3f0014e624d0645a271726ad2.tex
@@ -0,0 +1,19 @@
+\hypertarget{dir_e931c1a3f0014e624d0645a271726ad2}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/examples Directory Reference}
+\label{dir_e931c1a3f0014e624d0645a271726ad2}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples Directory Reference@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples Directory Reference}}
+\doxysubsection*{Files}
+\begin{DoxyCompactItemize}
+\item
+file \mbox{\hyperlink{xb__ex__date_8cpp}{xb\+\_\+ex\+\_\+date.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__ex__sql_8cpp}{xb\+\_\+ex\+\_\+sql.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__ex__string_8cpp}{xb\+\_\+ex\+\_\+string.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__ex__v3__create__dbf_8cpp}{xb\+\_\+ex\+\_\+v3\+\_\+create\+\_\+dbf.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__ex__v3__upd__dbf_8cpp}{xb\+\_\+ex\+\_\+v3\+\_\+upd\+\_\+dbf.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__ex__v4__create__dbf_8cpp}{xb\+\_\+ex\+\_\+v4\+\_\+create\+\_\+dbf.\+cpp}}
+\item
+file \mbox{\hyperlink{xb__ex__v4__upd__dbf_8cpp}{xb\+\_\+ex\+\_\+v4\+\_\+upd\+\_\+dbf.\+cpp}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/doxygen.sty b/docs/doxygen/latex/doxygen.sty
new file mode 100644
index 0000000..7e01991
--- /dev/null
+++ b/docs/doxygen/latex/doxygen.sty
@@ -0,0 +1,601 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{doxygen}
+
+% Packages used by this style file
+\RequirePackage{alltt}
+%%\RequirePackage{array} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
+\RequirePackage{calc}
+\RequirePackage{float}
+%%\RequirePackage{ifthen} %% moved to refman.tex due to workaround for LaTex 2019 version and unmaintained tabu package
+\RequirePackage{verbatim}
+\RequirePackage[table]{xcolor}
+\RequirePackage{longtable_doxygen}
+\RequirePackage{tabu_doxygen}
+\RequirePackage{fancyvrb}
+\RequirePackage{tabularx}
+\RequirePackage{multicol}
+\RequirePackage{multirow}
+\RequirePackage{hanging}
+\RequirePackage{ifpdf}
+\RequirePackage{adjustbox}
+\RequirePackage{amssymb}
+\RequirePackage{stackengine}
+\RequirePackage{enumitem}
+\RequirePackage{alphalph}
+\RequirePackage[normalem]{ulem} % for strikeout, but don't modify emphasis
+\RequirePackage{enumitem}
+
+%---------- Internal commands used in this style file ----------------
+
+\newcommand{\ensurespace}[1]{%
+ \begingroup%
+ \setlength{\dimen@}{#1}%
+ \vskip\z@\@plus\dimen@%
+ \penalty -100\vskip\z@\@plus -\dimen@%
+ \vskip\dimen@%
+ \penalty 9999%
+ \vskip -\dimen@%
+ \vskip\z@skip% hide the previous |\vskip| from |\addvspace|
+ \endgroup%
+}
+
+\newcommand{\DoxyHorRuler}[1]{%
+ \setlength{\parskip}{0ex plus 0ex minus 0ex}%
+ \ifthenelse{#1=0}%
+ {%
+ \hrule%
+ }%
+ {%
+ \hrulefilll%
+ }%
+}
+\newcommand{\DoxyLabelFont}{}
+\newcommand{\entrylabel}[1]{%
+ {%
+ \parbox[b]{\labelwidth-4pt}{%
+ \makebox[0pt][l]{\DoxyLabelFont#1}%
+ \vspace{1.5\baselineskip}%
+ }%
+ }%
+}
+
+\newenvironment{DoxyDesc}[1]{%
+ \ensurespace{4\baselineskip}%
+ \begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ %\setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }%
+ \item[#1]%
+}{%
+ \end{list}%
+}
+
+\newsavebox{\xrefbox}
+\newlength{\xreflength}
+\newcommand{\xreflabel}[1]{%
+ \sbox{\xrefbox}{#1}%
+ \setlength{\xreflength}{\wd\xrefbox}%
+ \ifthenelse{\xreflength>\labelwidth}{%
+ \begin{minipage}{\textwidth}%
+ \setlength{\parindent}{0pt}%
+ \hangindent=15pt\bfseries #1\vspace{1.2\itemsep}%
+ \end{minipage}%
+ }{%
+ \parbox[b]{\labelwidth}{\makebox[0pt][l]{\textbf{#1}}}%
+ }%
+}
+
+%---------- Commands used by doxygen LaTeX output generator ----------
+
+% Used by <pre> ... </pre>
+\newenvironment{DoxyPre}{%
+ \small%
+ \begin{alltt}%
+}{%
+ \end{alltt}%
+ \normalsize%
+}
+% Necessary for redefining not defined characters, i.e. "Replacement Character" in tex output.
+\newlength{\CodeWidthChar}
+\newlength{\CodeHeightChar}
+\settowidth{\CodeWidthChar}{?}
+\settoheight{\CodeHeightChar}{?}
+% Necessary for hanging indent
+\newlength{\DoxyCodeWidth}
+
+\newcommand\DoxyCodeLine[1]{\hangpara{\DoxyCodeWidth}{1}{#1}\par}
+
+\newcommand\NiceSpace{%
+ \discretionary{}{\kern\fontdimen2\font}{\kern\fontdimen2\font}%
+}
+
+% Used by @code ... @endcode
+\newenvironment{DoxyCode}[1]{%
+ \par%
+ \scriptsize%
+ \normalfont\ttfamily%
+ \rightskip0pt plus 1fil%
+ \settowidth{\DoxyCodeWidth}{000000}%
+ \settowidth{\CodeWidthChar}{?}%
+ \settoheight{\CodeHeightChar}{?}%
+ \setlength{\parskip}{0ex plus 0ex minus 0ex}%
+ \ifthenelse{\equal{#1}{0}}
+ {
+ {\lccode`~32 \lowercase{\global\let~}\NiceSpace}\obeyspaces%
+ }
+ {
+ {\lccode`~32 \lowercase{\global\let~}}\obeyspaces%
+ }
+
+}{%
+ \normalfont%
+ \normalsize%
+ \settowidth{\CodeWidthChar}{?}%
+ \settoheight{\CodeHeightChar}{?}%
+}
+
+% Redefining not defined characters, i.e. "Replacement Character" in tex output.
+\def\ucr{\adjustbox{width=\CodeWidthChar,height=\CodeHeightChar}{\stackinset{c}{}{c}{-.2pt}{%
+ \textcolor{white}{\sffamily\bfseries\small ?}}{%
+ \rotatebox{45}{$\blacksquare$}}}}
+
+% Used by @example, @include, @includelineno and @dontinclude
+\newenvironment{DoxyCodeInclude}[1]{%
+ \DoxyCode{#1}%
+}{%
+ \endDoxyCode%
+}
+
+% Used by @verbatim ... @endverbatim
+\newenvironment{DoxyVerb}{%
+ \footnotesize%
+ \verbatim%
+}{%
+ \endverbatim%
+ \normalsize%
+}
+
+% Used by @verbinclude
+\newenvironment{DoxyVerbInclude}{%
+ \DoxyVerb%
+}{%
+ \endDoxyVerb%
+}
+
+% Used by numbered lists (using '-#' or <ol> ... </ol>)
+\setlistdepth{12}
+\newlist{DoxyEnumerate}{enumerate}{12}
+\setlist[DoxyEnumerate,1]{label=\arabic*.}
+\setlist[DoxyEnumerate,2]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,3]{label=\roman*.}
+\setlist[DoxyEnumerate,4]{label=\enumAlphAlphcnt*.}
+\setlist[DoxyEnumerate,5]{label=\arabic*.}
+\setlist[DoxyEnumerate,6]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,7]{label=\roman*.}
+\setlist[DoxyEnumerate,8]{label=\enumAlphAlphcnt*.}
+\setlist[DoxyEnumerate,9]{label=\arabic*.}
+\setlist[DoxyEnumerate,10]{label=(\enumalphalphcnt*)}
+\setlist[DoxyEnumerate,11]{label=\roman*.}
+\setlist[DoxyEnumerate,12]{label=\enumAlphAlphcnt*.}
+
+% Used by bullet lists (using '-', @li, @arg, or <ul> ... </ul>)
+\setlistdepth{12}
+\newlist{DoxyItemize}{itemize}{12}
+\setlist[DoxyItemize]{label=\textperiodcentered}
+
+\setlist[DoxyItemize,1]{label=\textbullet}
+\setlist[DoxyItemize,2]{label=\normalfont\bfseries \textendash}
+\setlist[DoxyItemize,3]{label=\textasteriskcentered}
+\setlist[DoxyItemize,4]{label=\textperiodcentered}
+
+% Used by description lists (using <dl> ... </dl>)
+\newenvironment{DoxyDescription}{%
+ \description%
+}{%
+ \enddescription%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if caption is specified)
+\newenvironment{DoxyImage}{%
+ \begin{figure}[H]%
+ \centering%
+}{%
+ \end{figure}%
+}
+
+% Used by @image, @dotfile, @dot ... @enddot, and @msc ... @endmsc
+% (only if no caption is specified)
+\newenvironment{DoxyImageNoCaption}{%
+ \begin{center}%
+}{%
+ \end{center}%
+}
+
+% Used by @image
+% (only if inline is specified)
+\newenvironment{DoxyInlineImage}{%
+}{%
+}
+
+% Used by @attention
+\newenvironment{DoxyAttention}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @author and @authors
+\newenvironment{DoxyAuthor}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @date
+\newenvironment{DoxyDate}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @invariant
+\newenvironment{DoxyInvariant}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @note
+\newenvironment{DoxyNote}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @post
+\newenvironment{DoxyPostcond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @pre
+\newenvironment{DoxyPrecond}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @copyright
+\newenvironment{DoxyCopyright}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @remark
+\newenvironment{DoxyRemark}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @return and @returns
+\newenvironment{DoxyReturn}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @since
+\newenvironment{DoxySince}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @see
+\newenvironment{DoxySeeAlso}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @version
+\newenvironment{DoxyVersion}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @warning
+\newenvironment{DoxyWarning}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by @internal
+\newenvironment{DoxyInternal}[1]{%
+ \paragraph*{#1}%
+}{%
+}
+
+% Used by @par and @paragraph
+\newenvironment{DoxyParagraph}[1]{%
+ \begin{DoxyDesc}{#1}%
+}{%
+ \end{DoxyDesc}%
+}
+
+% Used by parameter lists
+\newenvironment{DoxyParams}[2][]{%
+ \tabulinesep=1mm%
+ \par%
+ \ifthenelse{\equal{#1}{}}%
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|}}% name + description
+ {\ifthenelse{\equal{#1}{1}}%
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + name + desc
+ {\begin{longtabu*}spread 0pt [l]{|X[-1,l]|X[-1,l]|X[-1,l]|X[-1,l]|}}% in/out + type + name + desc
+ }
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #2}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for fields of simple structs
+\newenvironment{DoxyFields}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|X[-1,l]|}%
+ \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{3}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for fields simple class style enums
+\newenvironment{DoxyEnumFields}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for parameters within a detailed function description
+\newenvironment{DoxyParamCaption}{%
+ \renewcommand{\item}[2][]{\\ \hspace*{2.0cm} ##1 {\em ##2}}%
+}{%
+}
+
+% Used by return value lists
+\newenvironment{DoxyRetVals}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used by exception lists
+\newenvironment{DoxyExceptions}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used by template parameter lists
+\newenvironment{DoxyTemplParams}[1]{%
+ \tabulinesep=1mm%
+ \par%
+ \begin{longtabu*}spread 0pt [l]{|X[-1,r]|X[-1,l]|}%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endfirsthead%
+ \multicolumn{2}{l}{\hspace{-6pt}\bfseries\fontseries{bc}\selectfont\color{darkgray} #1}\\[1ex]%
+ \hline%
+ \endhead%
+}{%
+ \end{longtabu*}%
+ \vspace{6pt}%
+}
+
+% Used for member lists
+\newenvironment{DoxyCompactItemize}{%
+ \begin{itemize}%
+ \setlength{\itemsep}{-3pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \setlength{\partopsep}{0pt}%
+}{%
+ \end{itemize}%
+}
+
+% Used for member descriptions
+\newenvironment{DoxyCompactList}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\topsep}{0pt}%
+ \renewcommand{\makelabel}{\hfill}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used for reference lists (@bug, @deprecated, @todo, etc.)
+\newenvironment{DoxyRefList}{%
+ \begin{list}{}{%
+ \setlength{\labelwidth}{10pt}%
+ \setlength{\leftmargin}{\labelwidth}%
+ \addtolength{\leftmargin}{\labelsep}%
+ \renewcommand{\makelabel}{\xreflabel}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by @bug, @deprecated, @todo, etc.
+\newenvironment{DoxyRefDesc}[1]{%
+ \begin{list}{}{%
+ \renewcommand\makelabel[1]{\textbf{##1}}%
+ \settowidth\labelwidth{\makelabel{#1}}%
+ \setlength\leftmargin{\labelwidth+\labelsep}%
+ }%
+}{%
+ \end{list}%
+}
+
+% Used by parameter lists and simple sections
+\newenvironment{Desc}
+{\begin{list}{}{%
+ \settowidth{\labelwidth}{20pt}%
+ \setlength{\parsep}{0pt}%
+ \setlength{\itemsep}{0pt}%
+ \setlength{\leftmargin}{\labelwidth+\labelsep}%
+ \renewcommand{\makelabel}{\entrylabel}%
+ }
+}{%
+ \end{list}%
+}
+
+% Used by tables
+\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}%
+\newenvironment{TabularC}[1]%
+{\tabulinesep=1mm
+\begin{longtabu*}spread 0pt [c]{*#1{|X[-1]}|}}%
+{\end{longtabu*}\par}%
+
+\newenvironment{TabularNC}[1]%
+{\begin{tabu}spread 0pt [l]{*#1{|X[-1]}|}}%
+{\end{tabu}\par}%
+
+% Used for member group headers
+\newenvironment{Indent}{%
+ \begin{list}{}{%
+ \setlength{\leftmargin}{0.5cm}%
+ }%
+ \item[]\ignorespaces%
+}{%
+ \unskip%
+ \end{list}%
+}
+
+% Used when hyperlinks are turned off
+\newcommand{\doxyref}[3]{%
+ \textbf{#1} (\textnormal{#2}\,\pageref{#3})%
+}
+
+% Used to link to a table when hyperlinks are turned on
+\newcommand{\doxytablelink}[2]{%
+ \ref{#1}%
+}
+
+% Used to link to a table when hyperlinks are turned off
+\newcommand{\doxytableref}[3]{%
+ \ref{#3}%
+}
+
+% Used by @addindex
+\newcommand{\lcurly}{\{}
+\newcommand{\rcurly}{\}}
+
+% Colors used for syntax highlighting
+\definecolor{comment}{rgb}{0.5,0.0,0.0}
+\definecolor{keyword}{rgb}{0.0,0.5,0.0}
+\definecolor{keywordtype}{rgb}{0.38,0.25,0.125}
+\definecolor{keywordflow}{rgb}{0.88,0.5,0.0}
+\definecolor{preprocessor}{rgb}{0.5,0.38,0.125}
+\definecolor{stringliteral}{rgb}{0.0,0.125,0.25}
+\definecolor{charliteral}{rgb}{0.0,0.5,0.5}
+\definecolor{vhdldigit}{rgb}{1.0,0.0,1.0}
+\definecolor{vhdlkeyword}{rgb}{0.43,0.0,0.43}
+\definecolor{vhdllogic}{rgb}{1.0,0.0,0.0}
+\definecolor{vhdlchar}{rgb}{0.0,0.0,0.0}
+
+% Color used for table heading
+\newcommand{\tableheadbgcolor}{lightgray}%
+
+% Version of hypertarget with correct landing location
+\newcommand{\Hypertarget}[1]{\Hy@raisedlink{\hypertarget{#1}{}}}
+
+% possibility to have sections etc. be within the margins
+% unfortunately had to copy part of book.cls and add \raggedright
+\makeatletter
+\newcommand\doxysection{\@startsection {section}{1}{\z@}%
+ {-3.5ex \@plus -1ex \@minus -.2ex}%
+ {2.3ex \@plus.2ex}%
+ {\raggedright\normalfont\Large\bfseries}}
+\newcommand\doxysubsection{\@startsection{subsection}{2}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\large\bfseries}}
+\newcommand\doxysubsubsection{\@startsection{subsubsection}{3}{\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxyparagraph{\@startsection{paragraph}{4}{\z@}%
+ {3.25ex \@plus1ex \@minus.2ex}%
+ {-1em}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\newcommand\doxysubparagraph{\@startsection{subparagraph}{5}{\parindent}%
+ {3.25ex \@plus1ex \@minus .2ex}%
+ {-1em}%
+ {\raggedright\normalfont\normalsize\bfseries}}
+\makeatother
+% Define caption that is also suitable in a table
+\makeatletter
+\def\doxyfigcaption{%
+\H@refstepcounter{figure}%
+\@dblarg{\@caption{figure}}}
+\makeatother
+
+% Define alpha enumarative names for counters > 26
+\makeatletter
+\def\enumalphalphcnt#1{\expandafter\@enumalphalphcnt\csname c@#1\endcsname}
+\def\@enumalphalphcnt#1{\alphalph{#1}}
+\def\enumAlphAlphcnt#1{\expandafter\@enumAlphAlphcnt\csname c@#1\endcsname}
+\def\@enumAlphAlphcnt#1{\AlphAlph{#1}}
+\makeatother
+\AddEnumerateCounter{\enumalphalphcnt}{\@enumalphalphcnt}{aa}
+\AddEnumerateCounter{\enumAlphAlphcnt}{\@enumAlphAlphcnt}{AA}
diff --git a/docs/doxygen/latex/files.tex b/docs/doxygen/latex/files.tex
new file mode 100644
index 0000000..f02ab4a
--- /dev/null
+++ b/docs/doxygen/latex/files.tex
@@ -0,0 +1,104 @@
+\doxysection{File List}
+Here is a list of all files with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbbcd_8cpp}{xbbcd.\+cpp}} }{\pageref{xbbcd_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbdate_8cpp}{xbdate.\+cpp}} }{\pageref{xbdate_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbdbf_8cpp}{xbdbf.\+cpp}} }{\pageref{xbdbf_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbdbf3_8cpp}{xbdbf3.\+cpp}} }{\pageref{xbdbf3_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbdbf4_8cpp}{xbdbf4.\+cpp}} }{\pageref{xbdbf4_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbexp_8cpp}{xbexp.\+cpp}} }{\pageref{xbexp_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbexpnode_8cpp}{xbexpnode.\+cpp}} }{\pageref{xbexpnode_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbfields_8cpp}{xbfields.\+cpp}} }{\pageref{xbfields_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbfile_8cpp}{xbfile.\+cpp}} }{\pageref{xbfile_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbfilter_8cpp}{xbfilter.\+cpp}} }{\pageref{xbfilter_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbfuncs_8cpp}{xbfuncs.\+cpp}} }{\pageref{xbfuncs_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbixbase_8cpp}{xbixbase.\+cpp}} }{\pageref{xbixbase_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbixmdx_8cpp}{xbixmdx.\+cpp}} }{\pageref{xbixmdx_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbixndx_8cpp}{xbixndx.\+cpp}} }{\pageref{xbixndx_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xblog_8cpp}{xblog.\+cpp}} }{\pageref{xblog_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbmemo_8cpp}{xbmemo.\+cpp}} }{\pageref{xbmemo_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbmemo3_8cpp}{xbmemo3.\+cpp}} }{\pageref{xbmemo3_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbmemo4_8cpp}{xbmemo4.\+cpp}} }{\pageref{xbmemo4_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbssv_8cpp}{xbssv.\+cpp}} }{\pageref{xbssv_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbstring_8cpp}{xbstring.\+cpp}} }{\pageref{xbstring_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbtag_8cpp}{xbtag.\+cpp}} }{\pageref{xbtag_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbtblmgr_8cpp}{xbtblmgr.\+cpp}} }{\pageref{xbtblmgr_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbuda_8cpp}{xbuda.\+cpp}} }{\pageref{xbuda_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/core/\mbox{\hyperlink{xbxbase_8cpp}{xbxbase.\+cpp}} }{\pageref{xbxbase_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/examples/\mbox{\hyperlink{xb__ex__date_8cpp}{xb\+\_\+ex\+\_\+date.\+cpp}} }{\pageref{xb__ex__date_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/examples/\mbox{\hyperlink{xb__ex__sql_8cpp}{xb\+\_\+ex\+\_\+sql.\+cpp}} }{\pageref{xb__ex__sql_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/examples/\mbox{\hyperlink{xb__ex__string_8cpp}{xb\+\_\+ex\+\_\+string.\+cpp}} }{\pageref{xb__ex__string_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/examples/\mbox{\hyperlink{xb__ex__v3__create__dbf_8cpp}{xb\+\_\+ex\+\_\+v3\+\_\+create\+\_\+dbf.\+cpp}} }{\pageref{xb__ex__v3__create__dbf_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/examples/\mbox{\hyperlink{xb__ex__v3__upd__dbf_8cpp}{xb\+\_\+ex\+\_\+v3\+\_\+upd\+\_\+dbf.\+cpp}} }{\pageref{xb__ex__v3__upd__dbf_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/examples/\mbox{\hyperlink{xb__ex__v4__create__dbf_8cpp}{xb\+\_\+ex\+\_\+v4\+\_\+create\+\_\+dbf.\+cpp}} }{\pageref{xb__ex__v4__create__dbf_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/examples/\mbox{\hyperlink{xb__ex__v4__upd__dbf_8cpp}{xb\+\_\+ex\+\_\+v4\+\_\+upd\+\_\+dbf.\+cpp}} }{\pageref{xb__ex__v4__upd__dbf_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbase_8h}{xbase.\+h}} }{\pageref{xbase_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbbcd_8h}{xbbcd.\+h}} }{\pageref{xbbcd_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbdate_8h}{xbdate.\+h}} }{\pageref{xbdate_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbdbf_8h}{xbdbf.\+h}} }{\pageref{xbdbf_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbexp_8h}{xbexp.\+h}} }{\pageref{xbexp_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbexpnode_8h}{xbexpnode.\+h}} }{\pageref{xbexpnode_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbfile_8h}{xbfile.\+h}} }{\pageref{xbfile_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbfilter_8h}{xbfilter.\+h}} }{\pageref{xbfilter_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbindex_8h}{xbindex.\+h}} }{\pageref{xbindex_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xblnklst_8h}{xblnklst.\+h}} }{\pageref{xblnklst_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xblnklstord_8h}{xblnklstord.\+h}} }{\pageref{xblnklstord_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xblnknod_8h}{xblnknod.\+h}} }{\pageref{xblnknod_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xblog_8h}{xblog.\+h}} }{\pageref{xblog_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbmemo_8h}{xbmemo.\+h}} }{\pageref{xbmemo_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbretcod_8h}{xbretcod.\+h}} }{\pageref{xbretcod_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbsql_8h}{xbsql.\+h}} }{\pageref{xbsql_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbssv_8h}{xbssv.\+h}} }{\pageref{xbssv_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbstring_8h}{xbstring.\+h}} }{\pageref{xbstring_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbtag_8h}{xbtag.\+h}} }{\pageref{xbtag_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbtblmgr_8h}{xbtblmgr.\+h}} }{\pageref{xbtblmgr_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbtypes_8h}{xbtypes.\+h}} }{\pageref{xbtypes_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbuda_8h}{xbuda.\+h}} }{\pageref{xbuda_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbxbase_8h}{xbxbase.\+h}} }{\pageref{xbxbase_8h}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/sql/\mbox{\hyperlink{xbcrix_8cpp}{xbcrix.\+cpp}} }{\pageref{xbcrix_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/sql/\mbox{\hyperlink{xbcrtbl_8cpp}{xbcrtbl.\+cpp}} }{\pageref{xbcrtbl_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/sql/\mbox{\hyperlink{xbdrpix_8cpp}{xbdrpix.\+cpp}} }{\pageref{xbdrpix_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/sql/\mbox{\hyperlink{xbdrptbl_8cpp}{xbdrptbl.\+cpp}} }{\pageref{xbdrptbl_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/sql/\mbox{\hyperlink{xbinsert_8cpp}{xbinsert.\+cpp}} }{\pageref{xbinsert_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/sql/\mbox{\hyperlink{xbset_8cpp}{xbset.\+cpp}} }{\pageref{xbset_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/sql/\mbox{\hyperlink{xbsql_8cpp}{xbsql.\+cpp}} }{\pageref{xbsql_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{tstfuncs_8cpp}{tstfuncs.\+cpp}} }{\pageref{tstfuncs_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__bcd_8cpp}{xb\+\_\+test\+\_\+bcd.\+cpp}} }{\pageref{xb__test__bcd_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__date_8cpp}{xb\+\_\+test\+\_\+date.\+cpp}} }{\pageref{xb__test__date_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__dbf__v3__memos_8cpp}{xb\+\_\+test\+\_\+dbf\+\_\+v3\+\_\+memos.\+cpp}} }{\pageref{xb__test__dbf__v3__memos_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__dbf__v3__nomemos_8cpp}{xb\+\_\+test\+\_\+dbf\+\_\+v3\+\_\+nomemos.\+cpp}} }{\pageref{xb__test__dbf__v3__nomemos_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__dbf__v4__memos_8cpp}{xb\+\_\+test\+\_\+dbf\+\_\+v4\+\_\+memos.\+cpp}} }{\pageref{xb__test__dbf__v4__memos_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__dbf__v4__nomemos_8cpp}{xb\+\_\+test\+\_\+dbf\+\_\+v4\+\_\+nomemos.\+cpp}} }{\pageref{xb__test__dbf__v4__nomemos_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__expnode_8cpp}{xb\+\_\+test\+\_\+expnode.\+cpp}} }{\pageref{xb__test__expnode_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__expression_8cpp}{xb\+\_\+test\+\_\+expression.\+cpp}} }{\pageref{xb__test__expression_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__file_8cpp}{xb\+\_\+test\+\_\+file.\+cpp}} }{\pageref{xb__test__file_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__filter_8cpp}{xb\+\_\+test\+\_\+filter.\+cpp}} }{\pageref{xb__test__filter_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__funcs_8cpp}{xb\+\_\+test\+\_\+funcs.\+cpp}} }{\pageref{xb__test__funcs_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__linklist_8cpp}{xb\+\_\+test\+\_\+linklist.\+cpp}} }{\pageref{xb__test__linklist_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__lock_8cpp}{xb\+\_\+test\+\_\+lock.\+cpp}} }{\pageref{xb__test__lock_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__lock2_8cpp}{xb\+\_\+test\+\_\+lock2.\+cpp}} }{\pageref{xb__test__lock2_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__log_8cpp}{xb\+\_\+test\+\_\+log.\+cpp}} }{\pageref{xb__test__log_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__mdx_8cpp}{xb\+\_\+test\+\_\+mdx.\+cpp}} }{\pageref{xb__test__mdx_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__ndx_8cpp}{xb\+\_\+test\+\_\+ndx.\+cpp}} }{\pageref{xb__test__ndx_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__ndx2_8cpp}{xb\+\_\+test\+\_\+ndx2.\+cpp}} }{\pageref{xb__test__ndx2_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__sql_8cpp}{xb\+\_\+test\+\_\+sql.\+cpp}} }{\pageref{xb__test__sql_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__string_8cpp}{xb\+\_\+test\+\_\+string.\+cpp}} }{\pageref{xb__test__string_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__tblmgr_8cpp}{xb\+\_\+test\+\_\+tblmgr.\+cpp}} }{\pageref{xb__test__tblmgr_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__uda_8cpp}{xb\+\_\+test\+\_\+uda.\+cpp}} }{\pageref{xb__test__uda_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/tests/\mbox{\hyperlink{xb__test__xbase_8cpp}{xb\+\_\+test\+\_\+xbase.\+cpp}} }{\pageref{xb__test__xbase_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{checkndx_8cpp}{checkndx.\+cpp}} }{\pageref{checkndx_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{dbfxtrct_8cpp}{dbfxtrct.\+cpp}} }{\pageref{dbfxtrct_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{reindex_8cpp}{reindex.\+cpp}} }{\pageref{reindex_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__cfg__check_8cpp}{xb\+\_\+cfg\+\_\+check.\+cpp}} }{\pageref{xb__cfg__check_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__copydbf_8cpp}{xb\+\_\+copydbf.\+cpp}} }{\pageref{xb__copydbf_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__dbfutil_8cpp}{xb\+\_\+dbfutil.\+cpp}} }{\pageref{xb__dbfutil_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__deletall_8cpp}{xb\+\_\+deletall.\+cpp}} }{\pageref{xb__deletall_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__dumpdbt_8cpp}{xb\+\_\+dumpdbt.\+cpp}} }{\pageref{xb__dumpdbt_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__dumphdr_8cpp}{xb\+\_\+dumphdr.\+cpp}} }{\pageref{xb__dumphdr_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__dumpix_8cpp}{xb\+\_\+dumpix.\+cpp}} }{\pageref{xb__dumpix_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__dumprecs_8cpp}{xb\+\_\+dumprecs.\+cpp}} }{\pageref{xb__dumprecs_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__execsql_8cpp}{xb\+\_\+execsql.\+cpp}} }{\pageref{xb__execsql_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__pack_8cpp}{xb\+\_\+pack.\+cpp}} }{\pageref{xb__pack_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__tblinfo_8cpp}{xb\+\_\+tblinfo.\+cpp}} }{\pageref{xb__tblinfo_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__undelall_8cpp}{xb\+\_\+undelall.\+cpp}} }{\pageref{xb__undelall_8cpp}}{}
+\item\contentsline{section}{/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/utils/\mbox{\hyperlink{xb__zap_8cpp}{xb\+\_\+zap.\+cpp}} }{\pageref{xb__zap_8cpp}}{}
+\end{DoxyCompactList}
diff --git a/docs/doxygen/latex/hierarchy.tex b/docs/doxygen/latex/hierarchy.tex
new file mode 100644
index 0000000..01c2aa7
--- /dev/null
+++ b/docs/doxygen/latex/hierarchy.tex
@@ -0,0 +1,18 @@
+\doxysection{Class Hierarchy}
+This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList}
+\item \contentsline{section}{xb\+::xb\+Schema}{\pageref{structxb_1_1xbSchema}}{}
+\item \contentsline{section}{xb\+::xb\+Ssv}{\pageref{classxb_1_1xbSsv}}{}
+\begin{DoxyCompactList}
+\item \contentsline{section}{xb\+::xb\+Date}{\pageref{classxb_1_1xbDate}}{}
+\item \contentsline{section}{xb\+::xb\+File}{\pageref{classxb_1_1xbFile}}{}
+\begin{DoxyCompactList}
+\item \contentsline{section}{xb\+::xb\+Dbf}{\pageref{classxb_1_1xbDbf}}{}
+\end{DoxyCompactList}
+\item \contentsline{section}{xb\+::xb\+Tbl\+Mgr}{\pageref{classxb_1_1xbTblMgr}}{}
+\begin{DoxyCompactList}
+\item \contentsline{section}{xb\+::xb\+XBase}{\pageref{classxb_1_1xbXBase}}{}
+\end{DoxyCompactList}
+\end{DoxyCompactList}
+\item \contentsline{section}{xb\+::xb\+String}{\pageref{classxb_1_1xbString}}{}
+\item \contentsline{section}{xb\+::xb\+Tbl\+List}{\pageref{structxb_1_1xbTblList}}{}
+\end{DoxyCompactList}
diff --git a/docs/doxygen/latex/longtable_doxygen.sty b/docs/doxygen/latex/longtable_doxygen.sty
new file mode 100644
index 0000000..a0eb314
--- /dev/null
+++ b/docs/doxygen/latex/longtable_doxygen.sty
@@ -0,0 +1,448 @@
+%%
+%% This is file `longtable.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% longtable.dtx (with options: `package')
+%%
+%% This is a generated file.
+%%
+%% The source is maintained by the LaTeX Project team and bug
+%% reports for it can be opened at http://latex-project.org/bugs.html
+%% (but please observe conditions on bug reports sent to that address!)
+%%
+%% Copyright 1993-2016
+%% The LaTeX3 Project and any individual authors listed elsewhere
+%% in this file.
+%%
+%% This file was generated from file(s) of the Standard LaTeX `Tools Bundle'.
+%% --------------------------------------------------------------------------
+%%
+%% It may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%% This file may only be distributed together with a copy of the LaTeX
+%% `Tools Bundle'. You may however distribute the LaTeX `Tools Bundle'
+%% without such generated files.
+%%
+%% The list of all files belonging to the LaTeX `Tools Bundle' is
+%% given in the file `manifest.txt'.
+%%
+%% File: longtable.dtx Copyright (C) 1990-2001 David Carlisle
+\NeedsTeXFormat{LaTeX2e}[1995/06/01]
+\ProvidesPackage{longtable_doxygen}
+ [2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen]
+\def\LT@err{\PackageError{longtable}}
+\def\LT@warn{\PackageWarning{longtable}}
+\def\LT@final@warn{%
+ \AtEndDocument{%
+ \LT@warn{Table \@width s have changed. Rerun LaTeX.\@gobbletwo}}%
+ \global\let\LT@final@warn\relax}
+\DeclareOption{errorshow}{%
+ \def\LT@warn{\PackageInfo{longtable}}}
+\DeclareOption{pausing}{%
+ \def\LT@warn#1{%
+ \LT@err{#1}{This is not really an error}}}
+\DeclareOption{set}{}
+\DeclareOption{final}{}
+\ProcessOptions
+\newskip\LTleft \LTleft=\fill
+\newskip\LTright \LTright=\fill
+\newskip\LTpre \LTpre=\bigskipamount
+\newskip\LTpost \LTpost=\bigskipamount
+\newcount\LTchunksize \LTchunksize=20
+\let\c@LTchunksize\LTchunksize
+\newdimen\LTcapwidth \LTcapwidth=4in
+\newbox\LT@head
+\newbox\LT@firsthead
+\newbox\LT@foot
+\newbox\LT@lastfoot
+\newcount\LT@cols
+\newcount\LT@rows
+\newcounter{LT@tables}
+\newcounter{LT@chunks}[LT@tables]
+\ifx\c@table\undefined
+ \newcounter{table}
+ \def\fnum@table{\tablename~\thetable}
+\fi
+\ifx\tablename\undefined
+ \def\tablename{Table}
+\fi
+\newtoks\LT@p@ftn
+\mathchardef\LT@end@pen=30000
+\def\longtable{%
+ \par
+ \ifx\multicols\@undefined
+ \else
+ \ifnum\col@number>\@ne
+ \@twocolumntrue
+ \fi
+ \fi
+ \if@twocolumn
+ \LT@err{longtable not in 1-column mode}\@ehc
+ \fi
+ \begingroup
+ \@ifnextchar[\LT@array{\LT@array[x]}}
+\def\LT@array[#1]#2{%
+ \refstepcounter{table}\stepcounter{LT@tables}%
+ \if l#1%
+ \LTleft\z@ \LTright\fill
+ \else\if r#1%
+ \LTleft\fill \LTright\z@
+ \else\if c#1%
+ \LTleft\fill \LTright\fill
+ \fi\fi\fi
+ \let\LT@mcol\multicolumn
+ \let\LT@@tabarray\@tabarray
+ \let\LT@@hl\hline
+ \def\@tabarray{%
+ \let\hline\LT@@hl
+ \LT@@tabarray}%
+ \let\\\LT@tabularcr\let\tabularnewline\\%
+ \def\newpage{\noalign{\break}}%
+ \def\pagebreak{\noalign{\ifnum`}=0\fi\@testopt{\LT@no@pgbk-}4}%
+ \def\nopagebreak{\noalign{\ifnum`}=0\fi\@testopt\LT@no@pgbk4}%
+ \let\hline\LT@hline \let\kill\LT@kill\let\caption\LT@caption
+ \@tempdima\ht\strutbox
+ \let\@endpbox\LT@endpbox
+ \ifx\extrarowheight\@undefined
+ \let\@acol\@tabacol
+ \let\@classz\@tabclassz \let\@classiv\@tabclassiv
+ \def\@startpbox{\vtop\LT@startpbox}%
+ \let\@@startpbox\@startpbox
+ \let\@@endpbox\@endpbox
+ \let\LT@LL@FM@cr\@tabularcr
+ \else
+ \advance\@tempdima\extrarowheight
+ \col@sep\tabcolsep
+ \let\@startpbox\LT@startpbox\let\LT@LL@FM@cr\@arraycr
+ \fi
+ \setbox\@arstrutbox\hbox{\vrule
+ \@height \arraystretch \@tempdima
+ \@depth \arraystretch \dp \strutbox
+ \@width \z@}%
+ \let\@sharp##\let\protect\relax
+ \begingroup
+ \@mkpream{#2}%
+ \xdef\LT@bchunk{%
+ \global\advance\c@LT@chunks\@ne
+ \global\LT@rows\z@\setbox\z@\vbox\bgroup
+ \LT@setprevdepth
+ \tabskip\LTleft \noexpand\halign to\hsize\bgroup
+ \tabskip\z@ \@arstrut \@preamble \tabskip\LTright \cr}%
+ \endgroup
+ \expandafter\LT@nofcols\LT@bchunk&\LT@nofcols
+ \LT@make@row
+ \m@th\let\par\@empty
+ \everycr{}\lineskip\z@\baselineskip\z@
+ \LT@bchunk}
+\def\LT@no@pgbk#1[#2]{\penalty #1\@getpen{#2}\ifnum`{=0\fi}}
+\def\LT@start{%
+ \let\LT@start\endgraf
+ \endgraf\penalty\z@\vskip\LTpre
+ \dimen@\pagetotal
+ \advance\dimen@ \ht\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
+ \advance\dimen@ \dp\ifvoid\LT@firsthead\LT@head\else\LT@firsthead\fi
+ \advance\dimen@ \ht\LT@foot
+ \dimen@ii\vfuzz
+ \vfuzz\maxdimen
+ \setbox\tw@\copy\z@
+ \setbox\tw@\vsplit\tw@ to \ht\@arstrutbox
+ \setbox\tw@\vbox{\unvbox\tw@}%
+ \vfuzz\dimen@ii
+ \advance\dimen@ \ht
+ \ifdim\ht\@arstrutbox>\ht\tw@\@arstrutbox\else\tw@\fi
+ \advance\dimen@\dp
+ \ifdim\dp\@arstrutbox>\dp\tw@\@arstrutbox\else\tw@\fi
+ \advance\dimen@ -\pagegoal
+ \ifdim \dimen@>\z@\vfil\break\fi
+ \global\@colroom\@colht
+ \ifvoid\LT@foot\else
+ \advance\vsize-\ht\LT@foot
+ \global\advance\@colroom-\ht\LT@foot
+ \dimen@\pagegoal\advance\dimen@-\ht\LT@foot\pagegoal\dimen@
+ \maxdepth\z@
+ \fi
+ \ifvoid\LT@firsthead\copy\LT@head\else\box\LT@firsthead\fi\nobreak
+ \output{\LT@output}}
+\def\endlongtable{%
+ \crcr
+ \noalign{%
+ \let\LT@entry\LT@entry@chop
+ \xdef\LT@save@row{\LT@save@row}}%
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \if@filesw
+ {\let\LT@entry\LT@entry@write\immediate\write\@auxout{%
+ \gdef\expandafter\noexpand
+ \csname LT@\romannumeral\c@LT@tables\endcsname
+ {\LT@save@row}}}%
+ \fi
+ \ifx\LT@save@row\LT@@save@row
+ \else
+ \LT@warn{Column \@width s have changed\MessageBreak
+ in table \thetable}%
+ \LT@final@warn
+ \fi
+ \endgraf\penalty -\LT@end@pen
+ \endgroup
+ \global\@mparbottom\z@
+ \pagegoal\vsize
+ \endgraf\penalty\z@\addvspace\LTpost
+ \ifvoid\footins\else\insert\footins{}\fi}
+\def\LT@nofcols#1&{%
+ \futurelet\@let@token\LT@n@fcols}
+\def\LT@n@fcols{%
+ \advance\LT@cols\@ne
+ \ifx\@let@token\LT@nofcols
+ \expandafter\@gobble
+ \else
+ \expandafter\LT@nofcols
+ \fi}
+\def\LT@tabularcr{%
+ \relax\iffalse{\fi\ifnum0=`}\fi
+ \@ifstar
+ {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr
+ \LT@t@bularcr}%
+ {\LT@t@bularcr}}
+\let\LT@crcr\crcr
+\let\LT@setprevdepth\relax
+\def\LT@t@bularcr{%
+ \global\advance\LT@rows\@ne
+ \ifnum\LT@rows=\LTchunksize
+ \gdef\LT@setprevdepth{%
+ \prevdepth\z@\global
+ \global\let\LT@setprevdepth\relax}%
+ \expandafter\LT@xtabularcr
+ \else
+ \ifnum0=`{}\fi
+ \expandafter\LT@LL@FM@cr
+ \fi}
+\def\LT@xtabularcr{%
+ \@ifnextchar[\LT@argtabularcr\LT@ntabularcr}
+\def\LT@ntabularcr{%
+ \ifnum0=`{}\fi
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\LT@argtabularcr[#1]{%
+ \ifnum0=`{}\fi
+ \ifdim #1>\z@
+ \unskip\@xargarraycr{#1}%
+ \else
+ \@yargarraycr{#1}%
+ \fi
+ \LT@echunk
+ \LT@start
+ \unvbox\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\LT@echunk{%
+ \crcr\LT@save@row\cr\egroup
+ \global\setbox\@ne\lastbox
+ \unskip
+ \egroup}
+\def\LT@entry#1#2{%
+ \ifhmode\@firstofone{&}\fi\omit
+ \ifnum#1=\c@LT@chunks
+ \else
+ \kern#2\relax
+ \fi}
+\def\LT@entry@chop#1#2{%
+ \noexpand\LT@entry
+ {\ifnum#1>\c@LT@chunks
+ 1}{0pt%
+ \else
+ #1}{#2%
+ \fi}}
+\def\LT@entry@write{%
+ \noexpand\LT@entry^^J%
+ \@spaces}
+\def\LT@kill{%
+ \LT@echunk
+ \LT@get@widths
+ \expandafter\LT@rebox\LT@bchunk}
+\def\LT@rebox#1\bgroup{%
+ #1\bgroup
+ \unvbox\z@
+ \unskip
+ \setbox\z@\lastbox}
+\def\LT@blank@row{%
+ \xdef\LT@save@row{\expandafter\LT@build@blank
+ \romannumeral\number\LT@cols 001 }}
+\def\LT@build@blank#1{%
+ \if#1m%
+ \noexpand\LT@entry{1}{0pt}%
+ \expandafter\LT@build@blank
+ \fi}
+\def\LT@make@row{%
+ \global\expandafter\let\expandafter\LT@save@row
+ \csname LT@\romannumeral\c@LT@tables\endcsname
+ \ifx\LT@save@row\relax
+ \LT@blank@row
+ \else
+ {\let\LT@entry\or
+ \if!%
+ \ifcase\expandafter\expandafter\expandafter\LT@cols
+ \expandafter\@gobble\LT@save@row
+ \or
+ \else
+ \relax
+ \fi
+ !%
+ \else
+ \aftergroup\LT@blank@row
+ \fi}%
+ \fi}
+\let\setlongtables\relax
+\def\LT@get@widths{%
+ \setbox\tw@\hbox{%
+ \unhbox\@ne
+ \let\LT@old@row\LT@save@row
+ \global\let\LT@save@row\@empty
+ \count@\LT@cols
+ \loop
+ \unskip
+ \setbox\tw@\lastbox
+ \ifhbox\tw@
+ \LT@def@row
+ \advance\count@\m@ne
+ \repeat}%
+ \ifx\LT@@save@row\@undefined
+ \let\LT@@save@row\LT@save@row
+ \fi}
+\def\LT@def@row{%
+ \let\LT@entry\or
+ \edef\@tempa{%
+ \ifcase\expandafter\count@\LT@old@row
+ \else
+ {1}{0pt}%
+ \fi}%
+ \let\LT@entry\relax
+ \xdef\LT@save@row{%
+ \LT@entry
+ \expandafter\LT@max@sel\@tempa
+ \LT@save@row}}
+\def\LT@max@sel#1#2{%
+ {\ifdim#2=\wd\tw@
+ #1%
+ \else
+ \number\c@LT@chunks
+ \fi}%
+ {\the\wd\tw@}}
+\def\LT@hline{%
+ \noalign{\ifnum0=`}\fi
+ \penalty\@M
+ \futurelet\@let@token\LT@@hline}
+\def\LT@@hline{%
+ \ifx\@let@token\hline
+ \global\let\@gtempa\@gobble
+ \gdef\LT@sep{\penalty-\@medpenalty\vskip\doublerulesep}%
+ \else
+ \global\let\@gtempa\@empty
+ \gdef\LT@sep{\penalty-\@lowpenalty\vskip-\arrayrulewidth}%
+ \fi
+ \ifnum0=`{\fi}%
+ \multispan\LT@cols
+ \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
+ \noalign{\LT@sep}%
+ \multispan\LT@cols
+ \unskip\leaders\hrule\@height\arrayrulewidth\hfill\cr
+ \noalign{\penalty\@M}%
+ \@gtempa}
+\def\LT@caption{%
+ \noalign\bgroup
+ \@ifnextchar[{\egroup\LT@c@ption\@firstofone}\LT@capti@n}
+\def\LT@c@ption#1[#2]#3{%
+ \LT@makecaption#1\fnum@table{#3}%
+ \def\@tempa{#2}%
+ \ifx\@tempa\@empty\else
+ {\let\\\space
+ \addcontentsline{lot}{table}{\protect\numberline{\thetable}{#2}}}%
+ \fi}
+\def\LT@capti@n{%
+ \@ifstar
+ {\egroup\LT@c@ption\@gobble[]}%
+ {\egroup\@xdblarg{\LT@c@ption\@firstofone}}}
+\def\LT@makecaption#1#2#3{%
+ \LT@mcol\LT@cols c{\hbox to\z@{\hss\parbox[t]\LTcapwidth{%
+ \sbox\@tempboxa{#1{#2: }#3}%
+ \ifdim\wd\@tempboxa>\hsize
+ #1{#2: }#3%
+ \else
+ \hbox to\hsize{\hfil\box\@tempboxa\hfil}%
+ \fi
+ \endgraf\vskip\baselineskip}%
+ \hss}}}
+\def\LT@output{%
+ \ifnum\outputpenalty <-\@Mi
+ \ifnum\outputpenalty > -\LT@end@pen
+ \LT@err{floats and marginpars not allowed in a longtable}\@ehc
+ \else
+ \setbox\z@\vbox{\unvbox\@cclv}%
+ \ifdim \ht\LT@lastfoot>\ht\LT@foot
+ \dimen@\pagegoal
+ \advance\dimen@-\ht\LT@lastfoot
+ \ifdim\dimen@<\ht\z@
+ \setbox\@cclv\vbox{\unvbox\z@\copy\LT@foot\vss}%
+ \@makecol
+ \@outputpage
+ \setbox\z@\vbox{\box\LT@head}%
+ \fi
+ \fi
+ \global\@colroom\@colht
+ \global\vsize\@colht
+ \vbox
+ {\unvbox\z@\box\ifvoid\LT@lastfoot\LT@foot\else\LT@lastfoot\fi}%
+ \fi
+ \else
+ \setbox\@cclv\vbox{\unvbox\@cclv\copy\LT@foot\vss}%
+ \@makecol
+ \@outputpage
+ \global\vsize\@colroom
+ \copy\LT@head\nobreak
+ \fi}
+\def\LT@end@hd@ft#1{%
+ \LT@echunk
+ \ifx\LT@start\endgraf
+ \LT@err
+ {Longtable head or foot not at start of table}%
+ {Increase LTchunksize}%
+ \fi
+ \setbox#1\box\z@
+ \LT@get@widths
+ \LT@bchunk}
+\def\endfirsthead{\LT@end@hd@ft\LT@firsthead}
+\def\endhead{\LT@end@hd@ft\LT@head}
+\def\endfoot{\LT@end@hd@ft\LT@foot}
+\def\endlastfoot{\LT@end@hd@ft\LT@lastfoot}
+\def\LT@startpbox#1{%
+ \bgroup
+ \let\@footnotetext\LT@p@ftntext
+ \setlength\hsize{#1}%
+ \@arrayparboxrestore
+ \vrule \@height \ht\@arstrutbox \@width \z@}
+\def\LT@endpbox{%
+ \@finalstrut\@arstrutbox
+ \egroup
+ \the\LT@p@ftn
+ \global\LT@p@ftn{}%
+ \hfil}
+\def\LT@p@ftntext#1{%
+ \edef\@tempa{\the\LT@p@ftn\noexpand\footnotetext[\the\c@footnote]}%
+ \global\LT@p@ftn\expandafter{\@tempa{#1}}}%
+
+\@namedef{ver@longtable.sty}{2014/10/28 v4.11 Multi-page Table package (DPC) - frozen version for doxygen}
+\endinput
+%%
+%% End of file `longtable.sty'.
diff --git a/docs/doxygen/latex/namespaces.tex b/docs/doxygen/latex/namespaces.tex
new file mode 100644
index 0000000..bac4907
--- /dev/null
+++ b/docs/doxygen/latex/namespaces.tex
@@ -0,0 +1,4 @@
+\doxysection{Namespace List}
+Here is a list of all namespaces with brief descriptions\+:\begin{DoxyCompactList}
+\item\contentsline{section}{\mbox{\hyperlink{namespacexb}{xb}} }{\pageref{namespacexb}}{}
+\end{DoxyCompactList}
diff --git a/docs/doxygen/latex/namespacexb.tex b/docs/doxygen/latex/namespacexb.tex
new file mode 100644
index 0000000..4abf6a2
--- /dev/null
+++ b/docs/doxygen/latex/namespacexb.tex
@@ -0,0 +1,126 @@
+\hypertarget{namespacexb}{}\doxysection{xb Namespace Reference}
+\label{namespacexb}\index{xb@{xb}}
+\doxysubsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}}
+\begin{DoxyCompactList}\small\item\em \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} class. \end{DoxyCompactList}\item
+class \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}}
+\begin{DoxyCompactList}\small\item\em Base class for handling dbf files/tables. \end{DoxyCompactList}\item
+class \mbox{\hyperlink{classxb_1_1xbFile}{xb\+File}}
+\begin{DoxyCompactList}\small\item\em Class for handling low level file I/O. \end{DoxyCompactList}\item
+struct \mbox{\hyperlink{structxb_1_1xbSchema}{xb\+Schema}}
+\begin{DoxyCompactList}\small\item\em Schema used for defining tables with Create\+Table methods. \end{DoxyCompactList}\item
+class \mbox{\hyperlink{classxb_1_1xbSsv}{xb\+Ssv}}
+\begin{DoxyCompactList}\small\item\em Class for handling shared system variables. \end{DoxyCompactList}\item
+class \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}}
+\begin{DoxyCompactList}\small\item\em Class for handling string data. \end{DoxyCompactList}\item
+struct \mbox{\hyperlink{structxb_1_1xbTblList}{xb\+Tbl\+List}}
+\item
+class \mbox{\hyperlink{classxb_1_1xbTblMgr}{xb\+Tbl\+Mgr}}
+\item
+class \mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}}
+\begin{DoxyCompactList}\small\item\em xb\+Xbase class. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef float \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+Float}}
+\item
+typedef double \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}}
+\item
+typedef short int \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}
+\item
+typedef xb\+UInt64 \mbox{\hyperlink{namespacexb_ac963d9fde6debb416303cfbed35fb793}{xb\+OffT}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+std\+::ostream \& \mbox{\hyperlink{namespacexb_ad27f348219e895c44f74addba8e1889a}{operator$<$$<$}} (std\+::ostream \&os, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s)
+\begin{DoxyCompactList}\small\item\em Stream insertion operator \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<}. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+const xb\+Error\+Message \mbox{\hyperlink{namespacexb_a04be228a037d220dd5564f5ef618adcc}{xb\+Error\+Messages}} \mbox{[}$\,$\mbox{]}
+\item
+class XBDLLEXPORT \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xb\+XBase}}
+\item
+class XBDLLEXPORT \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xb\+Dbf}}
+\item
+class XBDLLEXPORT \mbox{\hyperlink{namespacexb_a4a31fbe9110c9e55495ce71e642d785c}{xb\+Log}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Typedef Documentation}
+\mbox{\Hypertarget{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}\label{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}}
+\index{xb@{xb}!xbBool@{xbBool}}
+\index{xbBool@{xbBool}!xb@{xb}}
+\doxysubsubsection{\texorpdfstring{xbBool}{xbBool}}
+{\footnotesize\ttfamily typedef short int \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+::xb\+Bool}}}
+
+\mbox{\Hypertarget{namespacexb_a25f47b226ce924a5c78f97989b0744a2}\label{namespacexb_a25f47b226ce924a5c78f97989b0744a2}}
+\index{xb@{xb}!xbDouble@{xbDouble}}
+\index{xbDouble@{xbDouble}!xb@{xb}}
+\doxysubsubsection{\texorpdfstring{xbDouble}{xbDouble}}
+{\footnotesize\ttfamily typedef double \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+::xb\+Double}}}
+
+\mbox{\Hypertarget{namespacexb_a83aa6a550398db55973aa9fb4257e66e}\label{namespacexb_a83aa6a550398db55973aa9fb4257e66e}}
+\index{xb@{xb}!xbFloat@{xbFloat}}
+\index{xbFloat@{xbFloat}!xb@{xb}}
+\doxysubsubsection{\texorpdfstring{xbFloat}{xbFloat}}
+{\footnotesize\ttfamily typedef float \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+::xb\+Float}}}
+
+\mbox{\Hypertarget{namespacexb_ac963d9fde6debb416303cfbed35fb793}\label{namespacexb_ac963d9fde6debb416303cfbed35fb793}}
+\index{xb@{xb}!xbOffT@{xbOffT}}
+\index{xbOffT@{xbOffT}!xb@{xb}}
+\doxysubsubsection{\texorpdfstring{xbOffT}{xbOffT}}
+{\footnotesize\ttfamily typedef xb\+UInt64 \mbox{\hyperlink{namespacexb_ac963d9fde6debb416303cfbed35fb793}{xb\+::xb\+OffT}}}
+
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{namespacexb_ad27f348219e895c44f74addba8e1889a}\label{namespacexb_ad27f348219e895c44f74addba8e1889a}}
+\index{xb@{xb}!operator$<$$<$@{operator$<$$<$}}
+\index{operator$<$$<$@{operator$<$$<$}!xb@{xb}}
+\doxysubsubsection{\texorpdfstring{operator$<$$<$()}{operator<<()}}
+{\footnotesize\ttfamily std\+::ostream \& xb\+::operator$<$$<$ (\begin{DoxyParamCaption}\item[{std\+::ostream \&}]{os, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s }\end{DoxyParamCaption})}
+
+
+
+Stream insertion operator \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<}.
+
+std\+::cout \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<} My\+String \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<} std\+::endl;
+
+
+\begin{DoxyParams}{Parameters}
+{\em os} & Output stream \\
+\hline
+{\em s} & String to send to output stream \\
+\hline
+\end{DoxyParams}
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}\label{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}}
+\index{xb@{xb}!xbDbf@{xbDbf}}
+\index{xbDbf@{xbDbf}!xb@{xb}}
+\doxysubsubsection{\texorpdfstring{xbDbf}{xbDbf}}
+{\footnotesize\ttfamily class XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+::xb\+Dbf}}}
+
+\mbox{\Hypertarget{namespacexb_a04be228a037d220dd5564f5ef618adcc}\label{namespacexb_a04be228a037d220dd5564f5ef618adcc}}
+\index{xb@{xb}!xbErrorMessages@{xbErrorMessages}}
+\index{xbErrorMessages@{xbErrorMessages}!xb@{xb}}
+\doxysubsubsection{\texorpdfstring{xbErrorMessages}{xbErrorMessages}}
+{\footnotesize\ttfamily const xb\+Error\+Message xb\+::xb\+Error\+Messages\mbox{[}$\,$\mbox{]}}
+
+\mbox{\Hypertarget{namespacexb_a4a31fbe9110c9e55495ce71e642d785c}\label{namespacexb_a4a31fbe9110c9e55495ce71e642d785c}}
+\index{xb@{xb}!xbLog@{xbLog}}
+\index{xbLog@{xbLog}!xb@{xb}}
+\doxysubsubsection{\texorpdfstring{xbLog}{xbLog}}
+{\footnotesize\ttfamily class XBDLLEXPORT xb\+::xb\+Log}
+
+\mbox{\Hypertarget{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}\label{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}}
+\index{xb@{xb}!xbXBase@{xbXBase}}
+\index{xbXBase@{xbXBase}!xb@{xb}}
+\doxysubsubsection{\texorpdfstring{xbXBase}{xbXBase}}
+{\footnotesize\ttfamily class XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbXBase}{xb\+::xb\+XBase}}}
+
diff --git a/docs/doxygen/latex/refman.tex b/docs/doxygen/latex/refman.tex
new file mode 100644
index 0000000..3f408ed
--- /dev/null
+++ b/docs/doxygen/latex/refman.tex
@@ -0,0 +1,332 @@
+ % Handle batch mode
+ % to overcome problems with too many open files
+ \let\mypdfximage\pdfximage\def\pdfximage{\immediate\mypdfximage}
+ % Set document class depending on configuration
+ \documentclass[twoside]{book}
+ %% moved from doxygen.sty due to workaround for LaTex 2019 version and unmaintained tabu package
+ \usepackage{ifthen}
+ \ifx\requestedLaTeXdate\undefined
+ \usepackage{array}
+ \else
+ \usepackage{array}[=2016-10-06]
+ \fi
+ %%
+ % Packages required by doxygen
+ \usepackage{fixltx2e} % for \textsubscript
+ \usepackage{doxygen}
+ \usepackage{graphicx}
+ \usepackage[utf8]{inputenc}
+ \usepackage{makeidx}
+ \PassOptionsToPackage{warn}{textcomp}
+ \usepackage{textcomp}
+ \usepackage[nointegrals]{wasysym}
+ \usepackage{ifxetex}
+ % NLS support packages
+ % Define default fonts
+ % Font selection
+ \usepackage[T1]{fontenc}
+ % set main and monospaced font
+ \usepackage[scaled=.90]{helvet}
+\usepackage{courier}
+\renewcommand{\familydefault}{\sfdefault}
+ \usepackage{sectsty}
+ \allsectionsfont{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+ }
+ \renewcommand{\DoxyLabelFont}{%
+ \fontseries{bc}\selectfont%
+ \color{darkgray}%
+ }
+ \newcommand{\+}{\discretionary{\mbox{\scriptsize$\hookleftarrow$}}{}{}}
+ % Arguments of doxygenemoji:
+ % 1) ':<text>:' form of the emoji, already LaTeX-escaped
+ % 2) file with the name of the emoji without the .png extension
+ % in case image exist use this otherwise use the ':<text>:' form
+ \newcommand{\doxygenemoji}[2]{%
+ \IfFileExists{./#2.png}{\raisebox{-0.1em}{\includegraphics[height=0.9em]{./#2.png}}}{#1}%
+ }
+ % Page & text layout
+ \usepackage{geometry}
+ \geometry{%
+ a4paper,%
+ top=2.5cm,%
+ bottom=2.5cm,%
+ left=2.5cm,%
+ right=2.5cm%
+ }
+ % Allow a bit of overflow to go unnoticed by other means
+ \tolerance=750
+ \hfuzz=15pt
+ \hbadness=750
+ \setlength{\emergencystretch}{15pt}
+ \setlength{\parindent}{0cm}
+ \newcommand{\doxynormalparskip}{\setlength{\parskip}{3ex plus 2ex minus 2ex}}
+ \newcommand{\doxytocparskip}{\setlength{\parskip}{1ex plus 0ex minus 0ex}}
+ \doxynormalparskip
+ % Redefine paragraph/subparagraph environments, using sectsty fonts
+ \makeatletter
+ \renewcommand{\paragraph}{%
+ \@startsection{paragraph}{4}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@parafont%
+ }%
+ }
+ \renewcommand{\subparagraph}{%
+ \@startsection{subparagraph}{5}{0ex}{-1.0ex}{1.0ex}{%
+ \normalfont\normalsize\bfseries\SS@subparafont%
+ }%
+ }
+ \makeatother
+ \makeatletter
+ \newcommand\hrulefilll{\leavevmode\leaders\hrule\hskip 0pt plus 1filll\kern\z@}
+ \makeatother
+ % Headers & footers
+ \usepackage{fancyhdr}
+ \pagestyle{fancyplain}
+ \renewcommand{\footrulewidth}{0.4pt}
+ \fancypagestyle{fancyplain}{
+ \fancyhf{}
+ \fancyhead[LE, RO]{\bfseries\thepage}
+ \fancyhead[LO]{\bfseries\rightmark}
+ \fancyhead[RE]{\bfseries\leftmark}
+ \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen }
+ }
+ \fancypagestyle{plain}{
+ \fancyhf{}
+ \fancyfoot[LO, RE]{\bfseries\scriptsize Generated by Doxygen }
+ \renewcommand{\headrulewidth}{0pt}
+ }
+ \pagestyle{fancyplain}
+ \renewcommand{\chaptermark}[1]{%
+ \markboth{#1}{}%
+ }
+ \renewcommand{\sectionmark}[1]{%
+ \markright{\thesection\ #1}%
+ }
+ % ToC, LoF, LoT, bibliography, and index
+ % Indices & bibliography
+ \usepackage{natbib}
+ \usepackage[titles]{tocloft}
+ \setcounter{tocdepth}{3}
+ \setcounter{secnumdepth}{5}
+ % creating indexes
+ \makeindex
+ \usepackage{newunicodechar}
+ \newunicodechar{⁻}{${}^{-}$}% Superscript minus
+ \newunicodechar{²}{${}^{2}$}% Superscript two
+ \newunicodechar{³}{${}^{3}$}% Superscript three
+ % Hyperlinks
+ % Hyperlinks (required, but should be loaded last)
+ \ifpdf
+ \usepackage[pdftex,pagebackref=true]{hyperref}
+ \else
+ \ifxetex
+ \usepackage[pagebackref=true]{hyperref}
+ \else
+ \usepackage[ps2pdf,pagebackref=true]{hyperref}
+ \fi
+ \fi
+ \hypersetup{%
+ colorlinks=true,%
+ linkcolor=blue,%
+ citecolor=blue,%
+ unicode,%
+ pdftitle=Xbase64,%
+ pdfsubject=C++ Library for handling Xbase (\+DBF) format type files%
+ }
+ % Custom commands used by the header
+ % Custom commands
+ \newcommand{\clearemptydoublepage}{%
+ \newpage{\pagestyle{empty}\cleardoublepage}%
+ }
+ % caption style definition
+ \usepackage{caption}
+ \captionsetup{labelsep=space,justification=centering,font={bf},singlelinecheck=off,skip=4pt,position=top}
+ % in page table of contents
+ \usepackage{etoc}
+ \etocsettocstyle{\doxytocparskip}{\doxynormalparskip}
+ % prevent numbers overlap the titles in toc
+ \renewcommand{\numberline}[1]{#1~}
+% End of preamble, now comes the document contents
+%===== C O N T E N T S =====
+\begin{document}
+ \raggedbottom
+ % Titlepage & ToC
+ % To avoid duplicate page anchors due to reuse of same numbers for
+ % the index (be it as roman numbers)
+ \hypersetup{pageanchor=false,
+ bookmarksnumbered=true,
+ pdfencoding=unicode
+ }
+ \pagenumbering{alph}
+ \begin{titlepage}
+ \vspace*{7cm}
+ \begin{center}%
+ {\Large Xbase64}\\
+ \vspace*{1cm}
+ {\large Generated by Doxygen 1.9.3}\\
+ \end{center}
+ \end{titlepage}
+ \clearemptydoublepage
+ \pagenumbering{roman}
+ \tableofcontents
+ \clearemptydoublepage
+ \pagenumbering{arabic}
+ % re-enable anchors again
+ \hypersetup{pageanchor=true}
+%--- Begin generated contents ---
+\chapter{Namespace Index}
+\input{namespaces}
+\chapter{Hierarchical Index}
+\input{hierarchy}
+\chapter{Data Structure Index}
+\input{annotated}
+\chapter{File Index}
+\input{files}
+\chapter{Namespace Documentation}
+\input{namespacexb}
+\chapter{Data Structure Documentation}
+\input{classxb_1_1xbDate}
+\input{classxb_1_1xbDbf}
+\input{classxb_1_1xbFile}
+\input{structxb_1_1xbSchema}
+\input{classxb_1_1xbSsv}
+\input{classxb_1_1xbString}
+\input{structxb_1_1xbTblList}
+\input{classxb_1_1xbTblMgr}
+\input{classxb_1_1xbXBase}
+\chapter{File Documentation}
+\input{xbbcd_8cpp}
+\input{xbdate_8cpp}
+\input{xbdbf_8cpp}
+\input{xbdbf3_8cpp}
+\input{xbdbf4_8cpp}
+\input{xbexp_8cpp}
+\input{xbexpnode_8cpp}
+\input{xbfields_8cpp}
+\input{xbfile_8cpp}
+\input{xbfilter_8cpp}
+\input{xbfuncs_8cpp}
+\input{xbixbase_8cpp}
+\input{xbixmdx_8cpp}
+\input{xbixndx_8cpp}
+\input{xblog_8cpp}
+\input{xbmemo_8cpp}
+\input{xbmemo3_8cpp}
+\input{xbmemo4_8cpp}
+\input{xbssv_8cpp}
+\input{xbstring_8cpp}
+\input{xbtag_8cpp}
+\input{xbtblmgr_8cpp}
+\input{xbuda_8cpp}
+\input{xbxbase_8cpp}
+\input{xb__ex__date_8cpp}
+\input{xb__ex__sql_8cpp}
+\input{xb__ex__string_8cpp}
+\input{xb__ex__v3__create__dbf_8cpp}
+\input{xb__ex__v3__upd__dbf_8cpp}
+\input{xb__ex__v4__create__dbf_8cpp}
+\input{xb__ex__v4__upd__dbf_8cpp}
+\input{xbase_8h}
+\input{xbase_8h_source}
+\input{xbbcd_8h}
+\input{xbbcd_8h_source}
+\input{xbdate_8h}
+\input{xbdate_8h_source}
+\input{xbdbf_8h}
+\input{xbdbf_8h_source}
+\input{xbexp_8h}
+\input{xbexp_8h_source}
+\input{xbexpnode_8h}
+\input{xbexpnode_8h_source}
+\input{xbfile_8h}
+\input{xbfile_8h_source}
+\input{xbfilter_8h}
+\input{xbfilter_8h_source}
+\input{xbindex_8h}
+\input{xbindex_8h_source}
+\input{xblnklst_8h}
+\input{xblnklst_8h_source}
+\input{xblnklstord_8h}
+\input{xblnklstord_8h_source}
+\input{xblnknod_8h}
+\input{xblnknod_8h_source}
+\input{xblog_8h}
+\input{xblog_8h_source}
+\input{xbmemo_8h}
+\input{xbmemo_8h_source}
+\input{xbretcod_8h}
+\input{xbretcod_8h_source}
+\input{xbsql_8h}
+\input{xbsql_8h_source}
+\input{xbssv_8h}
+\input{xbssv_8h_source}
+\input{xbstring_8h}
+\input{xbstring_8h_source}
+\input{xbtag_8h}
+\input{xbtag_8h_source}
+\input{xbtblmgr_8h}
+\input{xbtblmgr_8h_source}
+\input{xbtypes_8h}
+\input{xbtypes_8h_source}
+\input{xbuda_8h}
+\input{xbuda_8h_source}
+\input{xbxbase_8h}
+\input{xbxbase_8h_source}
+\input{xbcrix_8cpp}
+\input{xbcrtbl_8cpp}
+\input{xbdrpix_8cpp}
+\input{xbdrptbl_8cpp}
+\input{xbinsert_8cpp}
+\input{xbset_8cpp}
+\input{xbsql_8cpp}
+\input{tstfuncs_8cpp}
+\input{xb__test__bcd_8cpp}
+\input{xb__test__date_8cpp}
+\input{xb__test__dbf__v3__memos_8cpp}
+\input{xb__test__dbf__v3__nomemos_8cpp}
+\input{xb__test__dbf__v4__memos_8cpp}
+\input{xb__test__dbf__v4__nomemos_8cpp}
+\input{xb__test__expnode_8cpp}
+\input{xb__test__expression_8cpp}
+\input{xb__test__file_8cpp}
+\input{xb__test__filter_8cpp}
+\input{xb__test__funcs_8cpp}
+\input{xb__test__linklist_8cpp}
+\input{xb__test__lock_8cpp}
+\input{xb__test__lock2_8cpp}
+\input{xb__test__log_8cpp}
+\input{xb__test__mdx_8cpp}
+\input{xb__test__ndx_8cpp}
+\input{xb__test__ndx2_8cpp}
+\input{xb__test__sql_8cpp}
+\input{xb__test__string_8cpp}
+\input{xb__test__tblmgr_8cpp}
+\input{xb__test__uda_8cpp}
+\input{xb__test__xbase_8cpp}
+\input{checkndx_8cpp}
+\input{dbfxtrct_8cpp}
+\input{reindex_8cpp}
+\input{xb__cfg__check_8cpp}
+\input{xb__copydbf_8cpp}
+\input{xb__dbfutil_8cpp}
+\input{xb__deletall_8cpp}
+\input{xb__dumpdbt_8cpp}
+\input{xb__dumphdr_8cpp}
+\input{xb__dumpix_8cpp}
+\input{xb__dumprecs_8cpp}
+\input{xb__execsql_8cpp}
+\input{xb__pack_8cpp}
+\input{xb__tblinfo_8cpp}
+\input{xb__undelall_8cpp}
+\input{xb__zap_8cpp}
+%--- End generated contents ---
+% Index
+ \backmatter
+ \newpage
+ \phantomsection
+ \clearemptydoublepage
+ \addcontentsline{toc}{chapter}{\indexname}
+ \printindex
+% Required for some languages (in combination with latexdocumentpre from the header)
+\end{document}
diff --git a/docs/doxygen/latex/reindex_8cpp.tex b/docs/doxygen/latex/reindex_8cpp.tex
new file mode 100644
index 0000000..043a116
--- /dev/null
+++ b/docs/doxygen/latex/reindex_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{reindex_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/reindex.cpp File Reference}
+\label{reindex_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/reindex.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/reindex.cpp}}
+{\ttfamily \#include $<$xbase64/xbase64.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{reindex_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{reindex_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{reindex_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{reindex.cpp@{reindex.cpp}!main@{main}}
+\index{main@{main}!reindex.cpp@{reindex.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/structxb_1_1xbSchema.tex b/docs/doxygen/latex/structxb_1_1xbSchema.tex
new file mode 100644
index 0000000..290259b
--- /dev/null
+++ b/docs/doxygen/latex/structxb_1_1xbSchema.tex
@@ -0,0 +1,77 @@
+\hypertarget{structxb_1_1xbSchema}{}\doxysection{xb\+::xb\+Schema Struct Reference}
+\label{structxb_1_1xbSchema}\index{xb::xbSchema@{xb::xbSchema}}
+
+
+Schema used for defining tables with Create\+Table methods.
+
+
+
+
+{\ttfamily \#include $<$xbdbf.\+h$>$}
+
+\doxysubsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+char \mbox{\hyperlink{structxb_1_1xbSchema_a514183856094123fd37df67885b4681e}{c\+Field\+Name}} \mbox{[}11\mbox{]}
+\item
+char \mbox{\hyperlink{structxb_1_1xbSchema_a1d612b2ed5dc0b0289c9e91b3cda3a25}{c\+Type}}
+\item
+xb\+Int16 \mbox{\hyperlink{structxb_1_1xbSchema_a2da554af25ef628acf59bb52996056ac}{i\+Field\+Len}}
+\item
+xb\+Int16 \mbox{\hyperlink{structxb_1_1xbSchema_a55bab3bb69dee3508d168c93e182d4b9}{i\+No\+Of\+Decs}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Detailed Description}
+Schema used for defining tables with Create\+Table methods.
+
+See program \mbox{\hyperlink{xb__ex__v3__create__dbf_8cpp}{xb\+\_\+ex\+\_\+v3\+\_\+create\+\_\+dbf.\+cpp}} or \mbox{\hyperlink{xb__ex__v4__create__dbf_8cpp}{xb\+\_\+ex\+\_\+v4\+\_\+create\+\_\+dbf.\+cpp}} as examples on how to use.
+
+
+\begin{DoxyCode}{0}
+\DoxyCodeLine{xbSchema MyRecord[] = \{}
+\DoxyCodeLine{\textcolor{comment}{// FieldName, Type, Len, Dec}}
+\DoxyCodeLine{ \{ \textcolor{stringliteral}{"{}FIRSTNAME"{}}, \mbox{\hyperlink{xbdbf_8h_a20f739b9d9dc6a002a246a999e76aeaa}{XB\_CHAR\_FLD}}, 15, 0 \},}
+\DoxyCodeLine{ \{ \textcolor{stringliteral}{"{}LASTNAME"{}}, \mbox{\hyperlink{xbdbf_8h_a20f739b9d9dc6a002a246a999e76aeaa}{XB\_CHAR\_FLD}}, 20, 0 \},}
+\DoxyCodeLine{ \{ \textcolor{stringliteral}{"{}BIRTHDATE"{}}, \mbox{\hyperlink{xbdbf_8h_a7f685e6f5fe804b2174725a27ce73adc}{XB\_DATE\_FLD}}, 8, 0 \},}
+\DoxyCodeLine{ \{ \textcolor{stringliteral}{"{}AMOUNT"{}}, \mbox{\hyperlink{xbdbf_8h_ae9fb6d69cc5edc94d36ae403c22ec1c6}{XB\_NUMERIC\_FLD}}, 9, 2 \},}
+\DoxyCodeLine{ \{ \textcolor{stringliteral}{"{}RETIRED?"{}}, \mbox{\hyperlink{xbdbf_8h_a2f6d5073af761bc1a806a2c7b1c1d886}{XB\_LOGICAL\_FLD}}, 1, 0 \},}
+\DoxyCodeLine{ \{ \textcolor{stringliteral}{"{}ZIPCODE"{}}, \mbox{\hyperlink{xbdbf_8h_ae9fb6d69cc5edc94d36ae403c22ec1c6}{XB\_NUMERIC\_FLD}}, 5, 0 \},}
+\DoxyCodeLine{ \{ \textcolor{stringliteral}{"{}NUMFLD1"{}}, \mbox{\hyperlink{xbdbf_8h_a96ab4218d70ab603b4866354ce8c18cd}{XB\_FLOAT\_FLD}}, 12, 2 \},}
+\DoxyCodeLine{ \{ \textcolor{stringliteral}{"{}NUMFLD2"{}}, \mbox{\hyperlink{xbdbf_8h_a96ab4218d70ab603b4866354ce8c18cd}{XB\_FLOAT\_FLD}}, 14, 2 \},}
+\DoxyCodeLine{ \{ \textcolor{stringliteral}{"{}MEMO1"{}}, \mbox{\hyperlink{xbdbf_8h_a23fa19b19cb43bd6dcc59a5a3f6c30ad}{XB\_MEMO\_FLD}}, 10, 0 \},}
+\DoxyCodeLine{ \{ \textcolor{stringliteral}{"{}"{}},0,0,0 \}\};}
+
+\end{DoxyCode}
+
+
+\doxysubsection{Field Documentation}
+\mbox{\Hypertarget{structxb_1_1xbSchema_a514183856094123fd37df67885b4681e}\label{structxb_1_1xbSchema_a514183856094123fd37df67885b4681e}}
+\index{xb::xbSchema@{xb::xbSchema}!cFieldName@{cFieldName}}
+\index{cFieldName@{cFieldName}!xb::xbSchema@{xb::xbSchema}}
+\doxysubsubsection{\texorpdfstring{cFieldName}{cFieldName}}
+{\footnotesize\ttfamily char xb\+::xb\+Schema\+::c\+Field\+Name\mbox{[}11\mbox{]}}
+
+\mbox{\Hypertarget{structxb_1_1xbSchema_a1d612b2ed5dc0b0289c9e91b3cda3a25}\label{structxb_1_1xbSchema_a1d612b2ed5dc0b0289c9e91b3cda3a25}}
+\index{xb::xbSchema@{xb::xbSchema}!cType@{cType}}
+\index{cType@{cType}!xb::xbSchema@{xb::xbSchema}}
+\doxysubsubsection{\texorpdfstring{cType}{cType}}
+{\footnotesize\ttfamily char xb\+::xb\+Schema\+::c\+Type}
+
+\mbox{\Hypertarget{structxb_1_1xbSchema_a2da554af25ef628acf59bb52996056ac}\label{structxb_1_1xbSchema_a2da554af25ef628acf59bb52996056ac}}
+\index{xb::xbSchema@{xb::xbSchema}!iFieldLen@{iFieldLen}}
+\index{iFieldLen@{iFieldLen}!xb::xbSchema@{xb::xbSchema}}
+\doxysubsubsection{\texorpdfstring{iFieldLen}{iFieldLen}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Schema\+::i\+Field\+Len}
+
+\mbox{\Hypertarget{structxb_1_1xbSchema_a55bab3bb69dee3508d168c93e182d4b9}\label{structxb_1_1xbSchema_a55bab3bb69dee3508d168c93e182d4b9}}
+\index{xb::xbSchema@{xb::xbSchema}!iNoOfDecs@{iNoOfDecs}}
+\index{iNoOfDecs@{iNoOfDecs}!xb::xbSchema@{xb::xbSchema}}
+\doxysubsubsection{\texorpdfstring{iNoOfDecs}{iNoOfDecs}}
+{\footnotesize\ttfamily xb\+Int16 xb\+::xb\+Schema\+::i\+No\+Of\+Decs}
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbdbf_8h}{xbdbf.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/structxb_1_1xbTblList.tex b/docs/doxygen/latex/structxb_1_1xbTblList.tex
new file mode 100644
index 0000000..2c3bddb
--- /dev/null
+++ b/docs/doxygen/latex/structxb_1_1xbTblList.tex
@@ -0,0 +1,49 @@
+\hypertarget{structxb_1_1xbTblList}{}\doxysection{xb\+::xb\+Tbl\+List Struct Reference}
+\label{structxb_1_1xbTblList}\index{xb::xbTblList@{xb::xbTblList}}
+
+
+{\ttfamily \#include $<$xbtblmgr.\+h$>$}
+
+\doxysubsection*{Data Fields}
+\begin{DoxyCompactItemize}
+\item
+\mbox{\hyperlink{structxb_1_1xbTblList}{xb\+Tbl\+List}} $\ast$ \mbox{\hyperlink{structxb_1_1xbTblList_a3fd169fcf0fd4df927544e5342db583c}{p\+Next}}
+\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} $\ast$ \mbox{\hyperlink{structxb_1_1xbTblList_a02c3b0c47fd104ef9758b375ecdcfd0f}{ps\+Tbl\+Name}}
+\item
+\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} $\ast$ \mbox{\hyperlink{structxb_1_1xbTblList_ac87742c8a6b1cf2e7e35218e96966a05}{ps\+Tbl\+Alias}}
+\item
+\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$ \mbox{\hyperlink{structxb_1_1xbTblList_a387d3f6bbf291a1fb96d276ed9bb96b6}{p\+Dbf}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Field Documentation}
+\mbox{\Hypertarget{structxb_1_1xbTblList_a387d3f6bbf291a1fb96d276ed9bb96b6}\label{structxb_1_1xbTblList_a387d3f6bbf291a1fb96d276ed9bb96b6}}
+\index{xb::xbTblList@{xb::xbTblList}!pDbf@{pDbf}}
+\index{pDbf@{pDbf}!xb::xbTblList@{xb::xbTblList}}
+\doxysubsubsection{\texorpdfstring{pDbf}{pDbf}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}}$\ast$ xb\+::xb\+Tbl\+List\+::p\+Dbf}
+
+\mbox{\Hypertarget{structxb_1_1xbTblList_a3fd169fcf0fd4df927544e5342db583c}\label{structxb_1_1xbTblList_a3fd169fcf0fd4df927544e5342db583c}}
+\index{xb::xbTblList@{xb::xbTblList}!pNext@{pNext}}
+\index{pNext@{pNext}!xb::xbTblList@{xb::xbTblList}}
+\doxysubsubsection{\texorpdfstring{pNext}{pNext}}
+{\footnotesize\ttfamily \mbox{\hyperlink{structxb_1_1xbTblList}{xb\+Tbl\+List}}$\ast$ xb\+::xb\+Tbl\+List\+::p\+Next}
+
+\mbox{\Hypertarget{structxb_1_1xbTblList_ac87742c8a6b1cf2e7e35218e96966a05}\label{structxb_1_1xbTblList_ac87742c8a6b1cf2e7e35218e96966a05}}
+\index{xb::xbTblList@{xb::xbTblList}!psTblAlias@{psTblAlias}}
+\index{psTblAlias@{psTblAlias}!xb::xbTblList@{xb::xbTblList}}
+\doxysubsubsection{\texorpdfstring{psTblAlias}{psTblAlias}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}}$\ast$ xb\+::xb\+Tbl\+List\+::ps\+Tbl\+Alias}
+
+\mbox{\Hypertarget{structxb_1_1xbTblList_a02c3b0c47fd104ef9758b375ecdcfd0f}\label{structxb_1_1xbTblList_a02c3b0c47fd104ef9758b375ecdcfd0f}}
+\index{xb::xbTblList@{xb::xbTblList}!psTblName@{psTblName}}
+\index{psTblName@{psTblName}!xb::xbTblList@{xb::xbTblList}}
+\doxysubsubsection{\texorpdfstring{psTblName}{psTblName}}
+{\footnotesize\ttfamily \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}}$\ast$ xb\+::xb\+Tbl\+List\+::ps\+Tbl\+Name}
+
+
+
+The documentation for this struct was generated from the following file\+:\begin{DoxyCompactItemize}
+\item
+/mnt/1\+Tdata/xbase/xbase64-\/4.\+0.\+2/src/include/\mbox{\hyperlink{xbtblmgr_8h}{xbtblmgr.\+h}}\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/tabu_doxygen.sty b/docs/doxygen/latex/tabu_doxygen.sty
new file mode 100644
index 0000000..3f17d1d
--- /dev/null
+++ b/docs/doxygen/latex/tabu_doxygen.sty
@@ -0,0 +1,2557 @@
+%%
+%% This is file `tabu.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% tabu.dtx (with options: `package')
+%%
+%% This is a generated file.
+%% Copyright (FC) 2010-2011 - lppl
+%%
+%% tabu : 2011/02/26 v2.8 - tabu : Flexible LaTeX tabulars
+%%
+%% **********************************************************************************************
+%% \begin{tabu} { preamble } => default target: \linewidth or \linegoal
+%% \begin{tabu} to <dimen>{ preamble } => target specified
+%% \begin{tabu} spread <dimen>{ preamble } => target relative to the ``natural width''
+%%
+%% tabu works in text and in math modes.
+%%
+%% X columns: automatic width adjustment + horizontal and vertical alignment
+%% \begin{tabu} { X[4c] X[1c] X[-2ml] }
+%%
+%% Horizontal lines and / or leaders:
+%% \hline\hline => double horizontal line
+%% \firsthline\hline => for nested tabulars
+%% \lasthline\hline => for nested tabulars
+%% \tabucline[line spec]{column-column} => ``funny'' lines (dash/leader)
+%% Automatic lines / leaders :
+%% \everyrow{\hline\hline}
+%%
+%% Vertical lines and / or leaders:
+%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt blue] }
+%% \begin{tabu} { |[3pt red] X[4c] X[1c] X[-2ml] |[3pt on 2pt off 4pt blue] }
+%%
+%% Fixed vertical spacing adjustment:
+%% \extrarowheight=<dimen> \extrarowdepth=<dimen>
+%% or: \extrarowsep=<dimen> => may be prefixed by \global
+%%
+%% Dynamic vertical spacing adjustment:
+%% \abovetabulinesep=<dimen> \belowtabulinesep=<dimen>
+%% or: \tabulinesep=<dimen> => may be prefixed by \global
+%%
+%% delarray.sty shortcuts: in math and text modes
+%% \begin{tabu} .... \({ preamble }\)
+%%
+%% Algorithms reports:
+%% \tracingtabu=1 \tracingtabu=2
+%%
+%% **********************************************************************************************
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either
+%% version 1.3 of this license or (at your option) any later
+%% version. The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work consists of the main source file tabu.dtx
+%% and the derived files
+%% tabu.sty, tabu.pdf, tabu.ins
+%%
+%% tabu : Flexible LaTeX tabulars
+%% lppl copyright 2010-2011 by FC <florent.chervet@free.fr>
+%%
+
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{tabu_doxygen}[2011/02/26 v2.8 - flexible LaTeX tabulars (FC), frozen version for doxygen]
+\RequirePackage{array}[2008/09/09]
+\RequirePackage{varwidth}[2009/03/30]
+\AtEndOfPackage{\tabu@AtEnd \let\tabu@AtEnd \@undefined}
+\let\tabu@AtEnd\@empty
+\def\TMP@EnsureCode#1={%
+ \edef\tabu@AtEnd{\tabu@AtEnd
+ \catcode#1 \the\catcode#1}%
+ \catcode#1=%
+}% \TMP@EnsureCode
+\TMP@EnsureCode 33 = 12 % !
+\TMP@EnsureCode 58 = 12 % : (for siunitx)
+\TMP@EnsureCode124 = 12 % |
+\TMP@EnsureCode 36 = 3 % $ = math shift
+\TMP@EnsureCode 38 = 4 % & = tab alignment character
+\TMP@EnsureCode 32 = 10 % space
+\TMP@EnsureCode 94 = 7 % ^
+\TMP@EnsureCode 95 = 8 % _
+%% Constants --------------------------------------------------------
+\newcount \c@taburow \def\thetaburow {\number\c@taburow}
+\newcount \tabu@nbcols
+\newcount \tabu@cnt
+\newcount \tabu@Xcol
+\let\tabu@start \@tempcnta
+\let\tabu@stop \@tempcntb
+\newcount \tabu@alloc \tabu@alloc=\m@ne
+\newcount \tabu@nested
+\def\tabu@alloc@{\global\advance\tabu@alloc \@ne \tabu@nested\tabu@alloc}
+\newdimen \tabu@target
+\newdimen \tabu@spreadtarget
+\newdimen \tabu@naturalX
+\newdimen \tabucolX
+\let\tabu@DELTA \@tempdimc
+\let\tabu@thick \@tempdima
+\let\tabu@on \@tempdimb
+\let\tabu@off \@tempdimc
+\newdimen \tabu@Xsum
+\newdimen \extrarowdepth
+\newdimen \abovetabulinesep
+\newdimen \belowtabulinesep
+\newdimen \tabustrutrule \tabustrutrule \z@
+\newtoks \tabu@thebody
+\newtoks \tabu@footnotes
+\newsavebox \tabu@box
+\newsavebox \tabu@arstrutbox
+\newsavebox \tabu@hleads
+\newsavebox \tabu@vleads
+\newif \iftabu@colortbl
+\newif \iftabu@siunitx
+\newif \iftabu@measuring
+\newif \iftabu@spread
+\newif \iftabu@negcoef
+\newif \iftabu@everyrow
+\def\tabu@everyrowtrue {\global\let\iftabu@everyrow \iftrue}
+\def\tabu@everyrowfalse{\global\let\iftabu@everyrow \iffalse}
+\newif \iftabu@long
+\newif \iftabuscantokens
+\def\tabu@rescan {\tabu@verbatim \scantokens }
+%% Utilities (for internal usage) -----------------------------------
+\def\tabu@gobblespace #1 {#1}
+\def\tabu@gobbletoken #1#2{#1}
+\def\tabu@gobbleX{\futurelet\@let@token \tabu@gobblex}
+\def\tabu@gobblex{\if ^^J\noexpand\@let@token \expandafter\@gobble
+ \else\ifx \@sptoken\@let@token
+ \expandafter\tabu@gobblespace\expandafter\tabu@gobbleX
+ \fi\fi
+}% \tabu@gobblex
+\def\tabu@X{^^J}
+{\obeyspaces
+\global\let\tabu@spxiii= % saves an active space (for \ifx)
+\gdef\tabu@@spxiii{ }}
+\def\tabu@ifenvir {% only for \multicolumn
+ \expandafter\tabu@if@nvir\csname\@currenvir\endcsname
+}% \tabu@ifenvir
+\def\tabu@if@nvir #1{\csname @\ifx\tabu#1first\else
+ \ifx\longtabu#1first\else
+ second\fi\fi oftwo\endcsname
+}% \tabu@ifenvir
+\def\tabu@modulo #1#2{\numexpr\ifnum\numexpr#1=\z@ 0\else #1-(#1-(#2-1)/2)/(#2)*(#2)\fi}
+{\catcode`\&=3
+\gdef\tabu@strtrim #1{% #1 = control sequence to trim
+ \ifodd 1\ifx #1\@empty \else \ifx #1\space \else 0\fi \fi
+ \let\tabu@c@l@r \@empty \let#1\@empty
+ \else \expandafter \tabu@trimspaces #1&#1\@nnil
+ \fi
+}% \tabu@strtrim
+\gdef\tabu@trimspaces #1&#2\@nnil{\let\tabu@c@l@r=#2\tabu@firstspace .#1& &#2}%
+\gdef\tabu@firstspace #1#2#3 &{\tabu@lastspace #2#3&}
+\gdef\tabu@lastspace #1&#2&#3{\def #3{#1}%
+ \ifx #3\tabu@c@l@r \def\tabu@c@l@r{\protect\color{#1}}\expandafter\remove@to@nnil \fi
+ \tabu@trimspaces #1&#3\@nnil}
+}% \catcode
+\def\tabu@sanitizearg #1#2{{%
+ \csname \ifcsname if@safe@actives\endcsname % <babel>
+ @safe@activestrue\else
+ relax\fi \endcsname
+ \edef#2{#1}\tabu@strtrim#2\@onelevel@sanitize#2%
+ \expandafter}\expandafter\def\expandafter#2\expandafter{#2}%
+}% \tabu@sanitizearg
+\def\tabu@textbar #1{\begingroup \endlinechar\m@ne \scantokens{\def\:{|}}%
+ \expandafter\endgroup \expandafter#1\:% !!! semi simple group !!!
+}% \tabu@textbar
+\def\tabu@everyrow@bgroup{\iftabu@everyrow \begingroup \else \noalign{\ifnum0=`}\fi \fi}
+\def\tabu@everyrow@egroup{%
+ \iftabu@everyrow \expandafter \endgroup \the\toks@
+ \else \ifnum0=`{\fi}%
+ \fi
+}% \tabu@everyrow@egroup
+\def\tabu@arstrut {\global\setbox\@arstrutbox \hbox{\vrule
+ height \arraystretch \dimexpr\ht\strutbox+\extrarowheight
+ depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth
+ width \z@}%
+}% \tabu@arstrut
+\def\tabu@rearstrut {%
+ \@tempdima \arraystretch\dimexpr\ht\strutbox+\extrarowheight \relax
+ \@tempdimb \arraystretch\dimexpr\dp\strutbox+\extrarowdepth \relax
+ \ifodd 1\ifdim \ht\@arstrutbox=\@tempdima
+ \ifdim \dp\@arstrutbox=\@tempdimb 0 \fi\fi
+ \tabu@mkarstrut
+ \fi
+}% \tabu@rearstrut
+\def\tabu@@DBG #1{\ifdim\tabustrutrule>\z@ \color{#1}\fi}
+\def\tabu@DBG@arstrut {\global\setbox\@arstrutbox
+ \hbox to\z@{\hbox to\z@{\hss
+ {\tabu@DBG{cyan}\vrule
+ height \arraystretch \dimexpr\ht\strutbox+\extrarowheight
+ depth \z@
+ width \tabustrutrule}\kern-\tabustrutrule
+ {\tabu@DBG{pink}\vrule
+ height \z@
+ depth \arraystretch \dimexpr\dp\strutbox+\extrarowdepth
+ width \tabustrutrule}}}%
+}% \tabu@DBG@arstrut
+\def\tabu@save@decl{\toks\count@ \expandafter{\the\toks\expandafter\count@
+ \@nextchar}}%
+\def\tabu@savedecl{\ifcat$\d@llarend\else
+ \let\save@decl \tabu@save@decl \fi % no inversion of tokens in text mode
+}% \tabu@savedecl
+\def\tabu@finalstrut #1{\unskip\ifhmode\nobreak\fi\vrule height\z@ depth\z@ width\z@}
+\newcommand*\tabuDisableCommands {\g@addto@macro\tabu@trialh@@k }
+\let\tabu@trialh@@k \@empty
+\def\tabu@nowrite #1#{{\afterassignment}\toks@}
+\let\tabu@write\write
+\let\tabu@immediate\immediate
+\def\tabu@WRITE{\begingroup
+ \def\immediate\write{\aftergroup\endgroup
+ \tabu@immediate\tabu@write}%
+}% \tabu@WRITE
+\expandafter\def\expandafter\tabu@GenericError\expandafter{%
+ \expandafter\tabu@WRITE\GenericError}
+\def\tabu@warn{\tabu@WRITE\PackageWarning{tabu}}
+\def\tabu@noxfootnote [#1]{\@gobble}
+\def\tabu@nocolor #1#{\@gobble}
+\newcommand*\tabu@norowcolor[2][]{}
+\def\tabu@maybesiunitx #1{\def\tabu@temp{#1}%
+ \futurelet\@let@token \tabu@m@ybesiunitx}
+\def\tabu@m@ybesiunitx #1{\def\tabu@m@ybesiunitx {%
+ \ifx #1\@let@token \let\tabu@cellleft \@empty \let\tabu@cellright \@empty \fi
+ \tabu@temp}% \tabu@m@ybesiunitx
+}\expandafter\tabu@m@ybesiunitx \csname siunitx_table_collect_begin:Nn\endcsname
+\def\tabu@celllalign@def #1{\def\tabu@celllalign{\tabu@maybesiunitx{#1}}}%
+%% Fixed vertical spacing adjustment: \extrarowsep ------------------
+\newcommand*\extrarowsep{\edef\tabu@C@extra{\the\numexpr\tabu@C@extra+1}%
+ \iftabu@everyrow \aftergroup\tabu@Gextra
+ \else \aftergroup\tabu@n@Gextra
+ \fi
+ \@ifnextchar={\tabu@gobbletoken\tabu@extra} \tabu@extra
+}% \extrarowsep
+\def\tabu@extra {\@ifnextchar_%
+ {\tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}
+ {\ifx ^\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}%
+ \else \let\tabu@temp \@empty
+ \afterassignment \tabu@setextrasep \extrarowdepth
+ \fi \tabu@temp}%
+}% \tabu@extra
+\def\tabu@setextra #1#2{\def\tabu@temp{\tabu@extr@#1#2}\afterassignment\tabu@temp#2}
+\def\tabu@extr@ #1#2{\@ifnextchar^%
+ {\tabu@gobbletoken{\tabu@setextra\extrarowdepth \extrarowheight}}
+ {\ifx _\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setextra\extrarowheight \extrarowdepth}}%
+ \else \let\tabu@temp \@empty
+ \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth
+ \fi \tabu@temp}%
+}% \tabu@extr@
+\def\tabu@setextrasep {\extrarowheight=\extrarowdepth
+ \tabu@Gsave \tabu@G@extra \tabu@C@extra \extrarowheight \extrarowdepth
+}% \tabu@setextrasep
+\def\tabu@Gextra{\ifx \tabu@G@extra\@empty \else {\tabu@Rextra}\fi}
+\def\tabu@n@Gextra{\ifx \tabu@G@extra\@empty \else \noalign{\tabu@Rextra}\fi}
+\def\tabu@Rextra{\tabu@Grestore \tabu@G@extra \tabu@C@extra}
+\let\tabu@C@extra \z@
+\let\tabu@G@extra \@empty
+%% Dynamic vertical spacing adjustment: \tabulinesep ----------------
+\newcommand*\tabulinesep{\edef\tabu@C@linesep{\the\numexpr\tabu@C@linesep+1}%
+ \iftabu@everyrow \aftergroup\tabu@Glinesep
+ \else \aftergroup\tabu@n@Glinesep
+ \fi
+ \@ifnextchar={\tabu@gobbletoken\tabu@linesep} \tabu@linesep
+}% \tabulinesep
+\def\tabu@linesep {\@ifnextchar_%
+ {\tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}
+ {\ifx ^\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}%
+ \else \let\tabu@temp \@empty
+ \afterassignment \tabu@setlinesep \abovetabulinesep
+ \fi \tabu@temp}%
+}% \tabu@linesep
+\def\tabu@setsep #1#2{\def\tabu@temp{\tabu@sets@p#1#2}\afterassignment\tabu@temp#2}
+\def\tabu@sets@p #1#2{\@ifnextchar^%
+ {\tabu@gobbletoken{\tabu@setsep\belowtabulinesep \abovetabulinesep}}
+ {\ifx _\@let@token \def\tabu@temp{%
+ \tabu@gobbletoken{\tabu@setsep\abovetabulinesep \belowtabulinesep}}%
+ \else \let\tabu@temp \@empty
+ \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep
+ \fi \tabu@temp}%
+}% \tabu@sets@p
+\def\tabu@setlinesep {\belowtabulinesep=\abovetabulinesep
+ \tabu@Gsave \tabu@G@linesep \tabu@C@linesep \abovetabulinesep \belowtabulinesep
+}% \tabu@setlinesep
+\def\tabu@Glinesep{\ifx \tabu@G@linesep\@empty \else {\tabu@Rlinesep}\fi}
+\def\tabu@n@Glinesep{\ifx \tabu@G@linesep\@empty \else \noalign{\tabu@Rlinesep}\fi}
+\def\tabu@Rlinesep{\tabu@Grestore \tabu@G@linesep \tabu@C@linesep}
+\let\tabu@C@linesep \z@
+\let\tabu@G@linesep \@empty
+%% \global\extrarowsep and \global\tabulinesep -------------------
+\def\tabu@Gsave #1#2#3#4{\xdef#1{#1%
+ \toks#2{\toks\the\currentgrouplevel{\global#3\the#3\global#4\the#4}}}%
+}% \tabu@Gsave
+\def\tabu@Grestore#1#2{%
+ \toks#2{}#1\toks\currentgrouplevel\expandafter{\expandafter}\the\toks#2\relax
+ \ifcat$\the\toks\currentgrouplevel$\else
+ \global\let#1\@empty \global\let#2\z@
+ \the\toks\currentgrouplevel
+ \fi
+}% \tabu@Grestore
+%% Setting code for every row ---------------------------------------
+\newcommand*\everyrow{\tabu@everyrow@bgroup
+ \tabu@start \z@ \tabu@stop \z@ \tabu@evrstartstop
+}% \everyrow
+\def\tabu@evrstartstop {\@ifnextchar^%
+ {\afterassignment \tabu@evrstartstop \tabu@stop=}%
+ {\ifx ^\@let@token
+ \afterassignment\tabu@evrstartstop \tabu@start=%
+ \else \afterassignment\tabu@everyr@w \toks@
+ \fi}%
+}% \tabu@evrstartstop
+\def\tabu@everyr@w {%
+ \xdef\tabu@everyrow{%
+ \noexpand\tabu@everyrowfalse
+ \let\noalign \relax
+ \noexpand\tabu@rowfontreset
+ \iftabu@colortbl \noexpand\tabu@rc@ \fi % \taburowcolors
+ \let\noexpand\tabu@docline \noexpand\tabu@docline@evr
+ \the\toks@
+ \noexpand\tabu@evrh@@k
+ \noexpand\tabu@rearstrut
+ \global\advance\c@taburow \@ne}%
+ \iftabu@everyrow \toks@\expandafter
+ {\expandafter\def\expandafter\tabu@evr@L\expandafter{\the\toks@}\ignorespaces}%
+ \else \xdef\tabu@evr@G{\the\toks@}%
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@everyr@w
+\def\tabu@evr {\def\tabu@evrh@@k} % for internal use only
+\tabu@evr{}
+%% line style and leaders -------------------------------------------
+\newcommand*\newtabulinestyle [1]{%
+ {\@for \@tempa :=#1\do{\expandafter\tabu@newlinestyle \@tempa==\@nil}}%
+}% \newtabulinestyle
+\def\tabu@newlinestyle #1=#2=#3\@nil{\tabu@getline {#2}%
+ \tabu@sanitizearg {#1}\@tempa
+ \ifodd 1\ifx \@tempa\@empty \ifdefined\tabu@linestyle@ 0 \fi\fi
+ \global\expandafter\let
+ \csname tabu@linestyle@\@tempa \endcsname =\tabu@thestyle \fi
+}% \tabu@newlinestyle
+\newcommand*\tabulinestyle [1]{\tabu@everyrow@bgroup \tabu@getline{#1}%
+ \iftabu@everyrow
+ \toks@\expandafter{\expandafter \def \expandafter
+ \tabu@ls@L\expandafter{\tabu@thestyle}\ignorespaces}%
+ \gdef\tabu@ls@{\tabu@ls@L}%
+ \else
+ \global\let\tabu@ls@G \tabu@thestyle
+ \gdef\tabu@ls@{\tabu@ls@G}%
+ \fi
+ \tabu@everyrow@egroup
+}% \tabulinestyle
+\newcommand*\taburulecolor{\tabu@everyrow@bgroup \tabu@textbar \tabu@rulecolor}
+\def\tabu@rulecolor #1{\toks@{}%
+ \def\tabu@temp #1##1#1{\tabu@ruledrsc{##1}}\@ifnextchar #1%
+ \tabu@temp
+ \tabu@rulearc
+}% \tabu@rulecolor
+\def\tabu@ruledrsc #1{\edef\tabu@temp{#1}\tabu@strtrim\tabu@temp
+ \ifx \tabu@temp\@empty \def\tabu@temp{\tabu@rule@drsc@ {}{}}%
+ \else \edef\tabu@temp{\noexpand\tabu@rule@drsc@ {}{\tabu@temp}}%
+ \fi
+ \tabu@temp
+}% \tabu@ruledrsc@
+\def\tabu@ruledrsc@ #1#{\tabu@rule@drsc@ {#1}}
+\def\tabu@rule@drsc@ #1#2{%
+ \iftabu@everyrow
+ \ifx \\#1#2\\\toks@{\let\CT@drsc@ \relax}%
+ \else \toks@{\def\CT@drsc@{\color #1{#2}}}%
+ \fi
+ \else
+ \ifx \\#1#2\\\global\let\CT@drsc@ \relax
+ \else \gdef\CT@drsc@{\color #1{#2}}%
+ \fi
+ \fi
+ \tabu@rulearc
+}% \tabu@rule@drsc@
+\def\tabu@rulearc #1#{\tabu@rule@arc@ {#1}}
+\def\tabu@rule@arc@ #1#2{%
+ \iftabu@everyrow
+ \ifx \\#1#2\\\toks@\expandafter{\the\toks@ \def\CT@arc@{}}%
+ \else \toks@\expandafter{\the\toks@ \def\CT@arc@{\color #1{#2}}}%
+ \fi
+ \toks@\expandafter{\the\toks@
+ \let\tabu@arc@L \CT@arc@
+ \let\tabu@drsc@L \CT@drsc@
+ \ignorespaces}%
+ \else
+ \ifx \\#1#2\\\gdef\CT@arc@{}%
+ \else \gdef\CT@arc@{\color #1{#2}}%
+ \fi
+ \global\let\tabu@arc@G \CT@arc@
+ \global\let\tabu@drsc@G \CT@drsc@
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@rule@arc@
+\def\taburowcolors {\tabu@everyrow@bgroup \@testopt \tabu@rowcolors 1}
+\def\tabu@rowcolors [#1]#2#{\tabu@rowc@lors{#1}{#2}}
+\def\tabu@rowc@lors #1#2#3{%
+ \toks@{}\@defaultunits \count@ =\number0#2\relax \@nnil
+ \@defaultunits \tabu@start =\number0#1\relax \@nnil
+ \ifnum \count@<\tw@ \count@=\tw@ \fi
+ \advance\tabu@start \m@ne
+ \ifnum \tabu@start<\z@ \tabu@start \z@ \fi
+ \tabu@rowcolorseries #3\in@..\in@ \@nnil
+}% \tabu@rowcolors
+\def\tabu@rowcolorseries #1..#2\in@ #3\@nnil {%
+ \ifx \in@#1\relax
+ \iftabu@everyrow \toks@{\def\tabu@rc@{}\let\tabu@rc@L \tabu@rc@}%
+ \else \gdef\tabu@rc@{}\global\let\tabu@rc@G \tabu@rc@
+ \fi
+ \else
+ \ifx \\#2\\\tabu@rowcolorserieserror \fi
+ \tabu@sanitizearg{#1}\tabu@temp
+ \tabu@sanitizearg{#2}\@tempa
+ \advance\count@ \m@ne
+ \iftabu@everyrow
+ \def\tabu@rc@ ##1##2##3##4{\def\tabu@rc@{%
+ \ifnum ##2=\c@taburow
+ \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{##3}{##4}\fi
+ \ifnum \c@taburow<##2 \else
+ \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\z@
+ \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \rowcolor{tabu@rc@\the\tabu@nested}\fi}%
+ }\edef\x{\noexpand\tabu@rc@ {\the\count@}
+ {\the\tabu@start}
+ {\tabu@temp}
+ {\@tempa}%
+ }\x
+ \toks@\expandafter{\expandafter\def\expandafter\tabu@rc@\expandafter{\tabu@rc@}}%
+ \toks@\expandafter{\the\toks@ \let\tabu@rc@L \tabu@rc@ \ignorespaces}%
+ \else % inside \noalign
+ \definecolorseries{tabu@rcseries@\the\tabu@nested}{rgb}{last}{\tabu@temp}{\@tempa}%
+ \expandafter\resetcolorseries\expandafter[\the\count@]{tabu@rcseries@\the\tabu@nested}%
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \let\noalign \relax \rowcolor{tabu@rc@\the\tabu@nested}%
+ \def\tabu@rc@ ##1##2{\gdef\tabu@rc@{%
+ \ifnum \tabu@modulo {\c@taburow-##2}{##1+1}=\@ne
+ \resetcolorseries[{##1}]{tabu@rcseries@\the\tabu@nested}\fi
+ \xglobal\colorlet{tabu@rc@\the\tabu@nested}{tabu@rcseries@\the\tabu@nested!!+}%
+ \rowcolor{tabu@rc@\the\tabu@nested}}%
+ }\edef\x{\noexpand\tabu@rc@{\the\count@}{\the\c@taburow}}\x
+ \global\let\tabu@rc@G \tabu@rc@
+ \fi
+ \fi
+ \tabu@everyrow@egroup
+}% \tabu@rowcolorseries
+\tabuDisableCommands {\let\tabu@rc@ \@empty }
+\def\tabu@rowcolorserieserror {\PackageError{tabu}
+ {Invalid syntax for \string\taburowcolors
+ \MessageBreak Please look at the documentation!}\@ehd
+}% \tabu@rowcolorserieserror
+\newcommand*\tabureset {%
+ \tabulinesep=\z@ \extrarowsep=\z@ \extratabsurround=\z@
+ \tabulinestyle{}\everyrow{}\taburulecolor||{}\taburowcolors{}%
+}% \tabureset
+%% Parsing the line styles ------------------------------------------
+\def\tabu@getline #1{\begingroup
+ \csname \ifcsname if@safe@actives\endcsname % <babel>
+ @safe@activestrue\else
+ relax\fi \endcsname
+ \edef\tabu@temp{#1}\tabu@sanitizearg{#1}\@tempa
+ \let\tabu@thestyle \relax
+ \ifcsname tabu@linestyle@\@tempa \endcsname
+ \edef\tabu@thestyle{\endgroup
+ \def\tabu@thestyle{\expandafter\noexpand
+ \csname tabu@linestyle@\@tempa\endcsname}%
+ }\tabu@thestyle
+ \else \expandafter\tabu@definestyle \tabu@temp \@nil
+ \fi
+}% \tabu@getline
+\def\tabu@definestyle #1#2\@nil {\endlinechar \m@ne \makeatletter
+ \tabu@thick \maxdimen \tabu@on \maxdimen \tabu@off \maxdimen
+ \let\tabu@c@lon \@undefined \let\tabu@c@loff \@undefined
+ \ifodd 1\ifcat .#1\else\ifcat\relax #1\else 0\fi\fi % catcode 12 or non expandable cs
+ \def\tabu@temp{\tabu@getparam{thick}}%
+ \else \def\tabu@temp{\tabu@getparam{thick}\maxdimen}%
+ \fi
+ {%
+ \let\tabu@ \relax
+ \def\:{\obeyspaces \tabu@oXIII \tabu@commaXIII \edef\:}% (space active \: happy ;-))
+ \scantokens{\:{\tabu@temp #1#2 \tabu@\tabu@}}%
+ \expandafter}\expandafter
+ \def\expandafter\:\expandafter{\:}% line spec rewritten now ;-)
+ \def\;{\def\:}%
+ \scantokens\expandafter{\expandafter\;\expandafter{\:}}% space is now inactive (catcode 10)
+ \let\tabu@ \tabu@getcolor \:% all arguments are ready now ;-)
+ \ifdefined\tabu@c@lon \else \let\tabu@c@lon\@empty \fi
+ \ifx \tabu@c@lon\@empty \def\tabu@c@lon{\CT@arc@}\fi
+ \ifdefined\tabu@c@loff \else \let\tabu@c@loff \@empty \fi
+ \ifdim \tabu@on=\maxdimen \ifdim \tabu@off<\maxdimen
+ \tabu@on \tabulineon \fi\fi
+ \ifdim \tabu@off=\maxdimen \ifdim \tabu@on<\maxdimen
+ \tabu@off \tabulineoff \fi\fi
+ \ifodd 1\ifdim \tabu@off=\maxdimen \ifdim \tabu@on=\maxdimen 0 \fi\fi
+ \in@true % <leaders>
+ \else \in@false % <rule>
+ \fi
+ \ifdim\tabu@thick=\maxdimen \def\tabu@thick{\arrayrulewidth}%
+ \else \edef\tabu@thick{\the\tabu@thick}%
+ \fi
+ \edef \tabu@thestyle ##1##2{\endgroup
+ \def\tabu@thestyle{%
+ \ifin@ \noexpand\tabu@leadersstyle {\tabu@thick}
+ {\the\tabu@on}{##1}
+ {\the\tabu@off}{##2}%
+ \else \noexpand\tabu@rulesstyle
+ {##1\vrule width \tabu@thick}%
+ {##1\leaders \hrule height \tabu@thick \hfil}%
+ \fi}%
+ }\expandafter \expandafter
+ \expandafter \tabu@thestyle \expandafter
+ \expandafter \expandafter
+ {\expandafter\tabu@c@lon\expandafter}\expandafter{\tabu@c@loff}%
+}% \tabu@definestyle
+{\catcode`\O=\active \lccode`\O=`\o \catcode`\,=\active
+ \lowercase{\gdef\tabu@oXIII {\catcode`\o=\active \let O=\tabu@oxiii}}
+ \gdef\tabu@commaXIII {\catcode`\,=\active \let ,=\space}
+}% \catcode
+\def\tabu@oxiii #1{%
+ \ifcase \ifx n#1\z@ \else
+ \ifx f#1\@ne\else
+ \tw@ \fi\fi
+ \expandafter\tabu@onxiii
+ \or \expandafter\tabu@ofxiii
+ \else o%
+ \fi#1}%
+\def\tabu@onxiii #1#2{%
+ \ifcase \ifx !#2\tw@ \else
+ \ifcat.\noexpand#2\z@ \else
+ \ifx \tabu@spxiii#2\@ne\else
+ \tw@ \fi\fi\fi
+ \tabu@getparam{on}#2\expandafter\@gobble
+ \or \expandafter\tabu@onxiii % (space is active)
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}%
+\def\tabu@ofxiii #1#2{%
+ \ifx #2f\expandafter\tabu@offxiii
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}
+\def\tabu@offxiii #1#2{%
+ \ifcase \ifx !#2\tw@ \else
+ \ifcat.\noexpand#2\z@ \else
+ \ifx\tabu@spxiii#2\@ne \else
+ \tw@ \fi\fi\fi
+ \tabu@getparam{off}#2\expandafter\@gobble
+ \or \expandafter\tabu@offxiii % (space is active)
+ \else o\expandafter\@firstofone
+ \fi{#1#2}}
+\def\tabu@getparam #1{\tabu@ \csname tabu@#1\endcsname=}
+\def\tabu@getcolor #1{% \tabu@ <- \tabu@getcolor after \edef
+ \ifx \tabu@#1\else % no more spec
+ \let\tabu@theparam=#1\afterassignment \tabu@getc@l@r #1\fi
+}% \tabu@getcolor
+\def\tabu@getc@l@r #1\tabu@ {%
+ \def\tabu@temp{#1}\tabu@strtrim \tabu@temp
+ \ifx \tabu@temp\@empty
+ \else%\ifcsname \string\color@\tabu@temp \endcsname % if the color exists
+ \ifx \tabu@theparam \tabu@off \let\tabu@c@loff \tabu@c@l@r
+ \else \let\tabu@c@lon \tabu@c@l@r
+ \fi
+ %\else \tabu@warncolour{\tabu@temp}%
+ \fi%\fi
+ \tabu@ % next spec
+}% \tabu@getc@l@r
+\def\tabu@warncolour #1{\PackageWarning{tabu}
+ {Color #1 is not defined. Default color used}%
+}% \tabu@warncolour
+\def\tabu@leadersstyle #1#2#3#4#5{\def\tabu@leaders{{#1}{#2}{#3}{#4}{#5}}%
+ \ifx \tabu@leaders\tabu@leaders@G \else
+ \tabu@LEADERS{#1}{#2}{#3}{#4}{#5}\fi
+}% \tabu@leadersstyle
+\def\tabu@rulesstyle #1#2{\let\tabu@leaders \@undefined
+ \gdef\tabu@thevrule{#1}\gdef\tabu@thehrule{#2}%
+}% \tabu@rulesstyle
+%% The leaders boxes ------------------------------------------------
+\def\tabu@LEADERS #1#2#3#4#5{%% width, dash, dash color, gap, gap color
+ {\let\color \tabu@color % => during trials -> \color = \tabu@nocolor
+ {% % but the leaders boxes should have colors !
+ \def\@therule{\vrule}\def\@thick{height}\def\@length{width}%
+ \def\@box{\hbox}\def\@unbox{\unhbox}\def\@elt{\wd}%
+ \def\@skip{\hskip}\def\@ss{\hss}\def\tabu@leads{\tabu@hleads}%
+ \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}%
+ \global\let\tabu@thehleaders \tabu@theleaders
+ }%
+ {%
+ \def\@therule{\hrule}\def\@thick{width}\def\@length{height}%
+ \def\@box{\vbox}\def\@unbox{\unvbox}\def\@elt{\ht}%
+ \def\@skip{\vskip}\def\@ss{\vss}\def\tabu@leads{\tabu@vleads}%
+ \tabu@l@@d@rs {#1}{#2}{#3}{#4}{#5}%
+ \global\let\tabu@thevleaders \tabu@theleaders
+ }%
+ \gdef\tabu@leaders@G{{#1}{#2}{#3}{#4}{#5}}%
+ }%
+}% \tabu@LEADERS
+\def\tabu@therule #1#2{\@therule \@thick#1\@length\dimexpr#2/2 \@depth\z@}
+\def\tabu@l@@d@rs #1#2#3#4#5{%% width, dash, dash color, gap, gap color
+ \global\setbox \tabu@leads=\@box{%
+ {#3\tabu@therule{#1}{#2}}%
+ \ifx\\#5\\\@skip#4\else{#5\tabu@therule{#1}{#4*2}}\fi
+ {#3\tabu@therule{#1}{#2}}}%
+ \global\setbox\tabu@leads=\@box to\@elt\tabu@leads{\@ss
+ {#3\tabu@therule{#1}{#2}}\@unbox\tabu@leads}%
+ \edef\tabu@theleaders ##1{\def\noexpand\tabu@theleaders {%
+ {##1\tabu@therule{#1}{#2}}%
+ \xleaders \copy\tabu@leads \@ss
+ \tabu@therule{0pt}{-#2}{##1\tabu@therule{#1}{#2}}}%
+ }\tabu@theleaders{#3}%
+}% \tabu@l@@d@rs
+%% \tabu \endtabu \tabu* \longtabu \endlongtabu \longtabu* ----------
+\newcommand*\tabu {\tabu@longfalse
+ \ifmmode \def\tabu@ {\array}\def\endtabu {\endarray}%
+ \else \def\tabu@ {\tabu@tabular}\def\endtabu {\endtabular}\fi
+ \expandafter\let\csname tabu*\endcsname \tabu
+ \expandafter\def\csname endtabu*\endcsname{\endtabu}%
+ \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget
+}% {tabu}
+\let\tabu@tabular \tabular % <For LyX: some users redefine \tabular...>
+\expandafter\def\csname tabu*\endcsname{\tabuscantokenstrue \tabu}
+\newcommand*\longtabu {\tabu@longtrue
+ \ifmmode\PackageError{tabu}{longtabu not allowed in math mode}\fi
+ \def\tabu@{\longtable}\def\endlongtabu{\endlongtable}%
+ \LTchunksize=\@M
+ \expandafter\let\csname tabu*\endcsname \tabu
+ \expandafter\def\csname endlongtabu*\endcsname{\endlongtabu}%
+ \let\LT@startpbox \tabu@LT@startpbox % \everypar{ array struts }
+ \tabu@spreadfalse \tabu@negcoeffalse \tabu@settarget
+}% {longtabu}
+\expandafter\def\csname longtabu*\endcsname{\tabuscantokenstrue \longtabu}
+\def\tabu@nolongtabu{\PackageError{tabu}
+ {longtabu requires the longtable package}\@ehd}
+%% Read the target and then : \tabular or \@array ------------------
+\def\tabu@settarget {\futurelet\@let@token \tabu@sett@rget }
+\def\tabu@sett@rget {\tabu@target \z@
+ \ifcase \ifx \bgroup\@let@token \z@ \else
+ \ifx \@sptoken\@let@token \@ne \else
+ \if t\@let@token \tw@ \else
+ \if s\@let@token \thr@@\else
+ \z@\fi\fi\fi\fi
+ \expandafter\tabu@begin
+ \or \expandafter\tabu@gobblespace\expandafter\tabu@settarget
+ \or \expandafter\tabu@to
+ \or \expandafter\tabu@spread
+ \fi
+}% \tabu@sett@rget
+\def\tabu@to to{\def\tabu@halignto{to}\tabu@gettarget}
+\def\tabu@spread spread{\tabu@spreadtrue\def\tabu@halignto{spread}\tabu@gettarget}
+\def\tabu@gettarget {\afterassignment\tabu@linegoaltarget \tabu@target }
+\def\tabu@linegoaltarget {\futurelet\tabu@temp \tabu@linegoalt@rget }
+\def\tabu@linegoalt@rget {%
+ \ifx \tabu@temp\LNGL@setlinegoal
+ \LNGL@setlinegoal \expandafter \@firstoftwo \fi % @gobbles \LNGL@setlinegoal
+ \tabu@begin
+}% \tabu@linegoalt@rget
+\def\tabu@begin #1#{%
+ \iftabu@measuring \expandafter\tabu@nestedmeasure \fi
+ \ifdim \tabu@target=\z@ \let\tabu@halignto \@empty
+ \else \edef\tabu@halignto{\tabu@halignto\the\tabu@target}%
+ \fi
+ \@testopt \tabu@tabu@ \tabu@aligndefault #1\@nil
+}% \tabu@begin
+\long\def\tabu@tabu@ [#1]#2\@nil #3{\tabu@setup
+ \def\tabu@align {#1}\def\tabu@savedpream{\NC@find #3}%
+ \tabu@ [\tabu@align ]#2{#3\tabu@rewritefirst }%
+}% \tabu@tabu@
+\def\tabu@nestedmeasure {%
+ \ifodd 1\iftabu@spread \else \ifdim\tabu@target=\z@ \else 0 \fi\fi\relax
+ \tabu@spreadtrue
+ \else \begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}%
+ \expandafter\tabu@collectbody\expandafter\tabu@quickrule
+ \expandafter\endgroup
+ \fi
+}% \tabu@nestedmeasure
+\def\tabu@quickrule {\indent\vrule height\z@ depth\z@ width\tabu@target}
+%% \tabu@setup \tabu@init \tabu@indent
+\def\tabu@setup{\tabu@alloc@
+ \ifcase \tabu@nested
+ \ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@
+ \let\tabu@afterendpar \par
+ \fi\fi\fi
+ \def\tabu@aligndefault{c}\tabu@init \tabu@indent
+ \else % <nested tabu>
+ \def\tabu@aligndefault{t}\let\tabudefaulttarget \linewidth
+ \fi
+ \let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined
+ \edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}%
+ \everycr{}\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu...
+ \let\@endpbox \tabu@endpbox % idem " " " " " "
+ \let\@tabarray \tabu@tabarray % idem " " " " " "
+ \tabu@setcleanup \tabu@setreset
+}% \tabu@setup
+\def\tabu@init{\tabu@starttimer \tabu@measuringfalse
+ \edef\tabu@hfuzz {\the\dimexpr\hfuzz+1sp}\global\tabu@footnotes{}%
+ \let\firsthline \tabu@firsthline \let\lasthline \tabu@lasthline
+ \let\firstline \tabu@firstline \let\lastline \tabu@lastline
+ \let\hline \tabu@hline \let\@xhline \tabu@xhline
+ \let\color \tabu@color \let\@arstrutbox \tabu@arstrutbox
+ \iftabu@colortbl\else\let\LT@@hline \tabu@LT@@hline \fi
+ \tabu@trivlist %<restore \\=\@normalcr inside lists>
+ \let\@footnotetext \tabu@footnotetext \let\@xfootnotetext \tabu@xfootnotetext
+ \let\@xfootnote \tabu@xfootnote \let\centering \tabu@centering
+ \let\raggedright \tabu@raggedright \let\raggedleft \tabu@raggedleft
+ \let\tabudecimal \tabu@tabudecimal \let\Centering \tabu@Centering
+ \let\RaggedRight \tabu@RaggedRight \let\RaggedLeft \tabu@RaggedLeft
+ \let\justifying \tabu@justifying \let\rowfont \tabu@rowfont
+ \let\fbox \tabu@fbox \let\color@b@x \tabu@color@b@x
+ \let\tabu@@everycr \everycr \let\tabu@@everypar \everypar
+ \let\tabu@prepnext@tokORI \prepnext@tok\let\prepnext@tok \tabu@prepnext@tok
+ \let\tabu@multicolumnORI\multicolumn \let\multicolumn \tabu@multicolumn
+ \let\tabu@startpbox \@startpbox % for nested tabu inside longtabu pfff !!!
+ \let\tabu@endpbox \@endpbox % idem " " " " " " "
+ \let\tabu@tabarray \@tabarray % idem " " " " " " "
+ \tabu@adl@fix \let\endarray \tabu@endarray % <fix> colortbl & arydshln (delarray)
+ \iftabu@colortbl\CT@everycr\expandafter{\expandafter\iftabu@everyrow \the\CT@everycr \fi}\fi
+}% \tabu@init
+\def\tabu@indent{% correction for indentation
+ \ifdim \parindent>\z@\ifx \linewidth\tabudefaulttarget
+ \everypar\expandafter{%
+ \the\everypar\everypar\expandafter{\the\everypar}%
+ \setbox\z@=\lastbox
+ \ifdim\wd\z@>\z@ \edef\tabu@thetarget
+ {\the\dimexpr -\wd\z@+\tabudefaulttarget}\fi
+ \box\z@}%
+ \fi\fi
+}% \tabu@indent
+\def\tabu@setcleanup {% saves last global assignments
+ \ifodd 1\ifmmode \else \iftabu@long \else 0\fi\fi\relax
+ \def\tabu@aftergroupcleanup{%
+ \def\tabu@aftergroupcleanup{\aftergroup\tabu@cleanup}}%
+ \else
+ \def\tabu@aftergroupcleanup{%
+ \aftergroup\aftergroup\aftergroup\tabu@cleanup
+ \let\tabu@aftergroupcleanup \relax}%
+ \fi
+ \let\tabu@arc@Gsave \tabu@arc@G
+ \let\tabu@arc@G \tabu@arc@L % <init>
+ \let\tabu@drsc@Gsave \tabu@drsc@G
+ \let\tabu@drsc@G \tabu@drsc@L % <init>
+ \let\tabu@ls@Gsave \tabu@ls@G
+ \let\tabu@ls@G \tabu@ls@L % <init>
+ \let\tabu@rc@Gsave \tabu@rc@G
+ \let\tabu@rc@G \tabu@rc@L % <init>
+ \let\tabu@evr@Gsave \tabu@evr@G
+ \let\tabu@evr@G \tabu@evr@L % <init>
+ \let\tabu@celllalign@save \tabu@celllalign
+ \let\tabu@cellralign@save \tabu@cellralign
+ \let\tabu@cellleft@save \tabu@cellleft
+ \let\tabu@cellright@save \tabu@cellright
+ \let\tabu@@celllalign@save \tabu@@celllalign
+ \let\tabu@@cellralign@save \tabu@@cellralign
+ \let\tabu@@cellleft@save \tabu@@cellleft
+ \let\tabu@@cellright@save \tabu@@cellright
+ \let\tabu@rowfontreset@save \tabu@rowfontreset
+ \let\tabu@@rowfontreset@save\tabu@@rowfontreset
+ \let\tabu@rowfontreset \@empty
+ \edef\tabu@alloc@save {\the\tabu@alloc}% restore at \tabu@reset
+ \edef\c@taburow@save {\the\c@taburow}%
+ \edef\tabu@naturalX@save {\the\tabu@naturalX}%
+ \let\tabu@naturalXmin@save \tabu@naturalXmin
+ \let\tabu@naturalXmax@save \tabu@naturalXmax
+ \let\tabu@mkarstrut@save \tabu@mkarstrut
+ \edef\tabu@clarstrut{%
+ \extrarowheight \the\dimexpr \ht\@arstrutbox-\ht\strutbox \relax
+ \extrarowdepth \the\dimexpr \dp\@arstrutbox-\dp\strutbox \relax
+ \let\noexpand\@arraystretch \@ne \noexpand\tabu@rearstrut}%
+}% \tabu@setcleanup
+\def\tabu@cleanup {\begingroup
+ \globaldefs\@ne \tabu@everyrowtrue
+ \let\tabu@arc@G \tabu@arc@Gsave
+ \let\CT@arc@ \tabu@arc@G
+ \let\tabu@drsc@G \tabu@drsc@Gsave
+ \let\CT@drsc@ \tabu@drsc@G
+ \let\tabu@ls@G \tabu@ls@Gsave
+ \let\tabu@ls@ \tabu@ls@G
+ \let\tabu@rc@G \tabu@rc@Gsave
+ \let\tabu@rc@ \tabu@rc@G
+ \let\CT@do@color \relax
+ \let\tabu@evr@G \tabu@evr@Gsave
+ \let\tabu@celllalign \tabu@celllalign@save
+ \let\tabu@cellralign \tabu@cellralign@save
+ \let\tabu@cellleft \tabu@cellleft@save
+ \let\tabu@cellright \tabu@cellright@save
+ \let\tabu@@celllalign \tabu@@celllalign@save
+ \let\tabu@@cellralign \tabu@@cellralign@save
+ \let\tabu@@cellleft \tabu@@cellleft@save
+ \let\tabu@@cellright \tabu@@cellright@save
+ \let\tabu@rowfontreset \tabu@rowfontreset@save
+ \let\tabu@@rowfontreset \tabu@@rowfontreset@save
+ \tabu@naturalX =\tabu@naturalX@save
+ \let\tabu@naturalXmax \tabu@naturalXmax@save
+ \let\tabu@naturalXmin \tabu@naturalXmin@save
+ \let\tabu@mkarstrut \tabu@mkarstrut@save
+ \c@taburow =\c@taburow@save
+ \ifcase \tabu@nested \tabu@alloc \m@ne\fi
+ \endgroup % <end of \globaldefs>
+ \ifcase \tabu@nested
+ \the\tabu@footnotes \global\tabu@footnotes{}%
+ \tabu@afterendpar \tabu@elapsedtime
+ \fi
+ \tabu@clarstrut
+ \everyrow\expandafter {\tabu@evr@G}%
+}% \tabu@cleanup
+\let\tabu@afterendpar \relax
+\def\tabu@setreset {%
+ \edef\tabu@savedparams {% \relax for \tabu@message@save
+ \ifmmode \col@sep \the\arraycolsep
+ \else \col@sep \the\tabcolsep \fi \relax
+ \arrayrulewidth \the\arrayrulewidth \relax
+ \doublerulesep \the\doublerulesep \relax
+ \extratabsurround \the\extratabsurround \relax
+ \extrarowheight \the\extrarowheight \relax
+ \extrarowdepth \the\extrarowdepth \relax
+ \abovetabulinesep \the\abovetabulinesep \relax
+ \belowtabulinesep \the\belowtabulinesep \relax
+ \def\noexpand\arraystretch{\arraystretch}%
+ \ifdefined\minrowclearance \minrowclearance\the\minrowclearance\relax\fi}%
+ \begingroup
+ \@temptokena\expandafter{\tabu@savedparams}% => only for \savetabu / \usetabu
+ \ifx \tabu@arc@L\relax \else \tabu@setsave \tabu@arc@L \fi
+ \ifx \tabu@drsc@L\relax \else \tabu@setsave \tabu@drsc@L \fi
+ \tabu@setsave \tabu@ls@L \tabu@setsave \tabu@evr@L
+ \expandafter \endgroup \expandafter
+ \def\expandafter\tabu@saved@ \expandafter{\the\@temptokena
+ \let\tabu@arc@G \tabu@arc@L
+ \let\tabu@drsc@G \tabu@drsc@L
+ \let\tabu@ls@G \tabu@ls@L
+ \let\tabu@rc@G \tabu@rc@L
+ \let\tabu@evr@G \tabu@evr@L}%
+ \def\tabu@reset{\tabu@savedparams
+ \tabu@everyrowtrue \c@taburow \z@
+ \let\CT@arc@ \tabu@arc@L
+ \let\CT@drsc@ \tabu@drsc@L
+ \let\tabu@ls@ \tabu@ls@L
+ \let\tabu@rc@ \tabu@rc@L
+ \global\tabu@alloc \tabu@alloc@save
+ \everyrow\expandafter{\tabu@evr@L}}%
+}% \tabu@reset
+\def\tabu@setsave #1{\expandafter\tabu@sets@ve #1\@nil{#1}}
+\long\def\tabu@sets@ve #1\@nil #2{\@temptokena\expandafter{\the\@temptokena \def#2{#1}}}
+%% The Rewriting Process -------------------------------------------
+\def\tabu@newcolumntype #1{%
+ \expandafter\tabu@new@columntype
+ \csname NC@find@\string#1\expandafter\endcsname
+ \csname NC@rewrite@\string#1\endcsname
+ {#1}%
+}% \tabu@newcolumntype
+\def\tabu@new@columntype #1#2#3{%
+ \def#1##1#3{\NC@{##1}}%
+ \let#2\relax \newcommand*#2%
+}% \tabu@new@columntype
+\def\tabu@privatecolumntype #1{%
+ \expandafter\tabu@private@columntype
+ \csname NC@find@\string#1\expandafter\endcsname
+ \csname NC@rewrite@\string#1\expandafter\endcsname
+ \csname tabu@NC@find@\string#1\expandafter\endcsname
+ \csname tabu@NC@rewrite@\string#1\endcsname
+ {#1}%
+}% \tabu@privatecolumntype
+\def\tabu@private@columntype#1#2#3#4{%
+ \g@addto@macro\tabu@privatecolumns{\let#1#3\let#2#4}%
+ \tabu@new@columntype#3#4%
+}% \tabu@private@columntype
+\let\tabu@privatecolumns \@empty
+\newcommand*\tabucolumn [1]{\expandafter \def \expandafter
+ \tabu@highprioritycolumns\expandafter{\tabu@highprioritycolumns
+ \NC@do #1}}%
+\let\tabu@highprioritycolumns \@empty
+%% The | ``column'' : rewriting process --------------------------
+\tabu@privatecolumntype |{\tabu@rewritevline}
+\newcommand*\tabu@rewritevline[1][]{\tabu@vlinearg{#1}%
+ \expandafter \NC@find \tabu@rewritten}
+\def\tabu@lines #1{%
+ \ifx|#1\else \tabu@privatecolumntype #1{\tabu@rewritevline}\fi
+ \NC@list\expandafter{\the\NC@list \NC@do #1}%
+}% \tabu@lines@
+\def\tabu@vlinearg #1{%
+ \ifx\\#1\\\def\tabu@thestyle {\tabu@ls@}%
+ \else\tabu@getline {#1}%
+ \fi
+ \def\tabu@rewritten ##1{\def\tabu@rewritten{!{##1\tabu@thevline}}%
+ }\expandafter\tabu@rewritten\expandafter{\tabu@thestyle}%
+ \expandafter \tabu@keepls \tabu@thestyle \@nil
+}% \tabu@vlinearg
+\def\tabu@keepls #1\@nil{%
+ \ifcat $\@cdr #1\@nil $%
+ \ifx \relax#1\else
+ \ifx \tabu@ls@#1\else
+ \let#1\relax
+ \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer
+ \tabu@savels\noexpand#1}\fi\fi\fi
+}% \tabu@keepls
+\def\tabu@thevline {\begingroup
+ \ifdefined\tabu@leaders
+ \setbox\@tempboxa=\vtop to\dimexpr
+ \ht\@arstrutbox+\dp\@arstrutbox{{\tabu@thevleaders}}%
+ \ht\@tempboxa=\ht\@arstrutbox \dp\@tempboxa=\dp\@arstrutbox
+ \box\@tempboxa
+ \else
+ \tabu@thevrule
+ \fi \endgroup
+}% \tabu@thevline
+\def\tabu@savels #1{%
+ \expandafter\let\csname\string#1\endcsname #1%
+ \expandafter\def\expandafter\tabu@reset\expandafter{\tabu@reset
+ \tabu@resetls#1}}%
+\def\tabu@resetls #1{\expandafter\let\expandafter#1\csname\string#1\endcsname}%
+%% \multicolumn inside tabu environment -----------------------------
+\tabu@newcolumntype \tabu@rewritemulticolumn{%
+ \aftergroup \tabu@endrewritemulticolumn % after \@mkpream group
+ \NC@list{\NC@do *}\tabu@textbar \tabu@lines
+ \tabu@savedecl
+ \tabu@privatecolumns
+ \NC@list\expandafter{\the\expandafter\NC@list \tabu@NC@list}%
+ \let\tabu@savels \relax
+ \NC@find
+}% \tabu@rewritemulticolumn
+\def\tabu@endrewritemulticolumn{\gdef\tabu@mkpreambuffer{}\endgroup}
+\def\tabu@multicolumn{\tabu@ifenvir \tabu@multic@lumn \tabu@multicolumnORI}
+\long\def\tabu@multic@lumn #1#2#3{\multispan{#1}\begingroup
+ \tabu@everyrowtrue
+ \NC@list{\NC@do \tabu@rewritemulticolumn}%
+ \expandafter\@gobbletwo % gobbles \multispan{#1}
+ \tabu@multicolumnORI{#1}{\tabu@rewritemulticolumn #2}%
+ {\iftabuscantokens \tabu@rescan \else \expandafter\@firstofone \fi
+ {#3}}%
+}% \tabu@multic@lumn
+%% The X column(s): rewriting process -----------------------------
+\tabu@privatecolumntype X[1][]{\begingroup \tabu@siunitx{\endgroup \tabu@rewriteX {#1}}}
+\def\tabu@nosiunitx #1{#1{}{}\expandafter \NC@find \tabu@rewritten }
+\def\tabu@siunitx #1{\@ifnextchar \bgroup
+ {\tabu@rewriteX@Ss{#1}}
+ {\tabu@nosiunitx{#1}}}
+\def\tabu@rewriteX@Ss #1#2{\@temptokena{}%
+ \@defaultunits \let\tabu@temp =#2\relax\@nnil
+ \ifodd 1\ifx S\tabu@temp \else \ifx s\tabu@temp \else 0 \fi\fi
+ \def\NC@find{\def\NC@find >####1####2<####3\relax{#1 {####1}{####3}%
+ }\expandafter\NC@find \the\@temptokena \relax
+ }\expandafter\NC@rewrite@S \@gobble #2\relax
+ \else \tabu@siunitxerror
+ \fi
+ \expandafter \NC@find \tabu@rewritten
+}% \tabu@rewriteX@Ss
+\def\tabu@siunitxerror {\PackageError{tabu}{Not a S nor s column !
+ \MessageBreak X column can only embed siunitx S or s columns}\@ehd
+}% \tabu@siunitxerror
+\def\tabu@rewriteX #1#2#3{\tabu@Xarg {#1}{#2}{#3}%
+ \iftabu@measuring
+ \else \tabu@measuringtrue % first X column found in the preamble
+ \let\@halignto \relax \let\tabu@halignto \relax
+ \iftabu@spread \tabu@spreadtarget \tabu@target \tabu@target \z@
+ \else \tabu@spreadtarget \z@ \fi
+ \ifdim \tabu@target=\z@
+ \setlength\tabu@target \tabu@thetarget
+ \tabu@message{\tabu@message@defaulttarget}%
+ \else \tabu@message{\tabu@message@target}\fi
+ \fi
+}% \tabu@rewriteX
+\def\tabu@rewriteXrestore #1#2#3{\let\@halignto \relax
+ \def\tabu@rewritten{l}}
+\def\tabu@Xarg #1#2#3{%
+ \advance\tabu@Xcol \@ne \let\tabu@Xlcr \@empty
+ \let\tabu@Xdisp \@empty \let\tabu@Xmath \@empty
+ \ifx\\#1\\% <shortcut when no option>
+ \def\tabu@rewritten{p}\tabucolX \p@ % <default coef = 1>
+ \else
+ \let\tabu@rewritten \@empty \let\tabu@temp \@empty \tabucolX \z@
+ \tabu@Xparse {}#1\relax
+ \fi
+ \tabu@Xrewritten{#2}{#3}%
+}% \tabu@Xarg
+\def\tabu@Xparse #1{\futurelet\@let@token \tabu@Xtest}
+\expandafter\def\expandafter\tabu@Xparsespace\space{\tabu@Xparse{}}
+\def\tabu@Xtest{%
+ \ifcase \ifx \relax\@let@token \z@ \else
+ \if ,\@let@token \m@ne\else
+ \if p\@let@token 1\else
+ \if m\@let@token 2\else
+ \if b\@let@token 3\else
+ \if l\@let@token 4\else
+ \if c\@let@token 5\else
+ \if r\@let@token 6\else
+ \if j\@let@token 7\else
+ \if L\@let@token 8\else
+ \if C\@let@token 9\else
+ \if R\@let@token 10\else
+ \if J\@let@token 11\else
+ \ifx \@sptoken\@let@token 12\else
+ \if .\@let@token 13\else
+ \if -\@let@token 13\else
+ \ifcat $\@let@token 14\else
+ 15\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax
+ \or \tabu@Xtype {p}%
+ \or \tabu@Xtype {m}%
+ \or \tabu@Xtype {b}%
+ \or \tabu@Xalign \raggedright\relax
+ \or \tabu@Xalign \centering\relax
+ \or \tabu@Xalign \raggedleft\relax
+ \or \tabu@Xalign \tabu@justify\relax
+ \or \tabu@Xalign \RaggedRight\raggedright
+ \or \tabu@Xalign \Centering\centering
+ \or \tabu@Xalign \RaggedLeft\raggedleft
+ \or \tabu@Xalign \justifying\tabu@justify
+ \or \expandafter \tabu@Xparsespace
+ \or \expandafter \tabu@Xcoef
+ \or \expandafter \tabu@Xm@th
+ \or \tabu@Xcoef{}%
+ \else\expandafter \tabu@Xparse
+ \fi
+}% \tabu@Xtest
+\def\tabu@Xalign #1#2{%
+ \ifx \tabu@Xlcr\@empty \else \PackageWarning{tabu}
+ {Duplicate horizontal alignment specification}\fi
+ \ifdefined#1\def\tabu@Xlcr{#1}\let#1\relax
+ \else \def\tabu@Xlcr{#2}\let#2\relax\fi
+ \expandafter\tabu@Xparse
+}% \tabu@Xalign
+\def\tabu@Xtype #1{%
+ \ifx \tabu@rewritten\@empty \else \PackageWarning{tabu}
+ {Duplicate vertical alignment specification}\fi
+ \def\tabu@rewritten{#1}\expandafter\tabu@Xparse
+}% \tabu@Xtype
+\def\tabu@Xcoef#1{\edef\tabu@temp{\tabu@temp#1}%
+ \afterassignment\tabu@Xc@ef \tabu@cnt\number\if-#10\fi
+}% \tabu@Xcoef
+\def\tabu@Xc@ef{\advance\tabucolX \tabu@temp\the\tabu@cnt\p@
+ \tabu@Xparse{}%
+}% \tabu@Xc@ef
+\def\tabu@Xm@th #1{\futurelet \@let@token \tabu@Xd@sp}
+\def\tabu@Xd@sp{\let\tabu@Xmath=$%
+ \ifx $\@let@token \def\tabu@Xdisp{\displaystyle}%
+ \expandafter\tabu@Xparse
+ \else \expandafter\tabu@Xparse\expandafter{\expandafter}%
+ \fi
+}% \tabu@Xd@sp
+\def\tabu@Xrewritten {%
+ \ifx \tabu@rewritten\@empty \def\tabu@rewritten{p}\fi
+ \ifdim \tabucolX<\z@ \tabu@negcoeftrue
+ \else\ifdim \tabucolX=\z@ \tabucolX \p@
+ \fi\fi
+ \edef\tabu@temp{{\the\tabu@Xcol}{\tabu@strippt\tabucolX}}%
+ \edef\tabu@Xcoefs{\tabu@Xcoefs \tabu@ \tabu@temp}%
+ \edef\tabu@rewritten ##1##2{\def\noexpand\tabu@rewritten{%
+ >{\tabu@Xlcr \ifx$\tabu@Xmath$\tabu@Xdisp\fi ##1}%
+ \tabu@rewritten {\tabu@hsize \tabu@temp}%
+ <{##2\ifx$\tabu@Xmath$\fi}}%
+ }\tabu@rewritten
+}% \tabu@Xrewritten
+\def\tabu@hsize #1#2{%
+ \ifdim #2\p@<\z@
+ \ifdim \tabucolX=\maxdimen \tabu@wd{#1}\else
+ \ifdim \tabu@wd{#1}<-#2\tabucolX \tabu@wd{#1}\else -#2\tabucolX\fi
+ \fi
+ \else #2\tabucolX
+ \fi
+}% \tabu@hsize
+%% \usetabu and \preamble: rewriting process ---------------------
+\tabu@privatecolumntype \usetabu [1]{%
+ \ifx\\#1\\\tabu@saveerr{}\else
+ \@ifundefined{tabu@saved@\string#1}
+ {\tabu@saveerr{#1}}
+ {\let\tabu@rewriteX \tabu@rewriteXrestore
+ \csname tabu@saved@\string#1\expandafter\endcsname\expandafter\@ne}%
+ \fi
+}% \NC@rewrite@\usetabu
+\tabu@privatecolumntype \preamble [1]{%
+ \ifx\\#1\\\tabu@saveerr{}\else
+ \@ifundefined{tabu@saved@\string#1}
+ {\tabu@saveerr{#1}}
+ {\csname tabu@saved@\string#1\expandafter\endcsname\expandafter\z@}%
+ \fi
+}% \NC@rewrite@\preamble
+%% Controlling the rewriting process -------------------------------
+\tabu@newcolumntype \tabu@rewritefirst{%
+ \iftabu@long \aftergroup \tabu@longpream % <the whole implementation is here !>
+ \else \aftergroup \tabu@pream
+ \fi
+ \let\tabu@ \relax \let\tabu@hsize \relax
+ \let\tabu@Xcoefs \@empty \let\tabu@savels \relax
+ \tabu@Xcol \z@ \tabu@cnt \tw@
+ \gdef\tabu@mkpreambuffer{\tabu@{}}\tabu@measuringfalse
+ \global\setbox\@arstrutbox \box\@arstrutbox
+ \NC@list{\NC@do *}\tabu@textbar \tabu@lines
+ \NC@list\expandafter{\the\NC@list \NC@do X}%
+ \iftabu@siunitx % <siunitx S and s columns>
+ \NC@list\expandafter{\the\NC@list \NC@do S\NC@do s}\fi
+ \NC@list\expandafter{\the\expandafter\NC@list \tabu@highprioritycolumns}%
+ \expandafter\def\expandafter\tabu@NC@list\expandafter{%
+ \the\expandafter\NC@list \tabu@NC@list}% % * | X S <original>
+ \NC@list\expandafter{\expandafter \NC@do \expandafter\usetabu
+ \expandafter \NC@do \expandafter\preamble
+ \the\NC@list \NC@do \tabu@rewritemiddle
+ \NC@do \tabu@rewritelast}%
+ \tabu@savedecl
+ \tabu@privatecolumns
+ \edef\tabu@prev{\the\@temptokena}\NC@find \tabu@rewritemiddle
+}% NC@rewrite@\tabu@rewritefirst
+\tabu@newcolumntype \tabu@rewritemiddle{%
+ \edef\tabu@temp{\the\@temptokena}\NC@find \tabu@rewritelast
+}% \NC@rewrite@\tabu@rewritemiddle
+\tabu@newcolumntype \tabu@rewritelast{%
+ \ifx \tabu@temp\tabu@prev \advance\tabu@cnt \m@ne
+ \NC@list\expandafter{\tabu@NC@list \NC@do \tabu@rewritemiddle
+ \NC@do \tabu@rewritelast}%
+ \else \let\tabu@prev\tabu@temp
+ \fi
+ \ifcase \tabu@cnt \expandafter\tabu@endrewrite
+ \else \expandafter\NC@find \expandafter\tabu@rewritemiddle
+ \fi
+}% \NC@rewrite@\tabu@rewritelast
+%% Choosing the strategy --------------------------------------------
+\def\tabu@endrewrite {%
+ \let\tabu@temp \NC@find
+ \ifx \@arrayright\relax \let\@arrayright \@empty \fi
+ \count@=%
+ \ifx \@finalstrut\tabu@finalstrut \z@ % outer in mode 0 print
+ \iftabu@measuring
+ \xdef\tabu@mkpreambuffer{\tabu@mkpreambuffer
+ \tabu@target \csname tabu@\the\tabu@nested.T\endcsname
+ \tabucolX \csname tabu@\the\tabu@nested.X\endcsname
+ \edef\@halignto {\ifx\@arrayright\@empty to\tabu@target\fi}}%
+ \fi
+ \else\iftabu@measuring 4 % X columns
+ \xdef\tabu@mkpreambuffer{\tabu@{\tabu@mkpreambuffer
+ \tabu@target \the\tabu@target
+ \tabu@spreadtarget \the\tabu@spreadtarget}%
+ \def\noexpand\tabu@Xcoefs{\tabu@Xcoefs}%
+ \edef\tabu@halignto{\ifx \@arrayright\@empty to\tabu@target\fi}}%
+ \let\tabu@Xcoefs \relax
+ \else\ifcase\tabu@nested \thr@@ % outer, no X
+ \global\let\tabu@afterendpar \relax
+ \else \@ne % inner, no X, outer in mode 1 or 2
+ \fi
+ \ifdefined\tabu@usetabu
+ \else \ifdim\tabu@target=\z@
+ \else \let\tabu@temp \tabu@extracolsep
+ \fi\fi
+ \fi
+ \fi
+ \xdef\tabu@mkpreambuffer{\count@ \the\count@ \tabu@mkpreambuffer}%
+ \tabu@temp
+}% \tabu@endrewrite
+\def\tabu@extracolsep{\@defaultunits \expandafter\let
+ \expandafter\tabu@temp \expandafter=\the\@temptokena \relax\@nnil
+ \ifx \tabu@temp\@sptoken
+ \expandafter\tabu@gobblespace \expandafter\tabu@extracolsep
+ \else
+ \edef\tabu@temp{\noexpand\NC@find
+ \if |\noexpand\tabu@temp @%
+ \else\if !\noexpand\tabu@temp @%
+ \else !%
+ \fi\fi
+ {\noexpand\extracolsep\noexpand\@flushglue}}%
+ \fi
+ \tabu@temp
+}% \tabu@extrac@lsep
+%% Implementing the strategy ----------------------------------------
+\long\def\tabu@pream #1\@preamble {%
+ \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup
+ \NC@list\expandafter {\tabu@NC@list}% in case of nesting...
+ \ifdefined\tabu@usetabu \tabu@usetabu \tabu@target \z@ \fi
+ \let\tabu@savedpreamble \@preamble
+ \global\let\tabu@elapsedtime \relax
+ \tabu@thebody ={#1\tabu@aftergroupcleanup}%
+ \tabu@thebody =\expandafter{\the\expandafter\tabu@thebody
+ \@preamble}%
+ \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens )
+ \tabu@select
+}% \tabu@pream
+\long\def\tabu@longpream #1\LT@bchunk #2\LT@bchunk{%
+ \let\tabu@ \tabu@@ \tabu@mkpreambuffer \tabu@aftergroupcleanup
+ \NC@list\expandafter {\tabu@NC@list}% in case of nesting...
+ \let\tabu@savedpreamble \@preamble
+ \global\let\tabu@elapsedtime \relax
+ \tabu@thebody ={#1\LT@bchunk #2\tabu@aftergroupcleanup \LT@bchunk}%
+ \edef\tabuthepreamble {\the\tabu@thebody}% ( no @ allowed for \scantokens )
+ \tabu@select
+}% \tabu@longpream
+\def\tabu@select {%
+ \ifnum\tabu@nested>\z@ \tabuscantokensfalse \fi
+ \ifnum \count@=\@ne \iftabu@measuring \count@=\tw@ \fi\fi
+ \ifcase \count@
+ \global\let\tabu@elapsedtime \relax
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble % vertical adjustment (inherited from outer)
+ \or % exit in vertical measure + struts per cell because no X and outer in mode 3
+ \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble
+ \or % exit without measure because no X and outer in mode 4
+ \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty
+ \tabu@seteverycr
+ \expandafter \tabuthepreamble
+ \else % needs trials
+ \tabu@evr{}\tabu@celllalign@def{}\let\tabu@cellralign \@empty
+ \tabu@savecounters
+ \expandafter \tabu@setstrategy
+ \fi
+}% \tabu@select
+\def\tabu@@ {\gdef\tabu@mkpreambuffer}
+%% Protections to set up before trials ------------------------------
+\def\tabu@setstrategy {\begingroup % <trials group>
+ \tabu@trialh@@k \tabu@cnt \z@ % number of trials
+ \hbadness \@M \let\hbadness \@tempcnta
+ \hfuzz \maxdimen \let\hfuzz \@tempdima
+ \let\write \tabu@nowrite\let\GenericError \tabu@GenericError
+ \let\savetabu \@gobble \let\tabudefaulttarget \linewidth
+ \let\@footnotetext \@gobble \let\@xfootnote \tabu@xfootnote
+ \let\color \tabu@nocolor\let\rowcolor \tabu@norowcolor
+ \let\tabu@aftergroupcleanup \relax % only after the last trial
+ \tabu@mkpreambuffer
+ \ifnum \count@>\thr@@ \let\@halignto \@empty \tabucolX@init
+ \def\tabu@lasttry{\m@ne\p@}\fi
+ \begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}\iftabuscantokens \endlinechar=10 \obeyspaces \fi %
+ \tabu@collectbody \tabu@strategy %
+}% \tabu@setstrategy
+\def\tabu@savecounters{%
+ \def\@elt ##1{\csname c@##1\endcsname\the\csname c@##1\endcsname}%
+ \edef\tabu@clckpt {\begingroup \globaldefs=\@ne \cl@@ckpt \endgroup}\let\@elt \relax
+}% \tabu@savecounters
+\def\tabucolX@init {% \tabucolX <= \tabu@target / (sum coefs > 0)
+ \dimen@ \z@ \tabu@Xsum \z@ \tabucolX \z@ \let\tabu@ \tabu@Xinit \tabu@Xcoefs
+ \ifdim \dimen@>\z@
+ \@tempdima \dimexpr \tabu@target *\p@/\dimen@ + \tabu@hfuzz\relax
+ \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi
+ \fi
+}% \tabucolX@init
+\def\tabu@Xinit #1#2{\tabu@Xcol #1 \advance \tabu@Xsum
+ \ifdim #2\p@>\z@ #2\p@ \advance\dimen@ #2\p@
+ \else -#2\p@ \tabu@negcoeftrue
+ \@tempdima \dimexpr \tabu@target*\p@/\dimexpr-#2\p@\relax \relax
+ \ifdim \tabucolX<\@tempdima \tabucolX \@tempdima \fi
+ \tabu@wddef{#1}{0pt}%
+ \fi
+}% \tabu@Xinit
+%% Collecting the environment body ----------------------------------
+\long\def\tabu@collectbody #1#2\end #3{%
+ \edef\tabu@stack{\tabu@pushbegins #2\begin\end\expandafter\@gobble\tabu@stack}%
+ \ifx \tabu@stack\@empty
+ \toks@\expandafter{\expandafter\tabu@thebody\expandafter{\the\toks@ #2}%
+ \def\tabu@end@envir{\end{#3}}%
+ \iftabuscantokens
+ \iftabu@long \def\tabu@endenvir {\end{#3}\tabu@gobbleX}%
+ \else \def\tabu@endenvir {\let\endarray \@empty
+ \end{#3}\tabu@gobbleX}%
+ \fi
+ \else \def\tabu@endenvir {\end{#3}}\fi}%
+ \let\tabu@collectbody \tabu@endofcollect
+ \else\def\tabu@temp{#3}%
+ \ifx \tabu@temp\@empty \toks@\expandafter{\the\toks@ #2\end }%
+ \else \ifx\tabu@temp\tabu@@spxiii \toks@\expandafter{\the\toks@ #2\end #3}%
+ \else \ifx\tabu@temp\tabu@X \toks@\expandafter{\the\toks@ #2\end #3}%
+ \else \toks@\expandafter{\the\toks@ #2\end{#3}}%
+ \fi\fi\fi
+ \fi
+ \tabu@collectbody{#1}%
+}% \tabu@collectbody
+\long\def\tabu@pushbegins#1\begin#2{\ifx\end#2\else b\expandafter\tabu@pushbegins\fi}%
+\def\tabu@endofcollect #1{\ifnum0=`{}\fi
+ \expandafter\endgroup \the\toks@ #1%
+}% \tabu@endofcollect
+%% The trials: switching between strategies -------------------------
+\def\tabu@strategy {\relax % stops \count@ assignment !
+ \ifcase\count@ % case 0 = print with vertical adjustment (outer is finished)
+ \expandafter \tabu@endoftrials
+ \or % case 1 = exit in vertical measure (outer in mode 3)
+ \expandafter\xdef\csname tabu@\the\tabu@nested.T\endcsname{\the\tabu@target}%
+ \expandafter\xdef\csname tabu@\the\tabu@nested.X\endcsname{\the\tabucolX}%
+ \expandafter \tabu@endoftrials
+ \or % case 2 = exit with a rule replacing the table (outer in mode 4)
+ \expandafter \tabu@quickend
+ \or % case 3 = outer is in mode 3 because of no X
+ \begingroup
+ \tabu@evr{\tabu@verticalinit}\tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \expandafter \tabu@measuring
+ \else % case 4 = horizontal measure
+ \begingroup
+ \global\let\tabu@elapsedtime \tabu@message@etime
+ \long\def\multicolumn##1##2##3{\multispan{##1}}%
+ \let\tabu@startpboxORI \@startpbox
+ \iftabu@spread
+ \def\tabu@naturalXmax {\z@}%
+ \let\tabu@naturalXmin \tabu@naturalXmax
+ \tabu@evr{\global\tabu@naturalX \z@}%
+ \let\@startpbox \tabu@startpboxmeasure
+ \else\iftabu@negcoef
+ \let\@startpbox \tabu@startpboxmeasure
+ \else \let\@startpbox \tabu@startpboxquick
+ \fi\fi
+ \expandafter \tabu@measuring
+ \fi
+}% \tabu@strategy
+\def\tabu@measuring{\expandafter \tabu@trial \expandafter
+ \count@ \the\count@ \tabu@endtrial
+}% \tabu@measuring
+\def\tabu@trial{\iftabu@long \tabu@longtrial \else \tabu@shorttrial \fi}
+\def\tabu@shorttrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr
+ \ifx \tabu@savecounters\relax \else
+ \let\tabu@savecounters \relax \tabu@clckpt \fi
+ $\iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi
+ \expandafter{\expandafter \tabuthepreamble
+ \the\tabu@thebody
+ \csname tabu@adl@endtrial\endcsname
+ \endarray}$\egroup % got \tabu@box
+}% \tabu@shorttrial
+\def\tabu@longtrial {\setbox\tabu@box \hbox\bgroup \tabu@seteverycr
+ \ifx \tabu@savecounters\relax \else
+ \let\tabu@savecounters \relax \tabu@clckpt \fi
+ \iftabuscantokens \tabu@rescan \else \expandafter\@secondoftwo \fi
+ \expandafter{\expandafter \tabuthepreamble
+ \the\tabu@thebody
+ \tabuendlongtrial}\egroup % got \tabu@box
+}% \tabu@longtrial
+\def\tabuendlongtrial{% no @ allowed for \scantokens
+ \LT@echunk \global\setbox\@ne \hbox{\unhbox\@ne}\kern\wd\@ne
+ \LT@get@widths
+}% \tabuendlongtrial
+\def\tabu@adl@endtrial{% <arydshln in nested trials - problem for global column counters!>
+ \crcr \noalign{\global\adl@ncol \tabu@nbcols}}% anything global is crap, junky and fails !
+\def\tabu@seteverycr {\tabu@reset
+ \everycr \expandafter{\the\everycr \tabu@everycr}%
+ \let\everycr \tabu@noeverycr % <for ialign>
+}% \tabu@seteverycr
+\def\tabu@noeverycr{{\aftergroup\tabu@restoreeverycr \afterassignment}\toks@}
+\def\tabu@restoreeverycr {\let\everycr \tabu@@everycr}
+\def\tabu@everycr {\iftabu@everyrow \noalign{\tabu@everyrow}\fi}
+\def\tabu@endoftrials {%
+ \iftabuscantokens \expandafter\@firstoftwo
+ \else \expandafter\@secondoftwo
+ \fi
+ {\expandafter \tabu@closetrialsgroup \expandafter
+ \tabu@rescan \expandafter{%
+ \expandafter\tabuthepreamble
+ \the\expandafter\tabu@thebody
+ \iftabu@long \else \endarray \fi}}
+ {\expandafter\tabu@closetrialsgroup \expandafter
+ \tabuthepreamble
+ \the\tabu@thebody}%
+ \tabu@endenvir % Finish !
+}% \tabu@endoftrials
+\def\tabu@closetrialsgroup {%
+ \toks@\expandafter{\tabu@endenvir}%
+ \edef\tabu@bufferX{\endgroup
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target
+ \tabu@cnt \the\tabu@cnt
+ \def\noexpand\tabu@endenvir{\the\toks@}%
+ %Quid de \@halignto = \tabu@halignto ??
+ }% \tabu@bufferX
+ \tabu@bufferX
+ \ifcase\tabu@nested % print out (outer in mode 0)
+ \global\tabu@cnt \tabu@cnt
+ \tabu@evr{\tabu@verticaldynamicadjustment}%
+ \tabu@celllalign@def{\everypar{}}\let\tabu@cellralign \@empty
+ \let\@finalstrut \tabu@finalstrut
+ \else % vertical measure of nested tabu
+ \tabu@evr{\tabu@verticalinit}%
+ \tabu@celllalign@def{\tabu@verticalmeasure}%
+ \def\tabu@cellralign{\tabu@verticalspacing}%
+ \fi
+ \tabu@clckpt \let\@halignto \tabu@halignto
+ \let\@halignto \@empty
+ \tabu@seteverycr
+ \ifdim \tabustrutrule>\z@ \ifnum\tabu@nested=\z@
+ \setbox\@arstrutbox \box\voidb@x % force \@arstrutbox to be rebuilt (visible struts)
+ \fi\fi
+}% \tabu@closetrialsgroup
+\def\tabu@quickend {\expandafter \endgroup \expandafter
+ \tabu@target \the\tabu@target \tabu@quickrule
+ \let\endarray \relax \tabu@endenvir
+}% \tabu@quickend
+\def\tabu@endtrial {\relax % stops \count@ assignment !
+ \ifcase \count@ \tabu@err % case 0 = impossible here
+ \or \tabu@err % case 1 = impossible here
+ \or \tabu@err % case 2 = impossible here
+ \or % case 3 = outer goes into mode 0
+ \def\tabu@bufferX{\endgroup}\count@ \z@
+ \else % case 4 = outer goes into mode 3
+ \iftabu@spread \tabu@spreadarith % inner into mode 1 (outer in mode 3)
+ \else \tabu@arith % or 2 (outer in mode 4)
+ \fi
+ \count@=%
+ \ifcase\tabu@nested \thr@@ % outer goes into mode 3
+ \else\iftabu@measuring \tw@ % outer is in mode 4
+ \else \@ne % outer is in mode 3
+ \fi\fi
+ \edef\tabu@bufferX{\endgroup
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target}%
+ \fi
+ \expandafter \tabu@bufferX \expandafter
+ \count@ \the\count@ \tabu@strategy
+}% \tabu@endtrial
+\def\tabu@err{\errmessage{(tabu) Internal impossible error! (\count@=\the\count@)}}
+%% The algorithms: compute the widths / stop or go on ---------------
+\def\tabu@arithnegcoef {%
+ \@tempdima \z@ \dimen@ \z@ \let\tabu@ \tabu@arith@negcoef \tabu@Xcoefs
+}% \tabu@arithnegcoef
+\def\tabu@arith@negcoef #1#2{%
+ \ifdim #2\p@>\z@ \advance\dimen@ #2\p@ % saturated by definition
+ \advance\@tempdima #2\tabucolX
+ \else
+ \ifdim -#2\tabucolX <\tabu@wd{#1}% c_i X < natural width <= \tabu@target-> saturated
+ \advance\dimen@ -#2\p@
+ \advance\@tempdima -#2\tabucolX
+ \else
+ \advance\@tempdima \tabu@wd{#1}% natural width <= c_i X => neutralised
+ \ifdim \tabu@wd{#1}<\tabu@target \else % neutralised
+ \advance\dimen@ -#2\p@ % saturated (natural width = tabu@target)
+ \fi
+ \fi
+ \fi
+}% \tabu@arith@negcoef
+\def\tabu@givespace #1#2{% here \tabu@DELTA < \z@
+ \ifdim \@tempdima=\z@
+ \tabu@wddef{#1}{\the\dimexpr -\tabu@DELTA*\p@/\tabu@Xsum}%
+ \else
+ \tabu@wddef{#1}{\the\dimexpr \tabu@hsize{#1}{#2}
+ *(\p@ -\tabu@DELTA*\p@/\@tempdima)/\p@\relax}%
+ \fi
+}% \tabu@givespace
+\def\tabu@arith {\advance\tabu@cnt \@ne
+ \ifnum \tabu@cnt=\@ne \tabu@message{\tabu@titles}\fi
+ \tabu@arithnegcoef
+ \@tempdimb \dimexpr \wd\tabu@box -\@tempdima \relax % <incompressible material>
+ \tabu@DELTA = \dimexpr \wd\tabu@box - \tabu@target \relax
+ \tabu@message{\tabu@message@arith}%
+ \ifdim \tabu@DELTA <\tabu@hfuzz
+ \ifdim \tabu@DELTA<\z@ % wd (tabu)<\tabu@target ?
+ \let\tabu@ \tabu@givespace \tabu@Xcoefs
+ \advance\@tempdima \@tempdimb \advance\@tempdima -\tabu@DELTA % for message
+ \else % already converged: nothing to do but nearly impossible...
+ \fi
+ \tabucolX \maxdimen
+ \tabu@measuringfalse
+ \else % need for narrower X columns
+ \tabucolX =\dimexpr (\@tempdima -\tabu@DELTA) *\p@/\tabu@Xsum \relax
+ \tabu@measuringtrue
+ \@whilesw \iftabu@measuring\fi {%
+ \advance\tabu@cnt \@ne
+ \tabu@arithnegcoef
+ \tabu@DELTA =\dimexpr \@tempdima+\@tempdimb -\tabu@target \relax % always < 0 here
+ \tabu@message{\tabu@header
+ \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \@tempdima+\@tempdimb { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@
+ \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@
+ \ifdim -\tabu@DELTA<\tabu@hfuzz \tabu@spaces target ok\else
+ \tabu@msgalign \dimexpr -\tabu@DELTA *\p@/\dimen@ {}{}{}{}{}\@@
+ \fi}%
+ \ifdim -\tabu@DELTA<\tabu@hfuzz
+ \advance\@tempdima \@tempdimb % for message
+ \tabu@measuringfalse
+ \else
+ \advance\tabucolX \dimexpr -\tabu@DELTA *\p@/\dimen@ \relax
+ \fi
+ }%
+ \fi
+ \tabu@message{\tabu@message@reached}%
+ \edef\tabu@bufferX{\endgroup \tabu@cnt \the\tabu@cnt
+ \tabucolX \the\tabucolX
+ \tabu@target \the\tabu@target}%
+}% \tabu@arith
+\def\tabu@spreadarith {%
+ \dimen@ \z@ \@tempdima \tabu@naturalXmax \let\tabu@ \tabu@spread@arith \tabu@Xcoefs
+ \edef\tabu@naturalXmin {\the\dimexpr\tabu@naturalXmin*\dimen@/\p@}%
+ \@tempdimc =\dimexpr \wd\tabu@box -\tabu@naturalXmax+\tabu@naturalXmin \relax
+ \iftabu@measuring
+ \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax
+ \edef\tabu@bufferX{\endgroup \tabucolX \the\tabucolX \tabu@target\the\tabu@target}%
+ \else
+ \tabu@message{\tabu@message@spreadarith}%
+ \ifdim \dimexpr \@tempdimc+\tabu@spreadtarget >\tabu@target
+ \tabu@message{(tabu) spread
+ \ifdim \@tempdimc>\tabu@target useless here: default target used%
+ \else too large: reduced to fit default target\fi.}%
+ \else
+ \tabu@target =\dimexpr \@tempdimc+\tabu@spreadtarget \relax
+ \tabu@message{(tabu) spread: New target set to \the\tabu@target^^J}%
+ \fi
+ \begingroup \let\tabu@wddef \@gobbletwo
+ \@tempdimb \@tempdima
+ \tabucolX@init
+ \tabu@arithnegcoef
+ \wd\tabu@box =\dimexpr \wd\tabu@box +\@tempdima-\@tempdimb \relax
+ \expandafter\endgroup \expandafter\tabucolX \the\tabucolX
+ \tabu@arith
+ \fi
+}% \tabu@spreadarith
+\def\tabu@spread@arith #1#2{%
+ \ifdim #2\p@>\z@ \advance\dimen@ #2\p@
+ \else \advance\@tempdima \tabu@wd{#1}\relax
+ \fi
+}% \tabu@spread@arith
+%% Reporting in the .log file ---------------------------------------
+\def\tabu@message@defaulttarget{%
+ \ifnum\tabu@nested=\z@^^J(tabu) Default target:
+ \ifx\tabudefaulttarget\linewidth \string\linewidth
+ \ifdim \tabu@thetarget=\linewidth \else
+ -\the\dimexpr\linewidth-\tabu@thetarget\fi =
+ \else\ifx\tabudefaulttarget\linegoal\string\linegoal=
+ \fi\fi
+ \else (tabu) Default target (nested): \fi
+ \the\tabu@target \on@line
+ \ifnum\tabu@nested=\z@ , page \the\c@page\fi}
+\def\tabu@message@target {^^J(tabu) Target specified:
+ \the\tabu@target \on@line, page \the\c@page}
+\def\tabu@message@arith {\tabu@header
+ \tabu@msgalign \tabucolX { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{ }\@@
+ \tabu@msgalign \tabu@target { }{ }{ }{ }{ }\@@
+ \tabu@msgalign@PT \dimen@ { }{}{}{}{}{}{}\@@
+ \ifdim \tabu@DELTA<\tabu@hfuzz giving space\else
+ \tabu@msgalign \dimexpr (\@tempdima-\tabu@DELTA) *\p@/\tabu@Xsum -\tabucolX {}{}{}{}{}\@@
+ \fi
+}% \tabu@message@arith
+\def\tabu@message@spreadarith {\tabu@spreadheader
+ \tabu@msgalign \tabu@spreadtarget { }{ }{ }{ }{}\@@
+ \tabu@msgalign \wd\tabu@box { }{ }{ }{ }{}\@@
+ \tabu@msgalign -\tabu@naturalXmax { }{}{}{}{}\@@
+ \tabu@msgalign \tabu@naturalXmin { }{ }{ }{ }{}\@@
+ \tabu@msgalign \ifdim \dimexpr\@tempdimc>\tabu@target \tabu@target
+ \else \@tempdimc+\tabu@spreadtarget \fi
+ {}{}{}{}{}\@@}
+\def\tabu@message@negcoef #1#2{
+ \tabu@spaces\tabu@spaces\space * #1. X[\rem@pt#2]:
+ \space width = \tabu@wd {#1}
+ \expandafter\string\csname tabu@\the\tabu@nested.W\number#1\endcsname
+ \ifdim -\tabu@pt#2\tabucolX<\tabu@target
+ < \number-\rem@pt#2 X
+ = \the\dimexpr -\tabu@pt#2\tabucolX \relax
+ \else
+ <= \the\tabu@target\space < \number-\rem@pt#2 X\fi}
+\def\tabu@message@reached{\tabu@header
+ ******* Reached Target:
+ hfuzz = \tabu@hfuzz\on@line\space *******}
+\def\tabu@message@etime{\edef\tabu@stoptime{\the\pdfelapsedtime}%
+ \tabu@message{(tabu)\tabu@spaces Time elapsed during measure:
+ \the\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax sec
+ \the\numexpr\numexpr(\tabu@stoptime-\tabu@starttime)
+ -\numexpr(\tabu@stoptime-\tabu@starttime-32767)/65536\relax*65536\relax
+ *1000/65536\relax ms \tabu@spaces(\the\tabu@cnt\space
+ cycle\ifnum\tabu@cnt>\@ne s\fi)^^J^^J}}
+\def\tabu@message@verticalsp {%
+ \ifdim \@tempdima>\tabu@ht
+ \ifdim \@tempdimb>\tabu@dp
+ \expandafter\expandafter\expandafter\string\tabu@ht =
+ \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@
+ \expandafter\expandafter\expandafter\string\tabu@dp =
+ \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J%
+ \else
+ \expandafter\expandafter\expandafter\string\tabu@ht =
+ \tabu@msgalign \@tempdima { }{ }{ }{ }{ }\@@^^J%
+ \fi
+ \else\ifdim \@tempdimb>\tabu@dp
+ \tabu@spaces\tabu@spaces\tabu@spaces
+ \expandafter\expandafter\expandafter\string\tabu@dp =
+ \tabu@msgalign \@tempdimb { }{ }{ }{ }{ }\@@^^J\fi
+ \fi
+}% \tabu@message@verticalsp
+\edef\tabu@spaces{\@spaces}
+\def\tabu@strippt{\expandafter\tabu@pt\the}
+{\@makeother\P \@makeother\T\lowercase{\gdef\tabu@pt #1PT{#1}}}
+\def\tabu@msgalign{\expandafter\tabu@msg@align\the\dimexpr}
+\def\tabu@msgalign@PT{\expandafter\tabu@msg@align\romannumeral-`\0\tabu@strippt}
+\def\do #1{%
+ \def\tabu@msg@align##1.##2##3##4##5##6##7##8##9\@@{%
+ \ifnum##1<10 #1 #1\else
+ \ifnum##1<100 #1 \else
+ \ifnum##1<\@m #1\fi\fi\fi
+ ##1.##2##3##4##5##6##7##8#1}%
+ \def\tabu@header{(tabu) \ifnum\tabu@cnt<10 #1\fi\the\tabu@cnt) }%
+ \def\tabu@titles{\ifnum \tabu@nested=\z@
+ (tabu) Try#1 #1 tabu X #1 #1 #1tabu Width #1 #1 Target
+ #1 #1 #1 Coefs #1 #1 #1 Update^^J\fi}%
+ \def\tabu@spreadheader{%
+ (tabu) Try#1 #1 Spread #1 #1 tabu Width #1 #1 #1 Nat. X #1 #1 #1 #1Nat. Min.
+ #1 New Target^^J%
+ (tabu) sprd}
+ \def\tabu@message@save {\begingroup
+ \def\x ####1{\tabu@msg@align ####1{ }{ }{ }{ }{}\@@}
+ \def\z ####1{\expandafter\x\expandafter{\romannumeral-`\0\tabu@strippt
+ \dimexpr####1\p@{ }{ }}}%
+ \let\color \relax \def\tabu@rulesstyle ####1####2{\detokenize{####1}}%
+ \let\CT@arc@ \relax \let\@preamble \@gobble
+ \let\tabu@savedpream \@firstofone
+ \let\tabu@savedparams \@firstofone
+ \def\tabu@target ####1\relax {(tabu) target #1 #1 #1 #1 #1 = \x{####1}^^J}%
+ \def\tabucolX ####1\relax {(tabu) X columns width#1 = \x{####1}^^J}%
+ \def\tabu@nbcols ####1\relax {(tabu) Number of columns: \z{####1}^^J}%
+ \def\tabu@aligndefault ####1{(tabu) Default alignment: #1 #1 ####1^^J}%
+ \def\col@sep ####1\relax {(tabu) column sep #1 #1 #1 = \x{####1}^^J}%
+ \def\arrayrulewidth ####1\relax{(tabu) arrayrulewidth #1 = \x{####1}}%
+ \def\doublerulesep ####1\relax { doublerulesep = \x{####1}^^J}%
+ \def\extratabsurround####1\relax{(tabu) extratabsurround = \x{####1}^^J}%
+ \def\extrarowheight ####1\relax{(tabu) extrarowheight #1 = \x{####1}}%
+ \def\extrarowdepth ####1\relax {extrarowdepth = \x{####1}^^J}%
+ \def\abovetabulinesep####1\relax{(tabu) abovetabulinesep=\x{####1} }%
+ \def\belowtabulinesep####1\relax{ belowtabulinesep=\x{####1}^^J}%
+ \def\arraystretch ####1{(tabu) arraystretch #1 #1 = \z{####1}^^J}%
+ \def\minrowclearance####1\relax{(tabu) minrowclearance #1 = \x{####1}^^J}%
+ \def\tabu@arc@L ####1{(tabu) taburulecolor #1 #1 = ####1^^J}%
+ \def\tabu@drsc@L ####1{(tabu) tabudoublerulecolor= ####1^^J}%
+ \def\tabu@evr@L ####1{(tabu) everyrow #1 #1 #1 #1 = \detokenize{####1}^^J}%
+ \def\tabu@ls@L ####1{(tabu) line style = \detokenize{####1}^^J}%
+ \def\NC@find ####1\@nil{(tabu) tabu preamble#1 #1 = \detokenize{####1}^^J}%
+ \def\tabu@wddef####1####2{(tabu) Natural width ####1 = \x{####2}^^J}%
+ \let\edef \@gobbletwo \let\def \@empty \let\let \@gobbletwo
+ \tabu@message{%
+ (tabu) \string\savetabu{\tabu@temp}: \on@line^^J%
+ \tabu@usetabu \@nil^^J}%
+ \endgroup}
+}\do{ }
+%% Measuring the natural width (varwidth) - store the results -------
+\def\tabu@startpboxmeasure #1{\bgroup % entering \vtop
+ \edef\tabu@temp{\expandafter\@secondoftwo \ifx\tabu@hsize #1\else\relax\fi}%
+ \ifodd 1\ifx \tabu@temp\@empty 0 \else % starts with \tabu@hsize ?
+ \iftabu@spread \else % if spread -> measure
+ \ifdim \tabu@temp\p@>\z@ 0 \fi\fi\fi% if coef>0 -> do not measure
+ \let\@startpbox \tabu@startpboxORI % restore immediately (nesting)
+ \tabu@measuringtrue % for the quick option...
+ \tabu@Xcol =\expandafter\@firstoftwo\ifx\tabu@hsize #1\fi
+ \ifdim \tabu@temp\p@>\z@ \ifdim \tabu@temp\tabucolX<\tabu@target
+ \tabu@target=\tabu@temp\tabucolX \fi\fi
+ \setbox\tabu@box \hbox \bgroup
+ \begin{varwidth}\tabu@target
+ \let\FV@ListProcessLine \tabu@FV@ListProcessLine % \hbox to natural width...
+ \narrowragged \arraybackslash \parfillskip \@flushglue
+ \ifdefined\pdfadjustspacing \pdfadjustspacing\z@ \fi
+ \bgroup \aftergroup\tabu@endpboxmeasure
+ \ifdefined \cellspacetoplimit \tabu@cellspacepatch \fi
+ \else \expandafter\@gobble
+ \tabu@startpboxquick{#1}% \@gobble \bgroup
+ \fi
+}% \tabu@startpboxmeasure
+\def\tabu@cellspacepatch{\def\bcolumn##1\@nil{}\let\ecolumn\@empty
+ \bgroup\color@begingroup}
+\def\tabu@endpboxmeasure {%
+ \@finalstrut \@arstrutbox
+ \end{varwidth}\egroup % <got my \tabu@box>
+ \ifdim \tabu@temp\p@ <\z@ % neg coef
+ \ifdim \tabu@wd\tabu@Xcol <\wd\tabu@box
+ \tabu@wddef\tabu@Xcol {\the\wd\tabu@box}%
+ \tabu@debug{\tabu@message@endpboxmeasure}%
+ \fi
+ \else % spread coef>0
+ \global\advance \tabu@naturalX \wd\tabu@box
+ \@tempdima =\dimexpr \wd\tabu@box *\p@/\dimexpr \tabu@temp\p@\relax \relax
+ \ifdim \tabu@naturalXmax <\tabu@naturalX
+ \xdef\tabu@naturalXmax {\the\tabu@naturalX}\fi
+ \ifdim \tabu@naturalXmin <\@tempdima
+ \xdef\tabu@naturalXmin {\the\@tempdima}\fi
+ \fi
+ \box\tabu@box \egroup % end of \vtop (measure) restore \tabu@target
+}% \tabu@endpboxmeasure
+\def\tabu@wddef #1{\expandafter\xdef
+ \csname tabu@\the\tabu@nested.W\number#1\endcsname}
+\def\tabu@wd #1{\csname tabu@\the\tabu@nested.W\number#1\endcsname}
+\def\tabu@message@endpboxmeasure{\tabu@spaces\tabu@spaces<-> % <-> save natural wd
+ \the\tabu@Xcol. X[\tabu@temp]:
+ target = \the\tabucolX \space
+ \expandafter\expandafter\expandafter\string\tabu@wd\tabu@Xcol
+ =\tabu@wd\tabu@Xcol
+}% \tabu@message@endpboxmeasure
+\def\tabu@startpboxquick {\bgroup
+ \let\@startpbox \tabu@startpboxORI % restore immediately
+ \let\tabu \tabu@quick % \begin is expanded before...
+ \expandafter\@gobble \@startpbox % gobbles \bgroup
+}% \tabu@startpboxquick
+\def\tabu@quick {\begingroup \iffalse{\fi \ifnum0=`}\fi
+ \toks@{}\def\tabu@stack{b}\tabu@collectbody \tabu@endquick
+}% \tabu@quick
+\def\tabu@endquick {%
+ \ifodd 1\ifx\tabu@end@envir\tabu@endtabu \else
+ \ifx\tabu@end@envir\tabu@endtabus \else 0\fi\fi\relax
+ \endgroup
+ \else \let\endtabu \relax
+ \tabu@end@envir
+ \fi
+}% \tabu@quick
+\def\tabu@endtabu {\end{tabu}}
+\def\tabu@endtabus {\end{tabu*}}
+%% Measuring the heights and depths - store the results -------------
+\def\tabu@verticalmeasure{\everypar{}%
+ \ifnum \currentgrouptype>12 % 14=semi-simple, 15=math shift group
+ \setbox\tabu@box =\hbox\bgroup
+ \let\tabu@verticalspacing \tabu@verticalsp@lcr
+ \d@llarbegin % after \hbox ...
+ \else
+ \edef\tabu@temp{\ifnum\currentgrouptype=5\vtop
+ \else\ifnum\currentgrouptype=12\vcenter
+ \else\vbox\fi\fi}%
+ \setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup
+ \let\tabu@verticalspacing \tabu@verticalsp@pmb
+ \fi
+}% \tabu@verticalmeasure
+\def\tabu@verticalsp@lcr{%
+ \d@llarend \egroup % <got my \tabu@box>
+ \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep
+ \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax
+ \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi
+ \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi
+ \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi
+ \noindent\vrule height\@tempdima depth\@tempdimb
+}% \tabu@verticalsp@lcr
+\def\tabu@verticalsp@pmb{% inserts struts as needed
+ \par \expandafter\egroup
+ \expandafter$\expandafter
+ \egroup \expandafter
+ \@tempdimc \the\prevdepth
+ \@tempdima \dimexpr \ht\tabu@box+\abovetabulinesep
+ \@tempdimb \dimexpr \dp\tabu@box+\belowtabulinesep \relax
+ \ifdim\tabustrutrule>\z@ \tabu@debug{\tabu@message@verticalsp}\fi
+ \ifdim \tabu@ht<\@tempdima \tabu@htdef{\the\@tempdima}\fi
+ \ifdim \tabu@dp<\@tempdimb \tabu@dpdef{\the\@tempdimb}\fi
+ \let\@finalstrut \@gobble
+ \hrule height\@tempdima depth\@tempdimb width\hsize
+%% \box\tabu@box
+}% \tabu@verticalsp@pmb
+
+\def\tabu@verticalinit{%
+ \ifnum \c@taburow=\z@ \tabu@rearstrut \fi % after \tabu@reset !
+ \advance\c@taburow \@ne
+ \tabu@htdef{\the\ht\@arstrutbox}\tabu@dpdef{\the\dp\@arstrutbox}%
+ \advance\c@taburow \m@ne
+}% \tabu@verticalinit
+\def\tabu@htdef {\expandafter\xdef \csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname}
+\def\tabu@ht {\csname tabu@\the\tabu@nested.H\the\c@taburow\endcsname}
+\def\tabu@dpdef {\expandafter\xdef \csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname}
+\def\tabu@dp {\csname tabu@\the\tabu@nested.D\the\c@taburow\endcsname}
+\def\tabu@verticaldynamicadjustment {%
+ \advance\c@taburow \@ne
+ \extrarowheight \dimexpr\tabu@ht - \ht\strutbox
+ \extrarowdepth \dimexpr\tabu@dp - \dp\strutbox
+ \let\arraystretch \@empty
+ \advance\c@taburow \m@ne
+}% \tabu@verticaldynamicadjustment
+\def\tabuphantomline{\crcr \noalign{%
+ {\globaldefs \@ne
+ \setbox\@arstrutbox \box\voidb@x
+ \let\tabu@@celllalign \tabu@celllalign
+ \let\tabu@@cellralign \tabu@cellralign
+ \let\tabu@@cellleft \tabu@cellleft
+ \let\tabu@@cellright \tabu@cellright
+ \let\tabu@@thevline \tabu@thevline
+ \let\tabu@celllalign \@empty
+ \let\tabu@cellralign \@empty
+ \let\tabu@cellright \@empty
+ \let\tabu@cellleft \@empty
+ \let\tabu@thevline \relax}%
+ \edef\tabu@temp{\tabu@multispan \tabu@nbcols{\noindent &}}%
+ \toks@\expandafter{\tabu@temp \noindent\tabu@everyrowfalse \cr
+ \noalign{\tabu@rearstrut
+ {\globaldefs\@ne
+ \let\tabu@celllalign \tabu@@celllalign
+ \let\tabu@cellralign \tabu@@cellralign
+ \let\tabu@cellleft \tabu@@cellleft
+ \let\tabu@cellright \tabu@@cellright
+ \let\tabu@thevline \tabu@@thevline}}}%
+ \expandafter}\the\toks@
+}% \tabuphantomline
+%% \firsthline and \lasthline corrections ---------------------------
+\def\tabu@firstline {\tabu@hlineAZ \tabu@firsthlinecorrection {}}
+\def\tabu@firsthline{\tabu@hlineAZ \tabu@firsthlinecorrection \hline}
+\def\tabu@lastline {\tabu@hlineAZ \tabu@lasthlinecorrection {}}
+\def\tabu@lasthline {\tabu@hlineAZ \tabu@lasthlinecorrection \hline}
+\def\tabu@hline {% replaces \hline if no colortbl (see \AtBeginDocument)
+ \noalign{\ifnum0=`}\fi
+ {\CT@arc@\hrule height\arrayrulewidth}%
+ \futurelet \tabu@temp \tabu@xhline
+}% \tabu@hline
+\def\tabu@xhline{%
+ \ifx \tabu@temp \hline
+ {\ifx \CT@drsc@\relax \vskip
+ \else\ifx \CT@drsc@\@empty \vskip
+ \else \CT@drsc@\hrule height
+ \fi\fi
+ \doublerulesep}%
+ \fi
+ \ifnum0=`{\fi}%
+}% \tabu@xhline
+\def\tabu@hlineAZ #1#2{\noalign{\ifnum0=`}\fi \dimen@ \z@ \count@ \z@
+ \toks@{}\def\tabu@hlinecorrection{#1}\def\tabu@temp{#2}%
+ \tabu@hlineAZsurround
+}% \tabu@hlineAZ
+\newcommand*\tabu@hlineAZsurround[1][\extratabsurround]{%
+ \extratabsurround #1\let\tabucline \tabucline@scan
+ \let\hline \tabu@hlinescan \let\firsthline \hline
+ \let\cline \tabu@clinescan \let\lasthline \hline
+ \expandafter \futurelet \expandafter \tabu@temp
+ \expandafter \tabu@nexthlineAZ \tabu@temp
+}% \tabu@hlineAZsurround
+\def\tabu@hlinescan {\tabu@thick \arrayrulewidth \tabu@xhlineAZ \hline}
+\def\tabu@clinescan #1{\tabu@thick \arrayrulewidth \tabu@xhlineAZ {\cline{#1}}}
+\def\tabucline@scan{\@testopt \tabucline@sc@n {}}
+\def\tabucline@sc@n #1[#2]{\tabu@xhlineAZ {\tabucline[{#1}]{#2}}}
+\def\tabu@nexthlineAZ{%
+ \ifx \tabu@temp\hline \else
+ \ifx \tabu@temp\cline \else
+ \ifx \tabu@temp\tabucline \else
+ \tabu@hlinecorrection
+ \fi\fi\fi
+}% \tabu@nexthlineAZ
+\def\tabu@xhlineAZ #1{%
+ \toks@\expandafter{\the\toks@ #1}%
+ \@tempdimc \tabu@thick % The last line width
+ \ifcase\count@ \@tempdimb \tabu@thick % The first line width
+ \else \advance\dimen@ \dimexpr \tabu@thick+\doublerulesep \relax
+ \fi
+ \advance\count@ \@ne \futurelet \tabu@temp \tabu@nexthlineAZ
+}% \tabu@xhlineAZ
+\def\tabu@firsthlinecorrection{% \count@ = number of \hline -1
+ \@tempdima \dimexpr \ht\@arstrutbox+\dimen@
+ \edef\firsthline{% <local in \noalign>
+ \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule
+ height \the\dimexpr\@tempdima+\extratabsurround
+ depth \dp\@arstrutbox
+ width \tabustrutrule}\hss}\cr
+ \noalign{\vskip -\the\dimexpr \@tempdima+\@tempdimb
+ +\dp\@arstrutbox \relax}%
+ \the\toks@
+ }\ifnum0=`{\fi
+ \expandafter}\firsthline % we are then !
+}% \tabu@firsthlinecorrection
+\def\tabu@lasthlinecorrection{%
+ \@tempdima \dimexpr \dp\@arstrutbox+\dimen@+\@tempdimb+\@tempdimc
+ \edef\lasthline{% <local in \noalign>
+ \the\toks@
+ \noalign{\vskip -\the\dimexpr\dimen@+\@tempdimb+\dp\@arstrutbox}%
+ \omit \hbox to\z@{\hss{\noexpand\tabu@DBG{yellow}\vrule
+ depth \the\dimexpr \dp\@arstrutbox+\@tempdimb+\dimen@
+ +\extratabsurround-\@tempdimc
+ height \z@
+ width \tabustrutrule}\hss}\cr
+ }\ifnum0=`{\fi
+ \expandafter}\lasthline % we are then !
+}% \tabu@lasthlinecorrection
+\def\tabu@LT@@hline{%
+ \ifx\LT@next\hline
+ \global\let\LT@next \@gobble
+ \ifx \CT@drsc@\relax
+ \gdef\CT@LT@sep{%
+ \noalign{\penalty-\@medpenalty\vskip\doublerulesep}}%
+ \else
+ \gdef\CT@LT@sep{%
+ \multispan\LT@cols{%
+ \CT@drsc@\leaders\hrule\@height\doublerulesep\hfill}\cr}%
+ \fi
+ \else
+ \global\let\LT@next\empty
+ \gdef\CT@LT@sep{%
+ \noalign{\penalty-\@lowpenalty\vskip-\arrayrulewidth}}%
+ \fi
+ \ifnum0=`{\fi}%
+ \multispan\LT@cols
+ {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
+ \CT@LT@sep
+ \multispan\LT@cols
+ {\CT@arc@\leaders\hrule\@height\arrayrulewidth\hfill}\cr
+ \noalign{\penalty\@M}%
+ \LT@next
+}% \tabu@LT@@hline
+%% Horizontal lines : \tabucline ------------------------------------
+\let\tabu@start \@tempcnta
+\let\tabu@stop \@tempcntb
+\newcommand*\tabucline{\noalign{\ifnum0=`}\fi \tabu@cline}
+\newcommand*\tabu@cline[2][]{\tabu@startstop{#2}%
+ \ifnum \tabu@stop<\z@ \toks@{}%
+ \else \tabu@clinearg{#1}\tabu@thestyle
+ \edef\tabucline{\toks@{%
+ \ifnum \tabu@start>\z@ \omit
+ \tabu@multispan\tabu@start {\span\omit}&\fi
+ \omit \tabu@multispan\tabu@stop {\span\omit}%
+ \tabu@thehline\cr
+ }}\tabucline
+ \tabu@tracinglines{(tabu:tabucline) Style: #1^^J\the\toks@^^J^^J}%
+ \fi
+ \futurelet \tabu@temp \tabu@xcline
+}% \tabu@cline
+\def\tabu@clinearg #1{%
+ \ifx\\#1\\\let\tabu@thestyle \tabu@ls@
+ \else \@defaultunits \expandafter\let\expandafter\@tempa
+ \romannumeral-`\0#1\relax \@nnil
+ \ifx \hbox\@tempa \tabu@clinebox{#1}%
+ \else\ifx \box\@tempa \tabu@clinebox{#1}%
+ \else\ifx \vbox\@tempa \tabu@clinebox{#1}%
+ \else\ifx \vtop\@tempa \tabu@clinebox{#1}%
+ \else\ifx \copy\@tempa \tabu@clinebox{#1}%
+ \else\ifx \leaders\@tempa \tabu@clineleads{#1}%
+ \else\ifx \cleaders\@tempa \tabu@clineleads{#1}%
+ \else\ifx \xleaders\@tempa \tabu@clineleads{#1}%
+ \else\tabu@getline {#1}%
+ \fi\fi\fi\fi\fi\fi\fi\fi
+ \fi
+}% \tabu@clinearg
+\def\tabu@clinebox #1{\tabu@clineleads{\xleaders#1\hss}}
+\def\tabu@clineleads #1{%
+ \let\tabu@thestyle \relax \let\tabu@leaders \@undefined
+ \gdef\tabu@thehrule{#1}}
+\def\tabu@thehline{\begingroup
+ \ifdefined\tabu@leaders
+ \noexpand\tabu@thehleaders
+ \else \noexpand\tabu@thehrule
+ \fi \endgroup
+}% \tabu@thehline
+\def\tabu@xcline{%
+ \ifx \tabu@temp\tabucline
+ \toks@\expandafter{\the\toks@ \noalign
+ {\ifx\CT@drsc@\relax \vskip
+ \else \CT@drsc@\hrule height
+ \fi
+ \doublerulesep}}%
+ \fi
+ \tabu@docline
+}% \tabu@xcline
+\def\tabu@docline {\ifnum0=`{\fi \expandafter}\the\toks@}
+\def\tabu@docline@evr {\xdef\tabu@doclineafter{\the\toks@}%
+ \ifnum0=`{\fi}\aftergroup\tabu@doclineafter}
+\def\tabu@multispan #1#2{%
+ \ifnum\numexpr#1>\@ne #2\expandafter\tabu@multispan
+ \else \expandafter\@gobbletwo
+ \fi {#1-1}{#2}%
+}% \tabu@multispan
+\def\tabu@startstop #1{\tabu@start@stop #1\relax 1-\tabu@nbcols \@nnil}
+\def\tabu@start@stop #1-#2\@nnil{%
+ \@defaultunits \tabu@start\number 0#1\relax \@nnil
+ \@defaultunits \tabu@stop \number 0#2\relax \@nnil
+ \tabu@stop \ifnum \tabu@start>\tabu@nbcols \m@ne
+ \else\ifnum \tabu@stop=\z@ \tabu@nbcols
+ \else\ifnum \tabu@stop>\tabu@nbcols \tabu@nbcols
+ \else \tabu@stop
+ \fi\fi\fi
+ \advance\tabu@start \m@ne
+ \ifnum \tabu@start>\z@ \advance\tabu@stop -\tabu@start \fi
+}% \tabu@start@stop
+%% Numbers: siunitx S columns (and \tabudecimal) -------------------
+\def\tabu@tabudecimal #1{%
+ \def\tabu@decimal{#1}\@temptokena{}%
+ \let\tabu@getdecimal@ \tabu@getdecimal@ignorespaces
+ \tabu@scandecimal
+}% \tabu@tabudecimal
+\def\tabu@scandecimal{\futurelet \tabu@temp \tabu@getdecimal@}
+\def\tabu@skipdecimal#1{#1\tabu@scandecimal}
+\def\tabu@getdecimal@ignorespaces{%
+ \ifcase 0\ifx\tabu@temp\ignorespaces\else
+ \ifx\tabu@temp\@sptoken1\else
+ 2\fi\fi\relax
+ \let\tabu@getdecimal@ \tabu@getdecimal
+ \expandafter\tabu@skipdecimal
+ \or \expandafter\tabu@gobblespace\expandafter\tabu@scandecimal
+ \else \expandafter\tabu@skipdecimal
+ \fi
+}% \tabu@getdecimal@ignorespaces
+\def\tabu@get@decimal#1{\@temptokena\expandafter{\the\@temptokena #1}%
+ \tabu@scandecimal}
+\def\do#1{%
+ \def\tabu@get@decimalspace#1{%
+ \@temptokena\expandafter{\the\@temptokena #1}\tabu@scandecimal}%
+}\do{ }
+\let\tabu@@tabudecimal \tabu@tabudecimal
+\def\tabu@getdecimal{%
+ \ifcase 0\ifx 0\tabu@temp\else
+ \ifx 1\tabu@temp\else
+ \ifx 2\tabu@temp\else
+ \ifx 3\tabu@temp\else
+ \ifx 4\tabu@temp\else
+ \ifx 5\tabu@temp\else
+ \ifx 6\tabu@temp\else
+ \ifx 7\tabu@temp\else
+ \ifx 8\tabu@temp\else
+ \ifx 9\tabu@temp\else
+ \ifx .\tabu@temp\else
+ \ifx ,\tabu@temp\else
+ \ifx -\tabu@temp\else
+ \ifx +\tabu@temp\else
+ \ifx e\tabu@temp\else
+ \ifx E\tabu@temp\else
+ \ifx\tabu@cellleft\tabu@temp1\else
+ \ifx\ignorespaces\tabu@temp1\else
+ \ifx\@sptoken\tabu@temp2\else
+ 3\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\relax
+ \expandafter\tabu@get@decimal
+ \or \expandafter\tabu@skipdecimal
+ \or \expandafter\tabu@get@decimalspace
+ \else\expandafter\tabu@printdecimal
+ \fi
+}% \tabu@getdecimal
+\def\tabu@printdecimal{%
+ \edef\tabu@temp{\the\@temptokena}%
+ \ifx\tabu@temp\@empty\else
+ \ifx\tabu@temp\space\else
+ \expandafter\tabu@decimal\expandafter{\the\@temptokena}%
+ \fi\fi
+}% \tabu@printdecimal
+%% Verbatim inside X columns ----------------------------------------
+\def\tabu@verbatim{%
+ \let\verb \tabu@verb
+ \let\FV@DefineCheckEnd \tabu@FV@DefineCheckEnd
+}% \tabu@verbatim
+\let\tabu@ltx@verb \verb
+\def\tabu@verb{\@ifstar {\tabu@ltx@verb*} \tabu@ltx@verb}
+\def\tabu@fancyvrb {%
+ \def\tabu@FV@DefineCheckEnd ##1{%
+ \def\tabu@FV@DefineCheckEnd{%
+ ##1% <original definition (if fancyvrb is loaded)>
+ \let\FV@CheckEnd \tabu@FV@CheckEnd
+ \let\FV@@CheckEnd \tabu@FV@@CheckEnd
+ \let\FV@@@CheckEnd \tabu@FV@@@CheckEnd
+ \edef\FV@EndScanning{%
+ \def\noexpand\next{\noexpand\end{\FV@EnvironName}}%
+ \global\let\noexpand\FV@EnvironName\relax
+ \noexpand\next}%
+ \xdef\FV@EnvironName{\detokenize\expandafter{\FV@EnvironName}}}%
+ }\expandafter\tabu@FV@DefineCheckEnd\expandafter{\FV@DefineCheckEnd}
+}% \tabu@fancyvrb
+\def\tabu@FV@CheckEnd #1{\expandafter\FV@@CheckEnd \detokenize{#1\end{}}\@nil}
+\edef\tabu@FV@@@CheckEnd {\detokenize{\end{}}}
+\begingroup
+\catcode`\[1 \catcode`\]2
+\@makeother\{ \@makeother\}
+ \edef\x[\endgroup
+ \def\noexpand\tabu@FV@@CheckEnd ##1\detokenize[\end{]##2\detokenize[}]##3%
+ ]\x \@nil{\def\@tempa{#2}\def\@tempb{#3}}
+\def\tabu@FV@ListProcessLine #1{%
+ \hbox {%to \hsize{%
+ \kern\leftmargin
+ \hbox {%to \linewidth{%
+ \FV@LeftListNumber
+ \FV@LeftListFrame
+ \FancyVerbFormatLine{#1}\hss
+%% DG/SR modification begin - Jan. 28, 1998 (for numbers=right add-on)
+%% \FV@RightListFrame}%
+ \FV@RightListFrame
+ \FV@RightListNumber}%
+%% DG/SR modification end
+ \hss}}
+%% \savetabu --------------------------------------------------------
+\newcommand*\savetabu[1]{\noalign{%
+ \tabu@sanitizearg{#1}\tabu@temp
+ \ifx \tabu@temp\@empty \tabu@savewarn{}{The tabu will not be saved}\else
+ \@ifundefined{tabu@saved@\tabu@temp}{}{\tabu@savewarn{#1}{Overwriting}}%
+ \ifdefined\tabu@restored \expandafter\let
+ \csname tabu@saved@\tabu@temp \endcsname \tabu@restored
+ \else {\tabu@save}%
+ \fi
+ \fi}%
+}% \savetabu
+\def\tabu@save {%
+ \toks0\expandafter{\tabu@saved@}%
+ \iftabu@negcoef
+ \let\tabu@wddef \relax \let\tabu@ \tabu@savewd \edef\tabu@savewd{\tabu@Xcoefs}%
+ \toks0\expandafter{\the\toks\expandafter0\tabu@savewd}\fi
+ \toks1\expandafter{\tabu@savedpream}%
+ \toks2\expandafter{\tabu@savedpreamble}%
+ \let\@preamble \relax
+ \let\tabu@savedpream \relax \let\tabu@savedparams \relax
+ \edef\tabu@preamble{%
+ \def\noexpand\tabu@aligndefault{\tabu@align}%
+ \def\tabu@savedparams {\noexpand\the\toks0}%
+ \def\tabu@savedpream {\noexpand\the\toks1}}%
+ \edef\tabu@usetabu{%
+ \def\@preamble {\noexpand\the\toks2}%
+ \tabu@target \the\tabu@target \relax
+ \tabucolX \the\tabucolX \relax
+ \tabu@nbcols \the\tabu@nbcols \relax
+ \def\noexpand\tabu@aligndefault{\tabu@align}%
+ \def\tabu@savedparams {\noexpand\the\toks0}%
+ \def\tabu@savedpream {\noexpand\the\toks1}}%
+ \let\tabu@aligndefault \relax \let\@sharp \relax
+ \edef\@tempa{\noexpand\tabu@s@ved
+ {\tabu@usetabu}
+ {\tabu@preamble}
+ {\the\toks1}}\@tempa
+ \tabu@message@save
+}% \tabu@save
+\long\def\tabu@s@ved #1#2#3{%
+ \def\tabu@usetabu{#1}% <for \tabu@message@save>
+ \expandafter\gdef\csname tabu@saved@\tabu@temp\endcsname ##1{%
+ \ifodd ##1% \usetabu
+ \tabu@measuringfalse \tabu@spreadfalse % Just in case...
+ \gdef\tabu@usetabu {%
+ \ifdim \tabu@target>\z@ \tabu@warn@usetabu \fi
+ \global\let\tabu@usetabu \@undefined
+ \def\@halignto {to\tabu@target}%
+ #1%
+ \ifx \tabu@align\tabu@aligndefault@text
+ \ifnum \tabu@nested=\z@
+ \let\tabu@align \tabu@aligndefault \fi\fi}%
+ \else % \preamble
+ \gdef\tabu@preamble {%
+ \global\let\tabu@preamble \@undefined
+ #2%
+ \ifx \tabu@align\tabu@aligndefault@text
+ \ifnum \tabu@nested=\z@
+ \let\tabu@align \tabu@aligndefault \fi\fi}%
+ \fi
+ #3}%
+}% \tabu@s@ved
+\def\tabu@aligndefault@text {\tabu@aligndefault}%
+\def\tabu@warn@usetabu {\PackageWarning{tabu}
+ {Specifying a target with \string\usetabu\space is useless
+ \MessageBreak The target cannot be changed!}}
+\def\tabu@savewd #1#2{\ifdim #2\p@<\z@ \tabu@wddef{#1}{\tabu@wd{#1}}\fi}
+\def\tabu@savewarn#1#2{\PackageInfo{tabu}
+ {User-name `#1' already used for \string\savetabu
+ \MessageBreak #2}}%
+\def\tabu@saveerr#1{\PackageError{tabu}
+ {User-name `#1' is unknown for \string\usetabu
+ \MessageBreak I cannot restore an unknown preamble!}\@ehd}
+%% \rowfont ---------------------------------------------------------
+\newskip \tabu@cellskip
+\def\tabu@rowfont{\ifdim \baselineskip=\z@\noalign\fi
+ {\ifnum0=`}\fi \tabu@row@font}
+\newcommand*\tabu@row@font[2][]{%
+ \ifnum7=\currentgrouptype
+ \global\let\tabu@@cellleft \tabu@cellleft
+ \global\let\tabu@@cellright \tabu@cellright
+ \global\let\tabu@@celllalign \tabu@celllalign
+ \global\let\tabu@@cellralign \tabu@cellralign
+ \global\let\tabu@@rowfontreset\tabu@rowfontreset
+ \fi
+ \global\let\tabu@rowfontreset \tabu@rowfont@reset
+ \expandafter\gdef\expandafter\tabu@cellleft\expandafter{\tabu@cellleft #2}%
+ \ifcsname tabu@cell@#1\endcsname % row alignment
+ \csname tabu@cell@#1\endcsname \fi
+ \ifnum0=`{\fi}% end of group / noalign group
+}% \rowfont
+\def\tabu@ifcolorleavevmode #1{\let\color \tabu@leavevmodecolor #1\let\color\tabu@color}%
+\def\tabu@rowfont@reset{%
+ \global\let\tabu@rowfontreset \tabu@@rowfontreset
+ \global\let\tabu@cellleft \tabu@@cellleft
+ \global\let\tabu@cellright \tabu@@cellright
+ \global\let\tabu@cellfont \@empty
+ \global\let\tabu@celllalign \tabu@@celllalign
+ \global\let\tabu@cellralign \tabu@@cellralign
+}% \tabu@@rowfontreset
+\let\tabu@rowfontreset \@empty % overwritten \AtBeginDocument if colortbl
+%% \tabu@prepnext@tok -----------------------------------------------
+\newif \iftabu@cellright
+\def\tabu@prepnext@tok{%
+ \ifnum \count@<\z@ % <first initialisation>
+ \@tempcnta \@M % <not initialized by array.sty>
+ \tabu@nbcols\z@
+ \let\tabu@fornoopORI \@fornoop
+ \tabu@cellrightfalse
+ \else
+ \ifcase \numexpr \count@-\@tempcnta \relax % (case 0): prev. token is left
+ \advance \tabu@nbcols \@ne
+ \iftabu@cellright % before-previous token is right and is finished
+ \tabu@cellrightfalse % <only once>
+ \tabu@righttok
+ \fi
+ \tabu@lefttok
+ \or % (case 1) previous token is right
+ \tabu@cellrighttrue \let\@fornoop \tabu@lastnoop
+ \else % special column: do not change the token
+ \iftabu@cellright % before-previous token is right
+ \tabu@cellrightfalse
+ \tabu@righttok
+ \fi
+ \fi % \ifcase
+ \fi
+ \tabu@prepnext@tokORI
+}% \tabu@prepnext@tok
+\long\def\tabu@lastnoop#1\@@#2#3{\tabu@lastn@@p #2\@nextchar \in@\in@@}
+\def\tabu@lastn@@p #1\@nextchar #2#3\in@@{%
+ \ifx \in@#2\else
+ \let\@fornoop \tabu@fornoopORI
+ \xdef\tabu@mkpreambuffer{\tabu@nbcols\the\tabu@nbcols \tabu@mkpreambuffer}%
+ \toks0\expandafter{\expandafter\tabu@everyrowtrue \the\toks0}%
+ \expandafter\prepnext@tok
+ \fi
+}% \tabu@lastnoop
+\def\tabu@righttok{%
+ \advance \count@ \m@ne
+ \toks\count@\expandafter {\the\toks\count@ \tabu@cellright \tabu@cellralign}%
+ \advance \count@ \@ne
+}% \tabu@righttok
+\def\tabu@lefttok{\toks\count@\expandafter{\expandafter\tabu@celllalign
+ \the\toks\count@ \tabu@cellleft}% after because of $
+}% \tabu@lefttok
+%% Neutralisation of glues ------------------------------------------
+\let\tabu@cellleft \@empty
+\let\tabu@cellright \@empty
+\tabu@celllalign@def{\tabu@cellleft}%
+\let\tabu@cellralign \@empty
+\def\tabu@cell@align #1#2#3{%
+ \let\tabu@maybesiunitx \toks@ \tabu@celllalign
+ \global \expandafter \tabu@celllalign@def \expandafter {\the\toks@ #1}%
+ \toks@\expandafter{\tabu@cellralign #2}%
+ \xdef\tabu@cellralign{\the\toks@}%
+ \toks@\expandafter{\tabu@cellleft #3}%
+ \xdef\tabu@cellleft{\the\toks@}%
+}% \tabu@cell@align
+\def\tabu@cell@l{% force alignment to left
+ \tabu@cell@align
+ {\tabu@removehfil \raggedright \tabu@cellleft}% left
+ {\tabu@flush1\tabu@ignorehfil}% right
+ \raggedright
+}% \tabu@cell@l
+\def\tabu@cell@c{% force alignment to center
+ \tabu@cell@align
+ {\tabu@removehfil \centering \tabu@flush{.5}\tabu@cellleft}
+ {\tabu@flush{.5}\tabu@ignorehfil}
+ \centering
+}% \tabu@cell@c
+\def\tabu@cell@r{% force alignment to right
+ \tabu@cell@align
+ {\tabu@removehfil \raggedleft \tabu@flush1\tabu@cellleft}
+ \tabu@ignorehfil
+ \raggedleft
+}% \tabu@cell@r
+\def\tabu@cell@j{% force justification (for p, m, b columns)
+ \tabu@cell@align
+ {\tabu@justify\tabu@cellleft}
+ {}
+ \tabu@justify
+}% \tabu@cell@j
+\def\tabu@justify{%
+ \leftskip\z@skip \@rightskip\leftskip \rightskip\@rightskip
+ \parfillskip\@flushglue
+}% \tabu@justify
+%% ragged2e settings
+\def\tabu@cell@L{% force alignment to left (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \RaggedRight \tabu@cellleft}
+ {\tabu@flush 1\tabu@ignorehfil}
+ \RaggedRight
+}% \tabu@cell@L
+\def\tabu@cell@C{% force alignment to center (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \Centering \tabu@flush{.5}\tabu@cellleft}
+ {\tabu@flush{.5}\tabu@ignorehfil}
+ \Centering
+}% \tabu@cell@C
+\def\tabu@cell@R{% force alignment to right (ragged2e)
+ \tabu@cell@align
+ {\tabu@removehfil \RaggedLeft \tabu@flush 1\tabu@cellleft}
+ \tabu@ignorehfil
+ \RaggedLeft
+}% \tabu@cell@R
+\def\tabu@cell@J{% force justification (ragged2e)
+ \tabu@cell@align
+ {\justifying \tabu@cellleft}
+ {}
+ \justifying
+}% \tabu@cell@J
+\def\tabu@flush#1{%
+ \iftabu@colortbl % colortbl uses \hfill rather than \hfil
+ \hskip \ifnum13<\currentgrouptype \stretch{#1}%
+ \else \ifdim#1pt<\p@ \tabu@cellskip
+ \else \stretch{#1}
+ \fi\fi \relax
+ \else % array.sty
+ \ifnum 13<\currentgrouptype
+ \hfil \hskip1sp \relax \fi
+ \fi
+}% \tabu@flush
+\let\tabu@hfil \hfil
+\let\tabu@hfill \hfill
+\let\tabu@hskip \hskip
+\def\tabu@removehfil{%
+ \iftabu@colortbl
+ \unkern \tabu@cellskip =\lastskip
+ \ifnum\gluestretchorder\tabu@cellskip =\tw@ \hskip-\tabu@cellskip
+ \else \tabu@cellskip \z@skip
+ \fi
+ \else
+ \ifdim\lastskip=1sp\unskip\fi
+ \ifnum\gluestretchorder\lastskip =\@ne
+ \hfilneg % \hfilneg for array.sty but not for colortbl...
+ \fi
+ \fi
+}% \tabu@removehfil
+\def\tabu@ignorehfil{\aftergroup \tabu@nohfil}
+\def\tabu@nohfil{% \hfil -> do nothing + restore original \hfil
+ \def\hfil{\let\hfil \tabu@hfil}% local to (alignment template) group
+}% \tabu@nohfil
+\def\tabu@colortblalignments {% if colortbl
+ \def\tabu@nohfil{%
+ \def\hfil {\let\hfil \tabu@hfil}% local to (alignment template) group
+ \def\hfill {\let\hfill \tabu@hfill}% (colortbl uses \hfill) pfff...
+ \def\hskip ####1\relax{\let\hskip \tabu@hskip}}% local
+}% \tabu@colortblalignments
+%% Taking care of footnotes and hyperfootnotes ----------------------
+\long\def\tabu@footnotetext #1{%
+ \edef\@tempa{\the\tabu@footnotes
+ \noexpand\footnotetext [\the\csname c@\@mpfn\endcsname]}%
+ \global\tabu@footnotes\expandafter{\@tempa {#1}}}%
+\long\def\tabu@xfootnotetext [#1]#2{%
+ \global\tabu@footnotes\expandafter{\the\tabu@footnotes
+ \footnotetext [{#1}]{#2}}}
+\let\tabu@xfootnote \@xfootnote
+\long\def\tabu@Hy@ftntext{\tabu@Hy@ftntxt {\the \c@footnote }}
+\long\def\tabu@Hy@xfootnote [#1]{%
+ \begingroup
+ \value\@mpfn #1\relax
+ \protected@xdef \@thefnmark {\thempfn}%
+ \endgroup
+ \@footnotemark \tabu@Hy@ftntxt {#1}%
+}% \tabu@Hy@xfootnote
+\long\def\tabu@Hy@ftntxt #1#2{%
+ \edef\@tempa{%
+ \the\tabu@footnotes
+ \begingroup
+ \value\@mpfn #1\relax
+ \noexpand\protected@xdef\noexpand\@thefnmark {\noexpand\thempfn}%
+ \expandafter \noexpand \expandafter
+ \tabu@Hy@footnotetext \expandafter{\Hy@footnote@currentHref}%
+ }%
+ \global\tabu@footnotes\expandafter{\@tempa {#2}%
+ \endgroup}%
+}% \tabu@Hy@ftntxt
+\long\def\tabu@Hy@footnotetext #1#2{%
+ \H@@footnotetext{%
+ \ifHy@nesting
+ \hyper@@anchor {#1}{#2}%
+ \else
+ \Hy@raisedlink{%
+ \hyper@@anchor {#1}{\relax}%
+ }%
+ \def\@currentHref {#1}%
+ \let\@currentlabelname \@empty
+ #2%
+ \fi
+ }%
+}% \tabu@Hy@footnotetext
+%% No need for \arraybackslash ! ------------------------------------
+\def\tabu@latextwoe {%
+\def\tabu@temp##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}}
+\tabu@temp \tabu@centering \centering \arraybackslash
+\tabu@temp \tabu@raggedleft \raggedleft \arraybackslash
+\tabu@temp \tabu@raggedright \raggedright \arraybackslash
+}% \tabu@latextwoe
+\def\tabu@raggedtwoe {%
+\def\tabu@temp ##1##2##3{{\toks@\expandafter{##2##3}\xdef##1{\the\toks@}}}
+\tabu@temp \tabu@Centering \Centering \arraybackslash
+\tabu@temp \tabu@RaggedLeft \RaggedLeft \arraybackslash
+\tabu@temp \tabu@RaggedRight \RaggedRight \arraybackslash
+\tabu@temp \tabu@justifying \justifying \arraybackslash
+}% \tabu@raggedtwoe
+\def\tabu@normalcrbackslash{\let\\\@normalcr}
+\def\tabu@trivlist{\expandafter\def\expandafter\@trivlist\expandafter{%
+ \expandafter\tabu@normalcrbackslash \@trivlist}}
+%% Utilities: \fbox \fcolorbox and \tabudecimal -------------------
+\def\tabu@fbox {\leavevmode\afterassignment\tabu@beginfbox \setbox\@tempboxa\hbox}
+\def\tabu@beginfbox {\bgroup \kern\fboxsep
+ \bgroup\aftergroup\tabu@endfbox}
+\def\tabu@endfbox {\kern\fboxsep\egroup\egroup
+ \@frameb@x\relax}
+\def\tabu@color@b@x #1#2{\leavevmode \bgroup
+ \def\tabu@docolor@b@x{#1{#2\color@block{\wd\z@}{\ht\z@}{\dp\z@}\box\z@}}%
+ \afterassignment\tabu@begincolor@b@x \setbox\z@ \hbox
+}% \tabu@color@b@x
+\def\tabu@begincolor@b@x {\kern\fboxsep \bgroup
+ \aftergroup\tabu@endcolor@b@x \set@color}
+\def\tabu@endcolor@b@x {\kern\fboxsep \egroup
+ \dimen@\ht\z@ \advance\dimen@ \fboxsep \ht\z@ \dimen@
+ \dimen@\dp\z@ \advance\dimen@ \fboxsep \dp\z@ \dimen@
+ \tabu@docolor@b@x \egroup
+}% \tabu@endcolor@b@x
+%% Corrections (arydshln, delarray, colortbl) -----------------------
+\def\tabu@fix@arrayright {%% \@arrayright is missing from \endarray
+ \iftabu@colortbl
+ \ifdefined\adl@array % <colortbl + arydshln>
+ \def\tabu@endarray{%
+ \adl@endarray \egroup \adl@arrayrestore \CT@end \egroup %<original>
+ \@arrayright % <FC>
+ \gdef\@preamble{}}% <FC>
+ \else % <colortbl / no arydshln>
+ \def\tabu@endarray{%
+ \crcr \egroup \egroup %<original>
+ \@arrayright % <FC>
+ \gdef\@preamble{}\CT@end}%
+ \fi
+ \else
+ \ifdefined\adl@array % <arydshln / no colortbl>
+ \def\tabu@endarray{%
+ \adl@endarray \egroup \adl@arrayrestore \egroup %<original>
+ \@arrayright % <FC>
+ \gdef\@preamble{}}% <FC>
+ \else % <no arydshln / no colotbl + \@arrayright missing>
+ \PackageWarning{tabu}
+ {\string\@arrayright\space is missing from the
+ \MessageBreak definition of \string\endarray.
+ \MessageBreak Compatibility with delarray.sty is broken.}%
+ \fi\fi
+}% \tabu@fix@arrayright
+\def\tabu@adl@xarraydashrule #1#2#3{%
+ \ifnum\@lastchclass=\adl@class@start\else
+ \ifnum\@lastchclass=\@ne\else
+ \ifnum\@lastchclass=5 \else % <FC> @-arg (class 5) and !-arg (class 1)
+ \adl@leftrulefalse \fi\fi % must be treated the same
+ \fi
+ \ifadl@zwvrule\else \ifadl@inactive\else
+ \@addtopreamble{\vrule\@width\arrayrulewidth
+ \@height\z@ \@depth\z@}\fi \fi
+ \ifadl@leftrule
+ \@addtopreamble{\adl@vlineL{\CT@arc@}{\adl@dashgapcolor}%
+ {\number#1}#3}%
+ \else \@addtopreamble{\adl@vlineR{\CT@arc@}{\adl@dashgapcolor}%
+ {\number#2}#3}
+ \fi
+}% \tabu@adl@xarraydashrule
+\def\tabu@adl@act@endpbox {%
+ \unskip \ifhmode \nobreak \fi \@finalstrut \@arstrutbox
+ \egroup \egroup
+ \adl@colhtdp \box\adl@box \hfil
+}% \tabu@adl@act@endpbox
+\def\tabu@adl@fix {%
+ \let\adl@xarraydashrule \tabu@adl@xarraydashrule % <fix> arydshln
+ \let\adl@act@endpbox \tabu@adl@act@endpbox % <fix> arydshln
+ \let\adl@act@@endpbox \tabu@adl@act@endpbox % <fix> arydshln
+ \let\@preamerror \@preamerr % <fix> arydshln
+}% \tabu@adl@fix
+%% Correction for longtable' \@startbox definition ------------------
+%% => \everypar is ``missing'' : TeX should be in vertical mode
+\def\tabu@LT@startpbox #1{%
+ \bgroup
+ \let\@footnotetext\LT@p@ftntext
+ \setlength\hsize{#1}%
+ \@arrayparboxrestore
+ \everypar{%
+ \vrule \@height \ht\@arstrutbox \@width \z@
+ \everypar{}}%
+}% \tabu@LT@startpbox
+%% \tracingtabu and the package options ------------------
+\DeclareOption{delarray}{\AtEndOfPackage{\RequirePackage{delarray}}}
+\DeclareOption{linegoal}{%
+ \AtEndOfPackage{%
+ \RequirePackage{linegoal}[2010/12/07]%
+ \let\tabudefaulttarget \linegoal% \linegoal is \linewidth if not pdfTeX
+}}
+\DeclareOption{scantokens}{\tabuscantokenstrue}
+\DeclareOption{debugshow}{\AtEndOfPackage{\tracingtabu=\tw@}}
+\def\tracingtabu {\begingroup\@ifnextchar=%
+ {\afterassignment\tabu@tracing\count@}
+ {\afterassignment\tabu@tracing\count@1\relax}}
+\def\tabu@tracing{\expandafter\endgroup
+ \expandafter\tabu@tr@cing \the\count@ \relax
+}% \tabu@tracing
+\def\tabu@tr@cing #1\relax {%
+ \ifnum#1>\thr@@ \let\tabu@tracinglines\message
+ \else \let\tabu@tracinglines\@gobble
+ \fi
+ \ifnum#1>\tw@ \let\tabu@DBG \tabu@@DBG
+ \def\tabu@mkarstrut {\tabu@DBG@arstrut}%
+ \tabustrutrule 1.5\p@
+ \else \let\tabu@DBG \@gobble
+ \def\tabu@mkarstrut {\tabu@arstrut}%
+ \tabustrutrule \z@
+ \fi
+ \ifnum#1>\@ne \let\tabu@debug \message
+ \else \let\tabu@debug \@gobble
+ \fi
+ \ifnum#1>\z@
+ \let\tabu@message \message
+ \let\tabu@tracing@save \tabu@message@save
+ \let\tabu@starttimer \tabu@pdftimer
+ \else
+ \let\tabu@message \@gobble
+ \let\tabu@tracing@save \@gobble
+ \let\tabu@starttimer \relax
+ \fi
+}% \tabu@tr@cing
+%% Setup \AtBeginDocument
+\AtBeginDocument{\tabu@AtBeginDocument}
+\def\tabu@AtBeginDocument{\let\tabu@AtBeginDocument \@undefined
+ \ifdefined\arrayrulecolor \tabu@colortbltrue % <colortbl>
+ \tabu@colortblalignments % different glues are used
+ \else \tabu@colortblfalse \fi
+ \ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi
+ \ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi
+ \let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@
+ \ifodd 1\ifcsname siunitx_table_collect_begin:Nn\endcsname % <siunitx: ok>
+ \expandafter\ifx
+ \csname siunitx_table_collect_begin:Nn\endcsname\relax 0\fi\fi\relax
+ \tabu@siunitxtrue
+ \else \let\tabu@maybesiunitx \@firstofone % <not siunitx: setup>
+ \let\tabu@siunitx \tabu@nosiunitx
+ \tabu@siunitxfalse
+ \fi
+ \ifdefined\adl@array % <arydshln>
+ \else \let\tabu@adl@fix \relax
+ \let\tabu@adl@endtrial \@empty \fi
+ \ifdefined\longtable % <longtable>
+ \else \let\longtabu \tabu@nolongtabu \fi
+ \ifdefined\cellspacetoplimit \tabu@warn@cellspace\fi
+ \csname\ifcsname ifHy@hyperfootnotes\endcsname % <hyperfootnotes>
+ ifHy@hyperfootnotes\else iffalse\fi\endcsname
+ \let\tabu@footnotetext \tabu@Hy@ftntext
+ \let\tabu@xfootnote \tabu@Hy@xfootnote \fi
+ \ifdefined\FV@DefineCheckEnd% <fancyvrb>
+ \tabu@fancyvrb \fi
+ \ifdefined\color % <color / xcolor>
+ \let\tabu@color \color
+ \def\tabu@leavevmodecolor ##1{%
+ \def\tabu@leavevmodecolor {\leavevmode ##1}%
+ }\expandafter\tabu@leavevmodecolor\expandafter{\color}%
+ \else
+ \let\tabu@color \tabu@nocolor
+ \let\tabu@leavevmodecolor \@firstofone \fi
+ \tabu@latextwoe
+ \ifdefined\@raggedtwoe@everyselectfont % <ragged2e>
+ \tabu@raggedtwoe
+ \else
+ \let\tabu@cell@L \tabu@cell@l
+ \let\tabu@cell@R \tabu@cell@r
+ \let\tabu@cell@C \tabu@cell@c
+ \let\tabu@cell@J \tabu@cell@j \fi
+ \expandafter\in@ \expandafter\@arrayright \expandafter{\endarray}%
+ \ifin@ \let\tabu@endarray \endarray
+ \else \tabu@fix@arrayright \fi% <fix for colortbl & arydshln (delarray)>
+ \everyrow{}%
+}% \tabu@AtBeginDocument
+\def\tabu@warn@cellspace{%
+ \PackageWarning{tabu}{%
+ Package cellspace has some limitations
+ \MessageBreak And redefines some macros of array.sty.
+ \MessageBreak Please use \string\tabulinesep\space to control
+ \MessageBreak vertical spacing of lines inside tabu environment}%
+}% \tabu@warn@cellspace
+%% tabu Package initialisation
+\tabuscantokensfalse
+\let\tabu@arc@G \relax
+\let\tabu@drsc@G \relax
+\let\tabu@evr@G \@empty
+\let\tabu@rc@G \@empty
+\def\tabu@ls@G {\tabu@linestyle@}%
+\let\tabu@@rowfontreset \@empty % <init>
+\let\tabu@@celllalign \@empty
+\let\tabu@@cellralign \@empty
+\let\tabu@@cellleft \@empty
+\let\tabu@@cellright \@empty
+\def\tabu@naturalXmin {\z@}
+\def\tabu@naturalXmax {\z@}
+\let\tabu@rowfontreset \@empty
+\def\tabulineon {4pt}\let\tabulineoff \tabulineon
+\tabu@everyrowtrue
+\ifdefined\pdfelapsedtime % <pdfTeX>
+ \def\tabu@pdftimer {\xdef\tabu@starttime{\the\pdfelapsedtime}}%
+\else \let\tabu@pdftimer \relax \let\tabu@message@etime \relax
+\fi
+\tracingtabu=\z@
+\newtabulinestyle {=\maxdimen}% creates the 'factory' settings \tabu@linestyle@
+\tabulinestyle{}
+\taburowcolors{}
+\let\tabudefaulttarget \linewidth
+\ProcessOptions* % \ProcessOptions* is quicker !
+\endinput
+%%
+%% End of file `tabu.sty'.
diff --git a/docs/doxygen/latex/tstfuncs_8cpp.tex b/docs/doxygen/latex/tstfuncs_8cpp.tex
new file mode 100644
index 0000000..5156893
--- /dev/null
+++ b/docs/doxygen/latex/tstfuncs_8cpp.tex
@@ -0,0 +1,126 @@
+\hypertarget{tstfuncs_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/tstfuncs.cpp File Reference}
+\label{tstfuncs_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/tstfuncs.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/tstfuncs.cpp}}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+xb\+Double \mbox{\hyperlink{tstfuncs_8cpp_af990eed1e43605771a5810196b4043f7}{Chron\+Time}} ()
+\item
+void \mbox{\hyperlink{tstfuncs_8cpp_ab1f17da15e67a8b2460d5a88b7a3db6e}{Init\+Time}} ()
+\item
+xb\+Bool \mbox{\hyperlink{tstfuncs_8cpp_a8b8e417213c57f2ea0bcb61a7fb28860}{dbl\+Equals}} (xb\+Double a, xb\+Double b, xb\+Double epsilon)
+\item
+xb\+Int16 \mbox{\hyperlink{tstfuncs_8cpp_a265547b80a3aef5836952bede5288e2c}{Test\+Method}} (xb\+Int16 Print\+Option, const char $\ast$title, const xb\+String \&result, const char $\ast$expected\+Result, size\+\_\+t expected\+Len)
+\item
+xb\+Int16 \mbox{\hyperlink{tstfuncs_8cpp_a9c27703ef863c9d29680844fc5124953}{Test\+Method}} (xb\+Int16 Print\+Option, const char $\ast$title, char result, char expected\+Result)
+\item
+xb\+Int16 \mbox{\hyperlink{tstfuncs_8cpp_ae6536e920580382389126d5f66655f90}{Test\+Method}} (xb\+Int16 Print\+Option, const char $\ast$title, xb\+Int32 result, xb\+Int32 expected\+Result)
+\item
+xb\+Int16 \mbox{\hyperlink{tstfuncs_8cpp_a000fca67bc0fffea3d3da7a5317a06e4}{Test\+Method}} (xb\+Int16 Print\+Option, const char $\ast$title, xb\+UInt64 result, xb\+UInt64 expected\+Result)
+\item
+xb\+Int16 \mbox{\hyperlink{tstfuncs_8cpp_a663f3dd7bd8574a35c1b1b9a22081c6d}{Test\+Method}} (xb\+Int16 Print\+Option, const char $\ast$title, xb\+Float result, xb\+Float expected\+Result)
+\item
+xb\+Int16 \mbox{\hyperlink{tstfuncs_8cpp_af1c78fb72bcd39eb86f11aa2887fe62c}{Test\+Method}} (xb\+Int16 Print\+Option, const char $\ast$title, xb\+Double result, xb\+Double expected\+Result)
+\item
+xb\+Int16 \mbox{\hyperlink{tstfuncs_8cpp_ac64a0bed74ba10b638456709f128f893}{Test\+Method}} (xb\+Int16 Print\+Option, const char $\ast$title, xb\+Double result, xb\+Double expected\+Result, xb\+Double d\+Epsilon)
+\item
+xb\+Int16 \mbox{\hyperlink{tstfuncs_8cpp_aa5dbb64c6135ac01f79e5b6087270cf5}{File\+Compare}} (xb\+XBase \&x, xb\+Int16 i\+Po, const xb\+String \&s\+File1, const xb\+String \&s\+File2, const xb\+String \&s\+Skip\+Bytes)
+\item
+xb\+Double \mbox{\hyperlink{tstfuncs_8cpp_a69a6e718e066af7f8392e5f1fea40d1b}{dbl\+Max}} (xb\+Double a, xb\+Double b)
+\item
+xb\+Double \mbox{\hyperlink{tstfuncs_8cpp_a4d7b8f3f1ce52c6c0a281f25419f4c93}{dbl\+Min}} (xb\+Double a, xb\+Double b)
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+time\+\_\+t \mbox{\hyperlink{tstfuncs_8cpp_ae2281da6157495d69406c35f69a61f9f}{timer}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{tstfuncs_8cpp_af990eed1e43605771a5810196b4043f7}\label{tstfuncs_8cpp_af990eed1e43605771a5810196b4043f7}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!ChronTime@{ChronTime}}
+\index{ChronTime@{ChronTime}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{ChronTime()}{ChronTime()}}
+{\footnotesize\ttfamily xb\+Double Chron\+Time (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_a8b8e417213c57f2ea0bcb61a7fb28860}\label{tstfuncs_8cpp_a8b8e417213c57f2ea0bcb61a7fb28860}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!dblEquals@{dblEquals}}
+\index{dblEquals@{dblEquals}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{dblEquals()}{dblEquals()}}
+{\footnotesize\ttfamily xb\+Bool dbl\+Equals (\begin{DoxyParamCaption}\item[{xb\+Double}]{a, }\item[{xb\+Double}]{b, }\item[{xb\+Double}]{epsilon = {\ttfamily 0.0001} }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_a69a6e718e066af7f8392e5f1fea40d1b}\label{tstfuncs_8cpp_a69a6e718e066af7f8392e5f1fea40d1b}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!dblMax@{dblMax}}
+\index{dblMax@{dblMax}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{dblMax()}{dblMax()}}
+{\footnotesize\ttfamily xb\+Double dbl\+Max (\begin{DoxyParamCaption}\item[{xb\+Double}]{a, }\item[{xb\+Double}]{b }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_a4d7b8f3f1ce52c6c0a281f25419f4c93}\label{tstfuncs_8cpp_a4d7b8f3f1ce52c6c0a281f25419f4c93}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!dblMin@{dblMin}}
+\index{dblMin@{dblMin}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{dblMin()}{dblMin()}}
+{\footnotesize\ttfamily xb\+Double dbl\+Min (\begin{DoxyParamCaption}\item[{xb\+Double}]{a, }\item[{xb\+Double}]{b }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_aa5dbb64c6135ac01f79e5b6087270cf5}\label{tstfuncs_8cpp_aa5dbb64c6135ac01f79e5b6087270cf5}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!FileCompare@{FileCompare}}
+\index{FileCompare@{FileCompare}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{FileCompare()}{FileCompare()}}
+{\footnotesize\ttfamily xb\+Int16 File\+Compare (\begin{DoxyParamCaption}\item[{xb\+XBase \&}]{x, }\item[{xb\+Int16}]{i\+Po, }\item[{const xb\+String \&}]{s\+File1, }\item[{const xb\+String \&}]{s\+File2, }\item[{const xb\+String \&}]{s\+Skip\+Bytes }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_ab1f17da15e67a8b2460d5a88b7a3db6e}\label{tstfuncs_8cpp_ab1f17da15e67a8b2460d5a88b7a3db6e}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!InitTime@{InitTime}}
+\index{InitTime@{InitTime}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{InitTime()}{InitTime()}}
+{\footnotesize\ttfamily void Init\+Time (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_a9c27703ef863c9d29680844fc5124953}\label{tstfuncs_8cpp_a9c27703ef863c9d29680844fc5124953}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [1/7]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{char}]{result, }\item[{char}]{expected\+Result }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_a265547b80a3aef5836952bede5288e2c}\label{tstfuncs_8cpp_a265547b80a3aef5836952bede5288e2c}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [2/7]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{const xb\+String \&}]{result, }\item[{const char $\ast$}]{expected\+Result, }\item[{size\+\_\+t}]{expected\+Len }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_af1c78fb72bcd39eb86f11aa2887fe62c}\label{tstfuncs_8cpp_af1c78fb72bcd39eb86f11aa2887fe62c}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [3/7]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{xb\+Double}]{result, }\item[{xb\+Double}]{expected\+Result }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_ac64a0bed74ba10b638456709f128f893}\label{tstfuncs_8cpp_ac64a0bed74ba10b638456709f128f893}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [4/7]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{xb\+Double}]{result, }\item[{xb\+Double}]{expected\+Result, }\item[{xb\+Double}]{d\+Epsilon }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_a663f3dd7bd8574a35c1b1b9a22081c6d}\label{tstfuncs_8cpp_a663f3dd7bd8574a35c1b1b9a22081c6d}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [5/7]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{xb\+Float}]{result, }\item[{xb\+Float}]{expected\+Result }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_ae6536e920580382389126d5f66655f90}\label{tstfuncs_8cpp_ae6536e920580382389126d5f66655f90}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [6/7]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{xb\+Int32}]{result, }\item[{xb\+Int32}]{expected\+Result }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{tstfuncs_8cpp_a000fca67bc0fffea3d3da7a5317a06e4}\label{tstfuncs_8cpp_a000fca67bc0fffea3d3da7a5317a06e4}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [7/7]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{xb\+UInt64}]{result, }\item[{xb\+UInt64}]{expected\+Result }\end{DoxyParamCaption})}
+
+
+
+\doxysubsection{Variable Documentation}
+\mbox{\Hypertarget{tstfuncs_8cpp_ae2281da6157495d69406c35f69a61f9f}\label{tstfuncs_8cpp_ae2281da6157495d69406c35f69a61f9f}}
+\index{tstfuncs.cpp@{tstfuncs.cpp}!timer@{timer}}
+\index{timer@{timer}!tstfuncs.cpp@{tstfuncs.cpp}}
+\doxysubsubsection{\texorpdfstring{timer}{timer}}
+{\footnotesize\ttfamily time\+\_\+t timer}
+
diff --git a/docs/doxygen/latex/xb__cfg__check_8cpp.tex b/docs/doxygen/latex/xb__cfg__check_8cpp.tex
new file mode 100644
index 0000000..1a04cc5
--- /dev/null
+++ b/docs/doxygen/latex/xb__cfg__check_8cpp.tex
@@ -0,0 +1,19 @@
+\hypertarget{xb__cfg__check_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+cfg\+\_\+check.cpp File Reference}
+\label{xb__cfg__check_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_cfg\_check.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_cfg\_check.cpp}}
+{\ttfamily \#include $<$stdio.\+h$>$}\newline
+{\ttfamily \#include $<$stdlib.\+h$>$}\newline
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__cfg__check_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}{main}} ()
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__cfg__check_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}\label{xb__cfg__check_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}}
+\index{xb\_cfg\_check.cpp@{xb\_cfg\_check.cpp}!main@{main}}
+\index{main@{main}!xb\_cfg\_check.cpp@{xb\_cfg\_check.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__copydbf_8cpp.tex b/docs/doxygen/latex/xb__copydbf_8cpp.tex
new file mode 100644
index 0000000..d9cd854
--- /dev/null
+++ b/docs/doxygen/latex/xb__copydbf_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__copydbf_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+copydbf.cpp File Reference}
+\label{xb__copydbf_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_copydbf.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_copydbf.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__copydbf_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__copydbf_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__copydbf_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_copydbf.cpp@{xb\_copydbf.cpp}!main@{main}}
+\index{main@{main}!xb\_copydbf.cpp@{xb\_copydbf.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__dbfutil_8cpp.tex b/docs/doxygen/latex/xb__dbfutil_8cpp.tex
new file mode 100644
index 0000000..029d025
--- /dev/null
+++ b/docs/doxygen/latex/xb__dbfutil_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__dbfutil_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+dbfutil.cpp File Reference}
+\label{xb__dbfutil_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_dbfutil.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_dbfutil.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+DOXYOFF int \mbox{\hyperlink{xb__dbfutil_8cpp_a57e6ea63b6f0a962708db29159629a6d}{main}} (int, char $\ast$$\ast$)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__dbfutil_8cpp_a57e6ea63b6f0a962708db29159629a6d}\label{xb__dbfutil_8cpp_a57e6ea63b6f0a962708db29159629a6d}}
+\index{xb\_dbfutil.cpp@{xb\_dbfutil.cpp}!main@{main}}
+\index{main@{main}!xb\_dbfutil.cpp@{xb\_dbfutil.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily DOXYOFF int main (\begin{DoxyParamCaption}\item[{int}]{, }\item[{char $\ast$$\ast$}]{ }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__deletall_8cpp.tex b/docs/doxygen/latex/xb__deletall_8cpp.tex
new file mode 100644
index 0000000..b85752c
--- /dev/null
+++ b/docs/doxygen/latex/xb__deletall_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__deletall_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+deletall.cpp File Reference}
+\label{xb__deletall_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_deletall.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_deletall.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__deletall_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__deletall_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__deletall_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_deletall.cpp@{xb\_deletall.cpp}!main@{main}}
+\index{main@{main}!xb\_deletall.cpp@{xb\_deletall.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__dumpdbt_8cpp.tex b/docs/doxygen/latex/xb__dumpdbt_8cpp.tex
new file mode 100644
index 0000000..334d1a5
--- /dev/null
+++ b/docs/doxygen/latex/xb__dumpdbt_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__dumpdbt_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+dumpdbt.cpp File Reference}
+\label{xb__dumpdbt_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_dumpdbt.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_dumpdbt.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__dumpdbt_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__dumpdbt_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__dumpdbt_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_dumpdbt.cpp@{xb\_dumpdbt.cpp}!main@{main}}
+\index{main@{main}!xb\_dumpdbt.cpp@{xb\_dumpdbt.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__dumphdr_8cpp.tex b/docs/doxygen/latex/xb__dumphdr_8cpp.tex
new file mode 100644
index 0000000..4f0b5c3
--- /dev/null
+++ b/docs/doxygen/latex/xb__dumphdr_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__dumphdr_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+dumphdr.cpp File Reference}
+\label{xb__dumphdr_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_dumphdr.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_dumphdr.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__dumphdr_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__dumphdr_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__dumphdr_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_dumphdr.cpp@{xb\_dumphdr.cpp}!main@{main}}
+\index{main@{main}!xb\_dumphdr.cpp@{xb\_dumphdr.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__dumpix_8cpp.tex b/docs/doxygen/latex/xb__dumpix_8cpp.tex
new file mode 100644
index 0000000..52f034d
--- /dev/null
+++ b/docs/doxygen/latex/xb__dumpix_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__dumpix_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+dumpix.cpp File Reference}
+\label{xb__dumpix_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_dumpix.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_dumpix.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__dumpix_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__dumpix_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__dumpix_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_dumpix.cpp@{xb\_dumpix.cpp}!main@{main}}
+\index{main@{main}!xb\_dumpix.cpp@{xb\_dumpix.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__dumprecs_8cpp.tex b/docs/doxygen/latex/xb__dumprecs_8cpp.tex
new file mode 100644
index 0000000..4216e03
--- /dev/null
+++ b/docs/doxygen/latex/xb__dumprecs_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__dumprecs_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+dumprecs.cpp File Reference}
+\label{xb__dumprecs_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_dumprecs.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_dumprecs.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__dumprecs_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__dumprecs_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__dumprecs_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_dumprecs.cpp@{xb\_dumprecs.cpp}!main@{main}}
+\index{main@{main}!xb\_dumprecs.cpp@{xb\_dumprecs.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__ex__date_8cpp.tex b/docs/doxygen/latex/xb__ex__date_8cpp.tex
new file mode 100644
index 0000000..b43cf2e
--- /dev/null
+++ b/docs/doxygen/latex/xb__ex__date_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__ex__date_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\+\_\+ex\+\_\+date.cpp File Reference}
+\label{xb__ex__date_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_date.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_date.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__ex__date_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}{main}} ()
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__ex__date_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}\label{xb__ex__date_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}}
+\index{xb\_ex\_date.cpp@{xb\_ex\_date.cpp}!main@{main}}
+\index{main@{main}!xb\_ex\_date.cpp@{xb\_ex\_date.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__ex__sql_8cpp.tex b/docs/doxygen/latex/xb__ex__sql_8cpp.tex
new file mode 100644
index 0000000..13b6ceb
--- /dev/null
+++ b/docs/doxygen/latex/xb__ex__sql_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__ex__sql_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\+\_\+ex\+\_\+sql.cpp File Reference}
+\label{xb__ex__sql_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_sql.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_sql.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__ex__sql_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__ex__sql_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__ex__sql_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_ex\_sql.cpp@{xb\_ex\_sql.cpp}!main@{main}}
+\index{main@{main}!xb\_ex\_sql.cpp@{xb\_ex\_sql.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__ex__string_8cpp.tex b/docs/doxygen/latex/xb__ex__string_8cpp.tex
new file mode 100644
index 0000000..94306b6
--- /dev/null
+++ b/docs/doxygen/latex/xb__ex__string_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__ex__string_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\+\_\+ex\+\_\+string.cpp File Reference}
+\label{xb__ex__string_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_string.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_string.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__ex__string_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}{main}} ()
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__ex__string_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}\label{xb__ex__string_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}}
+\index{xb\_ex\_string.cpp@{xb\_ex\_string.cpp}!main@{main}}
+\index{main@{main}!xb\_ex\_string.cpp@{xb\_ex\_string.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__ex__v3__create__dbf_8cpp.tex b/docs/doxygen/latex/xb__ex__v3__create__dbf_8cpp.tex
new file mode 100644
index 0000000..22a434e
--- /dev/null
+++ b/docs/doxygen/latex/xb__ex__v3__create__dbf_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__ex__v3__create__dbf_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\+\_\+ex\+\_\+v3\+\_\+create\+\_\+dbf.cpp File Reference}
+\label{xb__ex__v3__create__dbf_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_v3\_create\_dbf.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_v3\_create\_dbf.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__ex__v3__create__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}{main}} ()
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__ex__v3__create__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}\label{xb__ex__v3__create__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}}
+\index{xb\_ex\_v3\_create\_dbf.cpp@{xb\_ex\_v3\_create\_dbf.cpp}!main@{main}}
+\index{main@{main}!xb\_ex\_v3\_create\_dbf.cpp@{xb\_ex\_v3\_create\_dbf.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__ex__v3__upd__dbf_8cpp.tex b/docs/doxygen/latex/xb__ex__v3__upd__dbf_8cpp.tex
new file mode 100644
index 0000000..edcc446
--- /dev/null
+++ b/docs/doxygen/latex/xb__ex__v3__upd__dbf_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__ex__v3__upd__dbf_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\+\_\+ex\+\_\+v3\+\_\+upd\+\_\+dbf.cpp File Reference}
+\label{xb__ex__v3__upd__dbf_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_v3\_upd\_dbf.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_v3\_upd\_dbf.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__ex__v3__upd__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}{main}} ()
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__ex__v3__upd__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}\label{xb__ex__v3__upd__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}}
+\index{xb\_ex\_v3\_upd\_dbf.cpp@{xb\_ex\_v3\_upd\_dbf.cpp}!main@{main}}
+\index{main@{main}!xb\_ex\_v3\_upd\_dbf.cpp@{xb\_ex\_v3\_upd\_dbf.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__ex__v4__create__dbf_8cpp.tex b/docs/doxygen/latex/xb__ex__v4__create__dbf_8cpp.tex
new file mode 100644
index 0000000..a34ee54
--- /dev/null
+++ b/docs/doxygen/latex/xb__ex__v4__create__dbf_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__ex__v4__create__dbf_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\+\_\+ex\+\_\+v4\+\_\+create\+\_\+dbf.cpp File Reference}
+\label{xb__ex__v4__create__dbf_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_v4\_create\_dbf.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_v4\_create\_dbf.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__ex__v4__create__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}{main}} ()
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__ex__v4__create__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}\label{xb__ex__v4__create__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}}
+\index{xb\_ex\_v4\_create\_dbf.cpp@{xb\_ex\_v4\_create\_dbf.cpp}!main@{main}}
+\index{main@{main}!xb\_ex\_v4\_create\_dbf.cpp@{xb\_ex\_v4\_create\_dbf.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__ex__v4__upd__dbf_8cpp.tex b/docs/doxygen/latex/xb__ex__v4__upd__dbf_8cpp.tex
new file mode 100644
index 0000000..b4b15ff
--- /dev/null
+++ b/docs/doxygen/latex/xb__ex__v4__upd__dbf_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__ex__v4__upd__dbf_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\+\_\+ex\+\_\+v4\+\_\+upd\+\_\+dbf.cpp File Reference}
+\label{xb__ex__v4__upd__dbf_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_v4\_upd\_dbf.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/examples/xb\_ex\_v4\_upd\_dbf.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__ex__v4__upd__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}{main}} ()
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__ex__v4__upd__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}\label{xb__ex__v4__upd__dbf_8cpp_ae66f6b31b5ad750f1fe042a706a4e3d4}}
+\index{xb\_ex\_v4\_upd\_dbf.cpp@{xb\_ex\_v4\_upd\_dbf.cpp}!main@{main}}
+\index{main@{main}!xb\_ex\_v4\_upd\_dbf.cpp@{xb\_ex\_v4\_upd\_dbf.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__execsql_8cpp.tex b/docs/doxygen/latex/xb__execsql_8cpp.tex
new file mode 100644
index 0000000..28ddd4c
--- /dev/null
+++ b/docs/doxygen/latex/xb__execsql_8cpp.tex
@@ -0,0 +1,25 @@
+\hypertarget{xb__execsql_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+execsql.cpp File Reference}
+\label{xb__execsql_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_execsql.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_execsql.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+xb\+Int16 \mbox{\hyperlink{xb__execsql_8cpp_af888ba5e7e94d92c2165362b87f1ea0e}{Get\+Next\+Sql\+Cmd}} (\mbox{\hyperlink{classxb_1_1xbFile}{xb\+File}} \&f, \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Cmd)
+\item
+int \mbox{\hyperlink{xb__execsql_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__execsql_8cpp_af888ba5e7e94d92c2165362b87f1ea0e}\label{xb__execsql_8cpp_af888ba5e7e94d92c2165362b87f1ea0e}}
+\index{xb\_execsql.cpp@{xb\_execsql.cpp}!GetNextSqlCmd@{GetNextSqlCmd}}
+\index{GetNextSqlCmd@{GetNextSqlCmd}!xb\_execsql.cpp@{xb\_execsql.cpp}}
+\doxysubsubsection{\texorpdfstring{GetNextSqlCmd()}{GetNextSqlCmd()}}
+{\footnotesize\ttfamily xb\+Int16 Get\+Next\+Sql\+Cmd (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbFile}{xb\+File}} \&}]{f, }\item[{\mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Cmd }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{xb__execsql_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__execsql_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_execsql.cpp@{xb\_execsql.cpp}!main@{main}}
+\index{main@{main}!xb\_execsql.cpp@{xb\_execsql.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__pack_8cpp.tex b/docs/doxygen/latex/xb__pack_8cpp.tex
new file mode 100644
index 0000000..9a2a9a9
--- /dev/null
+++ b/docs/doxygen/latex/xb__pack_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__pack_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+pack.cpp File Reference}
+\label{xb__pack_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_pack.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_pack.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__pack_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__pack_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__pack_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_pack.cpp@{xb\_pack.cpp}!main@{main}}
+\index{main@{main}!xb\_pack.cpp@{xb\_pack.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__tblinfo_8cpp.tex b/docs/doxygen/latex/xb__tblinfo_8cpp.tex
new file mode 100644
index 0000000..1effddc
--- /dev/null
+++ b/docs/doxygen/latex/xb__tblinfo_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__tblinfo_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+tblinfo.cpp File Reference}
+\label{xb__tblinfo_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_tblinfo.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_tblinfo.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__tblinfo_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__tblinfo_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__tblinfo_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_tblinfo.cpp@{xb\_tblinfo.cpp}!main@{main}}
+\index{main@{main}!xb\_tblinfo.cpp@{xb\_tblinfo.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__bcd_8cpp.tex b/docs/doxygen/latex/xb__test__bcd_8cpp.tex
new file mode 100644
index 0000000..db40641
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__bcd_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__bcd_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+bcd.cpp File Reference}
+\label{xb__test__bcd_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_bcd.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_bcd.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__bcd_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__bcd_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__bcd_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_bcd.cpp@{xb\_test\_bcd.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_bcd.cpp@{xb\_test\_bcd.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__date_8cpp.tex b/docs/doxygen/latex/xb__test__date_8cpp.tex
new file mode 100644
index 0000000..a978788
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__date_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__date_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+date.cpp File Reference}
+\label{xb__test__date_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_date.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_date.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__date_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__date_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__date_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_date.cpp@{xb\_test\_date.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_date.cpp@{xb\_test\_date.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__dbf__v3__memos_8cpp.tex b/docs/doxygen/latex/xb__test__dbf__v3__memos_8cpp.tex
new file mode 100644
index 0000000..4974621
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__dbf__v3__memos_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__dbf__v3__memos_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+dbf\+\_\+v3\+\_\+memos.cpp File Reference}
+\label{xb__test__dbf__v3__memos_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_dbf\_v3\_memos.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_dbf\_v3\_memos.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__dbf__v3__memos_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__dbf__v3__memos_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__dbf__v3__memos_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_dbf\_v3\_memos.cpp@{xb\_test\_dbf\_v3\_memos.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_dbf\_v3\_memos.cpp@{xb\_test\_dbf\_v3\_memos.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__dbf__v3__nomemos_8cpp.tex b/docs/doxygen/latex/xb__test__dbf__v3__nomemos_8cpp.tex
new file mode 100644
index 0000000..35e32d5
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__dbf__v3__nomemos_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__dbf__v3__nomemos_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+dbf\+\_\+v3\+\_\+nomemos.cpp File Reference}
+\label{xb__test__dbf__v3__nomemos_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_dbf\_v3\_nomemos.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_dbf\_v3\_nomemos.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__dbf__v3__nomemos_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__dbf__v3__nomemos_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__dbf__v3__nomemos_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_dbf\_v3\_nomemos.cpp@{xb\_test\_dbf\_v3\_nomemos.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_dbf\_v3\_nomemos.cpp@{xb\_test\_dbf\_v3\_nomemos.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__dbf__v4__memos_8cpp.tex b/docs/doxygen/latex/xb__test__dbf__v4__memos_8cpp.tex
new file mode 100644
index 0000000..34a6200
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__dbf__v4__memos_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__dbf__v4__memos_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+dbf\+\_\+v4\+\_\+memos.cpp File Reference}
+\label{xb__test__dbf__v4__memos_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_dbf\_v4\_memos.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_dbf\_v4\_memos.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__dbf__v4__memos_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__dbf__v4__memos_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__dbf__v4__memos_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_dbf\_v4\_memos.cpp@{xb\_test\_dbf\_v4\_memos.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_dbf\_v4\_memos.cpp@{xb\_test\_dbf\_v4\_memos.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__dbf__v4__nomemos_8cpp.tex b/docs/doxygen/latex/xb__test__dbf__v4__nomemos_8cpp.tex
new file mode 100644
index 0000000..c859ec4
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__dbf__v4__nomemos_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__dbf__v4__nomemos_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+dbf\+\_\+v4\+\_\+nomemos.cpp File Reference}
+\label{xb__test__dbf__v4__nomemos_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_dbf\_v4\_nomemos.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_dbf\_v4\_nomemos.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__dbf__v4__nomemos_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__dbf__v4__nomemos_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__dbf__v4__nomemos_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_dbf\_v4\_nomemos.cpp@{xb\_test\_dbf\_v4\_nomemos.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_dbf\_v4\_nomemos.cpp@{xb\_test\_dbf\_v4\_nomemos.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__expnode_8cpp.tex b/docs/doxygen/latex/xb__test__expnode_8cpp.tex
new file mode 100644
index 0000000..2cde3bb
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__expnode_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__expnode_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+expnode.cpp File Reference}
+\label{xb__test__expnode_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_expnode.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_expnode.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__expnode_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__expnode_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__expnode_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_expnode.cpp@{xb\_test\_expnode.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_expnode.cpp@{xb\_test\_expnode.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__expression_8cpp.tex b/docs/doxygen/latex/xb__test__expression_8cpp.tex
new file mode 100644
index 0000000..b7584d5
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__expression_8cpp.tex
@@ -0,0 +1,74 @@
+\hypertarget{xb__test__expression_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+expression.cpp File Reference}
+\label{xb__test__expression_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_expression.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_expression.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+DOXYOFF xb\+Int16 \mbox{\hyperlink{xb__test__expression_8cpp_aee57237c5f5b9b4d80e84bf530eb42bc}{Dev\+Tester}} (\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$xb, \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$dbf, const char $\ast$s\+Exp\+In)
+\item
+xb\+Int16 \mbox{\hyperlink{xb__test__expression_8cpp_af56b6dbc38e0d23caaf6531526315379}{Test\+Weight}} (\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$xb, xb\+Int16 i\+Print\+Option, const char $\ast$title, const char $\ast$s\+Operator, xb\+Int16 i\+Expected\+Weight)
+\item
+xb\+Int16 \mbox{\hyperlink{xb__test__expression_8cpp_a440d64b55abaa9e14e73ecc132d1084d}{Test\+Token\+Method}} (\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$xb, xb\+Int16 i\+Print\+Option, const char $\ast$title, const char $\ast$s\+Expression, const char $\ast$s\+Expected\+Token, const char $\ast$s\+Expected\+Remainder, char c\+Expected\+Node\+Type, char c\+Expected\+Return\+Type, xb\+Int16 i\+Erc, xb\+Int16 i\+Trc)
+\item
+xb\+Int16 \mbox{\hyperlink{xb__test__expression_8cpp_ad52c27685018dda7c5c4b26fb445860e}{Test\+Method}} (\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$xb, \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d, xb\+Int16 Print\+Option, const char $\ast$title, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Expression, const char $\ast$s\+Expected\+Result, xb\+Int16 i\+Expected\+Result\+Len)
+\item
+xb\+Int16 \mbox{\hyperlink{xb__test__expression_8cpp_a7030149316fe8d8195ffbb18132e0cf9}{Test\+Method}} (\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$xb, \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d, xb\+Int16 Print\+Option, const char $\ast$title, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Expression, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}} d\+Expected\+Result)
+\item
+xb\+Int16 \mbox{\hyperlink{xb__test__expression_8cpp_a10e637a203841bd2b6a92e6217509e23}{Test\+Method}} (\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$xb, \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d, xb\+Int16 Print\+Option, const char $\ast$title, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Expression, \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} dt\+Expected\+Result)
+\item
+xb\+Int16 \mbox{\hyperlink{xb__test__expression_8cpp_aa385c5f9fa8b4cfd63763b4a28852b64}{Test\+Method}} (\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$xb, \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$d, xb\+Int16 Print\+Option, const char $\ast$title, const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&s\+Expression, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}} b\+Expected\+Result)
+\item
+int \mbox{\hyperlink{xb__test__expression_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__expression_8cpp_aee57237c5f5b9b4d80e84bf530eb42bc}\label{xb__test__expression_8cpp_aee57237c5f5b9b4d80e84bf530eb42bc}}
+\index{xb\_test\_expression.cpp@{xb\_test\_expression.cpp}!DevTester@{DevTester}}
+\index{DevTester@{DevTester}!xb\_test\_expression.cpp@{xb\_test\_expression.cpp}}
+\doxysubsubsection{\texorpdfstring{DevTester()}{DevTester()}}
+{\footnotesize\ttfamily DOXYOFF xb\+Int16 Dev\+Tester (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$}]{xb, }\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{dbf, }\item[{const char $\ast$}]{s\+Exp\+In }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{xb__test__expression_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__expression_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_expression.cpp@{xb\_test\_expression.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_expression.cpp@{xb\_test\_expression.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{xb__test__expression_8cpp_ad52c27685018dda7c5c4b26fb445860e}\label{xb__test__expression_8cpp_ad52c27685018dda7c5c4b26fb445860e}}
+\index{xb\_test\_expression.cpp@{xb\_test\_expression.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!xb\_test\_expression.cpp@{xb\_test\_expression.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [1/4]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$}]{xb, }\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d, }\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Expression, }\item[{const char $\ast$}]{s\+Expected\+Result, }\item[{xb\+Int16}]{i\+Expected\+Result\+Len }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{xb__test__expression_8cpp_aa385c5f9fa8b4cfd63763b4a28852b64}\label{xb__test__expression_8cpp_aa385c5f9fa8b4cfd63763b4a28852b64}}
+\index{xb\_test\_expression.cpp@{xb\_test\_expression.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!xb\_test\_expression.cpp@{xb\_test\_expression.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [2/4]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$}]{xb, }\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d, }\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Expression, }\item[{\mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+Bool}}}]{b\+Expected\+Result }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{xb__test__expression_8cpp_a10e637a203841bd2b6a92e6217509e23}\label{xb__test__expression_8cpp_a10e637a203841bd2b6a92e6217509e23}}
+\index{xb\_test\_expression.cpp@{xb\_test\_expression.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!xb\_test\_expression.cpp@{xb\_test\_expression.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [3/4]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$}]{xb, }\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d, }\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Expression, }\item[{\mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}}}]{dt\+Expected\+Result }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{xb__test__expression_8cpp_a7030149316fe8d8195ffbb18132e0cf9}\label{xb__test__expression_8cpp_a7030149316fe8d8195ffbb18132e0cf9}}
+\index{xb\_test\_expression.cpp@{xb\_test\_expression.cpp}!TestMethod@{TestMethod}}
+\index{TestMethod@{TestMethod}!xb\_test\_expression.cpp@{xb\_test\_expression.cpp}}
+\doxysubsubsection{\texorpdfstring{TestMethod()}{TestMethod()}\hspace{0.1cm}{\footnotesize\ttfamily [4/4]}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Method (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$}]{xb, }\item[{\mbox{\hyperlink{classxb_1_1xbDbf}{xb\+Dbf}} $\ast$}]{d, }\item[{xb\+Int16}]{Print\+Option, }\item[{const char $\ast$}]{title, }\item[{const \mbox{\hyperlink{classxb_1_1xbString}{xb\+String}} \&}]{s\+Expression, }\item[{\mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+Double}}}]{d\+Expected\+Result }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{xb__test__expression_8cpp_a440d64b55abaa9e14e73ecc132d1084d}\label{xb__test__expression_8cpp_a440d64b55abaa9e14e73ecc132d1084d}}
+\index{xb\_test\_expression.cpp@{xb\_test\_expression.cpp}!TestTokenMethod@{TestTokenMethod}}
+\index{TestTokenMethod@{TestTokenMethod}!xb\_test\_expression.cpp@{xb\_test\_expression.cpp}}
+\doxysubsubsection{\texorpdfstring{TestTokenMethod()}{TestTokenMethod()}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Token\+Method (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$}]{xb, }\item[{xb\+Int16}]{i\+Print\+Option, }\item[{const char $\ast$}]{title, }\item[{const char $\ast$}]{s\+Expression, }\item[{const char $\ast$}]{s\+Expected\+Token, }\item[{const char $\ast$}]{s\+Expected\+Remainder, }\item[{char}]{c\+Expected\+Node\+Type, }\item[{char}]{c\+Expected\+Return\+Type, }\item[{xb\+Int16}]{i\+Erc, }\item[{xb\+Int16}]{i\+Trc }\end{DoxyParamCaption})}
+
+\mbox{\Hypertarget{xb__test__expression_8cpp_af56b6dbc38e0d23caaf6531526315379}\label{xb__test__expression_8cpp_af56b6dbc38e0d23caaf6531526315379}}
+\index{xb\_test\_expression.cpp@{xb\_test\_expression.cpp}!TestWeight@{TestWeight}}
+\index{TestWeight@{TestWeight}!xb\_test\_expression.cpp@{xb\_test\_expression.cpp}}
+\doxysubsubsection{\texorpdfstring{TestWeight()}{TestWeight()}}
+{\footnotesize\ttfamily xb\+Int16 Test\+Weight (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classxb_1_1xbXBase}{xb\+XBase}} $\ast$}]{xb, }\item[{xb\+Int16}]{i\+Print\+Option, }\item[{const char $\ast$}]{title, }\item[{const char $\ast$}]{s\+Operator, }\item[{xb\+Int16}]{i\+Expected\+Weight }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__file_8cpp.tex b/docs/doxygen/latex/xb__test__file_8cpp.tex
new file mode 100644
index 0000000..453934d
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__file_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__file_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+file.cpp File Reference}
+\label{xb__test__file_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_file.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_file.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__file_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__file_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__file_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_file.cpp@{xb\_test\_file.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_file.cpp@{xb\_test\_file.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__filter_8cpp.tex b/docs/doxygen/latex/xb__test__filter_8cpp.tex
new file mode 100644
index 0000000..2133a8f
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__filter_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__filter_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+filter.cpp File Reference}
+\label{xb__test__filter_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_filter.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_filter.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__filter_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__filter_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__filter_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_filter.cpp@{xb\_test\_filter.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_filter.cpp@{xb\_test\_filter.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__funcs_8cpp.tex b/docs/doxygen/latex/xb__test__funcs_8cpp.tex
new file mode 100644
index 0000000..8f4707b
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__funcs_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__funcs_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+funcs.cpp File Reference}
+\label{xb__test__funcs_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_funcs.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_funcs.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__funcs_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__funcs_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__funcs_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_funcs.cpp@{xb\_test\_funcs.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_funcs.cpp@{xb\_test\_funcs.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__linklist_8cpp.tex b/docs/doxygen/latex/xb__test__linklist_8cpp.tex
new file mode 100644
index 0000000..4958af6
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__linklist_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__linklist_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+linklist.cpp File Reference}
+\label{xb__test__linklist_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_linklist.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_linklist.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__linklist_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__linklist_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__linklist_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_linklist.cpp@{xb\_test\_linklist.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_linklist.cpp@{xb\_test\_linklist.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__lock2_8cpp.tex b/docs/doxygen/latex/xb__test__lock2_8cpp.tex
new file mode 100644
index 0000000..c356482
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__lock2_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__lock2_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+lock2.cpp File Reference}
+\label{xb__test__lock2_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_lock2.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_lock2.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__lock2_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__lock2_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__lock2_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_lock2.cpp@{xb\_test\_lock2.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_lock2.cpp@{xb\_test\_lock2.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__lock_8cpp.tex b/docs/doxygen/latex/xb__test__lock_8cpp.tex
new file mode 100644
index 0000000..92829df
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__lock_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__lock_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+lock.cpp File Reference}
+\label{xb__test__lock_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_lock.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_lock.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__lock_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__lock_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__lock_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_lock.cpp@{xb\_test\_lock.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_lock.cpp@{xb\_test\_lock.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__log_8cpp.tex b/docs/doxygen/latex/xb__test__log_8cpp.tex
new file mode 100644
index 0000000..1587195
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__log_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__log_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+log.cpp File Reference}
+\label{xb__test__log_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_log.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_log.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__log_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__log_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__log_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_log.cpp@{xb\_test\_log.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_log.cpp@{xb\_test\_log.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__mdx_8cpp.tex b/docs/doxygen/latex/xb__test__mdx_8cpp.tex
new file mode 100644
index 0000000..3715bff
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__mdx_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__mdx_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+mdx.cpp File Reference}
+\label{xb__test__mdx_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_mdx.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_mdx.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__mdx_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__mdx_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__mdx_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_mdx.cpp@{xb\_test\_mdx.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_mdx.cpp@{xb\_test\_mdx.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__ndx2_8cpp.tex b/docs/doxygen/latex/xb__test__ndx2_8cpp.tex
new file mode 100644
index 0000000..921dfb6
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__ndx2_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__ndx2_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+ndx2.cpp File Reference}
+\label{xb__test__ndx2_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_ndx2.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_ndx2.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__ndx2_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__ndx2_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__ndx2_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_ndx2.cpp@{xb\_test\_ndx2.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_ndx2.cpp@{xb\_test\_ndx2.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__ndx_8cpp.tex b/docs/doxygen/latex/xb__test__ndx_8cpp.tex
new file mode 100644
index 0000000..ea77fa3
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__ndx_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__ndx_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+ndx.cpp File Reference}
+\label{xb__test__ndx_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_ndx.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_ndx.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__ndx_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__ndx_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__ndx_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_ndx.cpp@{xb\_test\_ndx.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_ndx.cpp@{xb\_test\_ndx.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__sql_8cpp.tex b/docs/doxygen/latex/xb__test__sql_8cpp.tex
new file mode 100644
index 0000000..982eee2
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__sql_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__sql_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+sql.cpp File Reference}
+\label{xb__test__sql_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_sql.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_sql.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__sql_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__sql_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__sql_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_sql.cpp@{xb\_test\_sql.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_sql.cpp@{xb\_test\_sql.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__string_8cpp.tex b/docs/doxygen/latex/xb__test__string_8cpp.tex
new file mode 100644
index 0000000..425e05b
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__string_8cpp.tex
@@ -0,0 +1,32 @@
+\hypertarget{xb__test__string_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+string.cpp File Reference}
+\label{xb__test__string_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_string.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_string.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \mbox{\hyperlink{xb__test__string_8cpp_a42f8c497a1968074f38bf5055c650dca}{VERBOSE}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__string_8cpp_aabf71bc9adb6daf457b2ea8879ae537f}{main}} (int arg\+Cnt, char $\ast$$\ast$av=NULL)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Macro Definition Documentation}
+\mbox{\Hypertarget{xb__test__string_8cpp_a42f8c497a1968074f38bf5055c650dca}\label{xb__test__string_8cpp_a42f8c497a1968074f38bf5055c650dca}}
+\index{xb\_test\_string.cpp@{xb\_test\_string.cpp}!VERBOSE@{VERBOSE}}
+\index{VERBOSE@{VERBOSE}!xb\_test\_string.cpp@{xb\_test\_string.cpp}}
+\doxysubsubsection{\texorpdfstring{VERBOSE}{VERBOSE}}
+{\footnotesize\ttfamily \#define VERBOSE}
+
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__string_8cpp_aabf71bc9adb6daf457b2ea8879ae537f}\label{xb__test__string_8cpp_aabf71bc9adb6daf457b2ea8879ae537f}}
+\index{xb\_test\_string.cpp@{xb\_test\_string.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_string.cpp@{xb\_test\_string.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av = {\ttfamily NULL} }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__tblmgr_8cpp.tex b/docs/doxygen/latex/xb__test__tblmgr_8cpp.tex
new file mode 100644
index 0000000..b1bf3b6
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__tblmgr_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__tblmgr_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+tblmgr.cpp File Reference}
+\label{xb__test__tblmgr_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_tblmgr.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_tblmgr.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__tblmgr_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__tblmgr_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__tblmgr_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_tblmgr.cpp@{xb\_test\_tblmgr.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_tblmgr.cpp@{xb\_test\_tblmgr.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__uda_8cpp.tex b/docs/doxygen/latex/xb__test__uda_8cpp.tex
new file mode 100644
index 0000000..734c593
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__uda_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__uda_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+uda.cpp File Reference}
+\label{xb__test__uda_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_uda.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_uda.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__uda_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__uda_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__uda_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_uda.cpp@{xb\_test\_uda.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_uda.cpp@{xb\_test\_uda.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__test__xbase_8cpp.tex b/docs/doxygen/latex/xb__test__xbase_8cpp.tex
new file mode 100644
index 0000000..82b8868
--- /dev/null
+++ b/docs/doxygen/latex/xb__test__xbase_8cpp.tex
@@ -0,0 +1,18 @@
+\hypertarget{xb__test__xbase_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\+\_\+test\+\_\+xbase.cpp File Reference}
+\label{xb__test__xbase_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_xbase.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/tests/xb\_test\_xbase.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include \char`\"{}tstfuncs.\+cpp\char`\"{}}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__test__xbase_8cpp_a1470527971db41f828c26074cde7e15a}{main}} (int arg\+Cnt, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__test__xbase_8cpp_a1470527971db41f828c26074cde7e15a}\label{xb__test__xbase_8cpp_a1470527971db41f828c26074cde7e15a}}
+\index{xb\_test\_xbase.cpp@{xb\_test\_xbase.cpp}!main@{main}}
+\index{main@{main}!xb\_test\_xbase.cpp@{xb\_test\_xbase.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{arg\+Cnt, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__undelall_8cpp.tex b/docs/doxygen/latex/xb__undelall_8cpp.tex
new file mode 100644
index 0000000..755564d
--- /dev/null
+++ b/docs/doxygen/latex/xb__undelall_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__undelall_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+undelall.cpp File Reference}
+\label{xb__undelall_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_undelall.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_undelall.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__undelall_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__undelall_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__undelall_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_undelall.cpp@{xb\_undelall.cpp}!main@{main}}
+\index{main@{main}!xb\_undelall.cpp@{xb\_undelall.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xb__zap_8cpp.tex b/docs/doxygen/latex/xb__zap_8cpp.tex
new file mode 100644
index 0000000..38b6e9e
--- /dev/null
+++ b/docs/doxygen/latex/xb__zap_8cpp.tex
@@ -0,0 +1,17 @@
+\hypertarget{xb__zap_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\+\_\+zap.cpp File Reference}
+\label{xb__zap_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_zap.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/utils/xb\_zap.cpp}}
+{\ttfamily \#include $<$xbase.\+h$>$}\newline
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+int \mbox{\hyperlink{xb__zap_8cpp_a0c99d968a34e803d378692bde2e3f18f}{main}} (int ac, char $\ast$$\ast$av)
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Function Documentation}
+\mbox{\Hypertarget{xb__zap_8cpp_a0c99d968a34e803d378692bde2e3f18f}\label{xb__zap_8cpp_a0c99d968a34e803d378692bde2e3f18f}}
+\index{xb\_zap.cpp@{xb\_zap.cpp}!main@{main}}
+\index{main@{main}!xb\_zap.cpp@{xb\_zap.cpp}}
+\doxysubsubsection{\texorpdfstring{main()}{main()}}
+{\footnotesize\ttfamily int main (\begin{DoxyParamCaption}\item[{int}]{ac, }\item[{char $\ast$$\ast$}]{av }\end{DoxyParamCaption})}
+
diff --git a/docs/doxygen/latex/xbase_8h.tex b/docs/doxygen/latex/xbase_8h.tex
new file mode 100644
index 0000000..e25b125
--- /dev/null
+++ b/docs/doxygen/latex/xbase_8h.tex
@@ -0,0 +1,30 @@
+\hypertarget{xbase_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbase.h File Reference}
+\label{xbase_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbase.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbase.h}}
+{\ttfamily \#include $<$xbconfig.\+h$>$}\newline
+{\ttfamily \#include $<$stdio.\+h$>$}\newline
+{\ttfamily \#include $<$errno.\+h$>$}\newline
+{\ttfamily \#include $<$time.\+h$>$}\newline
+{\ttfamily \#include $<$math.\+h$>$}\newline
+{\ttfamily \#include $<$iomanip$>$}\newline
+{\ttfamily \#include $<$xbretcod.\+h$>$}\newline
+{\ttfamily \#include $<$xbtypes.\+h$>$}\newline
+{\ttfamily \#include $<$xbstring.\+h$>$}\newline
+{\ttfamily \#include $<$xbssv.\+h$>$}\newline
+{\ttfamily \#include $<$xbdate.\+h$>$}\newline
+{\ttfamily \#include $<$xbtblmgr.\+h$>$}\newline
+{\ttfamily \#include $<$xbxbase.\+h$>$}\newline
+{\ttfamily \#include $<$xblnknod.\+h$>$}\newline
+{\ttfamily \#include $<$xblnklst.\+h$>$}\newline
+{\ttfamily \#include $<$xblnklstord.\+h$>$}\newline
+{\ttfamily \#include $<$xbfile.\+h$>$}\newline
+{\ttfamily \#include $<$xblog.\+h$>$}\newline
+{\ttfamily \#include $<$xbmemo.\+h$>$}\newline
+{\ttfamily \#include $<$xbbcd.\+h$>$}\newline
+{\ttfamily \#include $<$xbuda.\+h$>$}\newline
+{\ttfamily \#include $<$xbexpnode.\+h$>$}\newline
+{\ttfamily \#include $<$xbexp.\+h$>$}\newline
+{\ttfamily \#include $<$xbtag.\+h$>$}\newline
+{\ttfamily \#include $<$xbdbf.\+h$>$}\newline
+{\ttfamily \#include $<$xbindex.\+h$>$}\newline
+{\ttfamily \#include $<$xbfilter.\+h$>$}\newline
+{\ttfamily \#include $<$xbsql.\+h$>$}\newline
diff --git a/docs/doxygen/latex/xbase_8h_source.tex b/docs/doxygen/latex/xbase_8h_source.tex
new file mode 100644
index 0000000..d9cbba6
--- /dev/null
+++ b/docs/doxygen/latex/xbase_8h_source.tex
@@ -0,0 +1,99 @@
+\hypertarget{xbase_8h_source}{}\doxysection{xbase.\+h}
+\label{xbase_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbase.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbase.h}}
+\mbox{\hyperlink{xbase_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbase.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{}}
+\DoxyCodeLine{4 \textcolor{comment}{Xbase64 Software Library}}
+\DoxyCodeLine{5 \textcolor{comment}{}}
+\DoxyCodeLine{6 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{7 \textcolor{comment}{}}
+\DoxyCodeLine{8 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license}}
+\DoxyCodeLine{9 \textcolor{comment}{}}
+\DoxyCodeLine{10 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{11 \textcolor{comment}{}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{14 \textcolor{comment}{}}
+\DoxyCodeLine{15 \textcolor{comment}{*/}}
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#include <xbconfig.h>}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#include <stdio.h>}}
+\DoxyCodeLine{19 \textcolor{preprocessor}{\#include <errno.h>}}
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#include <time.h>}}
+\DoxyCodeLine{21 \textcolor{preprocessor}{\#include <math.h>}}
+\DoxyCodeLine{22 }
+\DoxyCodeLine{23 \textcolor{preprocessor}{\#ifdef HAVE\_INTTYPES\_H}}
+\DoxyCodeLine{24 \textcolor{preprocessor}{\#include <inttypes.h>}}
+\DoxyCodeLine{25 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{preprocessor}{\#ifdef HAVE\_STRING\_H}}
+\DoxyCodeLine{28 \textcolor{preprocessor}{\#include <string.h>}}
+\DoxyCodeLine{29 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{30 }
+\DoxyCodeLine{31 \textcolor{preprocessor}{\#ifdef HAVE\_STRINGS\_H}}
+\DoxyCodeLine{32 \textcolor{preprocessor}{\#include <strings.h>}}
+\DoxyCodeLine{33 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{34 }
+\DoxyCodeLine{35 \textcolor{comment}{// \#ifdef STDC\_HEADERS}}
+\DoxyCodeLine{36 \textcolor{preprocessor}{\#ifdef HAVE\_STDARGS\_H}}
+\DoxyCodeLine{37 \textcolor{preprocessor}{\#include <stdargs.h>}}
+\DoxyCodeLine{38 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{39 }
+\DoxyCodeLine{40 \textcolor{preprocessor}{\#ifdef HAVE\_CTYPE\_H}}
+\DoxyCodeLine{41 \textcolor{preprocessor}{\#include <ctype.h>}}
+\DoxyCodeLine{42 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{43 }
+\DoxyCodeLine{44 \textcolor{preprocessor}{\#ifdef HAVE\_STDARG\_H}}
+\DoxyCodeLine{45 \textcolor{preprocessor}{\#include <stdarg.h>}}
+\DoxyCodeLine{46 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{47 }
+\DoxyCodeLine{48 \textcolor{preprocessor}{\#ifdef HAVE\_STAT\_H}}
+\DoxyCodeLine{49 \textcolor{preprocessor}{\#include <sys/stat.h>}}
+\DoxyCodeLine{50 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{51 }
+\DoxyCodeLine{52 \textcolor{preprocessor}{\#ifdef HAVE\_FCNTL\_H}}
+\DoxyCodeLine{53 \textcolor{preprocessor}{\#include <fcntl.h>}}
+\DoxyCodeLine{54 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{55 }
+\DoxyCodeLine{56 \textcolor{preprocessor}{\#ifdef HAVE\_UNISTD\_H}}
+\DoxyCodeLine{57 \textcolor{preprocessor}{\#include <unistd.h>}}
+\DoxyCodeLine{58 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{59 }
+\DoxyCodeLine{60 \textcolor{preprocessor}{\#ifdef HAVE\_VARARGS\_H}}
+\DoxyCodeLine{61 \textcolor{preprocessor}{\#include <varargs.h>}}
+\DoxyCodeLine{62 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{63 }
+\DoxyCodeLine{64 \textcolor{preprocessor}{\#ifdef HAVE\_WINDOWS\_H}}
+\DoxyCodeLine{65 \textcolor{preprocessor}{\#include <windows.h>}}
+\DoxyCodeLine{66 \textcolor{preprocessor}{\#include <io.h>}}
+\DoxyCodeLine{67 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{68 }
+\DoxyCodeLine{69 \textcolor{preprocessor}{\#include <iomanip>}}
+\DoxyCodeLine{70 }
+\DoxyCodeLine{71 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbretcod_8h}{xbretcod.h}}>}}
+\DoxyCodeLine{72 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbtypes_8h}{xbtypes.h}}>}}
+\DoxyCodeLine{73 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbstring_8h}{xbstring.h}}>}}
+\DoxyCodeLine{74 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbssv_8h}{xbssv.h}}>}}
+\DoxyCodeLine{75 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbdate_8h}{xbdate.h}}>}}
+\DoxyCodeLine{76 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbtblmgr_8h}{xbtblmgr.h}}>}}
+\DoxyCodeLine{77 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbxbase_8h}{xbxbase.h}}>}}
+\DoxyCodeLine{78 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xblnknod_8h}{xblnknod.h}}>}}
+\DoxyCodeLine{79 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xblnklst_8h}{xblnklst.h}}>}}
+\DoxyCodeLine{80 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xblnklstord_8h}{xblnklstord.h}}>}}
+\DoxyCodeLine{81 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbfile_8h}{xbfile.h}}>}}
+\DoxyCodeLine{82 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xblog_8h}{xblog.h}}>}}
+\DoxyCodeLine{83 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbmemo_8h}{xbmemo.h}}>}}
+\DoxyCodeLine{84 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbbcd_8h}{xbbcd.h}}>}}
+\DoxyCodeLine{85 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbuda_8h}{xbuda.h}}>}}
+\DoxyCodeLine{86 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbexpnode_8h}{xbexpnode.h}}>}}
+\DoxyCodeLine{87 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbexp_8h}{xbexp.h}}>}}
+\DoxyCodeLine{88 }
+\DoxyCodeLine{89 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbtag_8h}{xbtag.h}}>}}
+\DoxyCodeLine{90 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbdbf_8h}{xbdbf.h}}>} \textcolor{comment}{/* dbf base class */}}
+\DoxyCodeLine{91 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbindex_8h}{xbindex.h}}>} \textcolor{comment}{/* index base class */}}
+\DoxyCodeLine{92 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbfilter_8h}{xbfilter.h}}>}}
+\DoxyCodeLine{93 \textcolor{preprocessor}{\#include <\mbox{\hyperlink{xbsql_8h}{xbsql.h}}>}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbbcd_8cpp.tex b/docs/doxygen/latex/xbbcd_8cpp.tex
new file mode 100644
index 0000000..bf70abd
--- /dev/null
+++ b/docs/doxygen/latex/xbbcd_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbbcd_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbbcd.cpp File Reference}
+\label{xbbcd_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbbcd.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbbcd.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbbcd_8h.tex b/docs/doxygen/latex/xbbcd_8h.tex
new file mode 100644
index 0000000..67739bd
--- /dev/null
+++ b/docs/doxygen/latex/xbbcd_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xbbcd_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbbcd.h File Reference}
+\label{xbbcd_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbbcd.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbbcd.h}}
diff --git a/docs/doxygen/latex/xbbcd_8h_source.tex b/docs/doxygen/latex/xbbcd_8h_source.tex
new file mode 100644
index 0000000..7ff643a
--- /dev/null
+++ b/docs/doxygen/latex/xbbcd_8h_source.tex
@@ -0,0 +1,99 @@
+\hypertarget{xbbcd_8h_source}{}\doxysection{xbbcd.\+h}
+\label{xbbcd_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbbcd.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbbcd.h}}
+\mbox{\hyperlink{xbbcd_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbbcd.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014, 2018, 2019, 2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 \textcolor{preprocessor}{\#ifndef \_\_XB\_BCD\_H\_\_}}
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#define \_\_XB\_BCD\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{21 }
+\DoxyCodeLine{22 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 \textcolor{comment}{// structure for bcd value}}
+\DoxyCodeLine{25 \textcolor{comment}{// next structure superceeded. Different compilers allocate different}}
+\DoxyCodeLine{26 \textcolor{comment}{// sizes to structures with bit fields, can't count on the size}}
+\DoxyCodeLine{27 }
+\DoxyCodeLine{28 \textcolor{comment}{/*}}
+\DoxyCodeLine{29 \textcolor{comment}{struct XBDLLEXPORT xbBcdStrucOld \{}}
+\DoxyCodeLine{30 \textcolor{comment}{ unsigned SigDigits : 8; // significant digit count}}
+\DoxyCodeLine{31 \textcolor{comment}{ unsigned Filler : 2; // always set to 1}}
+\DoxyCodeLine{32 \textcolor{comment}{ unsigned EncDigits : 5; // encoded digit count}}
+\DoxyCodeLine{33 \textcolor{comment}{ unsigned Sign : 1; // +/-\/ sign}}
+\DoxyCodeLine{34 \textcolor{comment}{ unsigned char Data[10];}}
+\DoxyCodeLine{35 \textcolor{comment}{\};}}
+\DoxyCodeLine{36 \textcolor{comment}{*/}}
+\DoxyCodeLine{37 }
+\DoxyCodeLine{38 \textcolor{keyword}{struct }XBDLLEXPORT xbBcdStruct \{}
+\DoxyCodeLine{39 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} cSigDigits; \textcolor{comment}{// significant digit count}}
+\DoxyCodeLine{40 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} cEncDigits; \textcolor{comment}{// encoded digit count}}
+\DoxyCodeLine{41 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} cData[10]; \textcolor{comment}{// data}}
+\DoxyCodeLine{42 \};}
+\DoxyCodeLine{43 }
+\DoxyCodeLine{44 \textcolor{keyword}{struct }XBDLLEXPORT xbByteSplit \{}
+\DoxyCodeLine{45 \textcolor{keywordtype}{unsigned} c1 : 4;}
+\DoxyCodeLine{46 \textcolor{keywordtype}{unsigned} c2 : 4;}
+\DoxyCodeLine{47 \};}
+\DoxyCodeLine{48 }
+\DoxyCodeLine{49 \textcolor{keyword}{class }XBDLLEXPORT xbBcd \{}
+\DoxyCodeLine{50 \textcolor{keyword}{public}:}
+\DoxyCodeLine{51 }
+\DoxyCodeLine{52 xbBcd( \textcolor{keyword}{const} xbString \&sIn );}
+\DoxyCodeLine{53 xbBcd( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn );}
+\DoxyCodeLine{54 xbBcd( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vBcd12In );}
+\DoxyCodeLine{55 \textcolor{keywordtype}{void} Set( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn );}
+\DoxyCodeLine{56 \textcolor{keywordtype}{void} Set( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *cBcd12In );}
+\DoxyCodeLine{57 \textcolor{keywordtype}{void} Set( \textcolor{keyword}{const} xbString \&sIn );}
+\DoxyCodeLine{58 }
+\DoxyCodeLine{59 }
+\DoxyCodeLine{60 \textcolor{keywordtype}{void} ToString( xbString \&sOut );}
+\DoxyCodeLine{61 \textcolor{keywordtype}{void} ToDouble( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dOut );}
+\DoxyCodeLine{62 \textcolor{keywordtype}{void} ToBcd( xbBcdStruct \&bcdOut );}
+\DoxyCodeLine{63 \textcolor{keywordtype}{void} ToChar( \textcolor{keywordtype}{char} *cOut );}
+\DoxyCodeLine{64 }
+\DoxyCodeLine{65 \textcolor{comment}{// const unsigned char * GetBcd() const;}}
+\DoxyCodeLine{66 \textcolor{keywordtype}{void} StringToBcd( \textcolor{keyword}{const} xbString \&sStringIn );}
+\DoxyCodeLine{67 }
+\DoxyCodeLine{68 \textcolor{comment}{// void StringToBcdOld( const xbString \&sStringIn );}}
+\DoxyCodeLine{69 }
+\DoxyCodeLine{70 xbInt16 Compare( \textcolor{keyword}{const} xbBcd \&bcdIn );}
+\DoxyCodeLine{71 xbInt16 Compare( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} d );}
+\DoxyCodeLine{72 }
+\DoxyCodeLine{73 \textcolor{keyword}{const} \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} *GetData() \textcolor{keyword}{const};}
+\DoxyCodeLine{74 \textcolor{keyword}{const} \textcolor{keywordtype}{void} * GetBcd() \textcolor{keyword}{const};}
+\DoxyCodeLine{75 }
+\DoxyCodeLine{76 }
+\DoxyCodeLine{77 \textcolor{keyword}{private}:}
+\DoxyCodeLine{78 \textcolor{keywordtype}{void} ctor();}
+\DoxyCodeLine{79 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} GetEncDigitsNoSign() \textcolor{keyword}{const};}
+\DoxyCodeLine{80 \textcolor{keywordtype}{unsigned} GetSign() \textcolor{keyword}{const};}
+\DoxyCodeLine{81 \textcolor{keywordtype}{unsigned} GetSigDigits() \textcolor{keyword}{const};}
+\DoxyCodeLine{82 \textcolor{keywordtype}{unsigned} GetActualSigDigits() \textcolor{keyword}{const};}
+\DoxyCodeLine{83 }
+\DoxyCodeLine{84 }
+\DoxyCodeLine{85 \textcolor{comment}{// xbBcdStruc bcdOld;}}
+\DoxyCodeLine{86 xbBcdStruct bcd;}
+\DoxyCodeLine{87 \};}
+\DoxyCodeLine{88 }
+\DoxyCodeLine{89 \} \textcolor{comment}{/* namespace xb */}}
+\DoxyCodeLine{90 }
+\DoxyCodeLine{91 }
+\DoxyCodeLine{93 }
+\DoxyCodeLine{94 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* XB\_INDEX\_SUPPORT */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{95 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_BCD\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbcrix_8cpp.tex b/docs/doxygen/latex/xbcrix_8cpp.tex
new file mode 100644
index 0000000..a9416a1
--- /dev/null
+++ b/docs/doxygen/latex/xbcrix_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbcrix_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/sql/xbcrix.cpp File Reference}
+\label{xbcrix_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbcrix.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbcrix.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbcrtbl_8cpp.tex b/docs/doxygen/latex/xbcrtbl_8cpp.tex
new file mode 100644
index 0000000..e2cfea6
--- /dev/null
+++ b/docs/doxygen/latex/xbcrtbl_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbcrtbl_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/sql/xbcrtbl.cpp File Reference}
+\label{xbcrtbl_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbcrtbl.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbcrtbl.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbdate_8cpp.tex b/docs/doxygen/latex/xbdate_8cpp.tex
new file mode 100644
index 0000000..7076949
--- /dev/null
+++ b/docs/doxygen/latex/xbdate_8cpp.tex
@@ -0,0 +1,9 @@
+\hypertarget{xbdate_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbdate.cpp File Reference}
+\label{xbdate_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbdate.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbdate.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+{\ttfamily \#include $<$time.\+h$>$}\newline
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbdate_8h.tex b/docs/doxygen/latex/xbdate_8h.tex
new file mode 100644
index 0000000..577344e
--- /dev/null
+++ b/docs/doxygen/latex/xbdate_8h.tex
@@ -0,0 +1,50 @@
+\hypertarget{xbdate_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbdate.h File Reference}
+\label{xbdate_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbdate.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbdate.h}}
+\doxysubsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classxb_1_1xbDate}{xb\+::xb\+Date}}
+\begin{DoxyCompactList}\small\item\em \mbox{\hyperlink{classxb_1_1xbDate}{xb\+Date}} class. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \mbox{\hyperlink{xbdate_8h_a8f22704d3fd93fa85dd93b6c699e8178}{XB\+\_\+\+FMT\+\_\+\+WEEK}}~1
+\item
+\#define \mbox{\hyperlink{xbdate_8h_aeacf2f7cc897ab5bd64781c0fb52b75d}{XB\+\_\+\+FMT\+\_\+\+MONTH}}~2
+\item
+\#define \mbox{\hyperlink{xbdate_8h_aa29d78982a9e007874af1c4f4e4d1aa4}{XB\+\_\+\+FMT\+\_\+\+YEAR}}~3
+\item
+\#define \mbox{\hyperlink{xbdate_8h_a119f32fda399e2ebc2d734012a130e8f}{JUL\+\_\+\+OFFSET}}~1721425L
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Macro Definition Documentation}
+\mbox{\Hypertarget{xbdate_8h_a119f32fda399e2ebc2d734012a130e8f}\label{xbdate_8h_a119f32fda399e2ebc2d734012a130e8f}}
+\index{xbdate.h@{xbdate.h}!JUL\_OFFSET@{JUL\_OFFSET}}
+\index{JUL\_OFFSET@{JUL\_OFFSET}!xbdate.h@{xbdate.h}}
+\doxysubsubsection{\texorpdfstring{JUL\_OFFSET}{JUL\_OFFSET}}
+{\footnotesize\ttfamily \#define JUL\+\_\+\+OFFSET~1721425L}
+
+\mbox{\Hypertarget{xbdate_8h_aeacf2f7cc897ab5bd64781c0fb52b75d}\label{xbdate_8h_aeacf2f7cc897ab5bd64781c0fb52b75d}}
+\index{xbdate.h@{xbdate.h}!XB\_FMT\_MONTH@{XB\_FMT\_MONTH}}
+\index{XB\_FMT\_MONTH@{XB\_FMT\_MONTH}!xbdate.h@{xbdate.h}}
+\doxysubsubsection{\texorpdfstring{XB\_FMT\_MONTH}{XB\_FMT\_MONTH}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+FMT\+\_\+\+MONTH~2}
+
+\mbox{\Hypertarget{xbdate_8h_a8f22704d3fd93fa85dd93b6c699e8178}\label{xbdate_8h_a8f22704d3fd93fa85dd93b6c699e8178}}
+\index{xbdate.h@{xbdate.h}!XB\_FMT\_WEEK@{XB\_FMT\_WEEK}}
+\index{XB\_FMT\_WEEK@{XB\_FMT\_WEEK}!xbdate.h@{xbdate.h}}
+\doxysubsubsection{\texorpdfstring{XB\_FMT\_WEEK}{XB\_FMT\_WEEK}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+FMT\+\_\+\+WEEK~1}
+
+\mbox{\Hypertarget{xbdate_8h_aa29d78982a9e007874af1c4f4e4d1aa4}\label{xbdate_8h_aa29d78982a9e007874af1c4f4e4d1aa4}}
+\index{xbdate.h@{xbdate.h}!XB\_FMT\_YEAR@{XB\_FMT\_YEAR}}
+\index{XB\_FMT\_YEAR@{XB\_FMT\_YEAR}!xbdate.h@{xbdate.h}}
+\doxysubsubsection{\texorpdfstring{XB\_FMT\_YEAR}{XB\_FMT\_YEAR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+FMT\+\_\+\+YEAR~3}
+
diff --git a/docs/doxygen/latex/xbdate_8h_source.tex b/docs/doxygen/latex/xbdate_8h_source.tex
new file mode 100644
index 0000000..09c5690
--- /dev/null
+++ b/docs/doxygen/latex/xbdate_8h_source.tex
@@ -0,0 +1,104 @@
+\hypertarget{xbdate_8h_source}{}\doxysection{xbdate.\+h}
+\label{xbdate_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbdate.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbdate.h}}
+\mbox{\hyperlink{xbdate_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbdate.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBDATE\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_XBDATE\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{21 \textcolor{preprocessor}{\#pragma interface}}
+\DoxyCodeLine{22 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 }
+\DoxyCodeLine{25 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{preprocessor}{\#define XB\_FMT\_WEEK 1}}
+\DoxyCodeLine{28 \textcolor{preprocessor}{\#define XB\_FMT\_MONTH 2}}
+\DoxyCodeLine{29 \textcolor{preprocessor}{\#define XB\_FMT\_YEAR 3}}
+\DoxyCodeLine{30 }
+\DoxyCodeLine{31 \textcolor{comment}{// next value is added to the date calculation to match dbase calculation}}
+\DoxyCodeLine{32 \textcolor{comment}{// first valid dbase date is 01/01/0001}}
+\DoxyCodeLine{33 \textcolor{preprocessor}{\#define JUL\_OFFSET 1721425L}}
+\DoxyCodeLine{34 }
+\DoxyCodeLine{35 }
+\DoxyCodeLine{37 }
+\DoxyCodeLine{62 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} : \textcolor{keyword}{public} \mbox{\hyperlink{classxb_1_1xbSsv}{xbSsv}} \{}
+\DoxyCodeLine{63 \textcolor{keyword}{public}:}
+\DoxyCodeLine{64 }
+\DoxyCodeLine{65 \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}}();}
+\DoxyCodeLine{66 \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}}( \textcolor{keyword}{const} \textcolor{keywordtype}{char} * Date8 );}
+\DoxyCodeLine{67 \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}}( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Date8 );}
+\DoxyCodeLine{68 \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}}( xbInt32 lJulDate );}
+\DoxyCodeLine{69 \mbox{\hyperlink{classxb_1_1xbDate}{\string~xbDate}}();}
+\DoxyCodeLine{70 }
+\DoxyCodeLine{71 \textcolor{keywordtype}{void} operator=( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&d );}
+\DoxyCodeLine{72 \textcolor{keywordtype}{void} operator+=( xbInt32 i );}
+\DoxyCodeLine{73 \textcolor{keywordtype}{void} operator-\/=( xbInt32 i );}
+\DoxyCodeLine{74 \textcolor{keywordtype}{void} operator++( xbInt32 i );}
+\DoxyCodeLine{75 \textcolor{keywordtype}{void} operator-\/-\/( xbInt32 i );}
+\DoxyCodeLine{76 }
+\DoxyCodeLine{77 xbInt32 operator-\/( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{78 \textcolor{keyword}{const} \textcolor{keywordtype}{char} * operator-\/( xbInt32 i );}
+\DoxyCodeLine{79 \textcolor{keyword}{const} \textcolor{keywordtype}{char} * operator+( xbInt32 i );}
+\DoxyCodeLine{80 }
+\DoxyCodeLine{81 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator==( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{82 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator!=( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{83 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator< ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{84 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator> ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{85 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator<=( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{86 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator>=( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{87 }
+\DoxyCodeLine{88 xbInt16 CalcRollingCenturyForYear( xbInt16 year ) \textcolor{keyword}{const};}
+\DoxyCodeLine{89 xbInt16 CenturyOf() \textcolor{keyword}{const};}
+\DoxyCodeLine{90 xbInt16 CharDayOf( \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOutCharDay );}
+\DoxyCodeLine{91 xbInt16 CharMonthOf( \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOutCharMonth );}
+\DoxyCodeLine{92 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} DateIsValid ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sDate8 ) \textcolor{keyword}{const};}
+\DoxyCodeLine{93 xbInt16 DayOf( xbInt16 iFormat ) \textcolor{keyword}{const};}
+\DoxyCodeLine{94 xbInt16 CTOD( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sCtodInDate );}
+\DoxyCodeLine{95 \textcolor{comment}{// xbInt16 FormatDate( const char *sFmtIn, xbString \&sFmtOut );}}
+\DoxyCodeLine{96 xbInt16 FormatDate( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFmtIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFmtOut );}
+\DoxyCodeLine{97 \textcolor{keyword}{const} \textcolor{keywordtype}{char} *Str() \textcolor{keyword}{const};}
+\DoxyCodeLine{98 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsLeapYear( xbInt16 iYear ) \textcolor{keyword}{const};}
+\DoxyCodeLine{99 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsLeapYear() \textcolor{keyword}{const};}
+\DoxyCodeLine{100 xbInt32 JulianDays() \textcolor{keyword}{const};}
+\DoxyCodeLine{101 xbInt16 JulToDate8( xbInt32 lJulDate );}
+\DoxyCodeLine{102 xbInt16 LastDayOfMonth();}
+\DoxyCodeLine{103 xbInt16 MonthOf() \textcolor{keyword}{const};}
+\DoxyCodeLine{104 xbInt16 Set( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Date8 );}
+\DoxyCodeLine{105 xbInt16 Sysdate();}
+\DoxyCodeLine{106 xbInt16 YearOf() \textcolor{keyword}{const};}
+\DoxyCodeLine{107 }
+\DoxyCodeLine{108 \textcolor{preprocessor}{\#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{109 \textcolor{keywordtype}{void} Dump( \textcolor{keyword}{const} \textcolor{keywordtype}{char} * title );}
+\DoxyCodeLine{110 \textcolor{keywordtype}{void} DumpDateTables();}
+\DoxyCodeLine{111 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{112 }
+\DoxyCodeLine{113 \textcolor{keyword}{private}:}
+\DoxyCodeLine{114 \textcolor{keywordtype}{void} SetDateTables();}
+\DoxyCodeLine{115 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} sDate8; \textcolor{comment}{/* CCYYMMDD date format ie; 20140718 */}}
+\DoxyCodeLine{116 }
+\DoxyCodeLine{117 \textcolor{keyword}{static} \textcolor{keywordtype}{int} iAggregatedDaysInMonths[2][13];}
+\DoxyCodeLine{118 \textcolor{keyword}{static} \textcolor{keywordtype}{int} iDaysInMonths[2][13];}
+\DoxyCodeLine{119 \};}
+\DoxyCodeLine{120 }
+\DoxyCodeLine{121 \} \textcolor{comment}{/* namespace */}}
+\DoxyCodeLine{122 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/*\_\_XB\_XBDATE\_H\_\_ */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{123 }
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbdbf3_8cpp.tex b/docs/doxygen/latex/xbdbf3_8cpp.tex
new file mode 100644
index 0000000..4132f6b
--- /dev/null
+++ b/docs/doxygen/latex/xbdbf3_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbdbf3_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbdbf3.cpp File Reference}
+\label{xbdbf3_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbdbf3.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbdbf3.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbdbf4_8cpp.tex b/docs/doxygen/latex/xbdbf4_8cpp.tex
new file mode 100644
index 0000000..ef9dc8b
--- /dev/null
+++ b/docs/doxygen/latex/xbdbf4_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbdbf4_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbdbf4.cpp File Reference}
+\label{xbdbf4_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbdbf4.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbdbf4.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbdbf_8cpp.tex b/docs/doxygen/latex/xbdbf_8cpp.tex
new file mode 100644
index 0000000..398a44d
--- /dev/null
+++ b/docs/doxygen/latex/xbdbf_8cpp.tex
@@ -0,0 +1,8 @@
+\hypertarget{xbdbf_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbdbf.cpp File Reference}
+\label{xbdbf_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbdbf.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbdbf.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbdbf_8h.tex b/docs/doxygen/latex/xbdbf_8h.tex
new file mode 100644
index 0000000..0574d62
--- /dev/null
+++ b/docs/doxygen/latex/xbdbf_8h.tex
@@ -0,0 +1,196 @@
+\hypertarget{xbdbf_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbdbf.h File Reference}
+\label{xbdbf_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbdbf.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbdbf.h}}
+\doxysubsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \mbox{\hyperlink{structxb_1_1xbSchema}{xb\+::xb\+Schema}}
+\begin{DoxyCompactList}\small\item\em Schema used for defining tables with Create\+Table methods. \end{DoxyCompactList}\item
+class \mbox{\hyperlink{classxb_1_1xbDbf}{xb\+::xb\+Dbf}}
+\begin{DoxyCompactList}\small\item\em Base class for handling dbf files/tables. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a20f739b9d9dc6a002a246a999e76aeaa}{XB\+\_\+\+CHAR\+\_\+\+FLD}}~\textquotesingle{}C\textquotesingle{}
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a2f6d5073af761bc1a806a2c7b1c1d886}{XB\+\_\+\+LOGICAL\+\_\+\+FLD}}~\textquotesingle{}L\textquotesingle{}
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_ae9fb6d69cc5edc94d36ae403c22ec1c6}{XB\+\_\+\+NUMERIC\+\_\+\+FLD}}~\textquotesingle{}N\textquotesingle{}
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a7f685e6f5fe804b2174725a27ce73adc}{XB\+\_\+\+DATE\+\_\+\+FLD}}~\textquotesingle{}D\textquotesingle{}
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a23fa19b19cb43bd6dcc59a5a3f6c30ad}{XB\+\_\+\+MEMO\+\_\+\+FLD}}~\textquotesingle{}M\textquotesingle{}
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a96ab4218d70ab603b4866354ce8c18cd}{XB\+\_\+\+FLOAT\+\_\+\+FLD}}~\textquotesingle{}F\textquotesingle{}
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a843ca4569326dbd1d0647899b0eb512f}{XB\+\_\+\+CLOSED}}~0
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a9a6dafbb07cac744eb14094efa739409}{XB\+\_\+\+OPEN}}~1
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a26e7eeda69f32bc88b08a208ca9e7991}{XB\+\_\+\+UPDATED}}~2
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a395a2e101a793bacabf6bc079d178e29}{XB\+\_\+\+LOCK}}~0
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a21389b73e7b4e7e185fa635b9e354c2e}{XB\+\_\+\+UNLOCK}}~1
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a4c08d01bd69e295b001bd00a228d8106}{LK\+\_\+\+DBASE}}~1
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a01d6d7910b0da2170eb904a97d864a41}{LK\+\_\+\+CLIPPER}}~2
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a65e29186276222f460a7171803e07adf}{LK\+\_\+\+FOX}}~3
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a42aea0ccd94f7422c8e0d7422dce85a4}{LK\+\_\+\+XBASE64}}~9
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a8bd17730da3ba5c55a6a07bc482dd0e4}{XB\+\_\+\+ALL\+\_\+\+RECS}}~0
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a1c44bb25bf2e23a3a9d3d2312df0b592}{XB\+\_\+\+ACTIVE\+\_\+\+RECS}}~1
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_acc0a441854ed92b9d65d1181a97cad43}{XB\+\_\+\+DELETED\+\_\+\+RECS}}~2
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a6fe10b307878b4612b04c2c876a4a592}{XB\+\_\+\+OVERLAY}}~1
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a7b797840abdb3291373d15978103a778}{XB\+\_\+\+DONTOVERLAY}}~0
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_ada1115f596131888c04df61546b198c4}{XB\+\_\+\+CHAREOF}}~\textquotesingle{}\textbackslash{}x1A\textquotesingle{} /$\ast$ end of DBF $\ast$/
+\item
+\#define \mbox{\hyperlink{xbdbf_8h_a35d56cac7959c1e5c761684ced3f1e17}{XB\+\_\+\+CHARHDR}}~\textquotesingle{}\textbackslash{}x0D\textquotesingle{} /$\ast$ header terminator $\ast$/
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Macro Definition Documentation}
+\mbox{\Hypertarget{xbdbf_8h_a01d6d7910b0da2170eb904a97d864a41}\label{xbdbf_8h_a01d6d7910b0da2170eb904a97d864a41}}
+\index{xbdbf.h@{xbdbf.h}!LK\_CLIPPER@{LK\_CLIPPER}}
+\index{LK\_CLIPPER@{LK\_CLIPPER}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{LK\_CLIPPER}{LK\_CLIPPER}}
+{\footnotesize\ttfamily \#define LK\+\_\+\+CLIPPER~2}
+
+\mbox{\Hypertarget{xbdbf_8h_a4c08d01bd69e295b001bd00a228d8106}\label{xbdbf_8h_a4c08d01bd69e295b001bd00a228d8106}}
+\index{xbdbf.h@{xbdbf.h}!LK\_DBASE@{LK\_DBASE}}
+\index{LK\_DBASE@{LK\_DBASE}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{LK\_DBASE}{LK\_DBASE}}
+{\footnotesize\ttfamily \#define LK\+\_\+\+DBASE~1}
+
+\mbox{\Hypertarget{xbdbf_8h_a65e29186276222f460a7171803e07adf}\label{xbdbf_8h_a65e29186276222f460a7171803e07adf}}
+\index{xbdbf.h@{xbdbf.h}!LK\_FOX@{LK\_FOX}}
+\index{LK\_FOX@{LK\_FOX}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{LK\_FOX}{LK\_FOX}}
+{\footnotesize\ttfamily \#define LK\+\_\+\+FOX~3}
+
+\mbox{\Hypertarget{xbdbf_8h_a42aea0ccd94f7422c8e0d7422dce85a4}\label{xbdbf_8h_a42aea0ccd94f7422c8e0d7422dce85a4}}
+\index{xbdbf.h@{xbdbf.h}!LK\_XBASE64@{LK\_XBASE64}}
+\index{LK\_XBASE64@{LK\_XBASE64}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{LK\_XBASE64}{LK\_XBASE64}}
+{\footnotesize\ttfamily \#define LK\+\_\+\+XBASE64~9}
+
+\mbox{\Hypertarget{xbdbf_8h_a1c44bb25bf2e23a3a9d3d2312df0b592}\label{xbdbf_8h_a1c44bb25bf2e23a3a9d3d2312df0b592}}
+\index{xbdbf.h@{xbdbf.h}!XB\_ACTIVE\_RECS@{XB\_ACTIVE\_RECS}}
+\index{XB\_ACTIVE\_RECS@{XB\_ACTIVE\_RECS}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_ACTIVE\_RECS}{XB\_ACTIVE\_RECS}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+ACTIVE\+\_\+\+RECS~1}
+
+\mbox{\Hypertarget{xbdbf_8h_a8bd17730da3ba5c55a6a07bc482dd0e4}\label{xbdbf_8h_a8bd17730da3ba5c55a6a07bc482dd0e4}}
+\index{xbdbf.h@{xbdbf.h}!XB\_ALL\_RECS@{XB\_ALL\_RECS}}
+\index{XB\_ALL\_RECS@{XB\_ALL\_RECS}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_ALL\_RECS}{XB\_ALL\_RECS}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+ALL\+\_\+\+RECS~0}
+
+\mbox{\Hypertarget{xbdbf_8h_a20f739b9d9dc6a002a246a999e76aeaa}\label{xbdbf_8h_a20f739b9d9dc6a002a246a999e76aeaa}}
+\index{xbdbf.h@{xbdbf.h}!XB\_CHAR\_FLD@{XB\_CHAR\_FLD}}
+\index{XB\_CHAR\_FLD@{XB\_CHAR\_FLD}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_CHAR\_FLD}{XB\_CHAR\_FLD}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+CHAR\+\_\+\+FLD~\textquotesingle{}C\textquotesingle{}}
+
+\mbox{\Hypertarget{xbdbf_8h_ada1115f596131888c04df61546b198c4}\label{xbdbf_8h_ada1115f596131888c04df61546b198c4}}
+\index{xbdbf.h@{xbdbf.h}!XB\_CHAREOF@{XB\_CHAREOF}}
+\index{XB\_CHAREOF@{XB\_CHAREOF}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_CHAREOF}{XB\_CHAREOF}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+CHAREOF~\textquotesingle{}\textbackslash{}x1A\textquotesingle{} /$\ast$ end of DBF $\ast$/}
+
+\mbox{\Hypertarget{xbdbf_8h_a35d56cac7959c1e5c761684ced3f1e17}\label{xbdbf_8h_a35d56cac7959c1e5c761684ced3f1e17}}
+\index{xbdbf.h@{xbdbf.h}!XB\_CHARHDR@{XB\_CHARHDR}}
+\index{XB\_CHARHDR@{XB\_CHARHDR}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_CHARHDR}{XB\_CHARHDR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+CHARHDR~\textquotesingle{}\textbackslash{}x0D\textquotesingle{} /$\ast$ header terminator $\ast$/}
+
+\mbox{\Hypertarget{xbdbf_8h_a843ca4569326dbd1d0647899b0eb512f}\label{xbdbf_8h_a843ca4569326dbd1d0647899b0eb512f}}
+\index{xbdbf.h@{xbdbf.h}!XB\_CLOSED@{XB\_CLOSED}}
+\index{XB\_CLOSED@{XB\_CLOSED}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_CLOSED}{XB\_CLOSED}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+CLOSED~0}
+
+\mbox{\Hypertarget{xbdbf_8h_a7f685e6f5fe804b2174725a27ce73adc}\label{xbdbf_8h_a7f685e6f5fe804b2174725a27ce73adc}}
+\index{xbdbf.h@{xbdbf.h}!XB\_DATE\_FLD@{XB\_DATE\_FLD}}
+\index{XB\_DATE\_FLD@{XB\_DATE\_FLD}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_DATE\_FLD}{XB\_DATE\_FLD}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+DATE\+\_\+\+FLD~\textquotesingle{}D\textquotesingle{}}
+
+\mbox{\Hypertarget{xbdbf_8h_acc0a441854ed92b9d65d1181a97cad43}\label{xbdbf_8h_acc0a441854ed92b9d65d1181a97cad43}}
+\index{xbdbf.h@{xbdbf.h}!XB\_DELETED\_RECS@{XB\_DELETED\_RECS}}
+\index{XB\_DELETED\_RECS@{XB\_DELETED\_RECS}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_DELETED\_RECS}{XB\_DELETED\_RECS}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+DELETED\+\_\+\+RECS~2}
+
+\mbox{\Hypertarget{xbdbf_8h_a7b797840abdb3291373d15978103a778}\label{xbdbf_8h_a7b797840abdb3291373d15978103a778}}
+\index{xbdbf.h@{xbdbf.h}!XB\_DONTOVERLAY@{XB\_DONTOVERLAY}}
+\index{XB\_DONTOVERLAY@{XB\_DONTOVERLAY}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_DONTOVERLAY}{XB\_DONTOVERLAY}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+DONTOVERLAY~0}
+
+\mbox{\Hypertarget{xbdbf_8h_a96ab4218d70ab603b4866354ce8c18cd}\label{xbdbf_8h_a96ab4218d70ab603b4866354ce8c18cd}}
+\index{xbdbf.h@{xbdbf.h}!XB\_FLOAT\_FLD@{XB\_FLOAT\_FLD}}
+\index{XB\_FLOAT\_FLD@{XB\_FLOAT\_FLD}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_FLOAT\_FLD}{XB\_FLOAT\_FLD}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+FLOAT\+\_\+\+FLD~\textquotesingle{}F\textquotesingle{}}
+
+\mbox{\Hypertarget{xbdbf_8h_a395a2e101a793bacabf6bc079d178e29}\label{xbdbf_8h_a395a2e101a793bacabf6bc079d178e29}}
+\index{xbdbf.h@{xbdbf.h}!XB\_LOCK@{XB\_LOCK}}
+\index{XB\_LOCK@{XB\_LOCK}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_LOCK}{XB\_LOCK}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+LOCK~0}
+
+\mbox{\Hypertarget{xbdbf_8h_a2f6d5073af761bc1a806a2c7b1c1d886}\label{xbdbf_8h_a2f6d5073af761bc1a806a2c7b1c1d886}}
+\index{xbdbf.h@{xbdbf.h}!XB\_LOGICAL\_FLD@{XB\_LOGICAL\_FLD}}
+\index{XB\_LOGICAL\_FLD@{XB\_LOGICAL\_FLD}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_LOGICAL\_FLD}{XB\_LOGICAL\_FLD}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+LOGICAL\+\_\+\+FLD~\textquotesingle{}L\textquotesingle{}}
+
+\mbox{\Hypertarget{xbdbf_8h_a23fa19b19cb43bd6dcc59a5a3f6c30ad}\label{xbdbf_8h_a23fa19b19cb43bd6dcc59a5a3f6c30ad}}
+\index{xbdbf.h@{xbdbf.h}!XB\_MEMO\_FLD@{XB\_MEMO\_FLD}}
+\index{XB\_MEMO\_FLD@{XB\_MEMO\_FLD}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_MEMO\_FLD}{XB\_MEMO\_FLD}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+MEMO\+\_\+\+FLD~\textquotesingle{}M\textquotesingle{}}
+
+\mbox{\Hypertarget{xbdbf_8h_ae9fb6d69cc5edc94d36ae403c22ec1c6}\label{xbdbf_8h_ae9fb6d69cc5edc94d36ae403c22ec1c6}}
+\index{xbdbf.h@{xbdbf.h}!XB\_NUMERIC\_FLD@{XB\_NUMERIC\_FLD}}
+\index{XB\_NUMERIC\_FLD@{XB\_NUMERIC\_FLD}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_NUMERIC\_FLD}{XB\_NUMERIC\_FLD}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+NUMERIC\+\_\+\+FLD~\textquotesingle{}N\textquotesingle{}}
+
+\mbox{\Hypertarget{xbdbf_8h_a9a6dafbb07cac744eb14094efa739409}\label{xbdbf_8h_a9a6dafbb07cac744eb14094efa739409}}
+\index{xbdbf.h@{xbdbf.h}!XB\_OPEN@{XB\_OPEN}}
+\index{XB\_OPEN@{XB\_OPEN}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_OPEN}{XB\_OPEN}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+OPEN~1}
+
+\mbox{\Hypertarget{xbdbf_8h_a6fe10b307878b4612b04c2c876a4a592}\label{xbdbf_8h_a6fe10b307878b4612b04c2c876a4a592}}
+\index{xbdbf.h@{xbdbf.h}!XB\_OVERLAY@{XB\_OVERLAY}}
+\index{XB\_OVERLAY@{XB\_OVERLAY}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_OVERLAY}{XB\_OVERLAY}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+OVERLAY~1}
+
+\mbox{\Hypertarget{xbdbf_8h_a21389b73e7b4e7e185fa635b9e354c2e}\label{xbdbf_8h_a21389b73e7b4e7e185fa635b9e354c2e}}
+\index{xbdbf.h@{xbdbf.h}!XB\_UNLOCK@{XB\_UNLOCK}}
+\index{XB\_UNLOCK@{XB\_UNLOCK}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_UNLOCK}{XB\_UNLOCK}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+UNLOCK~1}
+
+\mbox{\Hypertarget{xbdbf_8h_a26e7eeda69f32bc88b08a208ca9e7991}\label{xbdbf_8h_a26e7eeda69f32bc88b08a208ca9e7991}}
+\index{xbdbf.h@{xbdbf.h}!XB\_UPDATED@{XB\_UPDATED}}
+\index{XB\_UPDATED@{XB\_UPDATED}!xbdbf.h@{xbdbf.h}}
+\doxysubsubsection{\texorpdfstring{XB\_UPDATED}{XB\_UPDATED}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+UPDATED~2}
+
diff --git a/docs/doxygen/latex/xbdbf_8h_source.tex b/docs/doxygen/latex/xbdbf_8h_source.tex
new file mode 100644
index 0000000..b83d689
--- /dev/null
+++ b/docs/doxygen/latex/xbdbf_8h_source.tex
@@ -0,0 +1,491 @@
+\hypertarget{xbdbf_8h_source}{}\doxysection{xbdbf.\+h}
+\label{xbdbf_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbdbf.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbdbf.h}}
+\mbox{\hyperlink{xbdbf_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbdbf.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014, 2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBDBF\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_XBDBF\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 \textcolor{comment}{//\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{21 \textcolor{comment}{//\#pragma interface}}
+\DoxyCodeLine{22 \textcolor{comment}{//\#endif}}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 \textcolor{comment}{/*****************************/}}
+\DoxyCodeLine{27 \textcolor{comment}{/* Field Types */}}
+\DoxyCodeLine{28 }
+\DoxyCodeLine{29 \textcolor{preprocessor}{\#define XB\_CHAR\_FLD 'C'}}
+\DoxyCodeLine{30 \textcolor{preprocessor}{\#define XB\_LOGICAL\_FLD 'L'}}
+\DoxyCodeLine{31 \textcolor{preprocessor}{\#define XB\_NUMERIC\_FLD 'N'}}
+\DoxyCodeLine{32 \textcolor{preprocessor}{\#define XB\_DATE\_FLD 'D'}}
+\DoxyCodeLine{33 \textcolor{preprocessor}{\#define XB\_MEMO\_FLD 'M'}}
+\DoxyCodeLine{34 \textcolor{preprocessor}{\#define XB\_FLOAT\_FLD 'F'}}
+\DoxyCodeLine{35 }
+\DoxyCodeLine{36 \textcolor{comment}{/*****************************/}}
+\DoxyCodeLine{37 \textcolor{comment}{/* File Status Codes */}}
+\DoxyCodeLine{38 }
+\DoxyCodeLine{39 \textcolor{preprocessor}{\#define XB\_CLOSED 0}}
+\DoxyCodeLine{40 \textcolor{preprocessor}{\#define XB\_OPEN 1}}
+\DoxyCodeLine{41 \textcolor{preprocessor}{\#define XB\_UPDATED 2}}
+\DoxyCodeLine{42 }
+\DoxyCodeLine{43 }
+\DoxyCodeLine{44 \textcolor{comment}{/*****************************/}}
+\DoxyCodeLine{45 \textcolor{comment}{/* File Access Modes */}}
+\DoxyCodeLine{46 \textcolor{comment}{// \#define XB\_SINGLE\_USER 0 // file buffering on}}
+\DoxyCodeLine{47 \textcolor{comment}{// \#define XB\_MULTI\_USER 1 // file buffering off}}
+\DoxyCodeLine{48 }
+\DoxyCodeLine{49 \textcolor{comment}{/*****************************/}}
+\DoxyCodeLine{50 \textcolor{comment}{/* File Lock Functions */}}
+\DoxyCodeLine{51 \textcolor{preprocessor}{\#define XB\_LOCK 0}}
+\DoxyCodeLine{52 \textcolor{preprocessor}{\#define XB\_UNLOCK 1}}
+\DoxyCodeLine{53 }
+\DoxyCodeLine{54 \textcolor{preprocessor}{\#define LK\_DBASE 1}}
+\DoxyCodeLine{55 \textcolor{preprocessor}{\#define LK\_CLIPPER 2 }\textcolor{comment}{// future}}
+\DoxyCodeLine{56 \textcolor{preprocessor}{\#define LK\_FOX 3 }\textcolor{comment}{// future}}
+\DoxyCodeLine{57 \textcolor{preprocessor}{\#define LK\_XBASE64 9 }\textcolor{comment}{// future}}
+\DoxyCodeLine{58 }
+\DoxyCodeLine{59 \textcolor{comment}{/*****************************/}}
+\DoxyCodeLine{60 \textcolor{comment}{/* Record retrieve options */}}
+\DoxyCodeLine{61 \textcolor{preprocessor}{\#define XB\_ALL\_RECS 0}}
+\DoxyCodeLine{62 \textcolor{preprocessor}{\#define XB\_ACTIVE\_RECS 1}}
+\DoxyCodeLine{63 \textcolor{preprocessor}{\#define XB\_DELETED\_RECS 2}}
+\DoxyCodeLine{64 }
+\DoxyCodeLine{65 }
+\DoxyCodeLine{66 \textcolor{comment}{/*****************************/}}
+\DoxyCodeLine{67 \textcolor{comment}{/* Other defines */}}
+\DoxyCodeLine{68 }
+\DoxyCodeLine{69 \textcolor{preprocessor}{\#define XB\_OVERLAY 1}}
+\DoxyCodeLine{70 \textcolor{preprocessor}{\#define XB\_DONTOVERLAY 0}}
+\DoxyCodeLine{71 \textcolor{preprocessor}{\#define XB\_CHAREOF '\(\backslash\)x1A' }\textcolor{comment}{/* end of DBF */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{72 \textcolor{preprocessor}{\#define XB\_CHARHDR '\(\backslash\)x0D' }\textcolor{comment}{/* header terminator */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{73 }
+\DoxyCodeLine{74 }
+\DoxyCodeLine{76 }
+\DoxyCodeLine{95 \textcolor{keyword}{struct }XBDLLEXPORT \mbox{\hyperlink{structxb_1_1xbSchema}{xbSchema}} \{}
+\DoxyCodeLine{96 \textcolor{keywordtype}{char} cFieldName[11];}
+\DoxyCodeLine{97 \textcolor{keywordtype}{char} \mbox{\hyperlink{structxb_1_1xbSchema_a1d612b2ed5dc0b0289c9e91b3cda3a25}{cType}};}
+\DoxyCodeLine{98 xbInt16 \mbox{\hyperlink{structxb_1_1xbSchema_a2da554af25ef628acf59bb52996056ac}{iFieldLen}}; \textcolor{comment}{/* fields are stored as one byte on record*/}}
+\DoxyCodeLine{99 xbInt16 \mbox{\hyperlink{structxb_1_1xbSchema_a55bab3bb69dee3508d168c93e182d4b9}{iNoOfDecs}};}
+\DoxyCodeLine{100 \};}
+\DoxyCodeLine{101 }
+\DoxyCodeLine{103 \textcolor{keyword}{struct }XBDLLEXPORT xbSchemaRec \{}
+\DoxyCodeLine{104 \textcolor{keywordtype}{char} cFieldName[11]; \textcolor{comment}{/* ASCIIZ field name */}}
+\DoxyCodeLine{105 \textcolor{keywordtype}{char} cType; \textcolor{comment}{/* field type */}}
+\DoxyCodeLine{106 \textcolor{keywordtype}{char} *pAddress; \textcolor{comment}{/* pointer to field in record buffer 1 */}}
+\DoxyCodeLine{107 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} cFieldLen; \textcolor{comment}{/* fields are stored as one byte on record */}}
+\DoxyCodeLine{108 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} cNoOfDecs;}
+\DoxyCodeLine{109 \textcolor{keywordtype}{char} *pAddress2; \textcolor{comment}{/* pointer to field in record buffer 2 */}}
+\DoxyCodeLine{110 xbInt16 iLongFieldLen; \textcolor{comment}{/* to handle long field lengths */}}
+\DoxyCodeLine{111 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} cIxFlag; \textcolor{comment}{/* DBase IV Index field flag */}}
+\DoxyCodeLine{112 \};}
+\DoxyCodeLine{114 }
+\DoxyCodeLine{115 }
+\DoxyCodeLine{116 }
+\DoxyCodeLine{118 \textcolor{preprocessor}{\#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{119 \textcolor{keyword}{class }XBDLLEXPORT xbIx;}
+\DoxyCodeLine{120 \textcolor{comment}{// structure for file list, each open DBF file can have one or more index files}}
+\DoxyCodeLine{121 \textcolor{keyword}{struct }XBDLLEXPORT xbIxList \{}
+\DoxyCodeLine{122 xbIxList *next;}
+\DoxyCodeLine{123 xbIx *ix;}
+\DoxyCodeLine{124 xbString *sFmt;}
+\DoxyCodeLine{125 \};}
+\DoxyCodeLine{126 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{128 \textcolor{comment}{}}
+\DoxyCodeLine{129 }
+\DoxyCodeLine{131 }
+\DoxyCodeLine{150 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} : \textcolor{keyword}{public} \mbox{\hyperlink{classxb_1_1xbFile}{xbFile}} \{}
+\DoxyCodeLine{151 }
+\DoxyCodeLine{152 \textcolor{keyword}{public}:}
+\DoxyCodeLine{153 \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}}( \mbox{\hyperlink{classxb_1_1xbXBase}{xbXBase}} *x );}
+\DoxyCodeLine{154 \textcolor{keyword}{virtual} \mbox{\hyperlink{classxb_1_1xbDbf}{\string~xbDbf}}();}
+\DoxyCodeLine{155 }
+\DoxyCodeLine{156 \textcolor{keyword}{virtual} xbInt16 Abort();}
+\DoxyCodeLine{157 \textcolor{keyword}{virtual} xbInt16 AppendRecord();}
+\DoxyCodeLine{158 \textcolor{keyword}{virtual} xbInt16 BlankRecord();}
+\DoxyCodeLine{159 \textcolor{keyword}{virtual} xbInt16 Commit();}
+\DoxyCodeLine{160 \textcolor{keyword}{virtual} xbInt16 Close();}
+\DoxyCodeLine{161 \textcolor{keyword}{virtual} xbInt16 CopyDbfStructure( \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} *dNewTable, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableAlias, xbInt16 iOverlay, xbInt16 iShareMode );}
+\DoxyCodeLine{162 \textcolor{keyword}{virtual} xbInt16 \mbox{\hyperlink{classxb_1_1xbDbf_a73e41bfe679dd06ab16c436652df93f1}{CreateTable}} ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sAlias, \mbox{\hyperlink{structxb_1_1xbSchema}{xbSchema}} *pSchema, xbInt16 iOverlay, xbInt16 iShareMode ) = 0;}
+\DoxyCodeLine{163 \textcolor{keyword}{virtual} xbInt16 DeleteTable ();}
+\DoxyCodeLine{164 \textcolor{keyword}{virtual} xbInt16 DeleteAll ( xbInt16 iOption );}
+\DoxyCodeLine{165 \textcolor{keyword}{virtual} xbInt16 DeleteAllRecords ();}
+\DoxyCodeLine{166 \textcolor{keyword}{virtual} xbInt16 DeleteRecord ();}
+\DoxyCodeLine{167 \textcolor{keyword}{virtual} xbInt16 \mbox{\hyperlink{classxb_1_1xbDbf_ab1f4a515533402f872cedcd0322aabd4}{DumpHeader}} ( xbInt16 iOption ) \textcolor{keyword}{const};}
+\DoxyCodeLine{168 \textcolor{keyword}{virtual} xbInt16 \mbox{\hyperlink{classxb_1_1xbDbf_a3a6a068addffd06fc9a996639d6ca69e}{DumpRecord}} ( xbUInt32 ulRecNo, xbInt16 iOutputDest = 0, xbInt16 iOutputFmt = 0 );}
+\DoxyCodeLine{169 \textcolor{keyword}{virtual} xbInt16 GetAutoCommit () \textcolor{keyword}{const};}
+\DoxyCodeLine{170 \textcolor{keyword}{virtual} xbInt16 GetAutoCommit ( xbInt16 iOption ) \textcolor{keyword}{const};}
+\DoxyCodeLine{171 \textcolor{keyword}{virtual} xbUInt32 GetCurRecNo () \textcolor{keyword}{const};}
+\DoxyCodeLine{172 \textcolor{keyword}{virtual} xbInt16 GetDbfStatus () \textcolor{keyword}{const};}
+\DoxyCodeLine{173 \textcolor{keyword}{virtual} xbInt32 GetFieldCnt () \textcolor{keyword}{const};}
+\DoxyCodeLine{174 \textcolor{keyword}{virtual} xbInt16 GetFirstRecord ();}
+\DoxyCodeLine{175 \textcolor{keyword}{virtual} xbInt16 GetFirstRecord ( xbInt16 iOption );}
+\DoxyCodeLine{176 \textcolor{keyword}{virtual} xbInt16 GetLastRecord ();}
+\DoxyCodeLine{177 \textcolor{keyword}{virtual} xbInt16 GetLastRecord ( xbInt16 iOption );}
+\DoxyCodeLine{178 }
+\DoxyCodeLine{179 \textcolor{keyword}{virtual} xbInt16 GetNextRecord ();}
+\DoxyCodeLine{180 \textcolor{keyword}{virtual} xbInt16 GetNextRecord ( xbInt16 iOption );}
+\DoxyCodeLine{181 \textcolor{keyword}{virtual} xbInt16 GetNextRecord ( xbInt16 iOption, xbUInt32 ulStartRec );}
+\DoxyCodeLine{182 \textcolor{keyword}{virtual} xbInt32 \mbox{\hyperlink{classxb_1_1xbDbf_a13393704a8a191d4d6555ae31d3c3e92}{GetPhysicalIxCnt}} () \textcolor{keyword}{const};}
+\DoxyCodeLine{183 \textcolor{keyword}{virtual} xbInt16 GetPrevRecord ();}
+\DoxyCodeLine{184 \textcolor{keyword}{virtual} xbInt16 GetPrevRecord ( xbInt16 iOption );}
+\DoxyCodeLine{185 \textcolor{keyword}{virtual} xbInt16 GetRecord ( xbUInt32 ulRecNo );}
+\DoxyCodeLine{186 \textcolor{keyword}{virtual} xbInt16 GetRecordCnt ( xbUInt32 \& ulRecCnt );}
+\DoxyCodeLine{187 \textcolor{keyword}{virtual} \textcolor{keywordtype}{char} * GetRecordBuf ( xbInt16 iOpt = 0 ) \textcolor{keyword}{const};}
+\DoxyCodeLine{188 \textcolor{keyword}{virtual} xbUInt16 GetRecordLen () \textcolor{keyword}{const};}
+\DoxyCodeLine{189 \textcolor{keyword}{virtual} \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&GetTblAlias() \textcolor{keyword}{const};}
+\DoxyCodeLine{190 \textcolor{keyword}{virtual} xbInt16 \mbox{\hyperlink{classxb_1_1xbDbf_a49212a9eb17f7fa9f303e08d5fc50fc6}{GetVersion}} () \textcolor{keyword}{const} = 0; }
+\DoxyCodeLine{191 \textcolor{keyword}{virtual} \mbox{\hyperlink{classxb_1_1xbXBase}{xbXBase}} *GetXbasePtr () \textcolor{keyword}{const}; \textcolor{comment}{// return xbase pointer}}
+\DoxyCodeLine{192 }
+\DoxyCodeLine{193 \textcolor{keyword}{virtual} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} \mbox{\hyperlink{classxb_1_1xbDbf_ac856fc1b110b46aefa1b2f5c0f530aa2}{MemoFieldsExist}} () \textcolor{keyword}{const};}
+\DoxyCodeLine{194 }
+\DoxyCodeLine{195 \textcolor{keyword}{virtual} xbInt16 \mbox{\hyperlink{classxb_1_1xbDbf_a97366c7362e409d7f09973a6aef8dad0}{Open}} ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName );}
+\DoxyCodeLine{196 \textcolor{keyword}{virtual} xbInt16 \mbox{\hyperlink{classxb_1_1xbDbf_ac658818bf9b8f8ff7467d8d80495b324}{Open}} ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sAlias );}
+\DoxyCodeLine{197 \textcolor{keyword}{virtual} xbInt16 \mbox{\hyperlink{classxb_1_1xbDbf_a4d018cbf44d8d8b2145c9acab02c8adf}{Open}} ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sAlias, xbInt16 iOpenMode, xbInt16 iShareMode ) = 0;}
+\DoxyCodeLine{198 \textcolor{keyword}{virtual} xbInt16 Pack ();}
+\DoxyCodeLine{199 \textcolor{keyword}{virtual} xbInt16 Pack ( xbUInt32 \&ulDeletedRecCnt );}
+\DoxyCodeLine{200 }
+\DoxyCodeLine{201 }
+\DoxyCodeLine{202 \textcolor{keyword}{virtual} xbInt16 PutRecord (); \textcolor{comment}{// Put record to current location}}
+\DoxyCodeLine{203 \textcolor{keyword}{virtual} xbInt16 PutRecord ( xbUInt32 ulRecNo );}
+\DoxyCodeLine{204 \textcolor{keyword}{virtual} xbInt16 ReadHeader ( xbInt16 iFilePositionOption, xbInt16 iReadOption );}
+\DoxyCodeLine{205 \textcolor{keyword}{virtual} xbInt16 RecordDeleted ( xbInt16 iOpt = 0 ) \textcolor{keyword}{const};}
+\DoxyCodeLine{206 }
+\DoxyCodeLine{207 \textcolor{keyword}{virtual} xbInt16 SetAutoCommit ( xbInt16 iAutoCommit );}
+\DoxyCodeLine{208 }
+\DoxyCodeLine{209 \textcolor{keyword}{virtual} xbInt16 UndeleteAllRecords();}
+\DoxyCodeLine{210 \textcolor{keyword}{virtual} xbInt16 UndeleteRecord ();}
+\DoxyCodeLine{211 \textcolor{keyword}{virtual} xbInt16 Zap ();}
+\DoxyCodeLine{212 }
+\DoxyCodeLine{213 }
+\DoxyCodeLine{214 \textcolor{comment}{/* field methods */}}
+\DoxyCodeLine{215 \textcolor{comment}{//virtual xbInt16 GetRawField( xbInt16 iFieldNo, char *Buf, xbUInt32 BufSize, xbInt16 iRecBufSw ) const;}}
+\DoxyCodeLine{216 \textcolor{keyword}{virtual} xbInt16 GetField(xbInt16 iFieldNo, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldValue, xbInt16 iRecBufSw ) \textcolor{keyword}{const};}
+\DoxyCodeLine{217 \textcolor{keyword}{virtual} xbInt16 GetField(xbInt16 iFieldNo, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldValue) \textcolor{keyword}{const};}
+\DoxyCodeLine{218 \textcolor{keyword}{virtual} xbInt16 GetField(\textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldValue) \textcolor{keyword}{const};}
+\DoxyCodeLine{219 \textcolor{keyword}{virtual} xbInt16 GetFieldDecimal( xbInt16 iFieldNo, xbInt16 \&iFieldDecimal ) \textcolor{keyword}{const};}
+\DoxyCodeLine{220 \textcolor{keyword}{virtual} xbInt16 GetFieldDecimal( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, xbInt16 \&iFieldDecimal ) \textcolor{keyword}{const};}
+\DoxyCodeLine{221 \textcolor{keyword}{virtual} xbInt16 GetFieldLen( xbInt16 iFieldNo, xbInt16 \&iFieldLen ) \textcolor{keyword}{const};}
+\DoxyCodeLine{222 \textcolor{keyword}{virtual} xbInt16 GetFieldLen( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, xbInt16 \&iFieldLen ) \textcolor{keyword}{const};}
+\DoxyCodeLine{223 \textcolor{keyword}{virtual} xbInt16 GetFieldName( xbInt16 iFieldNo, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName ) \textcolor{keyword}{const};}
+\DoxyCodeLine{224 }
+\DoxyCodeLine{225 \textcolor{keyword}{virtual} xbInt16 GetFieldNo( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, xbInt16 \&iFieldNo ) \textcolor{keyword}{const};}
+\DoxyCodeLine{226 \textcolor{keyword}{virtual} xbInt16 GetFieldNo( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName ) \textcolor{keyword}{const};}
+\DoxyCodeLine{227 }
+\DoxyCodeLine{228 \textcolor{keyword}{virtual} xbInt16 GetFieldType( xbInt16 iFieldNo, \textcolor{keywordtype}{char} \&cFieldType ) \textcolor{keyword}{const};}
+\DoxyCodeLine{229 \textcolor{keyword}{virtual} xbInt16 GetFieldType( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \textcolor{keywordtype}{char} \&cFieldType ) \textcolor{keyword}{const};}
+\DoxyCodeLine{230 \textcolor{keyword}{virtual} xbInt16 PutField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldData );}
+\DoxyCodeLine{231 \textcolor{keyword}{virtual} xbInt16 PutField( xbInt16 iFieldNo, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldData );}
+\DoxyCodeLine{232 }
+\DoxyCodeLine{233 \textcolor{keyword}{virtual} xbInt16 PutLogicalField( xbInt16 iFieldNo, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldData );}
+\DoxyCodeLine{234 \textcolor{keyword}{virtual} xbInt16 PutLogicalField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldData );}
+\DoxyCodeLine{235 \textcolor{keyword}{virtual} xbInt16 GetLogicalField( xbInt16 iFieldNo, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldData ) \textcolor{keyword}{const};}
+\DoxyCodeLine{236 \textcolor{keyword}{virtual} xbInt16 GetLogicalField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldData) \textcolor{keyword}{const};}
+\DoxyCodeLine{237 }
+\DoxyCodeLine{238 \textcolor{keyword}{virtual} xbInt16 PutLogicalField( xbInt16 iFieldNo, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bFieldData );}
+\DoxyCodeLine{239 \textcolor{keyword}{virtual} xbInt16 PutLogicalField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bFieldData );}
+\DoxyCodeLine{240 \textcolor{keyword}{virtual} xbInt16 GetLogicalField( xbInt16 iFieldNo, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} \&bFieldData ) \textcolor{keyword}{const};}
+\DoxyCodeLine{241 \textcolor{keyword}{virtual} xbInt16 GetLogicalField( xbInt16 iFieldNo, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} \&bFieldData, xbInt16 iRecBufSw ) \textcolor{keyword}{const};}
+\DoxyCodeLine{242 \textcolor{keyword}{virtual} xbInt16 GetLogicalField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} \&bFieldData) \textcolor{keyword}{const};}
+\DoxyCodeLine{243 }
+\DoxyCodeLine{244 \textcolor{keyword}{virtual} xbInt16 GetLongField( xbInt16 iFieldNo, xbInt32 \&lFieldValue ) \textcolor{keyword}{const};}
+\DoxyCodeLine{245 \textcolor{keyword}{virtual} xbInt16 GetLongField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, xbInt32 \&lFieldValue ) \textcolor{keyword}{const};}
+\DoxyCodeLine{246 \textcolor{keyword}{virtual} xbInt16 PutLongField( xbInt16 iFieldNo, xbInt32 lFieldValue );}
+\DoxyCodeLine{247 \textcolor{keyword}{virtual} xbInt16 PutLongField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldNo, xbInt32 lFieldValue );}
+\DoxyCodeLine{248 }
+\DoxyCodeLine{249 \textcolor{keyword}{virtual} xbInt16 GetULongField( xbInt16 iFieldNo, xbUInt32 \&lFieldValue ) \textcolor{keyword}{const};}
+\DoxyCodeLine{250 \textcolor{keyword}{virtual} xbInt16 GetULongField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, xbUInt32 \&lFieldValue ) \textcolor{keyword}{const};}
+\DoxyCodeLine{251 \textcolor{keyword}{virtual} xbInt16 PutULongField( xbInt16 iFieldNo, xbUInt32 lFieldValue );}
+\DoxyCodeLine{252 \textcolor{keyword}{virtual} xbInt16 PutULongField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldNo, xbUInt32 lFieldValue );}
+\DoxyCodeLine{253 }
+\DoxyCodeLine{254 \textcolor{keyword}{virtual} xbInt16 GetDoubleField( xbInt16 FieldNo, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dFieldValue ) \textcolor{keyword}{const};}
+\DoxyCodeLine{255 \textcolor{keyword}{virtual} xbInt16 GetDoubleField( xbInt16 FieldNo, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dFieldValue, xbInt16 iRecBufSw ) \textcolor{keyword}{const};}
+\DoxyCodeLine{256 \textcolor{keyword}{virtual} xbInt16 GetDoubleField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dFieldValue ) \textcolor{keyword}{const};}
+\DoxyCodeLine{257 \textcolor{keyword}{virtual} xbInt16 PutDoubleField( xbInt16 FieldNo, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dFieldValue );}
+\DoxyCodeLine{258 \textcolor{keyword}{virtual} xbInt16 PutDoubleField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&FieldName, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dFieldValue );}
+\DoxyCodeLine{259 }
+\DoxyCodeLine{260 \textcolor{keyword}{virtual} xbInt16 GetFloatField( xbInt16 iFieldNo, \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xbFloat}} \&fFieldValue ) \textcolor{keyword}{const};}
+\DoxyCodeLine{261 \textcolor{keyword}{virtual} xbInt16 GetFloatField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xbFloat}} \&fFieldValue ) \textcolor{keyword}{const};}
+\DoxyCodeLine{262 \textcolor{keyword}{virtual} xbInt16 PutFloatField( xbInt16 iFieldNo, \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xbFloat}} fFieldValue );}
+\DoxyCodeLine{263 \textcolor{keyword}{virtual} xbInt16 PutFloatField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xbFloat}} fFieldValue );}
+\DoxyCodeLine{264 }
+\DoxyCodeLine{265 \textcolor{keyword}{virtual} xbInt16 GetDateField( xbInt16 iFieldNo, \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dt ) \textcolor{keyword}{const};}
+\DoxyCodeLine{266 \textcolor{keyword}{virtual} xbInt16 GetDateField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dt ) \textcolor{keyword}{const};}
+\DoxyCodeLine{267 \textcolor{keyword}{virtual} xbInt16 PutDateField( xbInt16 iFieldNo, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dt );}
+\DoxyCodeLine{268 \textcolor{keyword}{virtual} xbInt16 PutDateField( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dt );}
+\DoxyCodeLine{269 }
+\DoxyCodeLine{270 }
+\DoxyCodeLine{271 }
+\DoxyCodeLine{272 \textcolor{preprocessor}{ \#ifdef XB\_MEMO\_SUPPORT}}
+\DoxyCodeLine{273 \textcolor{keyword}{virtual} xbInt16 GetMemoFieldCnt () \textcolor{keyword}{const};}
+\DoxyCodeLine{274 \textcolor{keyword}{virtual} xbMemo *GetMemoPtr ();}
+\DoxyCodeLine{275 \textcolor{keyword}{virtual} xbUInt32 GetCreateMemoBlockSize() \textcolor{keyword}{const};}
+\DoxyCodeLine{276 \textcolor{keyword}{virtual} xbInt16 GetMemoField ( xbInt16 iFldNo, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sMemoData );}
+\DoxyCodeLine{277 \textcolor{keyword}{virtual} xbInt16 GetMemoField ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \& sFldName, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sMemoData );}
+\DoxyCodeLine{278 \textcolor{keyword}{virtual} xbInt16 GetMemoFieldLen ( xbInt16 iFldNo, xbUInt32 \&ullMemoFieldLen );}
+\DoxyCodeLine{279 \textcolor{keyword}{virtual} xbInt16 GetMemoFieldLen ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \& sFldName, xbUInt32 \&ulMemoFieldLen );}
+\DoxyCodeLine{280 \textcolor{keyword}{virtual} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} MemoFieldExists ( xbInt16 iFieldNo ) \textcolor{keyword}{const};}
+\DoxyCodeLine{281 \textcolor{keyword}{virtual} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} MemoFieldExists ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFieldName ) \textcolor{keyword}{const};}
+\DoxyCodeLine{282 \textcolor{keyword}{virtual} xbInt16 SetCreateMemoBlockSize( xbUInt32 ulBlockSize ) = 0;}
+\DoxyCodeLine{283 \textcolor{keyword}{virtual} xbInt16 UpdateMemoField ( xbInt16 iFldNo, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sMemoData );}
+\DoxyCodeLine{284 \textcolor{keyword}{virtual} xbInt16 UpdateMemoField ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \& sFldName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sMemoData );}
+\DoxyCodeLine{285 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_MEMO\_SUPPORT}}
+\DoxyCodeLine{286 }
+\DoxyCodeLine{287 }
+\DoxyCodeLine{288 \textcolor{preprocessor}{ \#ifdef XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{289 \textcolor{keyword}{virtual} xbInt16 LockTable ( xbInt16 iLockFunction );}
+\DoxyCodeLine{290 \textcolor{keyword}{virtual} xbInt16 LockRecord ( xbInt16 iLockFunction, xbUInt32 ulRecNo );}
+\DoxyCodeLine{291 \textcolor{keyword}{virtual} xbInt16 LockAppend ( xbInt16 iLockFunction );}
+\DoxyCodeLine{292 \textcolor{keyword}{virtual} xbInt16 LockHeader ( xbInt16 iLockFunction );}
+\DoxyCodeLine{293 }
+\DoxyCodeLine{294 \textcolor{preprocessor}{ \#ifdef XB\_MEMO\_SUPPORT}}
+\DoxyCodeLine{295 \textcolor{keyword}{virtual} xbInt16 LockMemo ( xbInt16 iLockFunction );}
+\DoxyCodeLine{296 \textcolor{keyword}{virtual} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetMemoLocked () \textcolor{keyword}{const}; }
+\DoxyCodeLine{297 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_MEMO\_LOCK}}
+\DoxyCodeLine{298 }
+\DoxyCodeLine{299 \textcolor{preprocessor}{ \#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{300 \textcolor{keyword}{virtual} xbInt16 LockIndices ( xbInt16 iLockFunction );}
+\DoxyCodeLine{301 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{302 }
+\DoxyCodeLine{303 xbInt16 GetAutoLock () \textcolor{keyword}{const};}
+\DoxyCodeLine{304 \textcolor{keywordtype}{void} SetAutoLock ( xbInt16 iAutoLock );}
+\DoxyCodeLine{305 xbInt16 GetLockFlavor () \textcolor{keyword}{const};}
+\DoxyCodeLine{306 \textcolor{keywordtype}{void} SetLockFlavor ( xbInt16 iLockFlavor );}
+\DoxyCodeLine{307 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetTableLocked () \textcolor{keyword}{const};}
+\DoxyCodeLine{308 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetHeaderLocked () \textcolor{keyword}{const};}
+\DoxyCodeLine{309 xbUInt32 GetAppendLocked () \textcolor{keyword}{const};}
+\DoxyCodeLine{310 xbLinkListNode<xbUInt32> * GetFirstRecLock () \textcolor{keyword}{const};}
+\DoxyCodeLine{311 }
+\DoxyCodeLine{312 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{313 \textcolor{keywordtype}{void} DumpTableLockStatus() \textcolor{keyword}{const};}
+\DoxyCodeLine{314 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{315 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{316 }
+\DoxyCodeLine{317 }
+\DoxyCodeLine{318 \textcolor{preprocessor}{ \#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{319 \textcolor{keyword}{virtual} xbInt16 CloseIndexFile( xbIx *pIx );}
+\DoxyCodeLine{320 \textcolor{keyword}{virtual} xbInt16 CreateTag( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIxType, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sKey, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFilter, }
+\DoxyCodeLine{321 xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverLay, xbIx **xbIxOut, \textcolor{keywordtype}{void} **vpTagOut );}
+\DoxyCodeLine{322 \textcolor{keyword}{virtual} xbInt16 DeleteTag( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIxType, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sName );}
+\DoxyCodeLine{323 \textcolor{keyword}{virtual} xbInt16 DeleteAllIndexFiles();}
+\DoxyCodeLine{324 \textcolor{keyword}{virtual} xbInt16 Find( \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sKey );}
+\DoxyCodeLine{325 \textcolor{keyword}{virtual} xbInt16 Find( \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dtKey );}
+\DoxyCodeLine{326 \textcolor{keyword}{virtual} xbInt16 Find( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dKey );}
+\DoxyCodeLine{327 \textcolor{keyword}{virtual} xbIx *GetCurIx() \textcolor{keyword}{const};}
+\DoxyCodeLine{328 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} *GetCurTag() \textcolor{keyword}{const};}
+\DoxyCodeLine{329 }
+\DoxyCodeLine{330 \textcolor{keyword}{virtual} xbInt16 GetFirstKey();}
+\DoxyCodeLine{331 \textcolor{keyword}{virtual} xbInt16 GetNextKey();}
+\DoxyCodeLine{332 \textcolor{keyword}{virtual} xbInt16 GetPrevKey();}
+\DoxyCodeLine{333 \textcolor{keyword}{virtual} xbInt16 GetLastKey();}
+\DoxyCodeLine{334 }
+\DoxyCodeLine{335 \textcolor{keyword}{virtual} \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&GetCurIxType() \textcolor{keyword}{const};}
+\DoxyCodeLine{336 \textcolor{keyword}{virtual} \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&GetCurTagName() \textcolor{keyword}{const};}
+\DoxyCodeLine{337 \textcolor{keyword}{virtual} xbIxList *GetIxList() \textcolor{keyword}{const};}
+\DoxyCodeLine{338 xbLinkListNode<xbTag *> *GetTagList () \textcolor{keyword}{const};}
+\DoxyCodeLine{339 \textcolor{keyword}{virtual} xbInt16 OpenIndex( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIxType, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIndexName );}
+\DoxyCodeLine{340 \textcolor{keyword}{virtual} xbInt16 SetCurTag( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTagName );}
+\DoxyCodeLine{341 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} SetCurTag( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIxType, xbIx *pIx, \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{342 }
+\DoxyCodeLine{343 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{344 \textcolor{keyword}{virtual} xbInt16 CheckTagIntegrity( xbInt16 iTagOpt, xbInt16 iOutputOpt );}
+\DoxyCodeLine{345 \textcolor{keyword}{virtual} xbInt16 Reindex( xbInt16 iTagOpt );}
+\DoxyCodeLine{346 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{347 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{348 }
+\DoxyCodeLine{349 \textcolor{preprocessor}{ \#ifdef XB\_NDXINF\_SUPPORT}}
+\DoxyCodeLine{350 \textcolor{keyword}{virtual} xbInt16 AssociateIndex( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sType, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sName, xbInt16 iOption );}
+\DoxyCodeLine{351 xbLinkListNode<xbString> *GetNdxInfList() \textcolor{keyword}{const};}
+\DoxyCodeLine{352 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_NDXINF\_SUPPORT}}
+\DoxyCodeLine{353 }
+\DoxyCodeLine{354 \textcolor{comment}{//\#ifdef XB\_MDX\_SUPPORT}}
+\DoxyCodeLine{355 \textcolor{comment}{//virtual xbInt16 GetCreateMdxBlockSize() const;}}
+\DoxyCodeLine{356 \textcolor{comment}{//virtual xbInt16 SetCreateMdxBlockSize( xbInt16 ulBlockSize );}}
+\DoxyCodeLine{357 \textcolor{comment}{//\#endif}}
+\DoxyCodeLine{358 }
+\DoxyCodeLine{359 }
+\DoxyCodeLine{360 }
+\DoxyCodeLine{361 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{362 \textcolor{preprocessor}{ \#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{363 \textcolor{keyword}{friend} \textcolor{keyword}{class }xbIx;}
+\DoxyCodeLine{364 \textcolor{keyword}{friend} \textcolor{keyword}{class }xbIxMdx;}
+\DoxyCodeLine{365 }
+\DoxyCodeLine{366 xbInt16 AddIndex( xbIx *ix, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFmt );}
+\DoxyCodeLine{367 \textcolor{keywordtype}{void} ClearTagList();}
+\DoxyCodeLine{368 \textcolor{keyword}{virtual} xbInt16 GetNdxInfFileName( \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sNdxIdxFileName );}
+\DoxyCodeLine{369 xbInt16 RemoveIndex( xbIx * ix );}
+\DoxyCodeLine{370 \textcolor{keywordtype}{void} UpdateSchemaIxFlag( xbInt16 iFldNo, \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} cVal );}
+\DoxyCodeLine{371 \textcolor{keyword}{virtual} xbInt16 UpdateTagList ();}
+\DoxyCodeLine{372 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{373 }
+\DoxyCodeLine{374 }
+\DoxyCodeLine{375 }
+\DoxyCodeLine{376 \textcolor{preprocessor}{ \#ifdef XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{377 \textcolor{keywordtype}{void} SetHeaderLocked ( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bTableLocked );}
+\DoxyCodeLine{378 \textcolor{keywordtype}{void} SetTableLocked ( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bTableLocked );}
+\DoxyCodeLine{379 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_LOCKING\_SUPORT}}
+\DoxyCodeLine{380 }
+\DoxyCodeLine{381 \textcolor{preprocessor}{ \#ifdef XB\_MEMO\_SUPPORT}}
+\DoxyCodeLine{382 xbInt16 iMemoFieldCnt; \textcolor{comment}{// Memo field cnt in the table}}
+\DoxyCodeLine{383 xbMemo *Memo; \textcolor{comment}{// Pointer to memo class}}
+\DoxyCodeLine{384 xbUInt32 ulCreateMemoBlockSize; \textcolor{comment}{// blocksize to use when creating dbt file}}
+\DoxyCodeLine{385 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{386 }
+\DoxyCodeLine{387 \textcolor{preprocessor}{ \#ifdef XB\_NDXINF\_SUPPORT}}
+\DoxyCodeLine{388 \textcolor{keyword}{virtual} xbInt16 DeleteNdxInfData();}
+\DoxyCodeLine{389 \textcolor{keyword}{virtual} xbInt16 LoadNdxInfData();}
+\DoxyCodeLine{390 \textcolor{keyword}{virtual} xbInt16 SaveNdxInfData();}
+\DoxyCodeLine{391 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_NDXINF\_SUPPORT}}
+\DoxyCodeLine{392 }
+\DoxyCodeLine{393 \textcolor{comment}{/*}}
+\DoxyCodeLine{394 \textcolor{comment}{ \#ifdef XB\_MDX\_SUPPORT}}
+\DoxyCodeLine{395 \textcolor{comment}{ xbInt16 iCreateMdxBlockSize;}}
+\DoxyCodeLine{396 \textcolor{comment}{ \#endif // XB\_MDX\_SUPPORT}}
+\DoxyCodeLine{397 \textcolor{comment}{*/}}
+\DoxyCodeLine{398 }
+\DoxyCodeLine{399 \textcolor{keyword}{virtual} xbInt16 GetRawField( xbInt16 iFieldNo, \textcolor{keywordtype}{char} *Buf, xbUInt32 BufSize, xbInt16 iRecBufSw ) \textcolor{keyword}{const};}
+\DoxyCodeLine{400 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} InitVars(); }
+\DoxyCodeLine{401 \textcolor{keyword}{virtual} xbInt16 SetVersion() = 0;}
+\DoxyCodeLine{402 \textcolor{keyword}{virtual} xbInt16 ValidateSchema( \mbox{\hyperlink{structxb_1_1xbSchema}{xbSchema}} * s ) = 0;}
+\DoxyCodeLine{403 xbInt16 WriteHeader( xbInt16 iPositionOption, xbInt16 iWriteOption );}
+\DoxyCodeLine{404 }
+\DoxyCodeLine{405 }
+\DoxyCodeLine{406 xbUInt32 ulCurRec; \textcolor{comment}{// Current record or zero}}
+\DoxyCodeLine{407 xbInt16 iAutoCommit; \textcolor{comment}{// Auto commit updates if not explicitly performed before moving off record?}}
+\DoxyCodeLine{408 \textcolor{comment}{// -\/1 -\/-\/> Use DBMS default}}
+\DoxyCodeLine{409 \textcolor{comment}{// 0 -\/-\/> No auto update on this table, regardless of DBMS setting}}
+\DoxyCodeLine{410 \textcolor{comment}{// 1 -\/-\/> Auto update on this table, regardless of DBMS setting}}
+\DoxyCodeLine{411 }
+\DoxyCodeLine{412 xbInt16 iFileVersion; \textcolor{comment}{// xBase file version -\/ which class is in play}}
+\DoxyCodeLine{413 }
+\DoxyCodeLine{414 }
+\DoxyCodeLine{415 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} sAlias; \textcolor{comment}{// table alias}}
+\DoxyCodeLine{416 xbInt16 iNoOfFields;}
+\DoxyCodeLine{417 xbInt16 iDbfStatus; \textcolor{comment}{// 0 = closed}}
+\DoxyCodeLine{418 \textcolor{comment}{// 1 = open}}
+\DoxyCodeLine{419 \textcolor{comment}{// 2 = updates pending}}
+\DoxyCodeLine{420 }
+\DoxyCodeLine{421 xbSchemaRec *SchemaPtr; \textcolor{comment}{// Pointer to field data}}
+\DoxyCodeLine{422 \textcolor{keywordtype}{char} *RecBuf; \textcolor{comment}{// Pointer to record buffer}}
+\DoxyCodeLine{423 \textcolor{keywordtype}{char} *RecBuf2; \textcolor{comment}{// Pointer to original rec buf}}
+\DoxyCodeLine{424 }
+\DoxyCodeLine{425 }
+\DoxyCodeLine{426 \textcolor{comment}{/* Next several variables are database header fields, up through dbase V */}}
+\DoxyCodeLine{427 \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} cVersion;}
+\DoxyCodeLine{428 \textcolor{keywordtype}{char} cUpdateYY;}
+\DoxyCodeLine{429 \textcolor{keywordtype}{char} cUpdateMM;}
+\DoxyCodeLine{430 \textcolor{keywordtype}{char} cUpdateDD;}
+\DoxyCodeLine{431 xbUInt32 ulNoOfRecs;}
+\DoxyCodeLine{432 xbUInt16 uiHeaderLen;}
+\DoxyCodeLine{433 xbUInt16 uiRecordLen;}
+\DoxyCodeLine{434 \textcolor{keywordtype}{char} cTransactionFlag;}
+\DoxyCodeLine{435 \textcolor{keywordtype}{char} cEncryptionFlag;}
+\DoxyCodeLine{436 \textcolor{keywordtype}{char} cIndexFlag;}
+\DoxyCodeLine{437 \textcolor{keywordtype}{char} cLangDriver; \textcolor{comment}{// dbase 7 sets to 1B}}
+\DoxyCodeLine{438 }
+\DoxyCodeLine{439 }
+\DoxyCodeLine{440 }
+\DoxyCodeLine{441 \textcolor{keyword}{private}:}
+\DoxyCodeLine{442 \textcolor{keywordtype}{void} ResetNoOfRecords(); }
+\DoxyCodeLine{443 }
+\DoxyCodeLine{444 }
+\DoxyCodeLine{445 \textcolor{preprocessor}{\#ifdef XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{446 xbInt16 iAutoLock; \textcolor{comment}{// 0 -\/ autolock off, 1 -\/ autolock on}}
+\DoxyCodeLine{447 xbInt16 iLockFlavor;}
+\DoxyCodeLine{448 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bTableLocked; \textcolor{comment}{// is the table locked}}
+\DoxyCodeLine{449 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bHeaderLocked; \textcolor{comment}{// is the header locked}}
+\DoxyCodeLine{450 xbUInt32 ulAppendLocked; \textcolor{comment}{// record number of the new record for the append lock operation}}
+\DoxyCodeLine{451 xbLinkListOrd<xbUInt32> lloRecLocks; \textcolor{comment}{// ordered link list of locked records}}
+\DoxyCodeLine{452 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{453 }
+\DoxyCodeLine{454 }
+\DoxyCodeLine{455 \textcolor{preprocessor}{\#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{456 xbIxList *ixList; \textcolor{comment}{// pointer to a list of indices associated with the table}}
+\DoxyCodeLine{457 \textcolor{comment}{// \#ifdef XB\_MDX\_SUPPORT}}
+\DoxyCodeLine{458 \textcolor{comment}{// xbIx *ixMdx; // pointer to production multi-\/tag index file}}
+\DoxyCodeLine{459 \textcolor{comment}{// \#endif}}
+\DoxyCodeLine{460 xbIx *pCurIx; \textcolor{comment}{// Pointer to current index class}}
+\DoxyCodeLine{461 \textcolor{keywordtype}{void} *vpCurIxTag; \textcolor{comment}{// Pointer to current tag}}
+\DoxyCodeLine{462 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} sCurIxType; \textcolor{comment}{// Current index type}}
+\DoxyCodeLine{463 xbLinkList<xbTag *> llTags; \textcolor{comment}{// linked list of open tags}}
+\DoxyCodeLine{464 }
+\DoxyCodeLine{465 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{466 }
+\DoxyCodeLine{467 \textcolor{preprocessor}{\#ifdef XB\_NDXINF\_SUPPORT}}
+\DoxyCodeLine{468 xbLinkList<xbString> llNdxInfData; \textcolor{comment}{// linked list of strings containing ndx file entries}}
+\DoxyCodeLine{469 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_NDXINF\_SUPPORT}}
+\DoxyCodeLine{470 }
+\DoxyCodeLine{471 }
+\DoxyCodeLine{472 \};}
+\DoxyCodeLine{473 }
+\DoxyCodeLine{474 }
+\DoxyCodeLine{475 \textcolor{preprocessor}{\#ifdef XB\_DBF3\_SUPPORT}}
+\DoxyCodeLine{477 }
+\DoxyCodeLine{483 \textcolor{keyword}{class }XBDLLEXPORT xbDbf3 : \textcolor{keyword}{public} \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} \{}
+\DoxyCodeLine{484 \textcolor{keyword}{public}:}
+\DoxyCodeLine{485 xbDbf3(\mbox{\hyperlink{classxb_1_1xbXBase}{xbXBase}} *x);}
+\DoxyCodeLine{486 \string~xbDbf3();}
+\DoxyCodeLine{487 \textcolor{keyword}{virtual} xbInt16 CreateTable ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sAlias, \mbox{\hyperlink{structxb_1_1xbSchema}{xbSchema}} *, xbInt16 iOverlay, xbInt16 iShareMode );}
+\DoxyCodeLine{488 \textcolor{keyword}{virtual} xbInt16 GetVersion () \textcolor{keyword}{const};}
+\DoxyCodeLine{489 \textcolor{keyword}{virtual} xbInt16 Open ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sAlias, xbInt16 iOpenMode, xbInt16 iShareMode );}
+\DoxyCodeLine{490 }
+\DoxyCodeLine{491 \textcolor{preprocessor}{ \#ifdef XB\_MEMO\_SUPPORT}}
+\DoxyCodeLine{492 \textcolor{keyword}{virtual} xbInt16 SetCreateMemoBlockSize( xbUInt32 iBlockSize );}
+\DoxyCodeLine{493 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{494 }
+\DoxyCodeLine{495 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{496 xbInt16 SetVersion ();}
+\DoxyCodeLine{497 \textcolor{keyword}{virtual} xbInt16 ValidateSchema( \mbox{\hyperlink{structxb_1_1xbSchema}{xbSchema}} *s );}
+\DoxyCodeLine{498 }
+\DoxyCodeLine{499 \textcolor{keyword}{private}:}
+\DoxyCodeLine{500 }
+\DoxyCodeLine{501 \};}
+\DoxyCodeLine{502 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* XB\_DBF3\_SUPPORT */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{503 }
+\DoxyCodeLine{504 }
+\DoxyCodeLine{505 \textcolor{preprocessor}{\#ifdef XB\_DBF4\_SUPPORT}}
+\DoxyCodeLine{507 }
+\DoxyCodeLine{512 \textcolor{keyword}{class }XBDLLEXPORT xbDbf4 : \textcolor{keyword}{public} \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} \{}
+\DoxyCodeLine{513 \textcolor{keyword}{public}:}
+\DoxyCodeLine{514 xbDbf4( \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xbXBase}} *x );}
+\DoxyCodeLine{515 }
+\DoxyCodeLine{516 \string~xbDbf4();}
+\DoxyCodeLine{517 }
+\DoxyCodeLine{518 \textcolor{keyword}{virtual} xbInt16 CreateTable ( \textcolor{keyword}{const} xbString \&sTableName, \textcolor{keyword}{const} xbString \&sAlias, xbSchema *, xbInt16 iOverlay, xbInt16 iShareMode );}
+\DoxyCodeLine{519 \textcolor{keyword}{virtual} xbInt16 GetVersion () \textcolor{keyword}{const};}
+\DoxyCodeLine{520 \textcolor{keyword}{virtual} xbInt16 Open ( \textcolor{keyword}{const} xbString \&sTableName, \textcolor{keyword}{const} xbString \&sAlias, xbInt16 iOpenMode, xbInt16 iShareMode );}
+\DoxyCodeLine{521 }
+\DoxyCodeLine{522 \textcolor{preprocessor}{ \#ifdef XB\_MEMO\_SUPPORT}}
+\DoxyCodeLine{523 \textcolor{keyword}{virtual} xbInt16 SetCreateMemoBlockSize( xbUInt32 iBlockSize );}
+\DoxyCodeLine{524 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{525 }
+\DoxyCodeLine{526 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{527 \textcolor{comment}{// void InitVars ();}}
+\DoxyCodeLine{528 xbInt16 SetVersion();}
+\DoxyCodeLine{529 \textcolor{keyword}{virtual} xbInt16 ValidateSchema ( xbSchema *s );}
+\DoxyCodeLine{530 }
+\DoxyCodeLine{531 \textcolor{keyword}{private}:}
+\DoxyCodeLine{532 }
+\DoxyCodeLine{533 \};}
+\DoxyCodeLine{534 }
+\DoxyCodeLine{535 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* XB\_DBF4\_SUPPORT */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{536 }
+\DoxyCodeLine{537 \} \textcolor{comment}{/* namespace xb */}}
+\DoxyCodeLine{538 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_DBF\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbdrpix_8cpp.tex b/docs/doxygen/latex/xbdrpix_8cpp.tex
new file mode 100644
index 0000000..5e24367
--- /dev/null
+++ b/docs/doxygen/latex/xbdrpix_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbdrpix_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/sql/xbdrpix.cpp File Reference}
+\label{xbdrpix_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbdrpix.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbdrpix.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbdrptbl_8cpp.tex b/docs/doxygen/latex/xbdrptbl_8cpp.tex
new file mode 100644
index 0000000..95f12a7
--- /dev/null
+++ b/docs/doxygen/latex/xbdrptbl_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbdrptbl_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/sql/xbdrptbl.cpp File Reference}
+\label{xbdrptbl_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbdrptbl.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbdrptbl.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbexp_8cpp.tex b/docs/doxygen/latex/xbexp_8cpp.tex
new file mode 100644
index 0000000..f8439bc
--- /dev/null
+++ b/docs/doxygen/latex/xbexp_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbexp_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbexp.cpp File Reference}
+\label{xbexp_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbexp.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbexp.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbexp_8h.tex b/docs/doxygen/latex/xbexp_8h.tex
new file mode 100644
index 0000000..edcfc3d
--- /dev/null
+++ b/docs/doxygen/latex/xbexp_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xbexp_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbexp.h File Reference}
+\label{xbexp_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbexp.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbexp.h}}
diff --git a/docs/doxygen/latex/xbexp_8h_source.tex b/docs/doxygen/latex/xbexp_8h_source.tex
new file mode 100644
index 0000000..7801e11
--- /dev/null
+++ b/docs/doxygen/latex/xbexp_8h_source.tex
@@ -0,0 +1,164 @@
+\hypertarget{xbexp_8h_source}{}\doxysection{xbexp.\+h}
+\label{xbexp_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbexp.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbexp.h}}
+\mbox{\hyperlink{xbexp_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbexp.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_EXP\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_EXP\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 }
+\DoxyCodeLine{21 \textcolor{comment}{// \#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{22 \textcolor{comment}{// \#pragma interface}}
+\DoxyCodeLine{23 \textcolor{comment}{// \#endif}}
+\DoxyCodeLine{24 }
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{preprocessor}{\#ifdef XB\_FUNCTION\_SUPPORT}}
+\DoxyCodeLine{28 \textcolor{preprocessor}{\#define XB\_EXP\_CHAR 'C'}}
+\DoxyCodeLine{29 \textcolor{preprocessor}{\#define XB\_EXP\_DATE 'D'}}
+\DoxyCodeLine{30 \textcolor{preprocessor}{\#define XB\_EXP\_LOGICAL 'L'}}
+\DoxyCodeLine{31 \textcolor{preprocessor}{\#define XB\_EXP\_NUMERIC 'N'}}
+\DoxyCodeLine{32 \textcolor{preprocessor}{\#define XB\_EXP\_UNKNOWN 'U'}}
+\DoxyCodeLine{33 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{34 }
+\DoxyCodeLine{35 \textcolor{preprocessor}{\#ifdef XB\_EXPRESSION\_SUPPORT}}
+\DoxyCodeLine{36 }
+\DoxyCodeLine{37 \textcolor{preprocessor}{\#define XB\_EXP\_CONSTANT 'C'}}
+\DoxyCodeLine{38 \textcolor{preprocessor}{\#define XB\_EXP\_FUNCTION 'F'}}
+\DoxyCodeLine{39 \textcolor{preprocessor}{\#define XB\_EXP\_FIELD 'D'}}
+\DoxyCodeLine{40 \textcolor{preprocessor}{\#define XB\_EXP\_OPERATOR 'O'}}
+\DoxyCodeLine{41 \textcolor{preprocessor}{\#define XB\_EXP\_NOTROOT 'N' }\textcolor{comment}{// not root node, needs further parsing}}
+\DoxyCodeLine{42 \textcolor{preprocessor}{\#define XB\_EXP\_PRE\_OPERATOR 'B' }\textcolor{comment}{// (B)efore) pre increment, pre decrement}}
+\DoxyCodeLine{43 \textcolor{preprocessor}{\#define XB\_EXP\_POST\_OPERATOR 'A' }\textcolor{comment}{// (A)fter) post increment, pre decrement}}
+\DoxyCodeLine{44 }
+\DoxyCodeLine{45 \textcolor{preprocessor}{\#define XB\_END\_OF\_EXPRESSION -\/100}}
+\DoxyCodeLine{46 }
+\DoxyCodeLine{47 \textcolor{comment}{// \#define XB\_UNBALANCED\_PARENS -\/101}}
+\DoxyCodeLine{48 \textcolor{comment}{// \#define XB\_UNBALANCED\_QUOTES -\/102}}
+\DoxyCodeLine{49 }
+\DoxyCodeLine{50 }
+\DoxyCodeLine{51 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{52 }
+\DoxyCodeLine{54 \textcolor{keyword}{struct }XBDLLEXPORT xbExpToken \{}
+\DoxyCodeLine{55 xbString sExpression; \textcolor{comment}{// in -\/ expression to pull next token from}}
+\DoxyCodeLine{56 \textcolor{comment}{// out -\/ remainder of the expression after token removed}}
+\DoxyCodeLine{57 xbString sToken; \textcolor{comment}{// next token pulled from the expression}}
+\DoxyCodeLine{58 \textcolor{keywordtype}{char} cNodeType; \textcolor{comment}{// one of XB\_EXP\_CONSTANT, XB\_EXP\_FUNCTION, XB\_EXP\_FIELD, XB\_EXP\_OPERATOR, XB\_EXP\_NOTROOT}}
+\DoxyCodeLine{59 \textcolor{keywordtype}{char} cReturnType; \textcolor{comment}{// one of XB\_EXP\_CHAR, XB\_EXP\_DATE, XB\_EXP\_LOGICAL, XB\_EXP\_NUMERIC, XB\_EXP\_UNKNOWN}}
+\DoxyCodeLine{60 xbInt16 iSts; \textcolor{comment}{// return status after retrieving or attempting next token from expression}}
+\DoxyCodeLine{61 \textcolor{comment}{// 0 = no error}}
+\DoxyCodeLine{62 \textcolor{comment}{// XB\_END\_OF\_EXPRESSION}}
+\DoxyCodeLine{63 \textcolor{comment}{// XB\_UNBALANCED\_PARENS}}
+\DoxyCodeLine{64 \textcolor{comment}{// XB\_UNBALANCED\_QUOTES}}
+\DoxyCodeLine{65 \textcolor{keywordtype}{char} cPrevNodeType; \textcolor{comment}{// previous node type}}
+\DoxyCodeLine{66 \textcolor{keywordtype}{char} cPrevReturnType; \textcolor{comment}{// previous return type}}
+\DoxyCodeLine{67 }
+\DoxyCodeLine{68 \textcolor{comment}{// constructor}}
+\DoxyCodeLine{69 xbExpToken() \{ cNodeType = 0; cReturnType = 0; iSts = 0; cPrevNodeType = 0; cPrevReturnType = 0; \}}
+\DoxyCodeLine{70 \};}
+\DoxyCodeLine{72 }
+\DoxyCodeLine{73 }
+\DoxyCodeLine{74 \textcolor{comment}{/************************************************************************/}}
+\DoxyCodeLine{75 }
+\DoxyCodeLine{77 }
+\DoxyCodeLine{132 \textcolor{keyword}{class }XBDLLEXPORT xbExp\{}
+\DoxyCodeLine{133 }
+\DoxyCodeLine{134 \textcolor{keyword}{public}:}
+\DoxyCodeLine{135 xbExp( \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xbXBase}} * );}
+\DoxyCodeLine{136 xbExp( \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xbXBase}} *, \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} * );}
+\DoxyCodeLine{137 \textcolor{keyword}{virtual} \string~xbExp();}
+\DoxyCodeLine{138 \textcolor{keywordtype}{void} ClearTreeHandle();}
+\DoxyCodeLine{139 }
+\DoxyCodeLine{140 }
+\DoxyCodeLine{141 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{142 \textcolor{keywordtype}{void} DumpTree( xbInt16 iOption );}
+\DoxyCodeLine{143 \textcolor{keywordtype}{void} DumpToken( xbExpToken \&t, xbInt16 iOption = 0 );}
+\DoxyCodeLine{144 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{145 }
+\DoxyCodeLine{146 xbInt16 GetResultLen() \textcolor{keyword}{const};}
+\DoxyCodeLine{147 \textcolor{keywordtype}{char} GetReturnType() \textcolor{keyword}{const};}
+\DoxyCodeLine{148 xbInt16 GetBoolResult( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} \&bResult );}
+\DoxyCodeLine{149 xbInt16 GetDateResult( xbDate \&dtResult );}
+\DoxyCodeLine{150 xbInt16 GetNumericResult( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dResult );}
+\DoxyCodeLine{151 xbInt16 GetStringResult( xbString \&sResult );}
+\DoxyCodeLine{152 xbInt16 GetStringResult( \textcolor{keywordtype}{char} * vpResult, xbUInt32 ulLen );}
+\DoxyCodeLine{153 xbExpNode *GetTreeHandle();}
+\DoxyCodeLine{154 xbInt16 ParseExpression( \textcolor{keyword}{const} xbString \&sExpression );}
+\DoxyCodeLine{155 xbInt16 ParseExpression( \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf, \textcolor{keyword}{const} xbString \&sExpression );}
+\DoxyCodeLine{156 xbInt16 ProcessExpression();}
+\DoxyCodeLine{157 xbInt16 ProcessExpression( xbInt16 iRecBufSw );}
+\DoxyCodeLine{158 }
+\DoxyCodeLine{159 }
+\DoxyCodeLine{160 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{161 xbInt16 GetNextToken( xbExpToken \&t );}
+\DoxyCodeLine{162 xbInt16 OperatorWeight( \textcolor{keyword}{const} xbString \&sOperator );}
+\DoxyCodeLine{163 xbExpNode *GetNextNode( xbExpNode * n ) \textcolor{keyword}{const}; \textcolor{comment}{// traverses the tree from bottom left node, right, then up}}
+\DoxyCodeLine{164 }
+\DoxyCodeLine{165 \textcolor{keyword}{private}: \textcolor{comment}{// methods}}
+\DoxyCodeLine{166 }
+\DoxyCodeLine{167 \textcolor{comment}{// xbInt16 CalcExpressionResultLen();}}
+\DoxyCodeLine{168 xbInt16 CalcFunctionResultLen( xbExpNode *n ) \textcolor{keyword}{const};}
+\DoxyCodeLine{169 xbInt16 CalcCharNodeLen( xbExpNode *n );}
+\DoxyCodeLine{170 xbInt16 CheckParensAndQuotes( \textcolor{keyword}{const} xbString \&sExpression );}
+\DoxyCodeLine{171 xbInt16 GetExpressionResultLen() \textcolor{keyword}{const};}
+\DoxyCodeLine{172 }
+\DoxyCodeLine{173 xbInt16 GetTokenCharConstant ( xbExpToken \&t );}
+\DoxyCodeLine{174 xbInt16 GetTokenDatabaseField ( xbExpToken \&t );}
+\DoxyCodeLine{175 xbInt16 GetTokenDateConstant ( xbExpToken \&t );}
+\DoxyCodeLine{176 xbInt16 GetTokenFunction ( xbExpToken \&t );}
+\DoxyCodeLine{177 xbInt16 GetTokenLogicalConstant( xbExpToken \&t );}
+\DoxyCodeLine{178 xbInt16 GetTokenNumericConstant( xbExpToken \&t );}
+\DoxyCodeLine{179 xbInt16 GetTokenOperator ( xbExpToken \&t );}
+\DoxyCodeLine{180 xbInt16 GetTokenParen ( xbExpToken \&t );}
+\DoxyCodeLine{181 }
+\DoxyCodeLine{182 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsFunction ( \textcolor{keyword}{const} xbString \&sExp, \textcolor{keywordtype}{char} \&cReturnType );}
+\DoxyCodeLine{183 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsLogicalConstant ( \textcolor{keyword}{const} xbString \&sExp );}
+\DoxyCodeLine{184 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsNumericConstant ( \textcolor{keyword}{const} xbString \&sExp, \textcolor{keywordtype}{char} cPrevNodeType );}
+\DoxyCodeLine{185 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsOperator ( \textcolor{keyword}{const} xbString \&sExp );}
+\DoxyCodeLine{186 \textcolor{keywordtype}{char} IsTokenSeparator ( \textcolor{keywordtype}{char} c );}
+\DoxyCodeLine{187 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsWhiteSpace ( \textcolor{keywordtype}{char} c );}
+\DoxyCodeLine{188 }
+\DoxyCodeLine{189 xbInt16 ParseExpression ( \textcolor{keyword}{const} xbString \&sExpression, xbInt16 iWeight );}
+\DoxyCodeLine{190 xbInt16 ParseExpressionConstant( xbExpToken \&t, xbExpNode *n );}
+\DoxyCodeLine{191 xbInt16 ParseExpressionFunction( xbExpToken \&t, xbExpNode *n, xbInt16 iWeight );}
+\DoxyCodeLine{192 xbInt16 ParseExpressionFunctionParms( \textcolor{keyword}{const} xbString \&sParms, xbLinkList<xbString> \&llParms );}
+\DoxyCodeLine{193 xbInt16 ParseExpressionField ( xbExpToken \&t, xbExpNode *n );}
+\DoxyCodeLine{194 xbInt16 ParseExpressionOperator( xbExpToken \&t, xbExpNode *n, xbInt16 iWeight );}
+\DoxyCodeLine{195 }
+\DoxyCodeLine{196 xbInt16 ProcessExpressionFunction( xbExpNode *n, xbInt16 iRecBufSw = 0 );}
+\DoxyCodeLine{197 xbInt16 ProcessExpressionOperator( xbExpNode *n );}
+\DoxyCodeLine{198 }
+\DoxyCodeLine{199 \textcolor{keyword}{private}: \textcolor{comment}{// fields}}
+\DoxyCodeLine{200 \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xbXBase}} *xbase;}
+\DoxyCodeLine{201 \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf;}
+\DoxyCodeLine{202 xbExpNode *nTree; \textcolor{comment}{// pointer to tree of expNodes}}
+\DoxyCodeLine{203 \textcolor{comment}{// xbInt16 iExpLen; // size of expression result}}
+\DoxyCodeLine{204 }
+\DoxyCodeLine{205 }
+\DoxyCodeLine{206 \};}
+\DoxyCodeLine{207 }
+\DoxyCodeLine{208 \textcolor{comment}{/* Expression handler */}}
+\DoxyCodeLine{209 }
+\DoxyCodeLine{210 }
+\DoxyCodeLine{211 \};}
+\DoxyCodeLine{212 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_EXPRESSION\_SUPPORT}}
+\DoxyCodeLine{213 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// \_\_XB\_EXP\_H\_\_}}
+\DoxyCodeLine{214 }
+\DoxyCodeLine{215 }
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbexpnode_8cpp.tex b/docs/doxygen/latex/xbexpnode_8cpp.tex
new file mode 100644
index 0000000..d5fce07
--- /dev/null
+++ b/docs/doxygen/latex/xbexpnode_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbexpnode_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbexpnode.cpp File Reference}
+\label{xbexpnode_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbexpnode.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbexpnode.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbexpnode_8h.tex b/docs/doxygen/latex/xbexpnode_8h.tex
new file mode 100644
index 0000000..574b650
--- /dev/null
+++ b/docs/doxygen/latex/xbexpnode_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xbexpnode_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbexpnode.h File Reference}
+\label{xbexpnode_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbexpnode.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbexpnode.h}}
diff --git a/docs/doxygen/latex/xbexpnode_8h_source.tex b/docs/doxygen/latex/xbexpnode_8h_source.tex
new file mode 100644
index 0000000..a0cbdd8
--- /dev/null
+++ b/docs/doxygen/latex/xbexpnode_8h_source.tex
@@ -0,0 +1,113 @@
+\hypertarget{xbexpnode_8h_source}{}\doxysection{xbexpnode.\+h}
+\label{xbexpnode_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbexpnode.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbexpnode.h}}
+\mbox{\hyperlink{xbexpnode_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbexpnode.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_EXPNODE\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_EXPNODE\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 \textcolor{comment}{// \#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{21 \textcolor{comment}{// \#pragma interface}}
+\DoxyCodeLine{22 \textcolor{comment}{// \#endif}}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 \textcolor{preprocessor}{\#ifdef XB\_EXPRESSION\_SUPPORT}}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{28 }
+\DoxyCodeLine{29 \textcolor{comment}{//class XBDLLEXPORT xbDbf;}}
+\DoxyCodeLine{30 }
+\DoxyCodeLine{31 \textcolor{comment}{/************************************************************************/}}
+\DoxyCodeLine{33 }
+\DoxyCodeLine{46 \textcolor{keyword}{class }XBDLLEXPORT xbExpNode \{}
+\DoxyCodeLine{47 \textcolor{keyword}{public}:}
+\DoxyCodeLine{48 xbExpNode();}
+\DoxyCodeLine{49 xbExpNode( xbString \&sNodeText, \textcolor{keywordtype}{char} cReturnType, \textcolor{keywordtype}{char} cNodeType );}
+\DoxyCodeLine{50 xbExpNode( xbString \&sNodeText, \textcolor{keywordtype}{char} cNodeType );}
+\DoxyCodeLine{51 xbExpNode( \textcolor{keywordtype}{char} cNodeType );}
+\DoxyCodeLine{52 }
+\DoxyCodeLine{53 \textcolor{keyword}{virtual} \string~xbExpNode();}
+\DoxyCodeLine{54 xbInt16 AddChild( xbExpNode *n );}
+\DoxyCodeLine{55 xbExpNode *GetChild( xbUInt32 ulChildNo ) \textcolor{keyword}{const};}
+\DoxyCodeLine{56 xbUInt32 GetChildCnt() \textcolor{keyword}{const};}
+\DoxyCodeLine{57 xbUInt32 GetChildNo() \textcolor{keyword}{const};}
+\DoxyCodeLine{58 \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *GetDbf() \textcolor{keyword}{const};}
+\DoxyCodeLine{59 xbInt16 GetFieldNo() \textcolor{keyword}{const};}
+\DoxyCodeLine{60 xbExpNode *GetFirstNode();}
+\DoxyCodeLine{61 xbExpNode *GetNextNode() \textcolor{keyword}{const};}
+\DoxyCodeLine{62 \textcolor{keywordtype}{void} GetNodeText( xbString \&sNodeText ) \textcolor{keyword}{const};}
+\DoxyCodeLine{63 \textcolor{keywordtype}{char} GetNodeType() \textcolor{keyword}{const};}
+\DoxyCodeLine{64 xbExpNode *GetParent() \textcolor{keyword}{const};}
+\DoxyCodeLine{65 xbString \&GetStringResult();}
+\DoxyCodeLine{66 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetBoolResult() \textcolor{keyword}{const};}
+\DoxyCodeLine{67 \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} GetNumericResult() \textcolor{keyword}{const};}
+\DoxyCodeLine{68 xbUInt32 GetResultLen() \textcolor{keyword}{const};}
+\DoxyCodeLine{69 xbExpNode *GetRightSibling() \textcolor{keyword}{const};}
+\DoxyCodeLine{70 \textcolor{keywordtype}{char} GetReturnType() \textcolor{keyword}{const};}
+\DoxyCodeLine{71 xbInt16 GetWeight() \textcolor{keyword}{const};}
+\DoxyCodeLine{72 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} HasRightSibling() \textcolor{keyword}{const};}
+\DoxyCodeLine{73 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsOperator() \textcolor{keyword}{const};}
+\DoxyCodeLine{74 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsUnaryOperator() \textcolor{keyword}{const};}
+\DoxyCodeLine{75 \textcolor{keywordtype}{void} RemoveLastChild();}
+\DoxyCodeLine{76 \textcolor{keywordtype}{void} SetResultLen( xbUInt32 ulResultLen );}
+\DoxyCodeLine{77 \textcolor{keywordtype}{void} SetDbfInfo( \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf );}
+\DoxyCodeLine{78 \textcolor{keywordtype}{void} SetDbfInfo( \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf, xbInt16 iFieldNo );}
+\DoxyCodeLine{79 \textcolor{keywordtype}{void} SetNodeText( xbString \&sNodeText );}
+\DoxyCodeLine{80 \textcolor{keywordtype}{void} SetNodeType( \textcolor{keywordtype}{char} cNodeType );}
+\DoxyCodeLine{81 \textcolor{keywordtype}{void} SetParent( xbExpNode *n );}
+\DoxyCodeLine{82 \textcolor{keywordtype}{void} SetResult( xbString \&sResult );}
+\DoxyCodeLine{83 \textcolor{keywordtype}{void} SetResult( xbDate \&dtResult );}
+\DoxyCodeLine{84 \textcolor{keywordtype}{void} SetResult( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bResult );}
+\DoxyCodeLine{85 \textcolor{keywordtype}{void} SetResult( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dResult );}
+\DoxyCodeLine{86 \textcolor{keywordtype}{void} SetReturnType( \textcolor{keywordtype}{char} cReturnType );}
+\DoxyCodeLine{87 \textcolor{keywordtype}{void} SetWeight( xbInt16 iWeight );}
+\DoxyCodeLine{88 }
+\DoxyCodeLine{89 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{90 \textcolor{keywordtype}{void} DumpNode( xbInt16 iOption ) \textcolor{keyword}{const}; \textcolor{comment}{// 0 = no children, 1 = and children}}
+\DoxyCodeLine{91 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{92 }
+\DoxyCodeLine{93 \textcolor{keyword}{private}:}
+\DoxyCodeLine{94 xbString sNodeText; \textcolor{comment}{// expression text}}
+\DoxyCodeLine{95 \textcolor{keywordtype}{char} cReturnType; \textcolor{comment}{// one of: XB\_EXP\_CHAR, XB\_EXP\_DATE, XB\_EXP\_LOGICAL, XB\_EXP\_NUMERIC}}
+\DoxyCodeLine{96 \textcolor{keywordtype}{char} cNodeType; \textcolor{comment}{// one of: XB\_EXP\_CONSTANT, XB\_EXP\_FUNCTION, XB\_EXP\_FIELD, XB\_EXP\_OPERATOR}}
+\DoxyCodeLine{97 xbString sResult; \textcolor{comment}{// char result, and operator}}
+\DoxyCodeLine{98 \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dResult; \textcolor{comment}{// numeric and bool results}}
+\DoxyCodeLine{99 xbExpNode * nParent; \textcolor{comment}{// pointer to parent}}
+\DoxyCodeLine{100 xbLinkList<xbExpNode *> llChildren; \textcolor{comment}{// linked list of descendent nodes}}
+\DoxyCodeLine{101 \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf; \textcolor{comment}{// pointer to dbf, used for field, RECNO() and RECCOUNT()}}
+\DoxyCodeLine{102 xbInt16 iFieldNo; \textcolor{comment}{// field no if DBF field}}
+\DoxyCodeLine{103 xbUInt32 ulResultLen; \textcolor{comment}{// for string results, accumulated length of character operations}}
+\DoxyCodeLine{104 \textcolor{comment}{// includes the sum of all nodes under this + this}}
+\DoxyCodeLine{105 \textcolor{comment}{// date = 8, numeric = 4, logical = 1}}
+\DoxyCodeLine{106 xbInt16 iWeight; \textcolor{comment}{// used for buildign the tree of nodes, assigned to operators}}
+\DoxyCodeLine{107 \textcolor{comment}{// the higher the number, the lower it goes on the tree}}
+\DoxyCodeLine{108 }
+\DoxyCodeLine{109 \};}
+\DoxyCodeLine{110 }
+\DoxyCodeLine{111 \textcolor{comment}{/************************************************************************/}}
+\DoxyCodeLine{112 }
+\DoxyCodeLine{113 \textcolor{comment}{/* Expression handler */}}
+\DoxyCodeLine{114 }
+\DoxyCodeLine{115 }
+\DoxyCodeLine{116 \};}
+\DoxyCodeLine{117 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_EXPRESSION\_SUPPORT}}
+\DoxyCodeLine{118 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// \_\_XB\_EXP\_H\_\_}}
+\DoxyCodeLine{119 }
+\DoxyCodeLine{120 }
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbfields_8cpp.tex b/docs/doxygen/latex/xbfields_8cpp.tex
new file mode 100644
index 0000000..83e84b3
--- /dev/null
+++ b/docs/doxygen/latex/xbfields_8cpp.tex
@@ -0,0 +1,8 @@
+\hypertarget{xbfields_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbfields.cpp File Reference}
+\label{xbfields_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbfields.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbfields.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbfile_8cpp.tex b/docs/doxygen/latex/xbfile_8cpp.tex
new file mode 100644
index 0000000..795870f
--- /dev/null
+++ b/docs/doxygen/latex/xbfile_8cpp.tex
@@ -0,0 +1,8 @@
+\hypertarget{xbfile_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbfile.cpp File Reference}
+\label{xbfile_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbfile.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbfile.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbfile_8h.tex b/docs/doxygen/latex/xbfile_8h.tex
new file mode 100644
index 0000000..d3ddbb8
--- /dev/null
+++ b/docs/doxygen/latex/xbfile_8h.tex
@@ -0,0 +1,58 @@
+\hypertarget{xbfile_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbfile.h File Reference}
+\label{xbfile_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbfile.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbfile.h}}
+\doxysubsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classxb_1_1xbFile}{xb\+::xb\+File}}
+\begin{DoxyCompactList}\small\item\em Class for handling low level file I/O. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \mbox{\hyperlink{xbfile_8h_ae58c73e0ba237fcf67ee20feea6c2743}{XB\+\_\+\+READ}}~0
+\item
+\#define \mbox{\hyperlink{xbfile_8h_af991a288c327f6857e90156ea734a633}{XB\+\_\+\+READ\+\_\+\+WRITE}}~1
+\item
+\#define \mbox{\hyperlink{xbfile_8h_abbf99e259c2f31572c886da6d85b1359}{XB\+\_\+\+WRITE}}~2
+\item
+\#define \mbox{\hyperlink{xbfile_8h_a9ec4d60a008c667d9861e3b3814f0232}{XB\+\_\+\+SINGLE\+\_\+\+USER}}~0
+\item
+\#define \mbox{\hyperlink{xbfile_8h_a05c0fc99ba71cf953d046d12f3f874bc}{XB\+\_\+\+MULTI\+\_\+\+USER}}~1
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Macro Definition Documentation}
+\mbox{\Hypertarget{xbfile_8h_a05c0fc99ba71cf953d046d12f3f874bc}\label{xbfile_8h_a05c0fc99ba71cf953d046d12f3f874bc}}
+\index{xbfile.h@{xbfile.h}!XB\_MULTI\_USER@{XB\_MULTI\_USER}}
+\index{XB\_MULTI\_USER@{XB\_MULTI\_USER}!xbfile.h@{xbfile.h}}
+\doxysubsubsection{\texorpdfstring{XB\_MULTI\_USER}{XB\_MULTI\_USER}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+MULTI\+\_\+\+USER~1}
+
+\mbox{\Hypertarget{xbfile_8h_ae58c73e0ba237fcf67ee20feea6c2743}\label{xbfile_8h_ae58c73e0ba237fcf67ee20feea6c2743}}
+\index{xbfile.h@{xbfile.h}!XB\_READ@{XB\_READ}}
+\index{XB\_READ@{XB\_READ}!xbfile.h@{xbfile.h}}
+\doxysubsubsection{\texorpdfstring{XB\_READ}{XB\_READ}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+READ~0}
+
+\mbox{\Hypertarget{xbfile_8h_af991a288c327f6857e90156ea734a633}\label{xbfile_8h_af991a288c327f6857e90156ea734a633}}
+\index{xbfile.h@{xbfile.h}!XB\_READ\_WRITE@{XB\_READ\_WRITE}}
+\index{XB\_READ\_WRITE@{XB\_READ\_WRITE}!xbfile.h@{xbfile.h}}
+\doxysubsubsection{\texorpdfstring{XB\_READ\_WRITE}{XB\_READ\_WRITE}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+READ\+\_\+\+WRITE~1}
+
+\mbox{\Hypertarget{xbfile_8h_a9ec4d60a008c667d9861e3b3814f0232}\label{xbfile_8h_a9ec4d60a008c667d9861e3b3814f0232}}
+\index{xbfile.h@{xbfile.h}!XB\_SINGLE\_USER@{XB\_SINGLE\_USER}}
+\index{XB\_SINGLE\_USER@{XB\_SINGLE\_USER}!xbfile.h@{xbfile.h}}
+\doxysubsubsection{\texorpdfstring{XB\_SINGLE\_USER}{XB\_SINGLE\_USER}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+SINGLE\+\_\+\+USER~0}
+
+\mbox{\Hypertarget{xbfile_8h_abbf99e259c2f31572c886da6d85b1359}\label{xbfile_8h_abbf99e259c2f31572c886da6d85b1359}}
+\index{xbfile.h@{xbfile.h}!XB\_WRITE@{XB\_WRITE}}
+\index{XB\_WRITE@{XB\_WRITE}!xbfile.h@{xbfile.h}}
+\doxysubsubsection{\texorpdfstring{XB\_WRITE}{XB\_WRITE}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+WRITE~2}
+
diff --git a/docs/doxygen/latex/xbfile_8h_source.tex b/docs/doxygen/latex/xbfile_8h_source.tex
new file mode 100644
index 0000000..19fb9c7
--- /dev/null
+++ b/docs/doxygen/latex/xbfile_8h_source.tex
@@ -0,0 +1,180 @@
+\hypertarget{xbfile_8h_source}{}\doxysection{xbfile.\+h}
+\label{xbfile_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbfile.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbfile.h}}
+\mbox{\hyperlink{xbfile_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbfile.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 \textcolor{preprocessor}{\#ifndef \_\_XB\_FILE\_H\_\_}}
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#define \_\_XB\_FILE\_H\_\_}}
+\DoxyCodeLine{18 }
+\DoxyCodeLine{19 \textcolor{preprocessor}{\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#pragma interface}}
+\DoxyCodeLine{21 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{22 }
+\DoxyCodeLine{23 \textcolor{comment}{/*****************************/}}
+\DoxyCodeLine{24 \textcolor{comment}{/* File Open Modes */}}
+\DoxyCodeLine{25 \textcolor{preprocessor}{\#define XB\_READ 0}}
+\DoxyCodeLine{26 \textcolor{preprocessor}{\#define XB\_READ\_WRITE 1}}
+\DoxyCodeLine{27 \textcolor{preprocessor}{\#define XB\_WRITE 2}}
+\DoxyCodeLine{28 }
+\DoxyCodeLine{29 \textcolor{comment}{/*****************************/}}
+\DoxyCodeLine{30 \textcolor{comment}{/* File Access Modes */}}
+\DoxyCodeLine{31 \textcolor{preprocessor}{\#define XB\_SINGLE\_USER 0 }\textcolor{comment}{// file buffering on}}
+\DoxyCodeLine{32 \textcolor{preprocessor}{\#define XB\_MULTI\_USER 1 }\textcolor{comment}{// file buffering off}}
+\DoxyCodeLine{33 }
+\DoxyCodeLine{34 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{35 }
+\DoxyCodeLine{56 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbFile}{xbFile}} : \textcolor{keyword}{public} \mbox{\hyperlink{classxb_1_1xbSsv}{xbSsv}} \{}
+\DoxyCodeLine{57 }
+\DoxyCodeLine{58 \textcolor{keyword}{public}:}
+\DoxyCodeLine{59 \textcolor{comment}{// xbFile();}}
+\DoxyCodeLine{60 \mbox{\hyperlink{classxb_1_1xbFile}{xbFile}}( \mbox{\hyperlink{classxb_1_1xbXBase}{xbXBase}} * x );}
+\DoxyCodeLine{61 }
+\DoxyCodeLine{62 \mbox{\hyperlink{classxb_1_1xbFile}{\string~xbFile}}();}
+\DoxyCodeLine{63 xbInt16 CreateUniqueFileName( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sDirIn, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sExtIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFqnOut );}
+\DoxyCodeLine{64 xbInt16 CreateUniqueFileName( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sDirIn, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sExtIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFqnOut, xbInt16 iOption );}
+\DoxyCodeLine{65 }
+\DoxyCodeLine{66 \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& GetDirectory() \textcolor{keyword}{const};}
+\DoxyCodeLine{67 \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& GetFileName() \textcolor{keyword}{const};}
+\DoxyCodeLine{68 \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& GetFqFileName() \textcolor{keyword}{const};}
+\DoxyCodeLine{69 }
+\DoxyCodeLine{70 \textcolor{keywordtype}{void} SetDirectory ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sDirectory);}
+\DoxyCodeLine{71 \textcolor{keywordtype}{void} SetFileName ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileName );}
+\DoxyCodeLine{72 \textcolor{keywordtype}{void} SetFqFileName( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFqName );}
+\DoxyCodeLine{73 }
+\DoxyCodeLine{74 xbUInt32 GetBlockSize () \textcolor{keyword}{const};}
+\DoxyCodeLine{75 xbInt16 SetBlockSize ( xbUInt32 ulBlockSize );}
+\DoxyCodeLine{76 }
+\DoxyCodeLine{77 xbInt16 GetOpenMode () \textcolor{keyword}{const};}
+\DoxyCodeLine{78 xbInt16 GetShareMode () \textcolor{keyword}{const};}
+\DoxyCodeLine{79 }
+\DoxyCodeLine{80 xbInt16 GetFileDirPart ( \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileDirPartOut ) \textcolor{keyword}{const};}
+\DoxyCodeLine{81 xbInt16 GetFileDirPart ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sCompleteFileNameIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileDirPartOut ) \textcolor{keyword}{const};}
+\DoxyCodeLine{82 xbInt16 GetFileExtPart ( \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileExtPartOut ) \textcolor{keyword}{const};}
+\DoxyCodeLine{83 xbInt16 GetFileExtPart ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sCompleteFileNameIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileExtPartOut ) \textcolor{keyword}{const};}
+\DoxyCodeLine{84 xbInt16 GetFileNamePart( \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileNamePartOut ) \textcolor{keyword}{const};}
+\DoxyCodeLine{85 xbInt16 GetFileNamePart( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sCompleteFileNameIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileNamePartOut ) \textcolor{keyword}{const};}
+\DoxyCodeLine{86 xbInt16 GetFileType ( \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileType ) \textcolor{keyword}{const};}
+\DoxyCodeLine{87 }
+\DoxyCodeLine{88 xbInt16 GetXbaseFileTypeByte( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileName, xbInt16 \&iVersion );}
+\DoxyCodeLine{89 xbInt16 GetXbaseFileTypeByte( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileName, \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} \&cFileTypeByte );}
+\DoxyCodeLine{90 xbInt16 GetXbaseFileTypeByte( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileName, \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} \&cFileTypeByte, xbInt16 \&iVersion );}
+\DoxyCodeLine{91 xbInt16 DetermineXbaseTableVersion( \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} cFileTypeByte ) \textcolor{keyword}{const};}
+\DoxyCodeLine{92 xbInt16 DetermineXbaseMemoVersion( \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} cFileTypeByte ) \textcolor{keyword}{const};}
+\DoxyCodeLine{93 }
+\DoxyCodeLine{94 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} FileExists () \textcolor{keyword}{const};}
+\DoxyCodeLine{95 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} FileExists ( xbInt16 iOption ) \textcolor{keyword}{const};}
+\DoxyCodeLine{96 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} FileExists ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileName ) \textcolor{keyword}{const};}
+\DoxyCodeLine{97 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} FileExists ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileName, xbInt16 iOption ) \textcolor{keyword}{const};}
+\DoxyCodeLine{98 }
+\DoxyCodeLine{99 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} FileIsOpen () \textcolor{keyword}{const};}
+\DoxyCodeLine{100 }
+\DoxyCodeLine{101 xbInt16 ReadBlock ( xbUInt32 ulBlockNo, \textcolor{keywordtype}{size\_t} readSize, \textcolor{keywordtype}{void} *buf );}
+\DoxyCodeLine{102 xbInt16 ReadBlock ( xbUInt32 ulBlockNo, xbUInt32 ulBlockSize, \textcolor{keywordtype}{size\_t} readSize, \textcolor{keywordtype}{void} *buf );}
+\DoxyCodeLine{103 xbInt16 WriteBlock( xbUInt32 ulBlockNo, \textcolor{keywordtype}{size\_t} writeSize, \textcolor{keywordtype}{void} *buf );}
+\DoxyCodeLine{104 }
+\DoxyCodeLine{105 xbInt16 GetFileSize( xbUInt64 \&ullFileSize );}
+\DoxyCodeLine{106 xbInt16 GetFileMtime( time\_t \&mtime );}
+\DoxyCodeLine{107 }
+\DoxyCodeLine{108 \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} eGetDouble( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *p ) \textcolor{keyword}{const};}
+\DoxyCodeLine{109 xbInt32 eGetInt32 ( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *p ) \textcolor{keyword}{const};}
+\DoxyCodeLine{110 xbUInt32 eGetUInt32( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *p ) \textcolor{keyword}{const};}
+\DoxyCodeLine{111 xbInt16 eGetInt16 ( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *p ) \textcolor{keyword}{const};}
+\DoxyCodeLine{112 xbUInt16 eGetUInt16( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *p ) \textcolor{keyword}{const};}
+\DoxyCodeLine{113 \textcolor{keywordtype}{void} ePutDouble( \textcolor{keywordtype}{char} *p, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} d );}
+\DoxyCodeLine{114 \textcolor{keywordtype}{void} ePutInt32 ( \textcolor{keywordtype}{char} *p, xbInt32 l );}
+\DoxyCodeLine{115 \textcolor{keywordtype}{void} ePutUInt32( \textcolor{keywordtype}{char} *p, xbUInt32 ul );}
+\DoxyCodeLine{116 \textcolor{keywordtype}{void} ePutInt16 ( \textcolor{keywordtype}{char} *p, xbInt16 s );}
+\DoxyCodeLine{117 \textcolor{keywordtype}{void} ePutUInt16( \textcolor{keywordtype}{char} *p, xbUInt16 s );}
+\DoxyCodeLine{118 }
+\DoxyCodeLine{119 xbInt16 xbFclose ();}
+\DoxyCodeLine{120 xbInt16 xbFeof ();}
+\DoxyCodeLine{121 xbInt16 xbFflush ();}
+\DoxyCodeLine{122 xbInt16 xbFgetc ( xbInt32 \&c );}
+\DoxyCodeLine{123 xbInt16 xbFgetc ( \textcolor{keywordtype}{char} \&c );}
+\DoxyCodeLine{124 }
+\DoxyCodeLine{125 \textcolor{preprocessor}{ \#ifdef XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{126 xbInt16 xbLock ( xbInt16 iFunction, xbInt64 llOffset, \textcolor{keywordtype}{size\_t} stLen );}
+\DoxyCodeLine{127 xbInt16 GetLockRetryCount() \textcolor{keyword}{const};}
+\DoxyCodeLine{128 \textcolor{keywordtype}{void} SetLockRetryCount( xbInt16 iLockRetries );}
+\DoxyCodeLine{129 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{130 }
+\DoxyCodeLine{131 xbInt16 \mbox{\hyperlink{classxb_1_1xbFile_a7cdfef5ede9ac98d44a28a6b7a70972c}{xbFopen}} ( xbInt16 iOpenMode );}
+\DoxyCodeLine{132 xbInt16 xbFopen ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOpenMode, xbInt16 iShareMode );}
+\DoxyCodeLine{133 xbInt16 xbFopen ( xbInt16 iOpenMode, xbInt16 iShareMode );}
+\DoxyCodeLine{134 xbInt16 xbFopen ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sMode, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileName, xbInt16 iShareMode );}
+\DoxyCodeLine{135 }
+\DoxyCodeLine{136 xbInt16 xbFputc ( xbInt32 c );}
+\DoxyCodeLine{137 xbInt16 xbFputc ( xbInt32 c, xbInt32 iNoTimes );}
+\DoxyCodeLine{138 xbInt16 xbFputs ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s );}
+\DoxyCodeLine{139 xbInt16 xbFread ( \textcolor{keywordtype}{void} *ptr, \textcolor{keywordtype}{size\_t} size, \textcolor{keywordtype}{size\_t} nmemb );}
+\DoxyCodeLine{140 xbInt16 xbFgets ( \textcolor{keywordtype}{size\_t} lSize, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sLine );}
+\DoxyCodeLine{141 }
+\DoxyCodeLine{142 \textcolor{keywordtype}{size\_t} xbFtell ();}
+\DoxyCodeLine{143 xbInt16 xbFseek ( xbInt64 llOffset, xbInt32 whence );}
+\DoxyCodeLine{144 }
+\DoxyCodeLine{145 \textcolor{keywordtype}{void} xbFTurnOffFileBuffering();}
+\DoxyCodeLine{146 xbInt16 xbFwrite ( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *ptr, \textcolor{keywordtype}{size\_t} lSize, \textcolor{keywordtype}{size\_t} lNmemb );}
+\DoxyCodeLine{147 }
+\DoxyCodeLine{148 xbInt16 xbReadUntil ( \textcolor{keyword}{const} \textcolor{keywordtype}{char} cDelim, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{149 xbInt16 xbRemove ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileName, xbInt16 iOption );}
+\DoxyCodeLine{150 xbInt16 xbRemove ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileName );}
+\DoxyCodeLine{151 xbInt16 xbRemove ();}
+\DoxyCodeLine{152 }
+\DoxyCodeLine{153 xbInt16 xbRename ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOldName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sNewName );}
+\DoxyCodeLine{154 xbInt16 xbRename ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOldName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sNewName, xbInt16 iOption );}
+\DoxyCodeLine{155 \textcolor{keywordtype}{void} xbRewind ();}
+\DoxyCodeLine{156 }
+\DoxyCodeLine{157 xbInt16 xbTruncate ( xbInt64 llSize );}
+\DoxyCodeLine{158 xbInt16 NameSuffixMissing( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFileName, xbInt16 iOption ) \textcolor{keyword}{const};}
+\DoxyCodeLine{159 }
+\DoxyCodeLine{160 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{161 xbInt16 DumpBlockToDisk( xbUInt32 ulBlockNo, \textcolor{keywordtype}{size\_t} lBlockSize );}
+\DoxyCodeLine{162 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{163 }
+\DoxyCodeLine{164 }
+\DoxyCodeLine{165 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{166 }
+\DoxyCodeLine{167 \mbox{\hyperlink{classxb_1_1xbXBase}{xbXBase}} *\mbox{\hyperlink{classxb_1_1xbFile_ae39a67ea391b46055d4ca299cb222004}{xbase}}; \textcolor{comment}{/* pointer to the main structures */}}
+\DoxyCodeLine{168 }
+\DoxyCodeLine{169 \textcolor{keyword}{private}:}
+\DoxyCodeLine{170 FILE *fp;}
+\DoxyCodeLine{171 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} sFqFileName; \textcolor{comment}{/* fully qualified file name */}}
+\DoxyCodeLine{172 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} sFileName; \textcolor{comment}{/* file name */}}
+\DoxyCodeLine{173 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} sDirectory; \textcolor{comment}{/* directory, ends with / or \(\backslash\) */}}
+\DoxyCodeLine{174 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bFileOpen; \textcolor{comment}{/* true if file is open */}}
+\DoxyCodeLine{175 xbUInt32 ulBlockSize; \textcolor{comment}{/* used for memo and index files */}}
+\DoxyCodeLine{176 }
+\DoxyCodeLine{177 xbInt16 iOpenMode; \textcolor{comment}{/* XB\_READ || XB\_READ\_WRITE || XB\_WRITE */}}
+\DoxyCodeLine{178 xbInt16 iShareMode; \textcolor{comment}{/* XB\_SINGLE\_USER || XB\_MULTI\_USER -\/ set file buffering */}}
+\DoxyCodeLine{179 xbInt32 iFileNo; \textcolor{comment}{/* Library File No */}}
+\DoxyCodeLine{180 }
+\DoxyCodeLine{181 \textcolor{preprocessor}{ \#ifdef XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{182 xbInt16 iLockRetries; \textcolor{comment}{/* file override number of lock attempts */}}
+\DoxyCodeLine{183 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{184 }
+\DoxyCodeLine{185 \textcolor{preprocessor}{ \#ifdef HAVE\_SETENDOFFILE\_F}}
+\DoxyCodeLine{186 HANDLE fHandle;}
+\DoxyCodeLine{187 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{188 }
+\DoxyCodeLine{189 }
+\DoxyCodeLine{190 \};}
+\DoxyCodeLine{191 }
+\DoxyCodeLine{192 \} \textcolor{comment}{/* namespace */}}
+\DoxyCodeLine{193 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XBFILE\_H\_\_ */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{194 }
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbfilter_8cpp.tex b/docs/doxygen/latex/xbfilter_8cpp.tex
new file mode 100644
index 0000000..a3711d4
--- /dev/null
+++ b/docs/doxygen/latex/xbfilter_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbfilter_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbfilter.cpp File Reference}
+\label{xbfilter_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbfilter.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbfilter.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbfilter_8h.tex b/docs/doxygen/latex/xbfilter_8h.tex
new file mode 100644
index 0000000..e9ccb84
--- /dev/null
+++ b/docs/doxygen/latex/xbfilter_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xbfilter_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbfilter.h File Reference}
+\label{xbfilter_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbfilter.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbfilter.h}}
diff --git a/docs/doxygen/latex/xbfilter_8h_source.tex b/docs/doxygen/latex/xbfilter_8h_source.tex
new file mode 100644
index 0000000..114fb1f
--- /dev/null
+++ b/docs/doxygen/latex/xbfilter_8h_source.tex
@@ -0,0 +1,84 @@
+\hypertarget{xbfilter_8h_source}{}\doxysection{xbfilter.\+h}
+\label{xbfilter_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbfilter.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbfilter.h}}
+\mbox{\hyperlink{xbfilter_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbfilter.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{This class manages the user data area (UDA)}}
+\DoxyCodeLine{15 \textcolor{comment}{}}
+\DoxyCodeLine{16 \textcolor{comment}{*/}}
+\DoxyCodeLine{17 }
+\DoxyCodeLine{18 }
+\DoxyCodeLine{19 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBFILTER\_H\_\_}}
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#define \_\_XB\_XBFILTER\_H\_\_}}
+\DoxyCodeLine{21 }
+\DoxyCodeLine{22 \textcolor{preprocessor}{\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{23 \textcolor{preprocessor}{\#pragma interface}}
+\DoxyCodeLine{24 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{preprocessor}{\#ifdef XB\_FILTER\_SUPPORT}}
+\DoxyCodeLine{28 }
+\DoxyCodeLine{29 }
+\DoxyCodeLine{30 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{31 }
+\DoxyCodeLine{32 \textcolor{comment}{//\#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{33 \textcolor{comment}{//class XBDLLEXPORT xbIx;}}
+\DoxyCodeLine{34 \textcolor{comment}{//\#endif // XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{35 }
+\DoxyCodeLine{36 }
+\DoxyCodeLine{37 \textcolor{keyword}{class }XBDLLEXPORT xbFilter \{}
+\DoxyCodeLine{38 }
+\DoxyCodeLine{39 \textcolor{keyword}{public}:}
+\DoxyCodeLine{40 xbFilter( \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xbXBase}} *xbase, \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf );}
+\DoxyCodeLine{41 \string~xbFilter();}
+\DoxyCodeLine{42 xbInt16 Set( xbString \&sFilterExpression );}
+\DoxyCodeLine{43 xbInt16 GetFirstRecord( xbInt16 iOpt = 1 );}
+\DoxyCodeLine{44 xbInt16 GetNextRecord ( xbInt16 iOpt = 1 );}
+\DoxyCodeLine{45 xbInt16 GetPrevRecord ( xbInt16 iOpt = 1 );}
+\DoxyCodeLine{46 xbInt16 GetLastRecord ( xbInt16 iOpt = 1 );}
+\DoxyCodeLine{47 \textcolor{keywordtype}{void} SetLimit( xbInt32 ulLimit );}
+\DoxyCodeLine{48 xbInt32 GetLimit() \textcolor{keyword}{const};}
+\DoxyCodeLine{49 \textcolor{keywordtype}{void} ResetQryCnt();}
+\DoxyCodeLine{50 xbInt32 GetQryCnt() \textcolor{keyword}{const};}
+\DoxyCodeLine{51 }
+\DoxyCodeLine{52 \textcolor{preprocessor}{ \#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{53 \textcolor{comment}{// void Set( xbIx *pIx, void *vpTag );}}
+\DoxyCodeLine{54 xbInt16 GetFirstRecordIx( xbInt16 iOpt = 1 );}
+\DoxyCodeLine{55 xbInt16 GetNextRecordIx ( xbInt16 iOpt = 1 );}
+\DoxyCodeLine{56 xbInt16 GetPrevRecordIx ( xbInt16 iOpt = 1 );}
+\DoxyCodeLine{57 xbInt16 GetLastRecordIx ( xbInt16 iOpt = 1 );}
+\DoxyCodeLine{58 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{59 }
+\DoxyCodeLine{60 }
+\DoxyCodeLine{61 \textcolor{keyword}{private}:}
+\DoxyCodeLine{62 \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xbXBase}} *xbase;}
+\DoxyCodeLine{63 \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf;}
+\DoxyCodeLine{64 xbExp *exp;}
+\DoxyCodeLine{65 }
+\DoxyCodeLine{66 xbInt32 lLimit; \textcolor{comment}{// max number rows returned}}
+\DoxyCodeLine{67 xbInt32 lCurQryCnt; \textcolor{comment}{// current count of rows returned, neg\# is moving from bottom to top}}
+\DoxyCodeLine{68 \textcolor{comment}{// pos\# is moving from top to bottom}}
+\DoxyCodeLine{69 \textcolor{preprocessor}{ \#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{70 xbIx *pIx; \textcolor{comment}{// if index is set, the class uses the index tag, otherwise table}}
+\DoxyCodeLine{71 \textcolor{keywordtype}{void} *vpTag;}
+\DoxyCodeLine{72 \textcolor{preprocessor}{ \#endif }\textcolor{comment}{// XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{73 }
+\DoxyCodeLine{74 }
+\DoxyCodeLine{75 \};}
+\DoxyCodeLine{76 \} \textcolor{comment}{/* namespace */}}
+\DoxyCodeLine{77 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* XB\_FILTER\_SUPPORT */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{78 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XBFILTER\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbfuncs_8cpp.tex b/docs/doxygen/latex/xbfuncs_8cpp.tex
new file mode 100644
index 0000000..237da74
--- /dev/null
+++ b/docs/doxygen/latex/xbfuncs_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbfuncs_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbfuncs.cpp File Reference}
+\label{xbfuncs_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbfuncs.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbfuncs.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbindex_8h.tex b/docs/doxygen/latex/xbindex_8h.tex
new file mode 100644
index 0000000..01bdb4f
--- /dev/null
+++ b/docs/doxygen/latex/xbindex_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xbindex_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbindex.h File Reference}
+\label{xbindex_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbindex.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbindex.h}}
diff --git a/docs/doxygen/latex/xbindex_8h_source.tex b/docs/doxygen/latex/xbindex_8h_source.tex
new file mode 100644
index 0000000..e104f5a
--- /dev/null
+++ b/docs/doxygen/latex/xbindex_8h_source.tex
@@ -0,0 +1,513 @@
+\hypertarget{xbindex_8h_source}{}\doxysection{xbindex.\+h}
+\label{xbindex_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbindex.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbindex.h}}
+\mbox{\hyperlink{xbindex_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbindex.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014, 2018, 2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_INDEX\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_INDEX\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{21 }
+\DoxyCodeLine{22 }
+\DoxyCodeLine{23 \textcolor{preprocessor}{\#define XB\_ADD\_KEY 1}}
+\DoxyCodeLine{24 \textcolor{preprocessor}{\#define XB\_UPD\_KEY 2}}
+\DoxyCodeLine{25 \textcolor{preprocessor}{\#define XB\_DEL\_KEY 3}}
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{28 }
+\DoxyCodeLine{29 }
+\DoxyCodeLine{30 }
+\DoxyCodeLine{32 \textcolor{comment}{// structure for index nodes, each node contains information regarding one block}}
+\DoxyCodeLine{33 \textcolor{keyword}{struct }XBDLLEXPORT xbIxNode \{}
+\DoxyCodeLine{34 xbIxNode *npPrev; \textcolor{comment}{// pointer to previous node in chain}}
+\DoxyCodeLine{35 xbIxNode *npNext; \textcolor{comment}{// pointer to next node in chain}}
+\DoxyCodeLine{36 xbUInt32 iCurKeyNo; \textcolor{comment}{// current key number in the node, 0 offset}}
+\DoxyCodeLine{37 xbUInt32 ulBlockNo; \textcolor{comment}{// this block number}}
+\DoxyCodeLine{38 xbUInt32 ulBufSize; \textcolor{comment}{// size of cpBlockData}}
+\DoxyCodeLine{39 \textcolor{keywordtype}{char} *cpBlockData; \textcolor{comment}{// pointer to memory version of block data stored in file}}
+\DoxyCodeLine{40 \};}
+\DoxyCodeLine{42 }
+\DoxyCodeLine{43 }
+\DoxyCodeLine{45 }
+\DoxyCodeLine{120 \textcolor{keyword}{class }XBDLLEXPORT xbIx : \textcolor{keyword}{public} xbFile \{}
+\DoxyCodeLine{121 \textcolor{keyword}{public}:}
+\DoxyCodeLine{122 xbIx( \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} * d );}
+\DoxyCodeLine{123 \textcolor{keyword}{virtual} \string~xbIx();}
+\DoxyCodeLine{124 }
+\DoxyCodeLine{125 \textcolor{keyword}{virtual} xbInt16 CheckTagIntegrity( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOpt ) = 0;}
+\DoxyCodeLine{126 \textcolor{keyword}{virtual} xbInt16 Close();}
+\DoxyCodeLine{127 \textcolor{keyword}{virtual} xbInt16 CreateTag( \textcolor{keyword}{const} xbString \&sName, \textcolor{keyword}{const} xbString \&sKey, \textcolor{keyword}{const} xbString \&sFilter, xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverlay, \textcolor{keywordtype}{void} **vpTag ) = 0;}
+\DoxyCodeLine{128 \textcolor{keyword}{virtual} xbInt16 FindKey( \textcolor{keywordtype}{void} *vpTag, \textcolor{keyword}{const} xbString \&sKey, xbInt16 iRetrieveSw );}
+\DoxyCodeLine{129 \textcolor{keyword}{virtual} xbInt16 FindKey( \textcolor{keywordtype}{void} *vpTag, \textcolor{keyword}{const} \textcolor{keywordtype}{char} * cKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw );}
+\DoxyCodeLine{130 \textcolor{keyword}{virtual} xbInt16 FindKey( \textcolor{keywordtype}{void} *vpTag, \textcolor{keyword}{const} xbBcd \&bcd, xbInt16 iRetrieveSw );}
+\DoxyCodeLine{131 \textcolor{keyword}{virtual} xbInt16 FindKey( \textcolor{keywordtype}{void} *vpTag, \textcolor{keyword}{const} xbDate \&dtKey, xbInt16 iRetrieveSw );}
+\DoxyCodeLine{132 \textcolor{keyword}{virtual} xbInt16 FindKey( \textcolor{keywordtype}{void} *vpTag, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dKey, xbInt16 iRetrieveSw );}
+\DoxyCodeLine{133 \textcolor{keyword}{virtual} xbInt16 FindKey( \textcolor{keywordtype}{void} *vpTag, \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw ) = 0;}
+\DoxyCodeLine{134 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} *GetCurTag() \textcolor{keyword}{const};}
+\DoxyCodeLine{135 \textcolor{keyword}{virtual} \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *GetDbf() \textcolor{keyword}{const};}
+\DoxyCodeLine{136 }
+\DoxyCodeLine{137 \textcolor{keyword}{virtual} xbString \&GetKeyExpression( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{138 \textcolor{keyword}{virtual} xbString \&GetKeyFilter( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{139 \textcolor{keyword}{virtual} \textcolor{keywordtype}{char} GetKeyType( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{140 \textcolor{keyword}{virtual} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetLocked() \textcolor{keyword}{const};}
+\DoxyCodeLine{141 }
+\DoxyCodeLine{142 \textcolor{keyword}{virtual} xbInt16 GetFirstKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 iRetrieveSw ) = 0;}
+\DoxyCodeLine{143 \textcolor{keyword}{virtual} xbInt16 GetFirstKey( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{144 \textcolor{keyword}{virtual} xbInt16 GetFirstKey();}
+\DoxyCodeLine{145 }
+\DoxyCodeLine{146 \textcolor{keyword}{virtual} xbInt16 GetLastKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 lRetrieveSw ) = 0;}
+\DoxyCodeLine{147 \textcolor{keyword}{virtual} xbInt16 GetLastKey( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{148 \textcolor{keyword}{virtual} xbInt16 GetLastKey();}
+\DoxyCodeLine{149 }
+\DoxyCodeLine{150 \textcolor{keyword}{virtual} xbInt16 GetNextKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 iRetrieveSw ) = 0;}
+\DoxyCodeLine{151 \textcolor{keyword}{virtual} xbInt16 GetNextKey( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{152 \textcolor{keyword}{virtual} xbInt16 GetNextKey();}
+\DoxyCodeLine{153 }
+\DoxyCodeLine{154 \textcolor{keyword}{virtual} xbInt16 GetPrevKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 iRetrieveSw ) = 0;}
+\DoxyCodeLine{155 \textcolor{keyword}{virtual} xbInt16 GetPrevKey( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{156 \textcolor{keyword}{virtual} xbInt16 GetPrevKey();}
+\DoxyCodeLine{157 }
+\DoxyCodeLine{158 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} *GetTag( xbInt16 iTagNo ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{159 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} *GetTag( xbString \&sTagName ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{160 \textcolor{keyword}{virtual} xbInt16 GetTagCount() \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{161 }
+\DoxyCodeLine{162 \textcolor{keyword}{virtual} xbString \&GetTagName( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{163 \textcolor{keyword}{virtual} \textcolor{keyword}{const} \textcolor{keywordtype}{char} * GetTagName( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOpt ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{164 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} GetTagName( \textcolor{keywordtype}{void} *vpTag, xbString \&sTagName ) \{\};}
+\DoxyCodeLine{165 }
+\DoxyCodeLine{166 \textcolor{keyword}{virtual} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetUnique( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{167 \textcolor{keyword}{virtual} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetSortOrder( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{168 }
+\DoxyCodeLine{169 \textcolor{keyword}{virtual} xbInt16 Open( \textcolor{keyword}{const} xbString \&sFileName );}
+\DoxyCodeLine{170 \textcolor{keyword}{virtual} xbInt16 Reindex( \textcolor{keywordtype}{void} **vpTag ) = 0;}
+\DoxyCodeLine{171 \textcolor{keyword}{virtual} xbInt16 SetCurTag( xbInt16 iTagNo ) = 0;}
+\DoxyCodeLine{172 \textcolor{keyword}{virtual} xbInt16 SetCurTag( xbString \&sTagName ) = 0;}
+\DoxyCodeLine{173 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} SetCurTag( \textcolor{keywordtype}{void} * vpCurTag );}
+\DoxyCodeLine{174 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} SetLocked( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bLocked );}
+\DoxyCodeLine{175 }
+\DoxyCodeLine{176 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} TestStub( \textcolor{keywordtype}{char} *s, \textcolor{keywordtype}{void} *vpTag ) \{\};}
+\DoxyCodeLine{177 }
+\DoxyCodeLine{178 }
+\DoxyCodeLine{179 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{180 \textcolor{keyword}{virtual} xbInt16 DumpFreeBlocks( xbInt16 iOpt = 0 ) \{ \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}}; \}}
+\DoxyCodeLine{181 \textcolor{keyword}{virtual} xbInt16 DumpHeader( xbInt16 iDestOpt = 0, xbInt16 iFmtOpt = 0 ) = 0;}
+\DoxyCodeLine{182 \textcolor{keyword}{virtual} xbInt16 DumpIxForTag( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOutputOpt ) = 0;}
+\DoxyCodeLine{183 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} DumpIxNodeChain( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOutputOpt ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{184 \textcolor{keyword}{virtual} xbInt16 DumpNode( \textcolor{keywordtype}{void} * vpTag, xbIxNode * pNode, xbInt16 iOption ) \textcolor{keyword}{const};}
+\DoxyCodeLine{185 \textcolor{keyword}{virtual} xbInt16 DumpTagBlocks( xbInt16 iOpt = 1, \textcolor{keywordtype}{void} *vpTag = NULL ) = 0;}
+\DoxyCodeLine{186 }
+\DoxyCodeLine{187 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{188 }
+\DoxyCodeLine{189 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{190 \textcolor{keyword}{friend} \textcolor{keyword}{class }\mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}};}
+\DoxyCodeLine{191 }
+\DoxyCodeLine{192 \textcolor{keyword}{virtual} xbInt16 AddKey( \textcolor{keywordtype}{void} *vpTag, xbUInt32 ulRecNo ) = 0;}
+\DoxyCodeLine{193 \textcolor{keyword}{virtual} xbInt16 AddKeys( xbUInt32 ulRecNo );}
+\DoxyCodeLine{194 \textcolor{keyword}{virtual} xbIxNode *AllocateIxNode( xbUInt32 ulBufSize = 0, xbInt16 iOption = 0 );}
+\DoxyCodeLine{195 \textcolor{keyword}{virtual} xbInt16 BSearchBlock( \textcolor{keywordtype}{char} cKeyType, xbIxNode *npNode, xbInt32 lKeyLen, \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpKey, xbInt32 lSearchKeyLen, xbInt16 \&iCompRc, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bDescending = \mbox{\hyperlink{xbtypes_8h_adc4b6ca5ad299f63675136d9e03938cc}{xbFalse}} ) \textcolor{keyword}{const};}
+\DoxyCodeLine{196 \textcolor{keyword}{virtual} xbInt16 CheckForDupKeys();}
+\DoxyCodeLine{197 \textcolor{keyword}{virtual} xbInt16 CheckForDupKey( \textcolor{keywordtype}{void} *vpTag ) = 0;}
+\DoxyCodeLine{198 \textcolor{keyword}{virtual} xbInt16 CompareKey( \textcolor{keywordtype}{char} cKeyType, \textcolor{keyword}{const} \textcolor{keywordtype}{void} *v1, \textcolor{keyword}{const} \textcolor{keywordtype}{void} *v2, \textcolor{keywordtype}{size\_t} lKeyLen ) \textcolor{keyword}{const};}
+\DoxyCodeLine{199 \textcolor{keyword}{virtual} xbInt16 CreateKeys( xbInt16 iOpt );}
+\DoxyCodeLine{200 \textcolor{keyword}{virtual} xbInt16 CreateKey( \textcolor{keywordtype}{void} * vpTag, xbInt16 iOpt ) = 0;}
+\DoxyCodeLine{201 \textcolor{keyword}{virtual} xbInt16 DeleteFromNode( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npNode, xbInt16 iSlotNo ) = 0;}
+\DoxyCodeLine{202 \textcolor{comment}{// virtual xbInt16 DeleteKeys( xbUInt32 ulRecNo );}}
+\DoxyCodeLine{203 \textcolor{keyword}{virtual} xbInt16 DeleteKeys();}
+\DoxyCodeLine{204 \textcolor{keyword}{virtual} xbInt16 DeleteKey( \textcolor{keywordtype}{void} *vpTag ) = 0;}
+\DoxyCodeLine{205 }
+\DoxyCodeLine{206 \textcolor{keyword}{virtual} xbInt16 DeleteTag( \textcolor{keywordtype}{void} *vpTag ) = 0;}
+\DoxyCodeLine{207 }
+\DoxyCodeLine{208 }
+\DoxyCodeLine{209 \textcolor{keyword}{virtual} xbInt16 FindKeyForCurRec( \textcolor{keywordtype}{void} *vpTag ) = 0;}
+\DoxyCodeLine{210 \textcolor{keyword}{virtual} xbIxNode *FreeNodeChain( xbIxNode *np );}
+\DoxyCodeLine{211 \textcolor{keyword}{virtual} xbInt16 GetBlock( \textcolor{keywordtype}{void} *vpTag, xbUInt32 ulBlockNo, xbInt16 iOpt, xbUInt32 ulAddlBuf = 0 );}
+\DoxyCodeLine{212 \textcolor{comment}{// virtual xbBool GetIndexUpdated() const = 0;}}
+\DoxyCodeLine{213 \textcolor{keyword}{virtual} xbInt32 GetKeyCount( xbIxNode *npNode ) \textcolor{keyword}{const};}
+\DoxyCodeLine{214 \textcolor{keyword}{virtual} \textcolor{keywordtype}{char} *GetKeyData( xbIxNode *npNode, xbInt16 iKeyNo, xbInt16 iKeyItemLen ) \textcolor{keyword}{const};}
+\DoxyCodeLine{215 \textcolor{keyword}{virtual} xbInt16 GetKeySts( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{216 \textcolor{keyword}{virtual} xbInt16 GetLastKey( xbUInt32 ulNodeNo, \textcolor{keywordtype}{void} *vpTag, xbInt16 lRetrieveSw ) = 0;}
+\DoxyCodeLine{217 \textcolor{keyword}{virtual} xbInt16 InsertNodeL( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, \textcolor{keywordtype}{char} * cpKeyBuf, xbUInt32 uiPtr ) = 0;}
+\DoxyCodeLine{218 \textcolor{keyword}{virtual} xbInt16 InsertNodeI( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, xbUInt32 uiPtr ) = 0;}
+\DoxyCodeLine{219 \textcolor{keyword}{virtual} xbInt16 KeyExists( \textcolor{keywordtype}{void} * ) = 0;}
+\DoxyCodeLine{220 \textcolor{comment}{// virtual xbInt16 KeyUpdated( void *vpTag ) const = 0;}}
+\DoxyCodeLine{221 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} NodeFree( xbIxNode * ixNode );}
+\DoxyCodeLine{222 \textcolor{keyword}{virtual} xbInt16 ReadHeadBlock( xbInt16 iOpt = 0 ) = 0;}
+\DoxyCodeLine{223 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} SetDbf( \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf );}
+\DoxyCodeLine{224 \textcolor{keyword}{virtual} xbInt16 SplitNodeL( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, \textcolor{keywordtype}{char} *cpKeyBuf, xbUInt32 uiPtr ) = 0;}
+\DoxyCodeLine{225 \textcolor{keyword}{virtual} xbInt16 SplitNodeI( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 uiPtr ) = 0;}
+\DoxyCodeLine{226 \textcolor{keyword}{virtual} xbInt16 UpdateTagKey( \textcolor{keywordtype}{char} cAction, \textcolor{keywordtype}{void} *vpTag, xbUInt32 ulRecNo = 0 ) = 0;}
+\DoxyCodeLine{227 \textcolor{keyword}{virtual} xbInt16 WriteHeadBlock( xbInt16 iOption ) = 0;}
+\DoxyCodeLine{228 }
+\DoxyCodeLine{229 \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf;}
+\DoxyCodeLine{230 \textcolor{keywordtype}{char} *cNodeBuf; \textcolor{comment}{// pointer to memory for processing in a block of index data}}
+\DoxyCodeLine{231 \textcolor{keywordtype}{void} *vpCurTag; \textcolor{comment}{// pointer to active tag. Single index files have only one tag}}
+\DoxyCodeLine{232 }
+\DoxyCodeLine{233 \textcolor{keyword}{private}:}
+\DoxyCodeLine{234 \textcolor{keyword}{virtual} \textcolor{keywordtype}{void} AppendNodeChain( \textcolor{keywordtype}{void} *vpTag, xbIxNode *npNode ) = 0;}
+\DoxyCodeLine{235 \textcolor{keyword}{virtual} xbInt16 GetKeyPtr( \textcolor{keywordtype}{void} *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 \&ulKeyPtr ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{236 \textcolor{keyword}{virtual} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsLeaf( \textcolor{keywordtype}{void} *vpTag, xbIxNode *npNode ) \textcolor{keyword}{const} = 0;}
+\DoxyCodeLine{237 \textcolor{comment}{// virtual void SetCurNode( void *vpTag, xbIxNode *npNode ) = 0;}}
+\DoxyCodeLine{238 }
+\DoxyCodeLine{239 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bLocked; \textcolor{comment}{// index file locked?}}
+\DoxyCodeLine{240 \};}
+\DoxyCodeLine{241 }
+\DoxyCodeLine{242 \textcolor{preprocessor}{\#ifdef XB\_NDX\_SUPPORT}}
+\DoxyCodeLine{243 }
+\DoxyCodeLine{244 \textcolor{preprocessor}{\#define XB\_NDX\_BLOCK\_SIZE 512}}
+\DoxyCodeLine{245 }
+\DoxyCodeLine{246 }
+\DoxyCodeLine{248 \textcolor{keyword}{struct }XBDLLEXPORT xbNdxTag \{}
+\DoxyCodeLine{249 }
+\DoxyCodeLine{250 \textcolor{comment}{// NDX File Header Fields}}
+\DoxyCodeLine{251 xbUInt32 ulRootBlock; \textcolor{comment}{// header node is 0}}
+\DoxyCodeLine{252 xbUInt32 ulTotalBlocks; \textcolor{comment}{// includes header node}}
+\DoxyCodeLine{253 \textcolor{keywordtype}{char} cKeyType; \textcolor{comment}{// C = Char, F = Numeric, D = Date}}
+\DoxyCodeLine{254 xbInt16 iKeyLen; \textcolor{comment}{// length of key data}}
+\DoxyCodeLine{255 xbInt16 iKeysPerBlock; \textcolor{comment}{// max number keys per block <=100}}
+\DoxyCodeLine{256 xbInt16 iKeyType; \textcolor{comment}{// 00 = Char, 01 = Numeric}}
+\DoxyCodeLine{257 xbInt16 iKeyItemLen; \textcolor{comment}{// KeyLen + 8 bytes}}
+\DoxyCodeLine{258 \textcolor{keywordtype}{char} cSerNo; \textcolor{comment}{// rolling incrementing serial number +1 on each index update}}
+\DoxyCodeLine{259 xbInt16 iUnique; \textcolor{comment}{// True if unique}}
+\DoxyCodeLine{260 xbString sKeyExpression; \textcolor{comment}{// index expression}}
+\DoxyCodeLine{261 \textcolor{comment}{// end of NDX Header field}}
+\DoxyCodeLine{262 }
+\DoxyCodeLine{263 xbExp *exp; \textcolor{comment}{// pointer to expression for expression keys}}
+\DoxyCodeLine{264 time\_t tNodeChainTs; \textcolor{comment}{// node chain time stamp}}
+\DoxyCodeLine{265 xbIxNode *npNodeChain;}
+\DoxyCodeLine{266 xbIxNode *npCurNode;}
+\DoxyCodeLine{267 \textcolor{keywordtype}{char} *cpKeyBuf; \textcolor{comment}{// key buffer, for searches and adds}}
+\DoxyCodeLine{268 \textcolor{keywordtype}{char} *cpKeyBuf2; \textcolor{comment}{// key buffer, for deletes}}
+\DoxyCodeLine{269 xbString sTagName; \textcolor{comment}{// tag name -\/ is the file name without the extension}}
+\DoxyCodeLine{270 \textcolor{comment}{// xbInt16 iKeyUpdated; // key updated? set in method KeyUpdated, checked in AddKey and DeleteKey routines}}
+\DoxyCodeLine{271 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bFoundSts; \textcolor{comment}{// key found? used to determine if new key should be added in XB\_EMULATE\_DBASE mode in AddKey}}
+\DoxyCodeLine{272 }
+\DoxyCodeLine{273 }
+\DoxyCodeLine{274 xbInt16 iKeySts; \textcolor{comment}{// key updated? set in method CreateKey, checked in AddKey and DeleteKey routines}}
+\DoxyCodeLine{275 \textcolor{comment}{// old key filtered new key filtered iKeySts}}
+\DoxyCodeLine{276 \textcolor{comment}{// Y Y XB\_UPD\_KEY 2 -\/ update key if changed (delete and add)}}
+\DoxyCodeLine{277 \textcolor{comment}{// Y N XB\_DEL\_KEY 3 -\/ delete key}}
+\DoxyCodeLine{278 \textcolor{comment}{// N Y XB\_ADD\_KEY 1 -\/ add key}}
+\DoxyCodeLine{279 \textcolor{comment}{// N N 0 -\/ no update}}
+\DoxyCodeLine{280 }
+\DoxyCodeLine{281 \};}
+\DoxyCodeLine{283 }
+\DoxyCodeLine{285 }
+\DoxyCodeLine{304 \textcolor{keyword}{class }XBDLLEXPORT xbIxNdx : \textcolor{keyword}{public} xbIx \{}
+\DoxyCodeLine{305 \textcolor{keyword}{public}:}
+\DoxyCodeLine{306 xbIxNdx( \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} * d );}
+\DoxyCodeLine{307 \string~xbIxNdx();}
+\DoxyCodeLine{308 xbInt16 CheckTagIntegrity( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOpt );}
+\DoxyCodeLine{309 xbInt16 CreateTag( \textcolor{keyword}{const} xbString \&sName, \textcolor{keyword}{const} xbString \&sKey, \textcolor{keyword}{const} xbString \&sFilter, xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverlay, \textcolor{keywordtype}{void} **vpTag );}
+\DoxyCodeLine{310 \textcolor{comment}{// xbInt16 DeleteTag( void *vpTag );}}
+\DoxyCodeLine{311 xbInt16 FindKey( \textcolor{keywordtype}{void} *vpTag, \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw );}
+\DoxyCodeLine{312 xbInt16 GetFirstKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 iRetrieveSw );}
+\DoxyCodeLine{313 }
+\DoxyCodeLine{314 xbInt16 GetLastKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 iRetrieveSw = 1 );}
+\DoxyCodeLine{315 xbInt16 GetNextKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 iRetrieveSw = 1 );}
+\DoxyCodeLine{316 xbInt16 GetPrevKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 iRetrieveSw = 1 );}
+\DoxyCodeLine{317 xbInt32 GetKeyLen ( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{318 \textcolor{keywordtype}{char} GetKeyType ( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{319 xbString \&GetKeyExpression( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{320 xbString \&GetKeyFilter( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{321 \textcolor{keywordtype}{void} *GetTag( xbInt16 iTagNo ) \textcolor{keyword}{const};}
+\DoxyCodeLine{322 \textcolor{keywordtype}{void} *GetTag( xbString \&sTagName ) \textcolor{keyword}{const};}
+\DoxyCodeLine{323 xbString \&GetTagName( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{324 \textcolor{keyword}{const} \textcolor{keywordtype}{char} * GetTagName( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOpt ) \textcolor{keyword}{const};}
+\DoxyCodeLine{325 }
+\DoxyCodeLine{326 xbInt16 GetTagCount() \textcolor{keyword}{const};}
+\DoxyCodeLine{327 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetUnique( \textcolor{keywordtype}{void} *vpTag = NULL ) \textcolor{keyword}{const};}
+\DoxyCodeLine{328 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetSortOrder( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{329 xbInt16 Reindex( \textcolor{keywordtype}{void} **vpTag );}
+\DoxyCodeLine{330 xbInt16 SetCurTag( xbInt16 iTagNo );}
+\DoxyCodeLine{331 xbInt16 SetCurTag( xbString \&sTagName );}
+\DoxyCodeLine{332 }
+\DoxyCodeLine{333 }
+\DoxyCodeLine{334 }
+\DoxyCodeLine{335 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{336 xbInt16 DumpTagBlocks( xbInt16 iOpt = 1, \textcolor{keywordtype}{void} *vpTag = NULL );}
+\DoxyCodeLine{337 xbInt16 DumpHeader( xbInt16 iOpt = 0, xbInt16 iFmt = 0 );}
+\DoxyCodeLine{338 xbInt16 DumpIxForTag( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOutputOpt );}
+\DoxyCodeLine{339 \textcolor{keywordtype}{void} DumpIxNodeChain( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOutputOpt ) \textcolor{keyword}{const};}
+\DoxyCodeLine{340 xbInt16 DumpNode( \textcolor{keywordtype}{void} * vpTag, xbIxNode * pNode, xbInt16 iOption ) \textcolor{keyword}{const};}
+\DoxyCodeLine{341 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{342 }
+\DoxyCodeLine{343 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{344 \textcolor{keyword}{friend} \textcolor{keyword}{class }\mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}};}
+\DoxyCodeLine{345 xbInt16 AddKey( \textcolor{keywordtype}{void} *vpTag, xbUInt32 ulRecNo );}
+\DoxyCodeLine{346 xbIxNode *AllocateIxNode( xbUInt32 ulBufSize = 0, xbInt16 iOption = 0 );}
+\DoxyCodeLine{347 xbInt16 CheckForDupKey( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{348 xbIxNode *CreateIxNode( xbUInt32 ulBufSize );}
+\DoxyCodeLine{349 xbInt16 CreateKey( \textcolor{keywordtype}{void} * vpTag, xbInt16 iOpt );}
+\DoxyCodeLine{350 xbInt16 DeleteFromNode( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npNode, xbInt16 iSlotNo );}
+\DoxyCodeLine{351 xbInt16 DeleteKey( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{352 }
+\DoxyCodeLine{353 xbInt16 DeleteTag( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{354 }
+\DoxyCodeLine{355 xbInt16 FindKeyForCurRec( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{356 \textcolor{comment}{// xbBool GetIndexUpdated() const;}}
+\DoxyCodeLine{357 xbInt16 GetKeyTypeN( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{358 xbInt16 GetKeySts( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{359 xbInt16 GetLastKey( xbUInt32 ulNodeNo, \textcolor{keywordtype}{void} *vpTag, xbInt16 iRetrieveSw = 1 );}
+\DoxyCodeLine{360 xbInt16 InsertNodeI( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, xbUInt32 uiPtr );}
+\DoxyCodeLine{361 xbInt16 InsertNodeL( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, \textcolor{keywordtype}{char} * cpKeyBuf, xbUInt32 uiPtr );}
+\DoxyCodeLine{362 xbInt16 KeyExists( \textcolor{keywordtype}{void} *vpTag = NULL );}
+\DoxyCodeLine{363 \textcolor{comment}{// xbBool KeyFiltered( void *vpTag ) const;}}
+\DoxyCodeLine{364 \textcolor{comment}{// xbInt16 KeyUpdated( void *vpTag ) const;}}
+\DoxyCodeLine{365 xbInt16 ReadHeadBlock(xbInt16 iOpt); \textcolor{comment}{// read the header node of the disk NDX file}}
+\DoxyCodeLine{366 xbInt16 SplitNodeI( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 uiPtr );}
+\DoxyCodeLine{367 xbInt16 SplitNodeL( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, \textcolor{keywordtype}{char} *cpKeyBuf, xbUInt32 uiPtr );}
+\DoxyCodeLine{368 xbInt16 UpdateTagKey( \textcolor{keywordtype}{char} cAction, \textcolor{keywordtype}{void} *vpTag, xbUInt32 ulRecNo = 0 );}
+\DoxyCodeLine{369 xbInt16 WriteHeadBlock( xbInt16 iOption );}
+\DoxyCodeLine{370 }
+\DoxyCodeLine{371 \textcolor{keyword}{private}:}
+\DoxyCodeLine{372 xbInt16 AddKeyNewRoot( xbNdxTag *npTag, xbIxNode *npLeft, xbIxNode *npRight );}
+\DoxyCodeLine{373 \textcolor{keywordtype}{void} AppendNodeChain( \textcolor{keywordtype}{void} *vpTag, xbIxNode *npNode );}
+\DoxyCodeLine{374 xbInt16 GetDbfPtr( \textcolor{keywordtype}{void} *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 \&ulDbfPtr ) \textcolor{keyword}{const};}
+\DoxyCodeLine{375 xbInt16 GetKeyPtr( \textcolor{keywordtype}{void} *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 \&ulKeyPtr ) \textcolor{keyword}{const};}
+\DoxyCodeLine{376 xbInt16 GetLastKeyForBlockNo( \textcolor{keywordtype}{void} *vpTag, xbUInt32 ulBlockNo, \textcolor{keywordtype}{char} *cpKeyBuf );}
+\DoxyCodeLine{377 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsLeaf( \textcolor{keywordtype}{void} *vpTag, xbIxNode *npNode ) \textcolor{keyword}{const};}
+\DoxyCodeLine{378 xbInt16 KeySetPosAdd( xbNdxTag *npTag, xbUInt32 ulAddKeyRecNo );}
+\DoxyCodeLine{379 xbInt16 KeySetPosDel( xbNdxTag *npTag );}
+\DoxyCodeLine{380 \textcolor{comment}{// void SetCurNode( void *vpTag, xbIxNode *np );}}
+\DoxyCodeLine{381 xbNdxTag *ndxTag;}
+\DoxyCodeLine{382 \};}
+\DoxyCodeLine{383 }
+\DoxyCodeLine{384 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* XB\_NDX\_SUPPORT */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{385 }
+\DoxyCodeLine{386 }
+\DoxyCodeLine{387 \textcolor{preprocessor}{\#ifdef XB\_MDX\_SUPPORT}}
+\DoxyCodeLine{388 \textcolor{comment}{//\#define XB\_MDX\_BLOCK\_SIZE 1024}}
+\DoxyCodeLine{389 }
+\DoxyCodeLine{390 \textcolor{keyword}{struct }XBDLLEXPORT xbMdxTag \{}
+\DoxyCodeLine{391 }
+\DoxyCodeLine{392 \textcolor{comment}{// next 7 fields comprise the tag table entry}}
+\DoxyCodeLine{393 xbUInt32 ulTagHdrPageNo; \textcolor{comment}{// 512 byte page number, NOT block number}}
+\DoxyCodeLine{394 \textcolor{keywordtype}{char} cTagName[11];}
+\DoxyCodeLine{395 \textcolor{keywordtype}{char} cKeyFmt; \textcolor{comment}{// always 0x10 w/ DBase V7}}
+\DoxyCodeLine{396 \textcolor{keywordtype}{char} cLeftChild; \textcolor{comment}{// cFwdTagThread}}
+\DoxyCodeLine{397 \textcolor{keywordtype}{char} cRightChild; \textcolor{comment}{// cFwdTagThread2}}
+\DoxyCodeLine{398 \textcolor{keywordtype}{char} cParent; \textcolor{comment}{// cBwdTagThread}}
+\DoxyCodeLine{399 \textcolor{keywordtype}{char} c2;}
+\DoxyCodeLine{400 \textcolor{keywordtype}{char} cKeyType; \textcolor{comment}{// C,D,N}}
+\DoxyCodeLine{401 }
+\DoxyCodeLine{402 xbUInt32 ulRootPage; \textcolor{comment}{// 512 byte page number, NOT block number}}
+\DoxyCodeLine{403 xbUInt32 ulTagSize; \textcolor{comment}{// Number of 512 byte pages allocated to the tag. Tag size of two is a single 1024 block}}
+\DoxyCodeLine{404 }
+\DoxyCodeLine{405 \textcolor{keywordtype}{char} cKeyFmt2; \textcolor{comment}{// 0x10 -\/ base}}
+\DoxyCodeLine{406 \textcolor{comment}{// 0x08 -\/ descending}}
+\DoxyCodeLine{407 \textcolor{comment}{// 0x40 -\/ unique}}
+\DoxyCodeLine{408 \textcolor{keywordtype}{char} cKeyType2;}
+\DoxyCodeLine{409 \textcolor{comment}{// one unused byte fits here}}
+\DoxyCodeLine{410 }
+\DoxyCodeLine{411 \textcolor{keywordtype}{char} cTag11; \textcolor{comment}{// dbase sets to 0x1B}}
+\DoxyCodeLine{412 }
+\DoxyCodeLine{413 xbInt16 iKeyLen;}
+\DoxyCodeLine{414 xbInt16 iKeysPerBlock;}
+\DoxyCodeLine{415 xbInt16 iSecKeyType;}
+\DoxyCodeLine{416 xbInt16 iKeyItemLen; \textcolor{comment}{// iKeyLen + 4}}
+\DoxyCodeLine{417 }
+\DoxyCodeLine{418 \textcolor{keywordtype}{char} cSerialNo; \textcolor{comment}{// Increments +1 for each tag update}}
+\DoxyCodeLine{419 \textcolor{keywordtype}{char} cUnique;}
+\DoxyCodeLine{420 xbString *sKeyExp; \textcolor{comment}{// Key expression}}
+\DoxyCodeLine{421 }
+\DoxyCodeLine{422 \textcolor{keywordtype}{char} cHasFilter; \textcolor{comment}{// 0x00 or 0x01}}
+\DoxyCodeLine{423 \textcolor{keywordtype}{char} cHasKeys; \textcolor{comment}{// 0x00 or 0x01}}
+\DoxyCodeLine{424 }
+\DoxyCodeLine{425 xbUInt32 ulLeftChild; \textcolor{comment}{// dbase 7 sets this to the root page on tag creation}}
+\DoxyCodeLine{426 xbUInt32 ulRightChild; \textcolor{comment}{// dbase 7 sets this to the root page on tag creation}}
+\DoxyCodeLine{427 }
+\DoxyCodeLine{428 \textcolor{keywordtype}{char} cTagYY;}
+\DoxyCodeLine{429 \textcolor{keywordtype}{char} cTagMM;}
+\DoxyCodeLine{430 \textcolor{keywordtype}{char} cTagDD;}
+\DoxyCodeLine{431 }
+\DoxyCodeLine{432 \textcolor{keywordtype}{char} cKeyFmt3; \textcolor{comment}{// dbase 7 sets this 0x01 if discreet field or 0x00 if calculated or combination field key expression on tag creation}}
+\DoxyCodeLine{433 }
+\DoxyCodeLine{434 xbString *sFiltExp; \textcolor{comment}{// Filter expression}}
+\DoxyCodeLine{435 }
+\DoxyCodeLine{436 time\_t tNodeChainTs;}
+\DoxyCodeLine{437 xbIxNode *npNodeChain;}
+\DoxyCodeLine{438 xbIxNode *npCurNode;}
+\DoxyCodeLine{439 xbExp *exp; \textcolor{comment}{// pointer to expression for expression based tags}}
+\DoxyCodeLine{440 xbExp *filter; \textcolor{comment}{// pointer to expression for index filter}}
+\DoxyCodeLine{441 }
+\DoxyCodeLine{442 \textcolor{keywordtype}{char} *cpKeyBuf; \textcolor{comment}{// key buffer}}
+\DoxyCodeLine{443 \textcolor{keywordtype}{char} *cpKeyBuf2; \textcolor{comment}{// key buffer}}
+\DoxyCodeLine{444 \textcolor{comment}{// xbBool iKeyUpdated; // key updated? set in method CreateKey, checked in AddKey and DeleteKey routines}}
+\DoxyCodeLine{445 \textcolor{comment}{// 0 -\/ no update}}
+\DoxyCodeLine{446 \textcolor{comment}{// 1 -\/ Add}}
+\DoxyCodeLine{447 \textcolor{comment}{// 2 -\/ Update}}
+\DoxyCodeLine{448 \textcolor{comment}{// 3 -\/ Delete}}
+\DoxyCodeLine{449 \textcolor{comment}{// xbBool bKeyFiltered; // key filtered? True if included key, False if excluded key. Set in method CreateKey, checked in AddKey and DeleteKey routines}}
+\DoxyCodeLine{450 xbString *sTagName; \textcolor{comment}{// string tag name}}
+\DoxyCodeLine{451 }
+\DoxyCodeLine{452 }
+\DoxyCodeLine{453 xbMdxTag *next;}
+\DoxyCodeLine{454 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bFoundSts; \textcolor{comment}{// key found? used to determine if new key should be added in XB\_EMULATE\_DBASE mode in AddKey}}
+\DoxyCodeLine{455 }
+\DoxyCodeLine{456 }
+\DoxyCodeLine{457 xbInt16 iKeySts; \textcolor{comment}{// key updated? set in method CreateKey, checked in AddKey and DeleteKey routines}}
+\DoxyCodeLine{458 \textcolor{comment}{// old key filtered new key filtered iKeySts}}
+\DoxyCodeLine{459 \textcolor{comment}{// Y Y XB\_UPD\_KEY 2 -\/ update key if changed (delete and add)}}
+\DoxyCodeLine{460 \textcolor{comment}{// Y N XB\_DEL\_KEY 3 -\/ delete key}}
+\DoxyCodeLine{461 \textcolor{comment}{// N Y XB\_ADD\_KEY 1 -\/ add key}}
+\DoxyCodeLine{462 \textcolor{comment}{// N N 0 -\/ no update}}
+\DoxyCodeLine{463 }
+\DoxyCodeLine{464 }
+\DoxyCodeLine{465 \};}
+\DoxyCodeLine{466 }
+\DoxyCodeLine{467 }
+\DoxyCodeLine{468 \textcolor{keyword}{class }XBDLLEXPORT xbIxMdx : \textcolor{keyword}{public} xbIx \{}
+\DoxyCodeLine{469 \textcolor{keyword}{public}:}
+\DoxyCodeLine{470 xbIxMdx( \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} * d );}
+\DoxyCodeLine{471 \string~xbIxMdx();}
+\DoxyCodeLine{472 xbInt16 CheckTagIntegrity( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOpt );}
+\DoxyCodeLine{473 xbInt16 CreateTag( \textcolor{keyword}{const} xbString \&sName, \textcolor{keyword}{const} xbString \&sKey, \textcolor{keyword}{const} xbString \&sFilter, xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverlay, \textcolor{keywordtype}{void} **vpTag );}
+\DoxyCodeLine{474 \textcolor{comment}{// xbInt16 DeleteTag( void *vpTag );}}
+\DoxyCodeLine{475 xbInt16 FindKey( \textcolor{keywordtype}{void} *vpTag, \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw );}
+\DoxyCodeLine{476 xbInt16 FindKey( \textcolor{keywordtype}{void} *vpTag, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dKey, xbInt16 iRetrieveSw );}
+\DoxyCodeLine{477 xbInt16 GetFirstKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 lRetrieveSw );}
+\DoxyCodeLine{478 xbString \&GetKeyExpression( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{479 xbString \&GetKeyFilter( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{480 \textcolor{keywordtype}{char} GetKeyType( \textcolor{keyword}{const} \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{481 xbInt16 GetLastKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 lRetrieveSw );}
+\DoxyCodeLine{482 xbInt16 GetNextKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 lRetrieveSw );}
+\DoxyCodeLine{483 xbInt16 GetPrevKey( \textcolor{keywordtype}{void} *vpTag, xbInt16 lRetrieveSw );}
+\DoxyCodeLine{484 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetReuseEmptyNodesSw() \textcolor{keyword}{const};}
+\DoxyCodeLine{485 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetSortOrder( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{486 \textcolor{keywordtype}{void} *GetTag( xbInt16 iTagNo ) \textcolor{keyword}{const};}
+\DoxyCodeLine{487 \textcolor{keywordtype}{void} *GetTag( xbString \&sTagName ) \textcolor{keyword}{const};}
+\DoxyCodeLine{488 xbInt16 GetTagCount() \textcolor{keyword}{const};}
+\DoxyCodeLine{489 }
+\DoxyCodeLine{490 xbString \&GetTagName( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{491 \textcolor{keyword}{const} \textcolor{keywordtype}{char} * GetTagName( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOpt ) \textcolor{keyword}{const};}
+\DoxyCodeLine{492 \textcolor{keywordtype}{void} GetTagName( \textcolor{keywordtype}{void} *vpTag, xbString \&sTagName );}
+\DoxyCodeLine{493 }
+\DoxyCodeLine{494 xbInt16 GetUnique( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{495 xbInt16 Reindex( \textcolor{keywordtype}{void} **vpTag );}
+\DoxyCodeLine{496 xbInt16 SetCurTag( xbInt16 iTagNo );}
+\DoxyCodeLine{497 xbInt16 SetCurTag( xbString \&sTagName );}
+\DoxyCodeLine{498 \textcolor{keywordtype}{void} SetReuseEmptyNodesSw( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bReuse );}
+\DoxyCodeLine{499 }
+\DoxyCodeLine{500 \textcolor{keywordtype}{void} TestStub( \textcolor{keywordtype}{char} *s, \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{501 }
+\DoxyCodeLine{502 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{503 \textcolor{keyword}{friend} \textcolor{keyword}{class }\mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}};}
+\DoxyCodeLine{504 }
+\DoxyCodeLine{505 xbInt16 AddKey( \textcolor{keywordtype}{void} *vpTag, xbUInt32 ulRecNo );}
+\DoxyCodeLine{506 xbIxNode *AllocateIxNode( xbMdxTag * mpTag, xbUInt32 ulBufSize, xbUInt32 ulBlock2 );}
+\DoxyCodeLine{507 xbInt16 CheckForDupKey( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{508 xbInt16 Close();}
+\DoxyCodeLine{509 xbInt16 CreateKey( \textcolor{keywordtype}{void} * vpTag, xbInt16 iOpt );}
+\DoxyCodeLine{510 xbInt16 DeleteFromNode( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npNode, xbInt16 iSlotNo );}
+\DoxyCodeLine{511 xbInt16 DeleteKey( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{512 }
+\DoxyCodeLine{513 xbInt16 DeleteTag( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{514 }
+\DoxyCodeLine{515 xbInt16 FindKeyForCurRec( \textcolor{keywordtype}{void} *vpTag );}
+\DoxyCodeLine{516 xbInt16 GetKeySts( \textcolor{keywordtype}{void} *vpTag ) \textcolor{keyword}{const};}
+\DoxyCodeLine{517 xbInt16 GetLastKey( xbUInt32 ulBlockNo, \textcolor{keywordtype}{void} *vpTag, xbInt16 lRetrieveSw );}
+\DoxyCodeLine{518 \textcolor{keywordtype}{void} *GetTagTblPtr() \textcolor{keyword}{const};}
+\DoxyCodeLine{519 \textcolor{keywordtype}{void} Init( xbInt16 iOpt = 0 );}
+\DoxyCodeLine{520 xbInt16 InsertNodeI( \textcolor{keywordtype}{void} *vpTag, xbIxNode *npNode, xbInt16 iSlotNo, xbUInt32 uiPtr );}
+\DoxyCodeLine{521 xbInt16 InsertNodeL( \textcolor{keywordtype}{void} *vpTag, xbIxNode *npNode, xbInt16 iSlotNo, \textcolor{keywordtype}{char} *cpKeyBuf, xbUInt32 uiPtr );}
+\DoxyCodeLine{522 xbInt16 KeyExists( \textcolor{keywordtype}{void} * );}
+\DoxyCodeLine{523 xbInt16 LoadTagTable();}
+\DoxyCodeLine{524 xbInt16 ReadHeadBlock(xbInt16 iOpt); \textcolor{comment}{// read the header node of the disk file}}
+\DoxyCodeLine{525 xbInt16 SplitNodeI( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 uiPtr );}
+\DoxyCodeLine{526 xbInt16 SplitNodeL( \textcolor{keywordtype}{void} *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, \textcolor{keywordtype}{char} *cpKeyBuf, xbUInt32 uiPtr );}
+\DoxyCodeLine{527 xbInt16 UpdateTagKey( \textcolor{keywordtype}{char} cAction, \textcolor{keywordtype}{void} *vpTag, xbUInt32 ulRecNo = 0 );}
+\DoxyCodeLine{528 xbInt16 WriteHeadBlock( xbInt16 iOption );}
+\DoxyCodeLine{529 }
+\DoxyCodeLine{530 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{531 xbInt16 DumpTagBlocks( xbInt16 iOpt = 1, \textcolor{keywordtype}{void} *vpTag = NULL );}
+\DoxyCodeLine{532 xbInt16 DumpFreeBlocks( xbInt16 iOpt = 0 );}
+\DoxyCodeLine{533 xbInt16 DumpHeader( xbInt16 iOpt = 0, xbInt16 iFmtOpt = 0 );}
+\DoxyCodeLine{534 xbInt16 DumpIxForTag( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOutputOpt );}
+\DoxyCodeLine{535 \textcolor{keywordtype}{void} DumpIxNodeChain( \textcolor{keywordtype}{void} *vpTag, xbInt16 iOutputOpt ) \textcolor{keyword}{const};}
+\DoxyCodeLine{536 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{537 }
+\DoxyCodeLine{538 \textcolor{keyword}{private}:}
+\DoxyCodeLine{539 xbInt16 AddKeyNewRoot( xbMdxTag *npTag, xbIxNode *npLeft, xbIxNode *npRight );}
+\DoxyCodeLine{540 \textcolor{keywordtype}{void} AppendNodeChain( \textcolor{keywordtype}{void} *vpTag, xbIxNode *npNode );}
+\DoxyCodeLine{541 xbUInt32 BlockToPage( xbUInt32 ulBlockNo );}
+\DoxyCodeLine{542 \textcolor{keywordtype}{void} CalcBtreePointers();}
+\DoxyCodeLine{543 \textcolor{keywordtype}{char} CalcTagKeyFmt( xbExp \&exp );}
+\DoxyCodeLine{544 \textcolor{keywordtype}{char} CalcTagFwdThread1();}
+\DoxyCodeLine{545 \textcolor{keywordtype}{char} CalcTagFwdThread2();}
+\DoxyCodeLine{546 xbMdxTag *ClearTagTable();}
+\DoxyCodeLine{547 xbInt16 DumpBlock( xbInt16 iOpt, xbUInt32 ulBlockNo, xbMdxTag * mpTag );}
+\DoxyCodeLine{548 xbInt16 GetDbfPtr( \textcolor{keywordtype}{void} *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 \&ulDbfPtr ) \textcolor{keyword}{const};}
+\DoxyCodeLine{549 xbInt16 GetKeyPtr( \textcolor{keywordtype}{void} *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 \&ulKeyPtr ) \textcolor{keyword}{const};}
+\DoxyCodeLine{550 xbInt16 GetLastKeyForBlockNo( \textcolor{keywordtype}{void} *vpTag, xbUInt32 ulBlockNo, \textcolor{keywordtype}{char} *cpKeyBuf );}
+\DoxyCodeLine{551 xbInt16 HarvestEmptyNode( xbMdxTag *mpTag, xbIxNode *npNode, xbInt16 iOpt, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bHarvestRoot = \mbox{\hyperlink{xbtypes_8h_adc4b6ca5ad299f63675136d9e03938cc}{xbFalse}} );}
+\DoxyCodeLine{552 xbInt16 HarvestTagNodes( xbMdxTag *mpTag, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bRecycleRoot = \mbox{\hyperlink{xbtypes_8h_adc4b6ca5ad299f63675136d9e03938cc}{xbFalse}} );}
+\DoxyCodeLine{553 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsLeaf( \textcolor{keywordtype}{void} *vpTag, xbIxNode *npNode ) \textcolor{keyword}{const};}
+\DoxyCodeLine{554 xbInt16 KeySetPosAdd( xbMdxTag *mpTag, xbUInt32 ulAddKeyRecNo );}
+\DoxyCodeLine{555 xbInt16 KeySetPosDel( xbMdxTag *mpTag );}
+\DoxyCodeLine{556 xbInt16 LoadTagDetail( xbInt16 iOption, xbMdxTag *tte );}
+\DoxyCodeLine{557 xbUInt32 PageToBlock( xbUInt32 ulPageNo );}
+\DoxyCodeLine{558 xbInt16 TagSerialNo( xbInt16 iOption, xbMdxTag *mpTag );}
+\DoxyCodeLine{559 xbInt16 UpdateTagSize( xbMdxTag *mpTag, xbUInt32 ulTagSz );}
+\DoxyCodeLine{560 }
+\DoxyCodeLine{561 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{562 xbInt16 PrintKey( \textcolor{keywordtype}{void} *vpTag, xbIxNode *npNode, xbInt16 iKeyNo, xbInt16 iDepth, \textcolor{keywordtype}{char} cType, xbInt16 iOutputOpt );}
+\DoxyCodeLine{563 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{564 }
+\DoxyCodeLine{565 \textcolor{comment}{// MDX File Header Fields}}
+\DoxyCodeLine{566 \textcolor{keywordtype}{char} cVersion;}
+\DoxyCodeLine{567 \textcolor{keywordtype}{char} cCreateYY;}
+\DoxyCodeLine{568 \textcolor{keywordtype}{char} cCreateMM;}
+\DoxyCodeLine{569 \textcolor{keywordtype}{char} cCreateDD;}
+\DoxyCodeLine{570 xbString sFileName;}
+\DoxyCodeLine{571 xbInt16 iBlockFactor; \textcolor{comment}{// 1-\/32 \#of 512 byte segments in a block}}
+\DoxyCodeLine{572 }
+\DoxyCodeLine{573 \textcolor{comment}{// use file version}}
+\DoxyCodeLine{574 \textcolor{comment}{// xbInt16 iBlockSize; // Stored at the xbFile level}}
+\DoxyCodeLine{575 }
+\DoxyCodeLine{576 \textcolor{keywordtype}{char} cProdIxFlag;}
+\DoxyCodeLine{577 \textcolor{keywordtype}{char} cTagEntryCnt;}
+\DoxyCodeLine{578 xbInt16 iTagLen;}
+\DoxyCodeLine{579 xbInt16 iTagUseCnt;}
+\DoxyCodeLine{580 \textcolor{keywordtype}{char} cNextTag; \textcolor{comment}{// byte 28 +1}}
+\DoxyCodeLine{581 \textcolor{keywordtype}{char} c1B; \textcolor{comment}{// always 0x1B}}
+\DoxyCodeLine{582 xbUInt32 ulPageCnt; \textcolor{comment}{// number of 512 byte pages in the mdx file}}
+\DoxyCodeLine{583 xbUInt32 ulFirstFreePage; \textcolor{comment}{// page number corresponding to the next free block}}
+\DoxyCodeLine{584 xbUInt32 ulNoOfBlockAvail; \textcolor{comment}{// might be improperly named?? not sure how it is used}}
+\DoxyCodeLine{585 \textcolor{keywordtype}{char} cUpdateYY;}
+\DoxyCodeLine{586 \textcolor{keywordtype}{char} cUpdateMM;}
+\DoxyCodeLine{587 \textcolor{keywordtype}{char} cUpdateDD;}
+\DoxyCodeLine{588 \textcolor{comment}{// end of MDX Header fields}}
+\DoxyCodeLine{589 }
+\DoxyCodeLine{590 }
+\DoxyCodeLine{591 }
+\DoxyCodeLine{592 xbMdxTag *mdxTagTbl;}
+\DoxyCodeLine{593 }
+\DoxyCodeLine{594 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bReuseEmptyNodes; \textcolor{comment}{// Reuese empty MDX nodes when all keys deleted?}}
+\DoxyCodeLine{595 \textcolor{comment}{// DBase 7.x and MS ODBC drivers do not reuse empty nodes, leaves them stranded in the file}}
+\DoxyCodeLine{596 \textcolor{comment}{// Codebase 6.x reuses empty nodes.}}
+\DoxyCodeLine{597 \textcolor{comment}{// Setting this to True will reuse empty nodes in the same manner Codebase 6.x reuses them.}}
+\DoxyCodeLine{598 }
+\DoxyCodeLine{599 \};}
+\DoxyCodeLine{600 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* XB\_MDX\_SUPPORT */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{601 }
+\DoxyCodeLine{602 }
+\DoxyCodeLine{603 \} \textcolor{comment}{/* namespace xb */}}
+\DoxyCodeLine{604 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* XB\_INDEX\_SUPPORT */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{605 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_INDEX\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbinsert_8cpp.tex b/docs/doxygen/latex/xbinsert_8cpp.tex
new file mode 100644
index 0000000..394c391
--- /dev/null
+++ b/docs/doxygen/latex/xbinsert_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbinsert_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/sql/xbinsert.cpp File Reference}
+\label{xbinsert_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbinsert.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbinsert.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbixbase_8cpp.tex b/docs/doxygen/latex/xbixbase_8cpp.tex
new file mode 100644
index 0000000..a2adcb8
--- /dev/null
+++ b/docs/doxygen/latex/xbixbase_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbixbase_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbixbase.cpp File Reference}
+\label{xbixbase_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbixbase.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbixbase.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbixmdx_8cpp.tex b/docs/doxygen/latex/xbixmdx_8cpp.tex
new file mode 100644
index 0000000..71b27f8
--- /dev/null
+++ b/docs/doxygen/latex/xbixmdx_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbixmdx_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbixmdx.cpp File Reference}
+\label{xbixmdx_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbixmdx.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbixmdx.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbixndx_8cpp.tex b/docs/doxygen/latex/xbixndx_8cpp.tex
new file mode 100644
index 0000000..6d3f9d7
--- /dev/null
+++ b/docs/doxygen/latex/xbixndx_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbixndx_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbixndx.cpp File Reference}
+\label{xbixndx_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbixndx.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbixndx.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xblnklst_8h.tex b/docs/doxygen/latex/xblnklst_8h.tex
new file mode 100644
index 0000000..27f761b
--- /dev/null
+++ b/docs/doxygen/latex/xblnklst_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xblnklst_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xblnklst.h File Reference}
+\label{xblnklst_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnklst.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnklst.h}}
diff --git a/docs/doxygen/latex/xblnklst_8h_source.tex b/docs/doxygen/latex/xblnklst_8h_source.tex
new file mode 100644
index 0000000..f3d8d4c
--- /dev/null
+++ b/docs/doxygen/latex/xblnklst_8h_source.tex
@@ -0,0 +1,263 @@
+\hypertarget{xblnklst_8h_source}{}\doxysection{xblnklst.\+h}
+\label{xblnklst_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnklst.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnklst.h}}
+\mbox{\hyperlink{xblnklst_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xblnklst.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBLNKLST\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_XBLNKLST\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#ifdef XB\_LINKLIST\_SUPPORT}}
+\DoxyCodeLine{21 }
+\DoxyCodeLine{22 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 }
+\DoxyCodeLine{25 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{26 \textcolor{keyword}{class }XBDLLEXPORT xbLinkList \{}
+\DoxyCodeLine{27 \textcolor{keyword}{public}:}
+\DoxyCodeLine{28 xbLinkList();}
+\DoxyCodeLine{29 \string~xbLinkList();}
+\DoxyCodeLine{30 }
+\DoxyCodeLine{31 xbLinkListNode<xbNodeType> *GetHeadNode() \textcolor{keyword}{const};}
+\DoxyCodeLine{32 xbLinkListNode<xbNodeType> *GetEndNode() \textcolor{keyword}{const};}
+\DoxyCodeLine{33 xbLinkListNode<xbNodeType> *GetNodeForNo( xbUInt32 ulNodeNo ) \textcolor{keyword}{const};}
+\DoxyCodeLine{34 }
+\DoxyCodeLine{35 \textcolor{keywordtype}{void} Clear();}
+\DoxyCodeLine{36 xbUInt32 GetNodeCnt () \textcolor{keyword}{const};}
+\DoxyCodeLine{37 xbInt16 InsertAtEnd ( \textcolor{keyword}{const} xbNodeType \&xbLLN );}
+\DoxyCodeLine{38 xbInt16 InsertAtFront ( \textcolor{keyword}{const} xbNodeType \&xbLLN );}
+\DoxyCodeLine{39 xbInt16 RemoveByVal ( \textcolor{keyword}{const} xbNodeType \&xbLLN );}
+\DoxyCodeLine{40 xbInt16 RemoveFromEnd ();}
+\DoxyCodeLine{41 xbInt16 RemoveFromEnd ( xbNodeType \&xbLLN );}
+\DoxyCodeLine{42 xbInt16 RemoveFromFront( xbNodeType \&xbLLN );}
+\DoxyCodeLine{43 xbInt16 SearchFor ( \textcolor{keyword}{const} xbNodeType \&xbLLN );}
+\DoxyCodeLine{44 }
+\DoxyCodeLine{45 \textcolor{keyword}{private}:}
+\DoxyCodeLine{46 xbUInt32 ulNodeCnt;}
+\DoxyCodeLine{47 xbLinkListNode<xbNodeType> *llStartPtr;}
+\DoxyCodeLine{48 xbLinkListNode<xbNodeType> *llEndPtr;}
+\DoxyCodeLine{49 \};}
+\DoxyCodeLine{50 }
+\DoxyCodeLine{51 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{52 xbLinkList<xbNodeType>::xbLinkList()\{}
+\DoxyCodeLine{53 ulNodeCnt = 0;}
+\DoxyCodeLine{54 llStartPtr = NULL;}
+\DoxyCodeLine{55 llEndPtr = NULL;}
+\DoxyCodeLine{56 \}}
+\DoxyCodeLine{57 }
+\DoxyCodeLine{58 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{59 xbLinkList<xbNodeType>::\string~xbLinkList()\{}
+\DoxyCodeLine{60 Clear();}
+\DoxyCodeLine{61 \}}
+\DoxyCodeLine{62 }
+\DoxyCodeLine{63 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{64 \textcolor{keywordtype}{void} xbLinkList<xbNodeType>::Clear()\{}
+\DoxyCodeLine{65 xbLinkListNode<xbNodeType> *cPtr = llStartPtr, *tPtr;}
+\DoxyCodeLine{66 \textcolor{keywordflow}{for}( xbUInt32 i = 0; i < ulNodeCnt; i++ )\{}
+\DoxyCodeLine{67 tPtr = cPtr;}
+\DoxyCodeLine{68 cPtr = cPtr-\/>GetNextNode();}
+\DoxyCodeLine{69 \textcolor{keyword}{delete} tPtr;}
+\DoxyCodeLine{70 \}}
+\DoxyCodeLine{71 ulNodeCnt = 0;}
+\DoxyCodeLine{72 llStartPtr = NULL;}
+\DoxyCodeLine{73 llEndPtr = NULL;}
+\DoxyCodeLine{74 \}}
+\DoxyCodeLine{75 }
+\DoxyCodeLine{76 }
+\DoxyCodeLine{77 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{78 xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetHeadNode()\textcolor{keyword}{ const}\{}
+\DoxyCodeLine{79 \textcolor{keywordflow}{return} llStartPtr;}
+\DoxyCodeLine{80 \}}
+\DoxyCodeLine{81 }
+\DoxyCodeLine{82 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{83 xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetEndNode()\textcolor{keyword}{ const}\{}
+\DoxyCodeLine{84 \textcolor{keywordflow}{return} llEndPtr;}
+\DoxyCodeLine{85 \}}
+\DoxyCodeLine{86 }
+\DoxyCodeLine{87 }
+\DoxyCodeLine{88 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{89 xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetNodeForNo( xbUInt32 ulNo )\textcolor{keyword}{ const}\{}
+\DoxyCodeLine{90 }
+\DoxyCodeLine{91 xbLinkListNode<xbNodeType> *cPtr = llStartPtr;}
+\DoxyCodeLine{92 xbUInt32 i;}
+\DoxyCodeLine{93 \textcolor{keywordflow}{for}( i = 0; i < ulNo \&\& i < ulNodeCnt; i++ )}
+\DoxyCodeLine{94 cPtr = cPtr-\/>GetNextNode();}
+\DoxyCodeLine{95 }
+\DoxyCodeLine{96 \textcolor{keywordflow}{if}( i == ulNo )}
+\DoxyCodeLine{97 \textcolor{keywordflow}{return} cPtr;}
+\DoxyCodeLine{98 \textcolor{keywordflow}{else} }
+\DoxyCodeLine{99 \textcolor{keywordflow}{return} 0;}
+\DoxyCodeLine{100 \}}
+\DoxyCodeLine{101 }
+\DoxyCodeLine{102 }
+\DoxyCodeLine{103 }
+\DoxyCodeLine{104 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{105 xbUInt32 xbLinkList<xbNodeType>::GetNodeCnt()\textcolor{keyword}{ const}\{}
+\DoxyCodeLine{106 \textcolor{keywordflow}{return} ulNodeCnt;}
+\DoxyCodeLine{107 \}}
+\DoxyCodeLine{108 }
+\DoxyCodeLine{109 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{110 xbInt16 xbLinkList<xbNodeType>::InsertAtFront( \textcolor{keyword}{const} xbNodeType \& ntKey )\{}
+\DoxyCodeLine{111 }
+\DoxyCodeLine{112 xbLinkListNode<xbNodeType> *p = \textcolor{keyword}{new} xbLinkListNode<xbNodeType>( ntKey );}
+\DoxyCodeLine{113 \textcolor{keywordflow}{if}( p == 0 )}
+\DoxyCodeLine{114 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ae687fc7d872ba0475a8477e4447f9b54}{XB\_NO\_MEMORY}};}
+\DoxyCodeLine{115 }
+\DoxyCodeLine{116 \textcolor{keywordflow}{if}( ulNodeCnt > 0 )\{}
+\DoxyCodeLine{117 llStartPtr-\/>SetPrevNode( p );}
+\DoxyCodeLine{118 p-\/>SetNextNode( llStartPtr );}
+\DoxyCodeLine{119 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{120 llEndPtr = p;}
+\DoxyCodeLine{121 \}}
+\DoxyCodeLine{122 }
+\DoxyCodeLine{123 llStartPtr = p;}
+\DoxyCodeLine{124 ulNodeCnt++;}
+\DoxyCodeLine{125 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{126 \}}
+\DoxyCodeLine{127 }
+\DoxyCodeLine{128 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{129 xbInt16 xbLinkList<xbNodeType>::InsertAtEnd( \textcolor{keyword}{const} xbNodeType \& ntKey )\{}
+\DoxyCodeLine{130 }
+\DoxyCodeLine{131 xbLinkListNode<xbNodeType> *p = \textcolor{keyword}{new} xbLinkListNode<xbNodeType>( ntKey );}
+\DoxyCodeLine{132 \textcolor{keywordflow}{if}( p == 0 )}
+\DoxyCodeLine{133 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ae687fc7d872ba0475a8477e4447f9b54}{XB\_NO\_MEMORY}};}
+\DoxyCodeLine{134 }
+\DoxyCodeLine{135 \textcolor{keywordflow}{if}( ulNodeCnt > 0 )\{}
+\DoxyCodeLine{136 llEndPtr-\/>SetNextNode( p );}
+\DoxyCodeLine{137 p-\/>SetPrevNode( llEndPtr );}
+\DoxyCodeLine{138 llEndPtr = p;}
+\DoxyCodeLine{139 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{140 llStartPtr = p;}
+\DoxyCodeLine{141 \}}
+\DoxyCodeLine{142 }
+\DoxyCodeLine{143 llEndPtr = p;}
+\DoxyCodeLine{144 ulNodeCnt++;}
+\DoxyCodeLine{145 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{146 \}}
+\DoxyCodeLine{147 }
+\DoxyCodeLine{148 }
+\DoxyCodeLine{149 }
+\DoxyCodeLine{150 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{151 xbInt16 xbLinkList<xbNodeType>::RemoveByVal( \textcolor{keyword}{const} xbNodeType \& ntKey )\{}
+\DoxyCodeLine{152 \textcolor{comment}{// Remove the first instance of ntKey from the node chain}}
+\DoxyCodeLine{153 xbLinkListNode<xbNodeType> *currPtr = llStartPtr;}
+\DoxyCodeLine{154 xbLinkListNode<xbNodeType> *prevPtr = NULL;}
+\DoxyCodeLine{155 }
+\DoxyCodeLine{156 \textcolor{keywordflow}{for}( xbUInt32 i = 0; i < ulNodeCnt; i++ )\{}
+\DoxyCodeLine{157 \textcolor{keywordflow}{if}( currPtr-\/>GetKey() == ntKey )\{}
+\DoxyCodeLine{158 \textcolor{keywordflow}{if}( prevPtr == NULL )\{ \textcolor{comment}{//then this is the first node}}
+\DoxyCodeLine{159 llStartPtr = currPtr-\/>GetNextNode();}
+\DoxyCodeLine{160 \textcolor{keywordflow}{if}( llStartPtr ) \textcolor{comment}{// if more than one link in the linked list}}
+\DoxyCodeLine{161 llStartPtr-\/>SetPrevNode( NULL );}
+\DoxyCodeLine{162 \textcolor{keyword}{delete} currPtr;}
+\DoxyCodeLine{163 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{164 \textcolor{keywordflow}{return} i + 1;}
+\DoxyCodeLine{165 \}}
+\DoxyCodeLine{166 \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{167 prevPtr-\/>SetNextNode( currPtr-\/>GetNextNode());}
+\DoxyCodeLine{168 \textcolor{keywordflow}{if}( currPtr-\/>GetNextNode())}
+\DoxyCodeLine{169 currPtr-\/>GetNextNode()-\/>SetPrevNode( prevPtr );}
+\DoxyCodeLine{170 \textcolor{keyword}{delete} currPtr;}
+\DoxyCodeLine{171 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{172 \textcolor{keywordflow}{return} i + 1;}
+\DoxyCodeLine{173 \}}
+\DoxyCodeLine{174 \}}
+\DoxyCodeLine{175 prevPtr = currPtr;}
+\DoxyCodeLine{176 currPtr = currPtr-\/>GetNextNode();}
+\DoxyCodeLine{177 \}}
+\DoxyCodeLine{178 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac2606659a54111334f5b02861e533700}{XB\_NOT\_FOUND}};}
+\DoxyCodeLine{179 \}}
+\DoxyCodeLine{180 }
+\DoxyCodeLine{181 }
+\DoxyCodeLine{182 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{183 xbInt16 xbLinkList<xbNodeType>::RemoveFromFront( xbNodeType \& ntKey )\{}
+\DoxyCodeLine{184 }
+\DoxyCodeLine{185 \textcolor{keywordflow}{if}( ulNodeCnt <= 0 )}
+\DoxyCodeLine{186 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_a13e6876470bd34c8c4e5533f115e04eb}{XB\_INVALID\_NODELINK}};}
+\DoxyCodeLine{187 xbLinkListNode<xbNodeType> *p = llStartPtr;}
+\DoxyCodeLine{188 llStartPtr = p-\/>GetNextNode();}
+\DoxyCodeLine{189 \textcolor{keywordflow}{if}( llStartPtr )}
+\DoxyCodeLine{190 llStartPtr-\/>SetPrevNode( NULL );}
+\DoxyCodeLine{191 ntKey = p-\/>GetKey();}
+\DoxyCodeLine{192 \textcolor{keyword}{delete} p;}
+\DoxyCodeLine{193 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{194 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{195 \}}
+\DoxyCodeLine{196 }
+\DoxyCodeLine{197 }
+\DoxyCodeLine{198 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{199 xbInt16 xbLinkList<xbNodeType>::RemoveFromEnd( xbNodeType \& ntKey )\{}
+\DoxyCodeLine{200 }
+\DoxyCodeLine{201 \textcolor{keywordflow}{if}( ulNodeCnt <= 0 )}
+\DoxyCodeLine{202 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_a13e6876470bd34c8c4e5533f115e04eb}{XB\_INVALID\_NODELINK}};}
+\DoxyCodeLine{203 xbLinkListNode<xbNodeType> *p = llEndPtr;}
+\DoxyCodeLine{204 \textcolor{keywordflow}{if}( p-\/>GetPrevNode())\{}
+\DoxyCodeLine{205 llEndPtr = p-\/>GetPrevNode();}
+\DoxyCodeLine{206 llEndPtr-\/>SetNextNode( NULL );}
+\DoxyCodeLine{207 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{208 \textcolor{comment}{// there are no more nodes}}
+\DoxyCodeLine{209 llStartPtr = NULL;}
+\DoxyCodeLine{210 llEndPtr = NULL;}
+\DoxyCodeLine{211 \}}
+\DoxyCodeLine{212 ntKey = p-\/>GetKey();}
+\DoxyCodeLine{213 \textcolor{keyword}{delete} p;}
+\DoxyCodeLine{214 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{215 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{216 \}}
+\DoxyCodeLine{217 }
+\DoxyCodeLine{218 }
+\DoxyCodeLine{219 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{220 xbInt16 xbLinkList<xbNodeType>::RemoveFromEnd()\{}
+\DoxyCodeLine{221 }
+\DoxyCodeLine{222 \textcolor{keywordflow}{if}( ulNodeCnt <= 0 )}
+\DoxyCodeLine{223 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_a13e6876470bd34c8c4e5533f115e04eb}{XB\_INVALID\_NODELINK}};}
+\DoxyCodeLine{224 xbLinkListNode<xbNodeType> *p = llEndPtr;}
+\DoxyCodeLine{225 \textcolor{keywordflow}{if}( p-\/>GetPrevNode())\{}
+\DoxyCodeLine{226 llEndPtr = p-\/>GetPrevNode();}
+\DoxyCodeLine{227 llEndPtr-\/>SetNextNode( NULL );}
+\DoxyCodeLine{228 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{229 \textcolor{comment}{// there are no more nodes}}
+\DoxyCodeLine{230 llStartPtr = NULL;}
+\DoxyCodeLine{231 llEndPtr = NULL;}
+\DoxyCodeLine{232 \}}
+\DoxyCodeLine{233 \textcolor{keyword}{delete} p-\/>GetKey();}
+\DoxyCodeLine{234 \textcolor{keyword}{delete} p;}
+\DoxyCodeLine{235 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{236 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{237 \}}
+\DoxyCodeLine{238 }
+\DoxyCodeLine{239 }
+\DoxyCodeLine{240 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{241 xbInt16 xbLinkList<xbNodeType>::SearchFor( \textcolor{keyword}{const} xbNodeType \& ntKey )\{}
+\DoxyCodeLine{242 }
+\DoxyCodeLine{243 xbLinkListNode<xbNodeType> *cPtr = llStartPtr;}
+\DoxyCodeLine{244 \textcolor{keywordflow}{for}( xbUInt32 i = 0; i < ulNodeCnt; i++ )\{}
+\DoxyCodeLine{245 \textcolor{keywordflow}{if}( cPtr-\/>GetKey() == ntKey )}
+\DoxyCodeLine{246 \textcolor{keywordflow}{return} i+1;}
+\DoxyCodeLine{247 cPtr = cPtr-\/>GetNextNode();}
+\DoxyCodeLine{248 \}}
+\DoxyCodeLine{249 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{250 }
+\DoxyCodeLine{251 \}}
+\DoxyCodeLine{252 \} \textcolor{comment}{// namespace}}
+\DoxyCodeLine{253 }
+\DoxyCodeLine{254 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_LINKLIST\_SUPPORT}}
+\DoxyCodeLine{255 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_XBLNKLST\_H\_\_}}
+\DoxyCodeLine{256 }
+\DoxyCodeLine{257 }
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xblnklstord_8h.tex b/docs/doxygen/latex/xblnklstord_8h.tex
new file mode 100644
index 0000000..665c61e
--- /dev/null
+++ b/docs/doxygen/latex/xblnklstord_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xblnklstord_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xblnklstord.h File Reference}
+\label{xblnklstord_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnklstord.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnklstord.h}}
diff --git a/docs/doxygen/latex/xblnklstord_8h_source.tex b/docs/doxygen/latex/xblnklstord_8h_source.tex
new file mode 100644
index 0000000..8d88a7a
--- /dev/null
+++ b/docs/doxygen/latex/xblnklstord_8h_source.tex
@@ -0,0 +1,373 @@
+\hypertarget{xblnklstord_8h_source}{}\doxysection{xblnklstord.\+h}
+\label{xblnklstord_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnklstord.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnklstord.h}}
+\mbox{\hyperlink{xblnklstord_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xblnklstord.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2019,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{comment}{// Ordered link list}}
+\DoxyCodeLine{18 }
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 }
+\DoxyCodeLine{21 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBLNKLSTORD\_H\_\_}}
+\DoxyCodeLine{22 \textcolor{preprocessor}{\#define \_\_XB\_XBLNKLSTORD\_H\_\_}}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 \textcolor{preprocessor}{\#ifdef XB\_LINKLIST\_SUPPORT}}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{28 }
+\DoxyCodeLine{29 }
+\DoxyCodeLine{30 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{31 \textcolor{keyword}{class }XBDLLEXPORT xbLinkListOrd \{}
+\DoxyCodeLine{32 \textcolor{keyword}{public}:}
+\DoxyCodeLine{33 xbLinkListOrd();}
+\DoxyCodeLine{34 \string~xbLinkListOrd();}
+\DoxyCodeLine{35 }
+\DoxyCodeLine{36 \textcolor{keywordtype}{void} Clear();}
+\DoxyCodeLine{37 xbLinkListNode<xbNodeType> *GetHeadNode() \textcolor{keyword}{const};}
+\DoxyCodeLine{38 xbLinkListNode<xbNodeType> *GetEndNode() \textcolor{keyword}{const};}
+\DoxyCodeLine{39 xbLinkListNode<xbNodeType> *GetNodeForKey( \textcolor{keyword}{const} xbString \&sKey ) \textcolor{keyword}{const};}
+\DoxyCodeLine{40 }
+\DoxyCodeLine{41 xbInt16 GetDataForKey ( \textcolor{keyword}{const} xbNodeType \&ntKey, xbString \&sData );}
+\DoxyCodeLine{42 }
+\DoxyCodeLine{43 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetDupKeys ();}
+\DoxyCodeLine{44 }
+\DoxyCodeLine{45 xbUInt32 GetNodeCnt () \textcolor{keyword}{const};}
+\DoxyCodeLine{46 xbUInt32 GetNodeCnt ( \textcolor{keyword}{const} xbString \&sNodeKey ) \textcolor{keyword}{const};}
+\DoxyCodeLine{47 xbInt16 InsertKey ( \textcolor{keyword}{const} xbNodeType \&ntKey );}
+\DoxyCodeLine{48 xbInt16 InsertKey ( \textcolor{keyword}{const} xbNodeType \&ntKey, \textcolor{keyword}{const} xbString \&sData );}
+\DoxyCodeLine{49 xbInt16 InsertKey ( \textcolor{keyword}{const} xbNodeType \&ntKey, xbUInt32 ulData );}
+\DoxyCodeLine{50 }
+\DoxyCodeLine{51 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} KeyExists ( \textcolor{keyword}{const} xbNodeType \&ntKey ) \textcolor{keyword}{const};}
+\DoxyCodeLine{52 xbInt16 RemoveKey ( \textcolor{keyword}{const} xbNodeType \&ntKey );}
+\DoxyCodeLine{53 xbInt16 RemoveFromEnd ( xbNodeType \&ntKey );}
+\DoxyCodeLine{54 xbInt16 RemoveFromFront( xbNodeType \&ntKey );}
+\DoxyCodeLine{55 xbInt16 RemoveFromFront();}
+\DoxyCodeLine{56 \textcolor{keywordtype}{void} SetDupKeys ( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bAllowDupKeys );}
+\DoxyCodeLine{57 xbInt16 UpdateForKey ( \textcolor{keyword}{const} xbNodeType \&ntKey, \textcolor{keyword}{const} xbString \&sData );}
+\DoxyCodeLine{58 }
+\DoxyCodeLine{59 }
+\DoxyCodeLine{60 \textcolor{keyword}{private}:}
+\DoxyCodeLine{61 xbUInt32 ulNodeCnt;}
+\DoxyCodeLine{62 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bAllowDupKeys;}
+\DoxyCodeLine{63 xbLinkListNode<xbNodeType> *llStartPtr;}
+\DoxyCodeLine{64 xbLinkListNode<xbNodeType> *llEndPtr;}
+\DoxyCodeLine{65 }
+\DoxyCodeLine{66 \};}
+\DoxyCodeLine{67 }
+\DoxyCodeLine{68 }
+\DoxyCodeLine{69 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{70 xbLinkListOrd<xbNodeType>::xbLinkListOrd()\{}
+\DoxyCodeLine{71 bAllowDupKeys = \mbox{\hyperlink{xbtypes_8h_ab0ae00665298fe7f5292691cb98ec2d9}{xbTrue}}; \textcolor{comment}{// default setting -\/ allow duplicate keys}}
+\DoxyCodeLine{72 ulNodeCnt = 0;}
+\DoxyCodeLine{73 llStartPtr = NULL;}
+\DoxyCodeLine{74 llEndPtr = NULL;}
+\DoxyCodeLine{75 \}}
+\DoxyCodeLine{76 }
+\DoxyCodeLine{77 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{78 xbLinkListOrd<xbNodeType>::\string~xbLinkListOrd()\{}
+\DoxyCodeLine{79 Clear();}
+\DoxyCodeLine{80 \}}
+\DoxyCodeLine{81 }
+\DoxyCodeLine{82 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{83 \textcolor{keywordtype}{void} xbLinkListOrd<xbNodeType>::Clear()\{}
+\DoxyCodeLine{84 xbLinkListNode<xbNodeType> *cPtr = llStartPtr, *tPtr;}
+\DoxyCodeLine{85 \textcolor{keywordflow}{for}( xbUInt32 i = 0; i < ulNodeCnt; i++ )\{}
+\DoxyCodeLine{86 tPtr = cPtr;}
+\DoxyCodeLine{87 cPtr = cPtr-\/>GetNextNode();}
+\DoxyCodeLine{88 }
+\DoxyCodeLine{89 \textcolor{comment}{// next line might cause seg faults}}
+\DoxyCodeLine{90 \textcolor{comment}{// delete tPtr-\/>GetData();}}
+\DoxyCodeLine{91 }
+\DoxyCodeLine{92 \textcolor{keyword}{delete} tPtr;}
+\DoxyCodeLine{93 \}}
+\DoxyCodeLine{94 ulNodeCnt = 0;}
+\DoxyCodeLine{95 llStartPtr = NULL;}
+\DoxyCodeLine{96 llEndPtr = NULL;}
+\DoxyCodeLine{97 \}}
+\DoxyCodeLine{98 }
+\DoxyCodeLine{99 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{100 xbLinkListNode<xbNodeType> * xbLinkListOrd<xbNodeType>::GetHeadNode()\textcolor{keyword}{ const}\{}
+\DoxyCodeLine{101 \textcolor{keywordflow}{return} llStartPtr;}
+\DoxyCodeLine{102 \}}
+\DoxyCodeLine{103 }
+\DoxyCodeLine{104 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{105 xbLinkListNode<xbNodeType> * xbLinkListOrd<xbNodeType>::GetEndNode()\textcolor{keyword}{ const}\{}
+\DoxyCodeLine{106 \textcolor{keywordflow}{return} llEndPtr;}
+\DoxyCodeLine{107 \}}
+\DoxyCodeLine{108 }
+\DoxyCodeLine{109 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{110 xbUInt32 xbLinkListOrd<xbNodeType>::GetNodeCnt()\textcolor{keyword}{ const}\{}
+\DoxyCodeLine{111 \textcolor{keywordflow}{return} ulNodeCnt;}
+\DoxyCodeLine{112 \}}
+\DoxyCodeLine{113 }
+\DoxyCodeLine{114 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{115 xbUInt32 xbLinkListOrd<xbNodeType>::GetNodeCnt( \textcolor{keyword}{const} xbString \&sNodeKey )\textcolor{keyword}{ const}\{}
+\DoxyCodeLine{116 }
+\DoxyCodeLine{117 \textcolor{comment}{// won't work if nodekey is not a string}}
+\DoxyCodeLine{118 xbLinkListNode<xbNodeType> *currPtr = llStartPtr;}
+\DoxyCodeLine{119 \textcolor{comment}{// skip to sNodeKey}}
+\DoxyCodeLine{120 \textcolor{keywordflow}{while}( currPtr \&\& ( sNodeKey > currPtr-\/>GetKey())) \{}
+\DoxyCodeLine{121 currPtr = currPtr-\/>GetNextNode();}
+\DoxyCodeLine{122 \}}
+\DoxyCodeLine{123 \textcolor{comment}{// count entries for sNodeKey}}
+\DoxyCodeLine{124 xbInt16 iKeyCnt = 0;}
+\DoxyCodeLine{125 \textcolor{keywordflow}{while}( currPtr \&\& ( sNodeKey == currPtr-\/>GetKey())) \{}
+\DoxyCodeLine{126 iKeyCnt++;}
+\DoxyCodeLine{127 currPtr = currPtr-\/>GetNextNode();}
+\DoxyCodeLine{128 \}}
+\DoxyCodeLine{129 \textcolor{keywordflow}{return} iKeyCnt;}
+\DoxyCodeLine{130 \}}
+\DoxyCodeLine{131 }
+\DoxyCodeLine{132 }
+\DoxyCodeLine{133 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{134 xbInt16 xbLinkListOrd<xbNodeType>::InsertKey( \textcolor{keyword}{const} xbNodeType \&ntKey )\{}
+\DoxyCodeLine{135 xbString s;}
+\DoxyCodeLine{136 \textcolor{keywordflow}{return} InsertKey( ntKey, s );}
+\DoxyCodeLine{137 \}}
+\DoxyCodeLine{138 }
+\DoxyCodeLine{139 }
+\DoxyCodeLine{140 }
+\DoxyCodeLine{141 }
+\DoxyCodeLine{142 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{143 xbInt16 xbLinkListOrd<xbNodeType>::InsertKey( \textcolor{keyword}{const} xbNodeType \&ntKey, xbUInt32 ul )\{}
+\DoxyCodeLine{144 }
+\DoxyCodeLine{145 xbString s;}
+\DoxyCodeLine{146 s.Sprintf( \textcolor{stringliteral}{"{}\%ld"{}}, ul );}
+\DoxyCodeLine{147 \textcolor{keywordflow}{return} InsertKey( ntKey, s );}
+\DoxyCodeLine{148 \}}
+\DoxyCodeLine{149 }
+\DoxyCodeLine{150 }
+\DoxyCodeLine{151 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{152 xbInt16 xbLinkListOrd<xbNodeType>::InsertKey( \textcolor{keyword}{const} xbNodeType \&ntKey, \textcolor{keyword}{const} xbString \&sData )\{}
+\DoxyCodeLine{153 }
+\DoxyCodeLine{154 xbLinkListNode<xbNodeType> *p = \textcolor{keyword}{new} xbLinkListNode<xbNodeType>( ntKey, sData );}
+\DoxyCodeLine{155 \textcolor{keywordflow}{if}( p == 0 )}
+\DoxyCodeLine{156 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ae687fc7d872ba0475a8477e4447f9b54}{XB\_NO\_MEMORY}};}
+\DoxyCodeLine{157 }
+\DoxyCodeLine{158 \textcolor{keywordflow}{if}( ulNodeCnt > 0 )\{}
+\DoxyCodeLine{159 xbLinkListNode<xbNodeType> *currPtr = llStartPtr;}
+\DoxyCodeLine{160 xbLinkListNode<xbNodeType> *prevPtr = NULL;}
+\DoxyCodeLine{161 }
+\DoxyCodeLine{162 \textcolor{comment}{// find location in the chain}}
+\DoxyCodeLine{163 \textcolor{keywordflow}{while}( currPtr \&\& ntKey > currPtr-\/>GetKey() )\{}
+\DoxyCodeLine{164 prevPtr = currPtr;}
+\DoxyCodeLine{165 currPtr = currPtr-\/>GetNextNode();}
+\DoxyCodeLine{166 \}}
+\DoxyCodeLine{167 \textcolor{keywordflow}{if}( currPtr \&\& ntKey == currPtr-\/>GetKey() \&\& bAllowDupKeys == 0 )\{}
+\DoxyCodeLine{168 \textcolor{keyword}{delete} p;}
+\DoxyCodeLine{169 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ad60dbb1862c0c1c2dc0464cfbfd93a34}{XB\_KEY\_NOT\_UNIQUE}};}
+\DoxyCodeLine{170 \}}
+\DoxyCodeLine{171 }
+\DoxyCodeLine{172 \textcolor{keywordflow}{if}( currPtr == NULL )\{}
+\DoxyCodeLine{173 \textcolor{comment}{// std::cout << "{}at the end of the chain\(\backslash\)n"{};}}
+\DoxyCodeLine{174 llEndPtr = p;}
+\DoxyCodeLine{175 prevPtr-\/>SetNextNode( p );}
+\DoxyCodeLine{176 p-\/>SetPrevNode( prevPtr );}
+\DoxyCodeLine{177 }
+\DoxyCodeLine{178 \} \textcolor{keywordflow}{else} \textcolor{keywordflow}{if}( currPtr-\/>GetPrevNode() == NULL )\{}
+\DoxyCodeLine{179 \textcolor{comment}{// std::cout << "{}at the beginning of the chain\(\backslash\)n"{};}}
+\DoxyCodeLine{180 p-\/>SetNextNode( llStartPtr );}
+\DoxyCodeLine{181 llStartPtr-\/>SetPrevNode( p );}
+\DoxyCodeLine{182 llStartPtr = p;}
+\DoxyCodeLine{183 }
+\DoxyCodeLine{184 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{185 \textcolor{comment}{// std::cout << "{}in the middle of the chain\(\backslash\)n"{};}}
+\DoxyCodeLine{186 p-\/>SetNextNode( currPtr ); }
+\DoxyCodeLine{187 p-\/>SetPrevNode( currPtr-\/>GetPrevNode());}
+\DoxyCodeLine{188 currPtr-\/>SetPrevNode( p );}
+\DoxyCodeLine{189 prevPtr-\/>SetNextNode( p );}
+\DoxyCodeLine{190 \}}
+\DoxyCodeLine{191 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{192 \textcolor{comment}{// std::cout << "{}first addition to the chain\(\backslash\)n"{};}}
+\DoxyCodeLine{193 llStartPtr = p;}
+\DoxyCodeLine{194 llEndPtr = p;}
+\DoxyCodeLine{195 \}}
+\DoxyCodeLine{196 ulNodeCnt++;}
+\DoxyCodeLine{197 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{198 \}}
+\DoxyCodeLine{199 }
+\DoxyCodeLine{200 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{201 xbInt16 xbLinkListOrd<xbNodeType>::RemoveKey( \textcolor{keyword}{const} xbNodeType \&ntKey )\{}
+\DoxyCodeLine{202 \textcolor{comment}{// Remove the first instance of ntKey from the node chain}}
+\DoxyCodeLine{203 xbLinkListNode<xbNodeType> *currPtr = llStartPtr;}
+\DoxyCodeLine{204 xbLinkListNode<xbNodeType> *prevPtr = NULL;}
+\DoxyCodeLine{205 }
+\DoxyCodeLine{206 \textcolor{keywordflow}{while}( currPtr \&\& ntKey > currPtr-\/>GetKey() )\{}
+\DoxyCodeLine{207 prevPtr = currPtr;}
+\DoxyCodeLine{208 currPtr = currPtr-\/>GetNextNode();}
+\DoxyCodeLine{209 \}}
+\DoxyCodeLine{210 }
+\DoxyCodeLine{211 \textcolor{keywordflow}{if}( currPtr \&\& ntKey == currPtr-\/>GetKey())\{}
+\DoxyCodeLine{212 \textcolor{comment}{// ntKey = currPtr-\/>GetKey();}}
+\DoxyCodeLine{213 \textcolor{keywordflow}{if}( prevPtr == NULL )\{ \textcolor{comment}{// this is the first node}}
+\DoxyCodeLine{214 llStartPtr = currPtr-\/>GetNextNode();}
+\DoxyCodeLine{215 \textcolor{comment}{// next line fails}}
+\DoxyCodeLine{216 \textcolor{keywordflow}{if}( llStartPtr )\{}
+\DoxyCodeLine{217 llStartPtr-\/>SetPrevNode( NULL );}
+\DoxyCodeLine{218 \}}
+\DoxyCodeLine{219 \textcolor{keyword}{delete} currPtr;}
+\DoxyCodeLine{220 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{221 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{222 \} \textcolor{keywordflow}{else} \textcolor{keywordflow}{if}( currPtr-\/>GetNextNode() == NULL )\{ \textcolor{comment}{// this is the last node}}
+\DoxyCodeLine{223 llEndPtr = prevPtr;}
+\DoxyCodeLine{224 prevPtr-\/>SetNextNode( NULL );}
+\DoxyCodeLine{225 \textcolor{keyword}{delete} currPtr;}
+\DoxyCodeLine{226 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{227 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{228 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{229 }
+\DoxyCodeLine{230 prevPtr-\/>SetNextNode( currPtr-\/>GetNextNode());}
+\DoxyCodeLine{231 currPtr-\/>GetNextNode()-\/>SetPrevNode( prevPtr );}
+\DoxyCodeLine{232 \textcolor{keyword}{delete} currPtr;}
+\DoxyCodeLine{233 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{234 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{235 \}}
+\DoxyCodeLine{236 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{237 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac2606659a54111334f5b02861e533700}{XB\_NOT\_FOUND}};}
+\DoxyCodeLine{238 \}}
+\DoxyCodeLine{239 \}}
+\DoxyCodeLine{240 }
+\DoxyCodeLine{241 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{242 xbInt16 xbLinkListOrd<xbNodeType>::RemoveFromFront( xbNodeType \&ntKey )\{}
+\DoxyCodeLine{243 }
+\DoxyCodeLine{244 \textcolor{keywordflow}{if}( ulNodeCnt <= 0 )}
+\DoxyCodeLine{245 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_a13e6876470bd34c8c4e5533f115e04eb}{XB\_INVALID\_NODELINK}};}
+\DoxyCodeLine{246 xbLinkListNode<xbNodeType> *p = llStartPtr;}
+\DoxyCodeLine{247 llStartPtr = p-\/>GetNextNode();}
+\DoxyCodeLine{248 \textcolor{keywordflow}{if}( llStartPtr )}
+\DoxyCodeLine{249 llStartPtr-\/>SetPrevNode( NULL );}
+\DoxyCodeLine{250 ntKey = p-\/>GetKey();}
+\DoxyCodeLine{251 \textcolor{keyword}{delete} p;}
+\DoxyCodeLine{252 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{253 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{254 \}}
+\DoxyCodeLine{255 }
+\DoxyCodeLine{256 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{257 xbInt16 xbLinkListOrd<xbNodeType>::RemoveFromFront()\{}
+\DoxyCodeLine{258 }
+\DoxyCodeLine{259 \textcolor{keywordflow}{if}( ulNodeCnt <= 0 )}
+\DoxyCodeLine{260 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_a13e6876470bd34c8c4e5533f115e04eb}{XB\_INVALID\_NODELINK}};}
+\DoxyCodeLine{261 xbLinkListNode<xbNodeType> *p = llStartPtr;}
+\DoxyCodeLine{262 llStartPtr = p-\/>GetNextNode();}
+\DoxyCodeLine{263 \textcolor{keywordflow}{if}( llStartPtr )}
+\DoxyCodeLine{264 llStartPtr-\/>SetPrevNode( NULL );}
+\DoxyCodeLine{265 }
+\DoxyCodeLine{266 \textcolor{keywordflow}{if}( p-\/>GetKey())}
+\DoxyCodeLine{267 \textcolor{keyword}{delete} p-\/>GetKey();}
+\DoxyCodeLine{268 }
+\DoxyCodeLine{269 \textcolor{keyword}{delete} p;}
+\DoxyCodeLine{270 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{271 }
+\DoxyCodeLine{272 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{273 \}}
+\DoxyCodeLine{274 }
+\DoxyCodeLine{275 }
+\DoxyCodeLine{276 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{277 xbInt16 xbLinkListOrd<xbNodeType>::RemoveFromEnd( xbNodeType \&ntKey )\{}
+\DoxyCodeLine{278 }
+\DoxyCodeLine{279 \textcolor{keywordflow}{if}( ulNodeCnt <= 0 )}
+\DoxyCodeLine{280 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_a13e6876470bd34c8c4e5533f115e04eb}{XB\_INVALID\_NODELINK}};}
+\DoxyCodeLine{281 xbLinkListNode<xbNodeType> *p = llEndPtr;}
+\DoxyCodeLine{282 llEndPtr = p-\/>GetPrevNode();}
+\DoxyCodeLine{283 llEndPtr-\/>SetNextNode( NULL );}
+\DoxyCodeLine{284 ntKey = p-\/>GetKey();}
+\DoxyCodeLine{285 \textcolor{keyword}{delete} p;}
+\DoxyCodeLine{286 ulNodeCnt-\/-\/;}
+\DoxyCodeLine{287 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{288 \}}
+\DoxyCodeLine{289 }
+\DoxyCodeLine{290 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{291 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} xbLinkListOrd<xbNodeType>::GetDupKeys()\{}
+\DoxyCodeLine{292 \textcolor{keywordflow}{return} bAllowDupKeys;}
+\DoxyCodeLine{293 \}}
+\DoxyCodeLine{294 }
+\DoxyCodeLine{295 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{296 \textcolor{keywordtype}{void} xbLinkListOrd<xbNodeType>::SetDupKeys( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bAllowDupKeys )\{}
+\DoxyCodeLine{297 this-\/>bAllowDupKeys = bAllowDupKeys;}
+\DoxyCodeLine{298 \}}
+\DoxyCodeLine{299 }
+\DoxyCodeLine{300 }
+\DoxyCodeLine{301 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{302 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} xbLinkListOrd<xbNodeType>::KeyExists( \textcolor{keyword}{const} xbNodeType \&ntKey )\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{303 }
+\DoxyCodeLine{304 xbLinkListNode<xbNodeType> *currPtr = llStartPtr;}
+\DoxyCodeLine{305 \textcolor{keywordflow}{while}( currPtr \&\& ntKey > currPtr-\/>GetKey() )\{}
+\DoxyCodeLine{306 currPtr = currPtr-\/>GetNextNode();}
+\DoxyCodeLine{307 \}}
+\DoxyCodeLine{308 \textcolor{keywordflow}{if}( currPtr \&\& ntKey == currPtr-\/>GetKey())\{}
+\DoxyCodeLine{309 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbtypes_8h_ab0ae00665298fe7f5292691cb98ec2d9}{xbTrue}};}
+\DoxyCodeLine{310 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{311 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbtypes_8h_adc4b6ca5ad299f63675136d9e03938cc}{xbFalse}};}
+\DoxyCodeLine{312 \}}
+\DoxyCodeLine{313 \}}
+\DoxyCodeLine{314 }
+\DoxyCodeLine{315 }
+\DoxyCodeLine{316 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{317 xbInt16 xbLinkListOrd<xbNodeType>::GetDataForKey( \textcolor{keyword}{const} xbNodeType \&ntKey, xbString \&sData )\{}
+\DoxyCodeLine{318 }
+\DoxyCodeLine{319 xbLinkListNode<xbNodeType> *currPtr = llStartPtr;}
+\DoxyCodeLine{320 \textcolor{keywordflow}{while}( currPtr \&\& ntKey > currPtr-\/>GetKey() )\{}
+\DoxyCodeLine{321 currPtr = currPtr-\/>GetNextNode();}
+\DoxyCodeLine{322 \}}
+\DoxyCodeLine{323 }
+\DoxyCodeLine{324 \textcolor{keywordflow}{if}( currPtr \&\& ntKey == currPtr-\/>GetKey())\{}
+\DoxyCodeLine{325 sData = currPtr-\/>GetData();}
+\DoxyCodeLine{326 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{327 \} \textcolor{keywordflow}{else} \{}
+\DoxyCodeLine{328 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac2606659a54111334f5b02861e533700}{XB\_NOT\_FOUND}};}
+\DoxyCodeLine{329 \}}
+\DoxyCodeLine{330 \}}
+\DoxyCodeLine{331 }
+\DoxyCodeLine{332 }
+\DoxyCodeLine{333 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{334 xbInt16 xbLinkListOrd<xbNodeType>::UpdateForKey( \textcolor{keyword}{const} xbNodeType \&ntKey, \textcolor{keyword}{const} xbString \&sData )\{}
+\DoxyCodeLine{335 }
+\DoxyCodeLine{336 \textcolor{keywordflow}{if}( ulNodeCnt == 0 )}
+\DoxyCodeLine{337 \textcolor{keywordflow}{return} InsertKey( ntKey, sData );}
+\DoxyCodeLine{338 xbLinkListNode<xbNodeType> * currPtr = llStartPtr;}
+\DoxyCodeLine{339 xbLinkListNode<xbNodeType> * prevPtr = NULL;}
+\DoxyCodeLine{340 \textcolor{keywordflow}{while}( currPtr \&\& ntKey > currPtr-\/>GetKey() ) \{}
+\DoxyCodeLine{341 prevPtr = currPtr;}
+\DoxyCodeLine{342 currPtr = currPtr-\/>GetNextNode();}
+\DoxyCodeLine{343 \}}
+\DoxyCodeLine{344 }
+\DoxyCodeLine{345 \textcolor{keywordflow}{if}( currPtr \&\& ntKey == currPtr-\/>GetKey() ) \{}
+\DoxyCodeLine{346 xbLinkListNode<xbNodeType> *p = \textcolor{keyword}{new} xbLinkListNode<xbNodeType>( ntKey, sData );}
+\DoxyCodeLine{347 \textcolor{keywordflow}{if}( prevPtr )}
+\DoxyCodeLine{348 prevPtr-\/>SetNextNode( p );}
+\DoxyCodeLine{349 \textcolor{keywordflow}{else}}
+\DoxyCodeLine{350 llStartPtr = p;}
+\DoxyCodeLine{351 p-\/>SetNextNode( currPtr-\/>GetNextNode() );}
+\DoxyCodeLine{352 p-\/>SetPrevNode( currPtr-\/>GetPrevNode() );}
+\DoxyCodeLine{353 \textcolor{keyword}{delete} currPtr;}
+\DoxyCodeLine{354 \textcolor{keywordflow}{return} \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\_NO\_ERROR}};}
+\DoxyCodeLine{355 \}}
+\DoxyCodeLine{356 }
+\DoxyCodeLine{357 \textcolor{keywordflow}{return} InsertKey( ntKey, sData );}
+\DoxyCodeLine{358 }
+\DoxyCodeLine{359 \textcolor{comment}{// return 0;}}
+\DoxyCodeLine{360 \}}
+\DoxyCodeLine{361 }
+\DoxyCodeLine{362 \} \textcolor{comment}{// namespace}}
+\DoxyCodeLine{363 }
+\DoxyCodeLine{364 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_LINKLIST\_SUPPORT}}
+\DoxyCodeLine{365 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_XBLNKLSTORD\_H\_\_}}
+\DoxyCodeLine{366 }
+\DoxyCodeLine{367 }
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xblnknod_8h.tex b/docs/doxygen/latex/xblnknod_8h.tex
new file mode 100644
index 0000000..4db5c8b
--- /dev/null
+++ b/docs/doxygen/latex/xblnknod_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xblnknod_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xblnknod.h File Reference}
+\label{xblnknod_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnknod.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnknod.h}}
diff --git a/docs/doxygen/latex/xblnknod_8h_source.tex b/docs/doxygen/latex/xblnknod_8h_source.tex
new file mode 100644
index 0000000..69a083a
--- /dev/null
+++ b/docs/doxygen/latex/xblnknod_8h_source.tex
@@ -0,0 +1,100 @@
+\hypertarget{xblnknod_8h_source}{}\doxysection{xblnknod.\+h}
+\label{xblnknod_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnknod.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblnknod.h}}
+\mbox{\hyperlink{xblnknod_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xblnknod.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBLNKNOD\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_XBLNKNOD\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 }
+\DoxyCodeLine{21 }
+\DoxyCodeLine{22 \textcolor{preprocessor}{\#ifdef XB\_LINKLIST\_SUPPORT}}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{27 \textcolor{keyword}{class }XBDLLEXPORT xbLinkListNode \{}
+\DoxyCodeLine{28 \textcolor{keyword}{public}:}
+\DoxyCodeLine{29 xbLinkListNode( \textcolor{keyword}{const} xbNodeType \& );}
+\DoxyCodeLine{30 xbLinkListNode( \textcolor{keyword}{const} xbNodeType \&, \textcolor{keyword}{const} xbString \& );}
+\DoxyCodeLine{31 xbNodeType GetKey() \textcolor{keyword}{const};}
+\DoxyCodeLine{32 xbString \&GetData();}
+\DoxyCodeLine{33 xbLinkListNode<xbNodeType> *GetNextNode() \textcolor{keyword}{const};}
+\DoxyCodeLine{34 xbLinkListNode<xbNodeType> *GetPrevNode() \textcolor{keyword}{const};}
+\DoxyCodeLine{35 \textcolor{keywordtype}{void} SetNextNode( xbLinkListNode<xbNodeType> *llNext );}
+\DoxyCodeLine{36 \textcolor{keywordtype}{void} SetPrevNode( xbLinkListNode<xbNodeType> *llPrev );}
+\DoxyCodeLine{37 }
+\DoxyCodeLine{38 \textcolor{keyword}{private}:}
+\DoxyCodeLine{39 xbNodeType ntKey;}
+\DoxyCodeLine{40 xbString sData;}
+\DoxyCodeLine{41 xbLinkListNode *llNext;}
+\DoxyCodeLine{42 xbLinkListNode *llPrev;}
+\DoxyCodeLine{43 \};}
+\DoxyCodeLine{44 }
+\DoxyCodeLine{45 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{46 xbLinkListNode<xbNodeType>::xbLinkListNode( \textcolor{keyword}{const} xbNodeType \&key )\{}
+\DoxyCodeLine{47 ntKey = key;}
+\DoxyCodeLine{48 llNext = NULL;}
+\DoxyCodeLine{49 llPrev = NULL;}
+\DoxyCodeLine{50 \}}
+\DoxyCodeLine{51 }
+\DoxyCodeLine{52 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{53 xbLinkListNode<xbNodeType>::xbLinkListNode( \textcolor{keyword}{const} xbNodeType \&key, \textcolor{keyword}{const} xbString \&s )\{}
+\DoxyCodeLine{54 ntKey = key;}
+\DoxyCodeLine{55 sData = s;}
+\DoxyCodeLine{56 llNext = NULL;}
+\DoxyCodeLine{57 llPrev = NULL;}
+\DoxyCodeLine{58 \}}
+\DoxyCodeLine{59 }
+\DoxyCodeLine{60 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{61 xbNodeType xbLinkListNode<xbNodeType>::GetKey()\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{62 \textcolor{keywordflow}{return} ntKey;}
+\DoxyCodeLine{63 \}}
+\DoxyCodeLine{64 }
+\DoxyCodeLine{65 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{66 xbString \&xbLinkListNode<xbNodeType>::GetData()\{}
+\DoxyCodeLine{67 \textcolor{keywordflow}{return} sData;}
+\DoxyCodeLine{68 \}}
+\DoxyCodeLine{69 }
+\DoxyCodeLine{70 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{71 xbLinkListNode<xbNodeType> *xbLinkListNode<xbNodeType>::GetNextNode()\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{72 \textcolor{keywordflow}{return} llNext;}
+\DoxyCodeLine{73 \}}
+\DoxyCodeLine{74 }
+\DoxyCodeLine{75 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{76 xbLinkListNode<xbNodeType> *xbLinkListNode<xbNodeType>::GetPrevNode()\textcolor{keyword}{ const }\{}
+\DoxyCodeLine{77 \textcolor{keywordflow}{return} llPrev;}
+\DoxyCodeLine{78 \}}
+\DoxyCodeLine{79 }
+\DoxyCodeLine{80 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{81 \textcolor{keywordtype}{void} xbLinkListNode<xbNodeType>::SetNextNode( xbLinkListNode<xbNodeType> *lln )\{}
+\DoxyCodeLine{82 llNext = lln;}
+\DoxyCodeLine{83 \}}
+\DoxyCodeLine{84 }
+\DoxyCodeLine{85 \textcolor{keyword}{template}<\textcolor{keyword}{class} xbNodeType>}
+\DoxyCodeLine{86 \textcolor{keywordtype}{void} xbLinkListNode<xbNodeType>::SetPrevNode( xbLinkListNode<xbNodeType> *llp )\{}
+\DoxyCodeLine{87 llPrev = llp;}
+\DoxyCodeLine{88 \}}
+\DoxyCodeLine{89 }
+\DoxyCodeLine{90 \} \textcolor{comment}{// namespace}}
+\DoxyCodeLine{91 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_LINKLIST\_SUPPORT}}
+\DoxyCodeLine{92 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_XBLNKNOD\_H\_\_}}
+\DoxyCodeLine{93 }
+\DoxyCodeLine{94 }
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xblog_8cpp.tex b/docs/doxygen/latex/xblog_8cpp.tex
new file mode 100644
index 0000000..5fdc579
--- /dev/null
+++ b/docs/doxygen/latex/xblog_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xblog_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xblog.cpp File Reference}
+\label{xblog_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xblog.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xblog.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xblog_8h.tex b/docs/doxygen/latex/xblog_8h.tex
new file mode 100644
index 0000000..e916153
--- /dev/null
+++ b/docs/doxygen/latex/xblog_8h.tex
@@ -0,0 +1,7 @@
+\hypertarget{xblog_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xblog.h File Reference}
+\label{xblog_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblog.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblog.h}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xblog_8h_source.tex b/docs/doxygen/latex/xblog_8h_source.tex
new file mode 100644
index 0000000..9bdec27
--- /dev/null
+++ b/docs/doxygen/latex/xblog_8h_source.tex
@@ -0,0 +1,59 @@
+\hypertarget{xblog_8h_source}{}\doxysection{xblog.\+h}
+\label{xblog_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblog.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xblog.h}}
+\mbox{\hyperlink{xblog_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xblog.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBLOG\_H\_\_}}
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#define \_\_XB\_XBLOG\_H\_\_}}
+\DoxyCodeLine{18 }
+\DoxyCodeLine{19 \textcolor{preprocessor}{\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#pragma interface}}
+\DoxyCodeLine{21 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{22 }
+\DoxyCodeLine{23 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{24 }
+\DoxyCodeLine{25 \textcolor{preprocessor}{\#ifdef XB\_LOGGING\_SUPPORT}}
+\DoxyCodeLine{26 }
+\DoxyCodeLine{28 }
+\DoxyCodeLine{41 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{namespacexb_a4a31fbe9110c9e55495ce71e642d785c}{xbLog}} : \textcolor{keyword}{public} xbFile \{}
+\DoxyCodeLine{42 \textcolor{keyword}{public}:}
+\DoxyCodeLine{43 \mbox{\hyperlink{namespacexb_a4a31fbe9110c9e55495ce71e642d785c}{xbLog}}();}
+\DoxyCodeLine{44 \mbox{\hyperlink{namespacexb_a4a31fbe9110c9e55495ce71e642d785c}{xbLog}}( \textcolor{keyword}{const} xbString \&sLogFileName );}
+\DoxyCodeLine{45 \string~xbLog();}
+\DoxyCodeLine{46 }
+\DoxyCodeLine{47 xbInt16 LogClose ();}
+\DoxyCodeLine{48 xbInt16 LogGetStatus ();}
+\DoxyCodeLine{49 xbInt16 LogOpen ();}
+\DoxyCodeLine{50 \textcolor{keywordtype}{void} LogSetStatus ( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bLogStatus );}
+\DoxyCodeLine{51 \textcolor{keywordtype}{void} LogSetLogSize( \textcolor{keywordtype}{size\_t} lSize ); \textcolor{comment}{// \{ LogSize = size; \}}}
+\DoxyCodeLine{52 xbInt16 LogWrite ( \textcolor{keyword}{const} xbString \&LogEntry, xbInt16 iOutputOption = 0 );}
+\DoxyCodeLine{53 xbInt16 LogWriteBytes( xbUInt32 lByteCnt, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *p );}
+\DoxyCodeLine{54 }
+\DoxyCodeLine{55 \textcolor{keyword}{private}:}
+\DoxyCodeLine{56 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bLoggingStatus; \textcolor{comment}{// false = logging off}}
+\DoxyCodeLine{57 \textcolor{comment}{// true = logging on}}
+\DoxyCodeLine{58 \textcolor{keywordtype}{size\_t} lLogSize;}
+\DoxyCodeLine{59 xbInt16 iShareMode;}
+\DoxyCodeLine{60 \};}
+\DoxyCodeLine{61 }
+\DoxyCodeLine{62 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_LOGGING\_SUPPORT}}
+\DoxyCodeLine{63 \} \textcolor{comment}{// namespace}}
+\DoxyCodeLine{64 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_XBLOG\_H\_\_}}
+\DoxyCodeLine{65 }
+\DoxyCodeLine{66 }
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbmemo3_8cpp.tex b/docs/doxygen/latex/xbmemo3_8cpp.tex
new file mode 100644
index 0000000..f829ce4
--- /dev/null
+++ b/docs/doxygen/latex/xbmemo3_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbmemo3_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbmemo3.cpp File Reference}
+\label{xbmemo3_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbmemo3.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbmemo3.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbmemo4_8cpp.tex b/docs/doxygen/latex/xbmemo4_8cpp.tex
new file mode 100644
index 0000000..ba7a70b
--- /dev/null
+++ b/docs/doxygen/latex/xbmemo4_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbmemo4_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbmemo4.cpp File Reference}
+\label{xbmemo4_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbmemo4.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbmemo4.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbmemo_8cpp.tex b/docs/doxygen/latex/xbmemo_8cpp.tex
new file mode 100644
index 0000000..d3d2c67
--- /dev/null
+++ b/docs/doxygen/latex/xbmemo_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbmemo_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbmemo.cpp File Reference}
+\label{xbmemo_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbmemo.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbmemo.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbmemo_8h.tex b/docs/doxygen/latex/xbmemo_8h.tex
new file mode 100644
index 0000000..e1fff45
--- /dev/null
+++ b/docs/doxygen/latex/xbmemo_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xbmemo_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbmemo.h File Reference}
+\label{xbmemo_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbmemo.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbmemo.h}}
diff --git a/docs/doxygen/latex/xbmemo_8h_source.tex b/docs/doxygen/latex/xbmemo_8h_source.tex
new file mode 100644
index 0000000..a948e02
--- /dev/null
+++ b/docs/doxygen/latex/xbmemo_8h_source.tex
@@ -0,0 +1,186 @@
+\hypertarget{xbmemo_8h_source}{}\doxysection{xbmemo.\+h}
+\label{xbmemo_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbmemo.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbmemo.h}}
+\mbox{\hyperlink{xbmemo_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbmemo.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBMEMO\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_XBMEMO\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 }
+\DoxyCodeLine{21 \textcolor{comment}{// dont use "{}\#pragma interface"{} with abstract classes}}
+\DoxyCodeLine{22 \textcolor{comment}{// \#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{23 \textcolor{comment}{// \#pragma interface}}
+\DoxyCodeLine{24 \textcolor{comment}{// \#endif}}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 \textcolor{preprocessor}{\#ifdef XB\_MEMO\_SUPPORT}}
+\DoxyCodeLine{27 }
+\DoxyCodeLine{28 }
+\DoxyCodeLine{29 }
+\DoxyCodeLine{30 }
+\DoxyCodeLine{31 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{32 }
+\DoxyCodeLine{34 }
+\DoxyCodeLine{55 \textcolor{keyword}{class }XBDLLEXPORT xbMemo : \textcolor{keyword}{public} xbFile \{}
+\DoxyCodeLine{56 \textcolor{keyword}{public}:}
+\DoxyCodeLine{57 }
+\DoxyCodeLine{58 xbMemo( \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf, xbString \textcolor{keyword}{const} \&sFileName );}
+\DoxyCodeLine{59 }
+\DoxyCodeLine{60 \textcolor{comment}{/* virtual methods */}}
+\DoxyCodeLine{61 \textcolor{keyword}{virtual} \string~xbMemo();}
+\DoxyCodeLine{62 \textcolor{keyword}{virtual} xbInt16 Abort () = 0;}
+\DoxyCodeLine{63 \textcolor{keyword}{virtual} xbInt16 CloseMemoFile ();}
+\DoxyCodeLine{64 \textcolor{keyword}{virtual} xbInt16 Commit () = 0;}
+\DoxyCodeLine{65 }
+\DoxyCodeLine{66 \textcolor{preprocessor}{ \#ifdef XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{67 \textcolor{keyword}{virtual} xbInt16 LockMemo ( xbInt16 iLockFunction );}
+\DoxyCodeLine{68 \textcolor{keyword}{virtual} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetMemoLocked () \textcolor{keyword}{const};}
+\DoxyCodeLine{69 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{70 }
+\DoxyCodeLine{71 \textcolor{comment}{/* pure virtual methods */}}
+\DoxyCodeLine{72 \textcolor{keyword}{virtual} xbInt16 CreateMemoFile () = 0;}
+\DoxyCodeLine{73 }
+\DoxyCodeLine{74 \textcolor{keyword}{virtual} xbInt16 GetMemoField ( xbInt16 iFieldNo, xbString \&sMemoData ) = 0;}
+\DoxyCodeLine{75 \textcolor{keyword}{virtual} xbInt16 GetMemoFieldLen( xbInt16 iFieldNo, xbUInt32 \&ulMemoFieldLen ) = 0;}
+\DoxyCodeLine{76 \textcolor{keyword}{virtual} xbInt16 OpenMemoFile () = 0;}
+\DoxyCodeLine{77 \textcolor{keyword}{virtual} xbInt16 GetMemoFileType();}
+\DoxyCodeLine{78 \textcolor{keyword}{virtual} xbInt16 PackMemo ( \textcolor{keywordtype}{void} (*memoStatusFunc)(xbUInt32 ulItemNum, xbUInt32 ulNumItems)) = 0;}
+\DoxyCodeLine{79 \textcolor{keyword}{virtual} xbInt16 UpdateMemoField( xbInt16 iFieldNo, \textcolor{keyword}{const} xbString \&sMemoData ) = 0;}
+\DoxyCodeLine{80 }
+\DoxyCodeLine{81 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{82 \textcolor{keyword}{virtual} xbInt16 DumpMemoFreeChain() = 0;}
+\DoxyCodeLine{83 \textcolor{keyword}{virtual} xbInt16 DumpMemoHeader () = 0;}
+\DoxyCodeLine{84 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{85 }
+\DoxyCodeLine{86 \textcolor{comment}{// *********** FIXME *************}}
+\DoxyCodeLine{87 \textcolor{comment}{// next two methods should be protected but are called in the xb\_test\_xxxx programs testing routines}}
+\DoxyCodeLine{88 \textcolor{comment}{// so for now, they are kept as public}}
+\DoxyCodeLine{89 \textcolor{keyword}{virtual} xbInt16 CalcLastDataBlock ( xbUInt32 \&lLastDataBlock );}
+\DoxyCodeLine{90 \textcolor{keyword}{virtual} xbInt16 GetHdrNextBlock ( xbUInt32 \&ulBlockNo );}
+\DoxyCodeLine{91 }
+\DoxyCodeLine{92 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{93 \textcolor{keyword}{friend} \textcolor{keyword}{class }\mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}};}
+\DoxyCodeLine{94 }
+\DoxyCodeLine{95 \textcolor{keyword}{virtual} xbInt16 ReadDbtHeader ( xbInt16 iOption ) = 0;}
+\DoxyCodeLine{96 \textcolor{keyword}{virtual} xbInt16 UpdateHeaderName () = 0;}
+\DoxyCodeLine{97 \textcolor{keyword}{virtual} xbInt16 UpdateHeadNextNode();}
+\DoxyCodeLine{98 \textcolor{keyword}{virtual} xbInt16 Zap () = 0;}
+\DoxyCodeLine{99 }
+\DoxyCodeLine{100 \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf; \textcolor{comment}{/* pointer to related dbf instance */}}
+\DoxyCodeLine{101 \textcolor{keywordtype}{char} cVersion; \textcolor{comment}{/* byte 16 off the header block, 0x03 for V3, version IV -\/ ? */}}
+\DoxyCodeLine{102 xbInt16 iMemoFileType; \textcolor{comment}{/* 3 = version III, 4 = version IV */}}
+\DoxyCodeLine{103 xbUInt32 ulHdrNextBlock; \textcolor{comment}{/* next available block , bytes 0-\/3 of the memo header */}}
+\DoxyCodeLine{104 \textcolor{keywordtype}{void} * mbb; \textcolor{comment}{/* memo block buffer */}}
+\DoxyCodeLine{105 }
+\DoxyCodeLine{106 }
+\DoxyCodeLine{107 \textcolor{keyword}{private}:}
+\DoxyCodeLine{108 }
+\DoxyCodeLine{109 \textcolor{preprocessor}{ \#ifdef XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{110 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bFileLocked; \textcolor{comment}{/* memo file locked */}}
+\DoxyCodeLine{111 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{112 }
+\DoxyCodeLine{113 \};}
+\DoxyCodeLine{114 }
+\DoxyCodeLine{115 }
+\DoxyCodeLine{116 }
+\DoxyCodeLine{117 \textcolor{preprocessor}{\#ifdef XB\_DBF3\_SUPPORT}}
+\DoxyCodeLine{119 }
+\DoxyCodeLine{131 \textcolor{keyword}{class }XBDLLEXPORT xbMemoDbt3 : \textcolor{keyword}{public} xbMemo \{}
+\DoxyCodeLine{132 \textcolor{keyword}{public}:}
+\DoxyCodeLine{133 xbMemoDbt3( \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf, xbString \textcolor{keyword}{const} \&sFileName );}
+\DoxyCodeLine{134 \string~xbMemoDbt3();}
+\DoxyCodeLine{135 \textcolor{keyword}{virtual} xbInt16 Abort ();}
+\DoxyCodeLine{136 \textcolor{keyword}{virtual} xbInt16 Commit ();}
+\DoxyCodeLine{137 \textcolor{keyword}{virtual} xbInt16 CreateMemoFile ();}
+\DoxyCodeLine{138 \textcolor{keyword}{virtual} xbInt16 GetMemoField ( xbInt16 iFieldNo, xbString \&sMemoData );}
+\DoxyCodeLine{139 \textcolor{keyword}{virtual} xbInt16 GetMemoFieldLen( xbInt16 iFieldNo, xbUInt32 \&ulMemoFieldLen );}
+\DoxyCodeLine{140 \textcolor{keyword}{virtual} xbInt16 OpenMemoFile ();}
+\DoxyCodeLine{141 \textcolor{keyword}{virtual} xbInt16 PackMemo ( \textcolor{keywordtype}{void} (*memoStatusFunc) (xbUInt32 ulItemNum, xbUInt32 ulNumItems));}
+\DoxyCodeLine{142 \textcolor{keyword}{virtual} xbInt16 UpdateMemoField( xbInt16 iFieldNo, \textcolor{keyword}{const} xbString \&sMemoData );}
+\DoxyCodeLine{143 }
+\DoxyCodeLine{144 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{145 \textcolor{keyword}{virtual} xbInt16 DumpMemoFreeChain();}
+\DoxyCodeLine{146 \textcolor{keyword}{virtual} xbInt16 DumpMemoHeader ();}
+\DoxyCodeLine{147 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{148 }
+\DoxyCodeLine{149 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{150 \textcolor{keyword}{virtual} xbInt16 ReadDbtHeader( xbInt16 iOption );}
+\DoxyCodeLine{151 \textcolor{keyword}{virtual} xbInt16 UpdateHeaderName();}
+\DoxyCodeLine{152 \textcolor{keyword}{virtual} xbInt16 Zap();}
+\DoxyCodeLine{153 }
+\DoxyCodeLine{154 \textcolor{keyword}{private}:}
+\DoxyCodeLine{155 \};}
+\DoxyCodeLine{156 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{157 }
+\DoxyCodeLine{158 }
+\DoxyCodeLine{159 \textcolor{preprocessor}{\#ifdef XB\_DBF4\_SUPPORT}}
+\DoxyCodeLine{160 }
+\DoxyCodeLine{162 }
+\DoxyCodeLine{172 \textcolor{keyword}{class }XBDLLEXPORT xbMemoDbt4 : \textcolor{keyword}{public} xbMemo \{}
+\DoxyCodeLine{173 \textcolor{keyword}{public}:}
+\DoxyCodeLine{174 xbMemoDbt4( \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xbDbf}} *dbf, xbString \textcolor{keyword}{const} \&sFileName );}
+\DoxyCodeLine{175 \string~xbMemoDbt4();}
+\DoxyCodeLine{176 \textcolor{keyword}{virtual} xbInt16 Abort ();}
+\DoxyCodeLine{177 \textcolor{keyword}{virtual} xbInt16 Commit ();}
+\DoxyCodeLine{178 \textcolor{keyword}{virtual} xbInt16 CreateMemoFile ();}
+\DoxyCodeLine{179 }
+\DoxyCodeLine{180 \textcolor{keyword}{virtual} xbInt16 GetMemoField ( xbInt16 iFieldNo, xbString \&sMemoData );}
+\DoxyCodeLine{181 \textcolor{keyword}{virtual} xbInt16 GetMemoFieldLen ( xbInt16 iFieldNo, xbUInt32 \&ulMemoFieldLen );}
+\DoxyCodeLine{182 \textcolor{keyword}{virtual} xbInt16 GetMemoFieldLen ( xbInt16 iFieldNo, xbUInt32 \&ulMemoFieldLen, xbUInt32 \&lBlockNo );}
+\DoxyCodeLine{183 \textcolor{keyword}{virtual} xbInt16 OpenMemoFile ();}
+\DoxyCodeLine{184 \textcolor{keyword}{virtual} xbInt16 PackMemo ( \textcolor{keywordtype}{void} (*memoStatusFunc) (xbUInt32 ulItemNum, xbUInt32 ulNumItems));}
+\DoxyCodeLine{185 \textcolor{keyword}{virtual} xbInt16 UpdateMemoField ( xbInt16 iFieldNo, \textcolor{keyword}{const} xbString \&sMemoData );}
+\DoxyCodeLine{186 }
+\DoxyCodeLine{187 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{188 \textcolor{keyword}{virtual} xbInt16 DumpMemoFreeChain ();}
+\DoxyCodeLine{189 \textcolor{keyword}{virtual} xbInt16 DumpMemoHeader ();}
+\DoxyCodeLine{190 \textcolor{keyword}{virtual} xbInt16 DumpMemoInternals ();}
+\DoxyCodeLine{191 \textcolor{keyword}{virtual} xbInt16 ReadFreeBlockHeader( xbUInt32 ulBlockNo, xbUInt32 \&ulNextBlock, xbUInt32 \&ulFreeBlockCnt );}
+\DoxyCodeLine{192 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{193 }
+\DoxyCodeLine{194 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{195 \textcolor{keyword}{virtual} xbInt16 FindBlockSetInChain( xbUInt32 ulBlocksNeeded, xbUInt32 \&ulLastDataBlock, xbUInt32 \&ulLocation, xbUInt32 \&ulPrevNode, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} \&bFound );}
+\DoxyCodeLine{196 \textcolor{keyword}{virtual} xbInt16 FreeMemoBlockChain( xbUInt32 ulBlockNo );}
+\DoxyCodeLine{197 \textcolor{keyword}{virtual} xbInt16 FreeMemoBlockChain( xbUInt32 ulBlockNo, xbUInt32 \&ulLastDataBlock );}
+\DoxyCodeLine{198 \textcolor{keyword}{virtual} xbInt16 GetBlockSetFromChain( xbUInt32 ulBlocksNeeded, xbUInt32 ulLocation, xbUInt32 ulPrevNode );}
+\DoxyCodeLine{199 \textcolor{keyword}{virtual} xbInt16 ReadDbtHeader( xbInt16 iOption );}
+\DoxyCodeLine{200 \textcolor{keyword}{virtual} xbInt16 ReadBlockHeader( xbUInt32 ulBlockNo, xbInt16 iOption );}
+\DoxyCodeLine{201 \textcolor{keyword}{virtual} xbInt16 UpdateHeaderName ();}
+\DoxyCodeLine{202 \textcolor{keyword}{virtual} xbInt16 WriteBlockHeader( xbUInt32 ulBlockNo, xbInt16 iOption );}
+\DoxyCodeLine{203 \textcolor{keyword}{virtual} xbInt16 Zap();}
+\DoxyCodeLine{204 }
+\DoxyCodeLine{205 \textcolor{keyword}{private}:}
+\DoxyCodeLine{206 xbString sDbfFileNameWoExt;}
+\DoxyCodeLine{207 xbUInt32 ulNextFreeBlock;}
+\DoxyCodeLine{208 xbUInt32 ulFreeBlockCnt;}
+\DoxyCodeLine{209 xbInt16 iField1;}
+\DoxyCodeLine{210 xbInt16 iStartPos;}
+\DoxyCodeLine{211 xbUInt32 ulFieldLen;}
+\DoxyCodeLine{212 }
+\DoxyCodeLine{213 xbLinkList<xbUInt32> llOldBlocks; \textcolor{comment}{// list of previously used memo blocks for field, used by Commit() / Abort()}}
+\DoxyCodeLine{214 xbLinkList<xbUInt32> llNewBlocks; \textcolor{comment}{// list of newly updated memo blocks for field, used by Commit() / Abort()}}
+\DoxyCodeLine{215 }
+\DoxyCodeLine{216 \};}
+\DoxyCodeLine{217 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{218 }
+\DoxyCodeLine{219 }
+\DoxyCodeLine{220 \} \textcolor{comment}{/* namespace xb */}}
+\DoxyCodeLine{221 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* XB\_MEMO\_SUPPORT */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{222 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_MEMO\_H\_\_ */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{223 }
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbretcod_8h.tex b/docs/doxygen/latex/xbretcod_8h.tex
new file mode 100644
index 0000000..d2ce8f0
--- /dev/null
+++ b/docs/doxygen/latex/xbretcod_8h.tex
@@ -0,0 +1,445 @@
+\hypertarget{xbretcod_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbretcod.h File Reference}
+\label{xbretcod_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbretcod.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbretcod.h}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}{XB\+\_\+\+NO\+\_\+\+ERROR}}~0
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ae687fc7d872ba0475a8477e4447f9b54}{XB\+\_\+\+NO\+\_\+\+MEMORY}}~-\/100
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_af1cd0baf346cad686fa4dd11f700012a}{XB\+\_\+\+INVALID\+\_\+\+OPTION}}~-\/101
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ac18036408d10e5eee1bf76cf92352b95}{XB\+\_\+\+DUP\+\_\+\+TABLE\+\_\+\+OR\+\_\+\+ALIAS}}~-\/110
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a13e6876470bd34c8c4e5533f115e04eb}{XB\+\_\+\+INVALID\+\_\+\+NODELINK}}~-\/120
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ad60dbb1862c0c1c2dc0464cfbfd93a34}{XB\+\_\+\+KEY\+\_\+\+NOT\+\_\+\+UNIQUE}}~-\/121
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a54303a9677dbd5342233f33dd08c64d0}{XB\+\_\+\+FILE\+\_\+\+EXISTS}}~-\/200
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_aa2ff8301503f446c6a5f6510090e520f}{XB\+\_\+\+ALREADY\+\_\+\+OPEN}}~-\/201
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a8104510b347c87998eadd0b27201e3c2}{XB\+\_\+\+DBF\+\_\+\+FILE\+\_\+\+NOT\+\_\+\+OPEN}}~-\/202
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ad090af330c93111d12f6de35dbb065bc}{XB\+\_\+\+FILE\+\_\+\+NOT\+\_\+\+FOUND}}~-\/203
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ab7b9130a5f1df9975cfeaf6241933596}{XB\+\_\+\+FILE\+\_\+\+TYPE\+\_\+\+NOT\+\_\+\+SUPPORTED}}~-\/204
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a373f30b2efcbbab9f6d060fb3fe8cba3}{XB\+\_\+\+RENAME\+\_\+\+ERROR}}~-\/205
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a418c047353bc683d0fd6ecbbdd5b7885}{XB\+\_\+\+INVALID\+\_\+\+OBJECT}}~-\/206
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a9474b400f647bdefbbb07e5177e8d7a1}{XB\+\_\+\+NOT\+\_\+\+OPEN}}~-\/207
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ac2606659a54111334f5b02861e533700}{XB\+\_\+\+NOT\+\_\+\+FOUND}}~-\/208
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_aaab55236993a1d3acb29206252a904c8}{XB\+\_\+\+OPEN\+\_\+\+ERROR}}~-\/209
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a030684d5541cf6127a76d81b0684b235}{XB\+\_\+\+CLOSE\+\_\+\+ERROR}}~-\/210
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a0455ad8719e153b08ec68b10c81e9f41}{XB\+\_\+\+SEEK\+\_\+\+ERROR}}~-\/211
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_adbd40585db8bb748d191f94a33bac710}{XB\+\_\+\+READ\+\_\+\+ERROR}}~-\/212
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_aef34ebe6726057f805d6063130280549}{XB\+\_\+\+WRITE\+\_\+\+ERROR}}~-\/213
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a8b47031e90c3f86306c7058e4490d3b7}{XB\+\_\+\+EOF}}~-\/214
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ade5f3a7cf1467d12761e4e21b5e4200f}{XB\+\_\+\+BOF}}~-\/215
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a1bd22921612389c37f6b2eac438c62c5}{XB\+\_\+\+INVALID\+\_\+\+BLOCK\+\_\+\+SIZE}}~-\/216
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a4e13b529b486c43ca600ce7d8ddbf3c2}{XB\+\_\+\+INVALID\+\_\+\+BLOCK\+\_\+\+NO}}~-\/217
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a0fd212f912b2e62700a66bae95bd73a1}{XB\+\_\+\+INVALID\+\_\+\+RECORD}}~-\/218
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ada15513935d5ede9216f07c0438f34d2}{XB\+\_\+\+DELETE\+\_\+\+FAILED}}~-\/219
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a53891c95a78483704d2a8e14c4499f92}{XB\+\_\+\+INVALID\+\_\+\+TABLE\+\_\+\+NAME}}~-\/220
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a18068d0cbe0c7a1b4dd3176220180c29}{XB\+\_\+\+EMPTY}}~-\/221
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a59f1a8a6aca19595c2d1804349a24850}{XB\+\_\+\+LIMIT\+\_\+\+REACHED}}~-\/222
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a79e2588f067d6e236c0e5a2c0728ba9f}{XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE}}~-\/300
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a09d6c08a44316f551108a74003efd381}{XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO}}~-\/301
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_afb40bbed323ecb369dd430a2e1242f9a}{XB\+\_\+\+INVALID\+\_\+\+DATA}}~-\/302
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a59403978784130834cf39434cb73f96e}{XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME}}~-\/303
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a187c50745f51bfe4aa6f70a92f16c59f}{XB\+\_\+\+INVALID\+\_\+\+MEMO\+\_\+\+FIELD}}~-\/304
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a34180b2e2bd350ba2ebcdd1335e15d7e}{XB\+\_\+\+INVALID\+\_\+\+FIELD}}~-\/305
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a7bd322c0efbba17f68ccccd6cf624411}{XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+LEN}}~-\/306
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a702475500357a27b8a34463be3e11925}{XB\+\_\+\+INVALID\+\_\+\+DATE}}~-\/307
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ab45735e63c208eb7e6d6df31fd527aec}{XB\+\_\+\+INVALID\+\_\+\+LOCK\+\_\+\+OPTION}}~-\/400
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a001e24b39e0f155fb1e892f5b1b9cff1}{XB\+\_\+\+LOCK\+\_\+\+FAILED}}~-\/401
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_af6aaf779fddecca521d785666f6dc56b}{XB\+\_\+\+TABLE\+\_\+\+NOT\+\_\+\+LOCKED}}~-\/402
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_aec713cac2b03a0d536a2d16336ae7c0b}{XB\+\_\+\+PARSE\+\_\+\+ERROR}}~-\/500
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a2b7e5e440dbcf5e6dc885b24dbe28742}{XB\+\_\+\+INVALID\+\_\+\+FUNCTION}}~-\/501
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a4cedf96581c9cbc9c14d07494143702d}{XB\+\_\+\+INVALID\+\_\+\+PARM}}~-\/502
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_adc4b24bfffa202f8df25409894e547b9}{XB\+\_\+\+INCONSISTENT\+\_\+\+PARM\+\_\+\+LENS}}~-\/503
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_af141ec58b7ca7360e0be6c61d015ea74}{XB\+\_\+\+INCOMPATIBLE\+\_\+\+OPERANDS}}~-\/504
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_aff5646a6b0884ff81004de6961473ea6}{XB\+\_\+\+UNBALANCED\+\_\+\+PARENS}}~-\/505
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_aedfa20a6c4eb9ba3063ba56be8280eac}{XB\+\_\+\+UNBALANCED\+\_\+\+QUOTES}}~-\/506
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a54db562c3cae97581812b4fccd52b71a}{XB\+\_\+\+INVALID\+\_\+\+EXPRESSION}}~-\/507
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_aec2c0ac2bd62e0329ef130e4fbda39f8}{XB\+\_\+\+INVALID\+\_\+\+KEYNO}}~-\/600
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_acd175ef0541e2cad424791bd87619dd4}{XB\+\_\+\+INVALID\+\_\+\+INDEX}}~-\/601
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a176d917912d3433f065483f905a4c50a}{XB\+\_\+\+INVALID\+\_\+\+TAG}}~-\/602
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_ad0aba12b5ae2137f8d6abd28b47f95f0}{XB\+\_\+\+INVALID\+\_\+\+PAGE}}~-\/603
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a5db3a90f215534143bdde81253729c7f}{XB\+\_\+\+SYNTAX\+\_\+\+ERROR}}~-\/700
+\item
+\#define \mbox{\hyperlink{xbretcod_8h_a299419a9c80e000b74bf97a2d24d6a3d}{XB\+\_\+\+MAX\+\_\+\+ERROR\+\_\+\+NO}}~-\/999
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Macro Definition Documentation}
+\mbox{\Hypertarget{xbretcod_8h_aa2ff8301503f446c6a5f6510090e520f}\label{xbretcod_8h_aa2ff8301503f446c6a5f6510090e520f}}
+\index{xbretcod.h@{xbretcod.h}!XB\_ALREADY\_OPEN@{XB\_ALREADY\_OPEN}}
+\index{XB\_ALREADY\_OPEN@{XB\_ALREADY\_OPEN}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_ALREADY\_OPEN}{XB\_ALREADY\_OPEN}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+ALREADY\+\_\+\+OPEN~-\/201}
+
+\mbox{\Hypertarget{xbretcod_8h_ade5f3a7cf1467d12761e4e21b5e4200f}\label{xbretcod_8h_ade5f3a7cf1467d12761e4e21b5e4200f}}
+\index{xbretcod.h@{xbretcod.h}!XB\_BOF@{XB\_BOF}}
+\index{XB\_BOF@{XB\_BOF}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_BOF}{XB\_BOF}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+BOF~-\/215}
+
+\mbox{\Hypertarget{xbretcod_8h_a030684d5541cf6127a76d81b0684b235}\label{xbretcod_8h_a030684d5541cf6127a76d81b0684b235}}
+\index{xbretcod.h@{xbretcod.h}!XB\_CLOSE\_ERROR@{XB\_CLOSE\_ERROR}}
+\index{XB\_CLOSE\_ERROR@{XB\_CLOSE\_ERROR}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_CLOSE\_ERROR}{XB\_CLOSE\_ERROR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+CLOSE\+\_\+\+ERROR~-\/210}
+
+\mbox{\Hypertarget{xbretcod_8h_a8104510b347c87998eadd0b27201e3c2}\label{xbretcod_8h_a8104510b347c87998eadd0b27201e3c2}}
+\index{xbretcod.h@{xbretcod.h}!XB\_DBF\_FILE\_NOT\_OPEN@{XB\_DBF\_FILE\_NOT\_OPEN}}
+\index{XB\_DBF\_FILE\_NOT\_OPEN@{XB\_DBF\_FILE\_NOT\_OPEN}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_DBF\_FILE\_NOT\_OPEN}{XB\_DBF\_FILE\_NOT\_OPEN}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+DBF\+\_\+\+FILE\+\_\+\+NOT\+\_\+\+OPEN~-\/202}
+
+\mbox{\Hypertarget{xbretcod_8h_ada15513935d5ede9216f07c0438f34d2}\label{xbretcod_8h_ada15513935d5ede9216f07c0438f34d2}}
+\index{xbretcod.h@{xbretcod.h}!XB\_DELETE\_FAILED@{XB\_DELETE\_FAILED}}
+\index{XB\_DELETE\_FAILED@{XB\_DELETE\_FAILED}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_DELETE\_FAILED}{XB\_DELETE\_FAILED}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+DELETE\+\_\+\+FAILED~-\/219}
+
+\mbox{\Hypertarget{xbretcod_8h_ac18036408d10e5eee1bf76cf92352b95}\label{xbretcod_8h_ac18036408d10e5eee1bf76cf92352b95}}
+\index{xbretcod.h@{xbretcod.h}!XB\_DUP\_TABLE\_OR\_ALIAS@{XB\_DUP\_TABLE\_OR\_ALIAS}}
+\index{XB\_DUP\_TABLE\_OR\_ALIAS@{XB\_DUP\_TABLE\_OR\_ALIAS}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_DUP\_TABLE\_OR\_ALIAS}{XB\_DUP\_TABLE\_OR\_ALIAS}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+DUP\+\_\+\+TABLE\+\_\+\+OR\+\_\+\+ALIAS~-\/110}
+
+\mbox{\Hypertarget{xbretcod_8h_a18068d0cbe0c7a1b4dd3176220180c29}\label{xbretcod_8h_a18068d0cbe0c7a1b4dd3176220180c29}}
+\index{xbretcod.h@{xbretcod.h}!XB\_EMPTY@{XB\_EMPTY}}
+\index{XB\_EMPTY@{XB\_EMPTY}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_EMPTY}{XB\_EMPTY}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+EMPTY~-\/221}
+
+\mbox{\Hypertarget{xbretcod_8h_a8b47031e90c3f86306c7058e4490d3b7}\label{xbretcod_8h_a8b47031e90c3f86306c7058e4490d3b7}}
+\index{xbretcod.h@{xbretcod.h}!XB\_EOF@{XB\_EOF}}
+\index{XB\_EOF@{XB\_EOF}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_EOF}{XB\_EOF}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+EOF~-\/214}
+
+\mbox{\Hypertarget{xbretcod_8h_a54303a9677dbd5342233f33dd08c64d0}\label{xbretcod_8h_a54303a9677dbd5342233f33dd08c64d0}}
+\index{xbretcod.h@{xbretcod.h}!XB\_FILE\_EXISTS@{XB\_FILE\_EXISTS}}
+\index{XB\_FILE\_EXISTS@{XB\_FILE\_EXISTS}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_FILE\_EXISTS}{XB\_FILE\_EXISTS}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+FILE\+\_\+\+EXISTS~-\/200}
+
+\mbox{\Hypertarget{xbretcod_8h_ad090af330c93111d12f6de35dbb065bc}\label{xbretcod_8h_ad090af330c93111d12f6de35dbb065bc}}
+\index{xbretcod.h@{xbretcod.h}!XB\_FILE\_NOT\_FOUND@{XB\_FILE\_NOT\_FOUND}}
+\index{XB\_FILE\_NOT\_FOUND@{XB\_FILE\_NOT\_FOUND}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_FILE\_NOT\_FOUND}{XB\_FILE\_NOT\_FOUND}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+FILE\+\_\+\+NOT\+\_\+\+FOUND~-\/203}
+
+\mbox{\Hypertarget{xbretcod_8h_ab7b9130a5f1df9975cfeaf6241933596}\label{xbretcod_8h_ab7b9130a5f1df9975cfeaf6241933596}}
+\index{xbretcod.h@{xbretcod.h}!XB\_FILE\_TYPE\_NOT\_SUPPORTED@{XB\_FILE\_TYPE\_NOT\_SUPPORTED}}
+\index{XB\_FILE\_TYPE\_NOT\_SUPPORTED@{XB\_FILE\_TYPE\_NOT\_SUPPORTED}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_FILE\_TYPE\_NOT\_SUPPORTED}{XB\_FILE\_TYPE\_NOT\_SUPPORTED}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+FILE\+\_\+\+TYPE\+\_\+\+NOT\+\_\+\+SUPPORTED~-\/204}
+
+\mbox{\Hypertarget{xbretcod_8h_af141ec58b7ca7360e0be6c61d015ea74}\label{xbretcod_8h_af141ec58b7ca7360e0be6c61d015ea74}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INCOMPATIBLE\_OPERANDS@{XB\_INCOMPATIBLE\_OPERANDS}}
+\index{XB\_INCOMPATIBLE\_OPERANDS@{XB\_INCOMPATIBLE\_OPERANDS}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INCOMPATIBLE\_OPERANDS}{XB\_INCOMPATIBLE\_OPERANDS}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INCOMPATIBLE\+\_\+\+OPERANDS~-\/504}
+
+\mbox{\Hypertarget{xbretcod_8h_adc4b24bfffa202f8df25409894e547b9}\label{xbretcod_8h_adc4b24bfffa202f8df25409894e547b9}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INCONSISTENT\_PARM\_LENS@{XB\_INCONSISTENT\_PARM\_LENS}}
+\index{XB\_INCONSISTENT\_PARM\_LENS@{XB\_INCONSISTENT\_PARM\_LENS}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INCONSISTENT\_PARM\_LENS}{XB\_INCONSISTENT\_PARM\_LENS}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INCONSISTENT\+\_\+\+PARM\+\_\+\+LENS~-\/503}
+
+\mbox{\Hypertarget{xbretcod_8h_a4e13b529b486c43ca600ce7d8ddbf3c2}\label{xbretcod_8h_a4e13b529b486c43ca600ce7d8ddbf3c2}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_BLOCK\_NO@{XB\_INVALID\_BLOCK\_NO}}
+\index{XB\_INVALID\_BLOCK\_NO@{XB\_INVALID\_BLOCK\_NO}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_BLOCK\_NO}{XB\_INVALID\_BLOCK\_NO}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+BLOCK\+\_\+\+NO~-\/217}
+
+\mbox{\Hypertarget{xbretcod_8h_a1bd22921612389c37f6b2eac438c62c5}\label{xbretcod_8h_a1bd22921612389c37f6b2eac438c62c5}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_BLOCK\_SIZE@{XB\_INVALID\_BLOCK\_SIZE}}
+\index{XB\_INVALID\_BLOCK\_SIZE@{XB\_INVALID\_BLOCK\_SIZE}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_BLOCK\_SIZE}{XB\_INVALID\_BLOCK\_SIZE}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+BLOCK\+\_\+\+SIZE~-\/216}
+
+\mbox{\Hypertarget{xbretcod_8h_afb40bbed323ecb369dd430a2e1242f9a}\label{xbretcod_8h_afb40bbed323ecb369dd430a2e1242f9a}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_DATA@{XB\_INVALID\_DATA}}
+\index{XB\_INVALID\_DATA@{XB\_INVALID\_DATA}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_DATA}{XB\_INVALID\_DATA}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+DATA~-\/302}
+
+\mbox{\Hypertarget{xbretcod_8h_a702475500357a27b8a34463be3e11925}\label{xbretcod_8h_a702475500357a27b8a34463be3e11925}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_DATE@{XB\_INVALID\_DATE}}
+\index{XB\_INVALID\_DATE@{XB\_INVALID\_DATE}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_DATE}{XB\_INVALID\_DATE}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+DATE~-\/307}
+
+\mbox{\Hypertarget{xbretcod_8h_a54db562c3cae97581812b4fccd52b71a}\label{xbretcod_8h_a54db562c3cae97581812b4fccd52b71a}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_EXPRESSION@{XB\_INVALID\_EXPRESSION}}
+\index{XB\_INVALID\_EXPRESSION@{XB\_INVALID\_EXPRESSION}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_EXPRESSION}{XB\_INVALID\_EXPRESSION}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+EXPRESSION~-\/507}
+
+\mbox{\Hypertarget{xbretcod_8h_a34180b2e2bd350ba2ebcdd1335e15d7e}\label{xbretcod_8h_a34180b2e2bd350ba2ebcdd1335e15d7e}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_FIELD@{XB\_INVALID\_FIELD}}
+\index{XB\_INVALID\_FIELD@{XB\_INVALID\_FIELD}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_FIELD}{XB\_INVALID\_FIELD}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+FIELD~-\/305}
+
+\mbox{\Hypertarget{xbretcod_8h_a7bd322c0efbba17f68ccccd6cf624411}\label{xbretcod_8h_a7bd322c0efbba17f68ccccd6cf624411}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_FIELD\_LEN@{XB\_INVALID\_FIELD\_LEN}}
+\index{XB\_INVALID\_FIELD\_LEN@{XB\_INVALID\_FIELD\_LEN}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_FIELD\_LEN}{XB\_INVALID\_FIELD\_LEN}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+LEN~-\/306}
+
+\mbox{\Hypertarget{xbretcod_8h_a59403978784130834cf39434cb73f96e}\label{xbretcod_8h_a59403978784130834cf39434cb73f96e}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_FIELD\_NAME@{XB\_INVALID\_FIELD\_NAME}}
+\index{XB\_INVALID\_FIELD\_NAME@{XB\_INVALID\_FIELD\_NAME}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_FIELD\_NAME}{XB\_INVALID\_FIELD\_NAME}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NAME~-\/303}
+
+\mbox{\Hypertarget{xbretcod_8h_a09d6c08a44316f551108a74003efd381}\label{xbretcod_8h_a09d6c08a44316f551108a74003efd381}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_FIELD\_NO@{XB\_INVALID\_FIELD\_NO}}
+\index{XB\_INVALID\_FIELD\_NO@{XB\_INVALID\_FIELD\_NO}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_FIELD\_NO}{XB\_INVALID\_FIELD\_NO}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+NO~-\/301}
+
+\mbox{\Hypertarget{xbretcod_8h_a79e2588f067d6e236c0e5a2c0728ba9f}\label{xbretcod_8h_a79e2588f067d6e236c0e5a2c0728ba9f}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_FIELD\_TYPE@{XB\_INVALID\_FIELD\_TYPE}}
+\index{XB\_INVALID\_FIELD\_TYPE@{XB\_INVALID\_FIELD\_TYPE}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_FIELD\_TYPE}{XB\_INVALID\_FIELD\_TYPE}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+FIELD\+\_\+\+TYPE~-\/300}
+
+\mbox{\Hypertarget{xbretcod_8h_a2b7e5e440dbcf5e6dc885b24dbe28742}\label{xbretcod_8h_a2b7e5e440dbcf5e6dc885b24dbe28742}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_FUNCTION@{XB\_INVALID\_FUNCTION}}
+\index{XB\_INVALID\_FUNCTION@{XB\_INVALID\_FUNCTION}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_FUNCTION}{XB\_INVALID\_FUNCTION}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+FUNCTION~-\/501}
+
+\mbox{\Hypertarget{xbretcod_8h_acd175ef0541e2cad424791bd87619dd4}\label{xbretcod_8h_acd175ef0541e2cad424791bd87619dd4}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_INDEX@{XB\_INVALID\_INDEX}}
+\index{XB\_INVALID\_INDEX@{XB\_INVALID\_INDEX}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_INDEX}{XB\_INVALID\_INDEX}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+INDEX~-\/601}
+
+\mbox{\Hypertarget{xbretcod_8h_aec2c0ac2bd62e0329ef130e4fbda39f8}\label{xbretcod_8h_aec2c0ac2bd62e0329ef130e4fbda39f8}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_KEYNO@{XB\_INVALID\_KEYNO}}
+\index{XB\_INVALID\_KEYNO@{XB\_INVALID\_KEYNO}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_KEYNO}{XB\_INVALID\_KEYNO}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+KEYNO~-\/600}
+
+\mbox{\Hypertarget{xbretcod_8h_ab45735e63c208eb7e6d6df31fd527aec}\label{xbretcod_8h_ab45735e63c208eb7e6d6df31fd527aec}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_LOCK\_OPTION@{XB\_INVALID\_LOCK\_OPTION}}
+\index{XB\_INVALID\_LOCK\_OPTION@{XB\_INVALID\_LOCK\_OPTION}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_LOCK\_OPTION}{XB\_INVALID\_LOCK\_OPTION}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+LOCK\+\_\+\+OPTION~-\/400}
+
+\mbox{\Hypertarget{xbretcod_8h_a187c50745f51bfe4aa6f70a92f16c59f}\label{xbretcod_8h_a187c50745f51bfe4aa6f70a92f16c59f}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_MEMO\_FIELD@{XB\_INVALID\_MEMO\_FIELD}}
+\index{XB\_INVALID\_MEMO\_FIELD@{XB\_INVALID\_MEMO\_FIELD}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_MEMO\_FIELD}{XB\_INVALID\_MEMO\_FIELD}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+MEMO\+\_\+\+FIELD~-\/304}
+
+\mbox{\Hypertarget{xbretcod_8h_a13e6876470bd34c8c4e5533f115e04eb}\label{xbretcod_8h_a13e6876470bd34c8c4e5533f115e04eb}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_NODELINK@{XB\_INVALID\_NODELINK}}
+\index{XB\_INVALID\_NODELINK@{XB\_INVALID\_NODELINK}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_NODELINK}{XB\_INVALID\_NODELINK}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+NODELINK~-\/120}
+
+\mbox{\Hypertarget{xbretcod_8h_a418c047353bc683d0fd6ecbbdd5b7885}\label{xbretcod_8h_a418c047353bc683d0fd6ecbbdd5b7885}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_OBJECT@{XB\_INVALID\_OBJECT}}
+\index{XB\_INVALID\_OBJECT@{XB\_INVALID\_OBJECT}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_OBJECT}{XB\_INVALID\_OBJECT}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+OBJECT~-\/206}
+
+\mbox{\Hypertarget{xbretcod_8h_af1cd0baf346cad686fa4dd11f700012a}\label{xbretcod_8h_af1cd0baf346cad686fa4dd11f700012a}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_OPTION@{XB\_INVALID\_OPTION}}
+\index{XB\_INVALID\_OPTION@{XB\_INVALID\_OPTION}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_OPTION}{XB\_INVALID\_OPTION}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+OPTION~-\/101}
+
+\mbox{\Hypertarget{xbretcod_8h_ad0aba12b5ae2137f8d6abd28b47f95f0}\label{xbretcod_8h_ad0aba12b5ae2137f8d6abd28b47f95f0}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_PAGE@{XB\_INVALID\_PAGE}}
+\index{XB\_INVALID\_PAGE@{XB\_INVALID\_PAGE}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_PAGE}{XB\_INVALID\_PAGE}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+PAGE~-\/603}
+
+\mbox{\Hypertarget{xbretcod_8h_a4cedf96581c9cbc9c14d07494143702d}\label{xbretcod_8h_a4cedf96581c9cbc9c14d07494143702d}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_PARM@{XB\_INVALID\_PARM}}
+\index{XB\_INVALID\_PARM@{XB\_INVALID\_PARM}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_PARM}{XB\_INVALID\_PARM}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+PARM~-\/502}
+
+\mbox{\Hypertarget{xbretcod_8h_a0fd212f912b2e62700a66bae95bd73a1}\label{xbretcod_8h_a0fd212f912b2e62700a66bae95bd73a1}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_RECORD@{XB\_INVALID\_RECORD}}
+\index{XB\_INVALID\_RECORD@{XB\_INVALID\_RECORD}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_RECORD}{XB\_INVALID\_RECORD}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+RECORD~-\/218}
+
+\mbox{\Hypertarget{xbretcod_8h_a53891c95a78483704d2a8e14c4499f92}\label{xbretcod_8h_a53891c95a78483704d2a8e14c4499f92}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_TABLE\_NAME@{XB\_INVALID\_TABLE\_NAME}}
+\index{XB\_INVALID\_TABLE\_NAME@{XB\_INVALID\_TABLE\_NAME}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_TABLE\_NAME}{XB\_INVALID\_TABLE\_NAME}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+TABLE\+\_\+\+NAME~-\/220}
+
+\mbox{\Hypertarget{xbretcod_8h_a176d917912d3433f065483f905a4c50a}\label{xbretcod_8h_a176d917912d3433f065483f905a4c50a}}
+\index{xbretcod.h@{xbretcod.h}!XB\_INVALID\_TAG@{XB\_INVALID\_TAG}}
+\index{XB\_INVALID\_TAG@{XB\_INVALID\_TAG}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_INVALID\_TAG}{XB\_INVALID\_TAG}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+INVALID\+\_\+\+TAG~-\/602}
+
+\mbox{\Hypertarget{xbretcod_8h_ad60dbb1862c0c1c2dc0464cfbfd93a34}\label{xbretcod_8h_ad60dbb1862c0c1c2dc0464cfbfd93a34}}
+\index{xbretcod.h@{xbretcod.h}!XB\_KEY\_NOT\_UNIQUE@{XB\_KEY\_NOT\_UNIQUE}}
+\index{XB\_KEY\_NOT\_UNIQUE@{XB\_KEY\_NOT\_UNIQUE}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_KEY\_NOT\_UNIQUE}{XB\_KEY\_NOT\_UNIQUE}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+KEY\+\_\+\+NOT\+\_\+\+UNIQUE~-\/121}
+
+\mbox{\Hypertarget{xbretcod_8h_a59f1a8a6aca19595c2d1804349a24850}\label{xbretcod_8h_a59f1a8a6aca19595c2d1804349a24850}}
+\index{xbretcod.h@{xbretcod.h}!XB\_LIMIT\_REACHED@{XB\_LIMIT\_REACHED}}
+\index{XB\_LIMIT\_REACHED@{XB\_LIMIT\_REACHED}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_LIMIT\_REACHED}{XB\_LIMIT\_REACHED}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+LIMIT\+\_\+\+REACHED~-\/222}
+
+\mbox{\Hypertarget{xbretcod_8h_a001e24b39e0f155fb1e892f5b1b9cff1}\label{xbretcod_8h_a001e24b39e0f155fb1e892f5b1b9cff1}}
+\index{xbretcod.h@{xbretcod.h}!XB\_LOCK\_FAILED@{XB\_LOCK\_FAILED}}
+\index{XB\_LOCK\_FAILED@{XB\_LOCK\_FAILED}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_LOCK\_FAILED}{XB\_LOCK\_FAILED}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+LOCK\+\_\+\+FAILED~-\/401}
+
+\mbox{\Hypertarget{xbretcod_8h_a299419a9c80e000b74bf97a2d24d6a3d}\label{xbretcod_8h_a299419a9c80e000b74bf97a2d24d6a3d}}
+\index{xbretcod.h@{xbretcod.h}!XB\_MAX\_ERROR\_NO@{XB\_MAX\_ERROR\_NO}}
+\index{XB\_MAX\_ERROR\_NO@{XB\_MAX\_ERROR\_NO}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_MAX\_ERROR\_NO}{XB\_MAX\_ERROR\_NO}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+MAX\+\_\+\+ERROR\+\_\+\+NO~-\/999}
+
+\mbox{\Hypertarget{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}\label{xbretcod_8h_ac720d5b4ec45bfd606f5865d40816e23}}
+\index{xbretcod.h@{xbretcod.h}!XB\_NO\_ERROR@{XB\_NO\_ERROR}}
+\index{XB\_NO\_ERROR@{XB\_NO\_ERROR}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_NO\_ERROR}{XB\_NO\_ERROR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+NO\+\_\+\+ERROR~0}
+
+\mbox{\Hypertarget{xbretcod_8h_ae687fc7d872ba0475a8477e4447f9b54}\label{xbretcod_8h_ae687fc7d872ba0475a8477e4447f9b54}}
+\index{xbretcod.h@{xbretcod.h}!XB\_NO\_MEMORY@{XB\_NO\_MEMORY}}
+\index{XB\_NO\_MEMORY@{XB\_NO\_MEMORY}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_NO\_MEMORY}{XB\_NO\_MEMORY}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+NO\+\_\+\+MEMORY~-\/100}
+
+\mbox{\Hypertarget{xbretcod_8h_ac2606659a54111334f5b02861e533700}\label{xbretcod_8h_ac2606659a54111334f5b02861e533700}}
+\index{xbretcod.h@{xbretcod.h}!XB\_NOT\_FOUND@{XB\_NOT\_FOUND}}
+\index{XB\_NOT\_FOUND@{XB\_NOT\_FOUND}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_NOT\_FOUND}{XB\_NOT\_FOUND}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+NOT\+\_\+\+FOUND~-\/208}
+
+\mbox{\Hypertarget{xbretcod_8h_a9474b400f647bdefbbb07e5177e8d7a1}\label{xbretcod_8h_a9474b400f647bdefbbb07e5177e8d7a1}}
+\index{xbretcod.h@{xbretcod.h}!XB\_NOT\_OPEN@{XB\_NOT\_OPEN}}
+\index{XB\_NOT\_OPEN@{XB\_NOT\_OPEN}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_NOT\_OPEN}{XB\_NOT\_OPEN}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+NOT\+\_\+\+OPEN~-\/207}
+
+\mbox{\Hypertarget{xbretcod_8h_aaab55236993a1d3acb29206252a904c8}\label{xbretcod_8h_aaab55236993a1d3acb29206252a904c8}}
+\index{xbretcod.h@{xbretcod.h}!XB\_OPEN\_ERROR@{XB\_OPEN\_ERROR}}
+\index{XB\_OPEN\_ERROR@{XB\_OPEN\_ERROR}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_OPEN\_ERROR}{XB\_OPEN\_ERROR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+OPEN\+\_\+\+ERROR~-\/209}
+
+\mbox{\Hypertarget{xbretcod_8h_aec713cac2b03a0d536a2d16336ae7c0b}\label{xbretcod_8h_aec713cac2b03a0d536a2d16336ae7c0b}}
+\index{xbretcod.h@{xbretcod.h}!XB\_PARSE\_ERROR@{XB\_PARSE\_ERROR}}
+\index{XB\_PARSE\_ERROR@{XB\_PARSE\_ERROR}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_PARSE\_ERROR}{XB\_PARSE\_ERROR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+PARSE\+\_\+\+ERROR~-\/500}
+
+\mbox{\Hypertarget{xbretcod_8h_adbd40585db8bb748d191f94a33bac710}\label{xbretcod_8h_adbd40585db8bb748d191f94a33bac710}}
+\index{xbretcod.h@{xbretcod.h}!XB\_READ\_ERROR@{XB\_READ\_ERROR}}
+\index{XB\_READ\_ERROR@{XB\_READ\_ERROR}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_READ\_ERROR}{XB\_READ\_ERROR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+READ\+\_\+\+ERROR~-\/212}
+
+\mbox{\Hypertarget{xbretcod_8h_a373f30b2efcbbab9f6d060fb3fe8cba3}\label{xbretcod_8h_a373f30b2efcbbab9f6d060fb3fe8cba3}}
+\index{xbretcod.h@{xbretcod.h}!XB\_RENAME\_ERROR@{XB\_RENAME\_ERROR}}
+\index{XB\_RENAME\_ERROR@{XB\_RENAME\_ERROR}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_RENAME\_ERROR}{XB\_RENAME\_ERROR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+RENAME\+\_\+\+ERROR~-\/205}
+
+\mbox{\Hypertarget{xbretcod_8h_a0455ad8719e153b08ec68b10c81e9f41}\label{xbretcod_8h_a0455ad8719e153b08ec68b10c81e9f41}}
+\index{xbretcod.h@{xbretcod.h}!XB\_SEEK\_ERROR@{XB\_SEEK\_ERROR}}
+\index{XB\_SEEK\_ERROR@{XB\_SEEK\_ERROR}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_SEEK\_ERROR}{XB\_SEEK\_ERROR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+SEEK\+\_\+\+ERROR~-\/211}
+
+\mbox{\Hypertarget{xbretcod_8h_a5db3a90f215534143bdde81253729c7f}\label{xbretcod_8h_a5db3a90f215534143bdde81253729c7f}}
+\index{xbretcod.h@{xbretcod.h}!XB\_SYNTAX\_ERROR@{XB\_SYNTAX\_ERROR}}
+\index{XB\_SYNTAX\_ERROR@{XB\_SYNTAX\_ERROR}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_SYNTAX\_ERROR}{XB\_SYNTAX\_ERROR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+SYNTAX\+\_\+\+ERROR~-\/700}
+
+\mbox{\Hypertarget{xbretcod_8h_af6aaf779fddecca521d785666f6dc56b}\label{xbretcod_8h_af6aaf779fddecca521d785666f6dc56b}}
+\index{xbretcod.h@{xbretcod.h}!XB\_TABLE\_NOT\_LOCKED@{XB\_TABLE\_NOT\_LOCKED}}
+\index{XB\_TABLE\_NOT\_LOCKED@{XB\_TABLE\_NOT\_LOCKED}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_TABLE\_NOT\_LOCKED}{XB\_TABLE\_NOT\_LOCKED}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+TABLE\+\_\+\+NOT\+\_\+\+LOCKED~-\/402}
+
+\mbox{\Hypertarget{xbretcod_8h_aff5646a6b0884ff81004de6961473ea6}\label{xbretcod_8h_aff5646a6b0884ff81004de6961473ea6}}
+\index{xbretcod.h@{xbretcod.h}!XB\_UNBALANCED\_PARENS@{XB\_UNBALANCED\_PARENS}}
+\index{XB\_UNBALANCED\_PARENS@{XB\_UNBALANCED\_PARENS}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_UNBALANCED\_PARENS}{XB\_UNBALANCED\_PARENS}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+UNBALANCED\+\_\+\+PARENS~-\/505}
+
+\mbox{\Hypertarget{xbretcod_8h_aedfa20a6c4eb9ba3063ba56be8280eac}\label{xbretcod_8h_aedfa20a6c4eb9ba3063ba56be8280eac}}
+\index{xbretcod.h@{xbretcod.h}!XB\_UNBALANCED\_QUOTES@{XB\_UNBALANCED\_QUOTES}}
+\index{XB\_UNBALANCED\_QUOTES@{XB\_UNBALANCED\_QUOTES}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_UNBALANCED\_QUOTES}{XB\_UNBALANCED\_QUOTES}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+UNBALANCED\+\_\+\+QUOTES~-\/506}
+
+\mbox{\Hypertarget{xbretcod_8h_aef34ebe6726057f805d6063130280549}\label{xbretcod_8h_aef34ebe6726057f805d6063130280549}}
+\index{xbretcod.h@{xbretcod.h}!XB\_WRITE\_ERROR@{XB\_WRITE\_ERROR}}
+\index{XB\_WRITE\_ERROR@{XB\_WRITE\_ERROR}!xbretcod.h@{xbretcod.h}}
+\doxysubsubsection{\texorpdfstring{XB\_WRITE\_ERROR}{XB\_WRITE\_ERROR}}
+{\footnotesize\ttfamily \#define XB\+\_\+\+WRITE\+\_\+\+ERROR~-\/213}
+
diff --git a/docs/doxygen/latex/xbretcod_8h_source.tex b/docs/doxygen/latex/xbretcod_8h_source.tex
new file mode 100644
index 0000000..3d2ca9e
--- /dev/null
+++ b/docs/doxygen/latex/xbretcod_8h_source.tex
@@ -0,0 +1,100 @@
+\hypertarget{xbretcod_8h_source}{}\doxysection{xbretcod.\+h}
+\label{xbretcod_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbretcod.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbretcod.h}}
+\mbox{\hyperlink{xbretcod_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbretcod.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 \textcolor{preprocessor}{\#ifndef \_\_XB\_RETCODES\_H\_\_}}
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#define \_\_XB\_RETCODES\_H\_\_}}
+\DoxyCodeLine{18 }
+\DoxyCodeLine{19 \textcolor{comment}{/***********************************************/}}
+\DoxyCodeLine{20 \textcolor{comment}{/* Return Codes and Error Messages */}}
+\DoxyCodeLine{21 }
+\DoxyCodeLine{22 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 \textcolor{preprocessor}{ \#define XB\_NO\_ERROR 0 }\textcolor{comment}{// general}}
+\DoxyCodeLine{25 \textcolor{preprocessor}{ \#define XB\_NO\_MEMORY -\/100 }\textcolor{comment}{// general}}
+\DoxyCodeLine{26 \textcolor{preprocessor}{ \#define XB\_INVALID\_OPTION -\/101 }\textcolor{comment}{// general}}
+\DoxyCodeLine{27 \textcolor{preprocessor}{ \#define XB\_DUP\_TABLE\_OR\_ALIAS -\/110 }\textcolor{comment}{// table manager}}
+\DoxyCodeLine{28 \textcolor{preprocessor}{ \#define XB\_INVALID\_NODELINK -\/120 }\textcolor{comment}{// linklist}}
+\DoxyCodeLine{29 \textcolor{preprocessor}{ \#define XB\_KEY\_NOT\_UNIQUE -\/121 }\textcolor{comment}{// linklist}}
+\DoxyCodeLine{30 }
+\DoxyCodeLine{31 \textcolor{preprocessor}{ \#define XB\_FILE\_EXISTS -\/200 }\textcolor{comment}{// file}}
+\DoxyCodeLine{32 \textcolor{preprocessor}{ \#define XB\_ALREADY\_OPEN -\/201 }\textcolor{comment}{// file}}
+\DoxyCodeLine{33 \textcolor{preprocessor}{ \#define XB\_DBF\_FILE\_NOT\_OPEN -\/202 }\textcolor{comment}{// file}}
+\DoxyCodeLine{34 \textcolor{preprocessor}{ \#define XB\_FILE\_NOT\_FOUND -\/203 }\textcolor{comment}{// file}}
+\DoxyCodeLine{35 \textcolor{preprocessor}{ \#define XB\_FILE\_TYPE\_NOT\_SUPPORTED -\/204 }\textcolor{comment}{// file}}
+\DoxyCodeLine{36 \textcolor{preprocessor}{ \#define XB\_RENAME\_ERROR -\/205 }\textcolor{comment}{// file}}
+\DoxyCodeLine{37 \textcolor{preprocessor}{ \#define XB\_INVALID\_OBJECT -\/206 }\textcolor{comment}{// file}}
+\DoxyCodeLine{38 \textcolor{preprocessor}{ \#define XB\_NOT\_OPEN -\/207 }\textcolor{comment}{// file}}
+\DoxyCodeLine{39 \textcolor{preprocessor}{ \#define XB\_NOT\_FOUND -\/208 }\textcolor{comment}{// file}}
+\DoxyCodeLine{40 \textcolor{preprocessor}{ \#define XB\_OPEN\_ERROR -\/209 }\textcolor{comment}{// file}}
+\DoxyCodeLine{41 \textcolor{preprocessor}{ \#define XB\_CLOSE\_ERROR -\/210 }\textcolor{comment}{// file}}
+\DoxyCodeLine{42 \textcolor{preprocessor}{ \#define XB\_SEEK\_ERROR -\/211 }\textcolor{comment}{// file}}
+\DoxyCodeLine{43 \textcolor{preprocessor}{ \#define XB\_READ\_ERROR -\/212 }\textcolor{comment}{// file}}
+\DoxyCodeLine{44 \textcolor{preprocessor}{ \#define XB\_WRITE\_ERROR -\/213 }\textcolor{comment}{// file}}
+\DoxyCodeLine{45 \textcolor{preprocessor}{ \#define XB\_EOF -\/214 }\textcolor{comment}{// file}}
+\DoxyCodeLine{46 \textcolor{preprocessor}{ \#define XB\_BOF -\/215 }\textcolor{comment}{// file}}
+\DoxyCodeLine{47 \textcolor{preprocessor}{ \#define XB\_INVALID\_BLOCK\_SIZE -\/216 }\textcolor{comment}{// file}}
+\DoxyCodeLine{48 \textcolor{preprocessor}{ \#define XB\_INVALID\_BLOCK\_NO -\/217 }\textcolor{comment}{// file}}
+\DoxyCodeLine{49 \textcolor{preprocessor}{ \#define XB\_INVALID\_RECORD -\/218 }\textcolor{comment}{// file}}
+\DoxyCodeLine{50 \textcolor{preprocessor}{ \#define XB\_DELETE\_FAILED -\/219 }\textcolor{comment}{// file}}
+\DoxyCodeLine{51 \textcolor{preprocessor}{ \#define XB\_INVALID\_TABLE\_NAME -\/220 }\textcolor{comment}{// file}}
+\DoxyCodeLine{52 \textcolor{preprocessor}{ \#define XB\_EMPTY -\/221 }\textcolor{comment}{// file}}
+\DoxyCodeLine{53 \textcolor{preprocessor}{ \#define XB\_LIMIT\_REACHED -\/222 }\textcolor{comment}{// file}}
+\DoxyCodeLine{54 }
+\DoxyCodeLine{55 \textcolor{preprocessor}{ \#define XB\_INVALID\_FIELD\_TYPE -\/300 }\textcolor{comment}{// field}}
+\DoxyCodeLine{56 \textcolor{preprocessor}{ \#define XB\_INVALID\_FIELD\_NO -\/301 }\textcolor{comment}{// field}}
+\DoxyCodeLine{57 \textcolor{preprocessor}{ \#define XB\_INVALID\_DATA -\/302 }\textcolor{comment}{// field}}
+\DoxyCodeLine{58 \textcolor{preprocessor}{ \#define XB\_INVALID\_FIELD\_NAME -\/303 }\textcolor{comment}{// field}}
+\DoxyCodeLine{59 \textcolor{preprocessor}{ \#define XB\_INVALID\_MEMO\_FIELD -\/304 }\textcolor{comment}{// field}}
+\DoxyCodeLine{60 \textcolor{preprocessor}{ \#define XB\_INVALID\_FIELD -\/305 }\textcolor{comment}{// field}}
+\DoxyCodeLine{61 \textcolor{preprocessor}{ \#define XB\_INVALID\_FIELD\_LEN -\/306 }\textcolor{comment}{// field}}
+\DoxyCodeLine{62 \textcolor{preprocessor}{ \#define XB\_INVALID\_DATE -\/307 }\textcolor{comment}{// date field}}
+\DoxyCodeLine{63 }
+\DoxyCodeLine{64 \textcolor{preprocessor}{ \#define XB\_INVALID\_LOCK\_OPTION -\/400 }\textcolor{comment}{// lock}}
+\DoxyCodeLine{65 \textcolor{preprocessor}{ \#define XB\_LOCK\_FAILED -\/401 }\textcolor{comment}{// lock}}
+\DoxyCodeLine{66 \textcolor{preprocessor}{ \#define XB\_TABLE\_NOT\_LOCKED -\/402 }\textcolor{comment}{// lock -\/ need table locked for operation}}
+\DoxyCodeLine{67 }
+\DoxyCodeLine{68 \textcolor{preprocessor}{ \#define XB\_PARSE\_ERROR -\/500 }\textcolor{comment}{// expression}}
+\DoxyCodeLine{69 \textcolor{preprocessor}{ \#define XB\_INVALID\_FUNCTION -\/501 }\textcolor{comment}{// expression}}
+\DoxyCodeLine{70 \textcolor{preprocessor}{ \#define XB\_INVALID\_PARM -\/502 }\textcolor{comment}{// expression}}
+\DoxyCodeLine{71 \textcolor{preprocessor}{ \#define XB\_INCONSISTENT\_PARM\_LENS -\/503 }\textcolor{comment}{// expression}}
+\DoxyCodeLine{72 \textcolor{preprocessor}{ \#define XB\_INCOMPATIBLE\_OPERANDS -\/504 }\textcolor{comment}{// expression}}
+\DoxyCodeLine{73 \textcolor{preprocessor}{ \#define XB\_UNBALANCED\_PARENS -\/505 }\textcolor{comment}{// expression}}
+\DoxyCodeLine{74 \textcolor{preprocessor}{ \#define XB\_UNBALANCED\_QUOTES -\/506 }\textcolor{comment}{// expression}}
+\DoxyCodeLine{75 \textcolor{preprocessor}{ \#define XB\_INVALID\_EXPRESSION -\/507 }\textcolor{comment}{// expression}}
+\DoxyCodeLine{76 }
+\DoxyCodeLine{77 \textcolor{preprocessor}{ \#define XB\_INVALID\_KEYNO -\/600 }\textcolor{comment}{// index}}
+\DoxyCodeLine{78 \textcolor{preprocessor}{ \#define XB\_INVALID\_INDEX -\/601 }\textcolor{comment}{// index file error}}
+\DoxyCodeLine{79 \textcolor{preprocessor}{ \#define XB\_INVALID\_TAG -\/602 }\textcolor{comment}{// invalid index tag name, must be <= 10 bytes}}
+\DoxyCodeLine{80 \textcolor{preprocessor}{ \#define XB\_INVALID\_PAGE -\/603 }\textcolor{comment}{// invalid index page}}
+\DoxyCodeLine{81 }
+\DoxyCodeLine{82 }
+\DoxyCodeLine{83 \textcolor{preprocessor}{ \#define XB\_SYNTAX\_ERROR -\/700 }\textcolor{comment}{// sql syntax error}}
+\DoxyCodeLine{84 }
+\DoxyCodeLine{85 }
+\DoxyCodeLine{86 \textcolor{preprocessor}{ \#define XB\_MAX\_ERROR\_NO -\/999}}
+\DoxyCodeLine{87 }
+\DoxyCodeLine{88 }
+\DoxyCodeLine{89 \textcolor{comment}{/* when updating this table, also need to update messages in xbssv.cpp */}}
+\DoxyCodeLine{90 }
+\DoxyCodeLine{91 }
+\DoxyCodeLine{92 \} \textcolor{comment}{/* namespace */}}
+\DoxyCodeLine{93 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_RETCODES\_H\_\_ */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{94 }
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbset_8cpp.tex b/docs/doxygen/latex/xbset_8cpp.tex
new file mode 100644
index 0000000..2e325e7
--- /dev/null
+++ b/docs/doxygen/latex/xbset_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbset_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/sql/xbset.cpp File Reference}
+\label{xbset_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbset.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbset.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbsql_8cpp.tex b/docs/doxygen/latex/xbsql_8cpp.tex
new file mode 100644
index 0000000..f488c9d
--- /dev/null
+++ b/docs/doxygen/latex/xbsql_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbsql_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/sql/xbsql.cpp File Reference}
+\label{xbsql_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbsql.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/sql/xbsql.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbsql_8h.tex b/docs/doxygen/latex/xbsql_8h.tex
new file mode 100644
index 0000000..e398353
--- /dev/null
+++ b/docs/doxygen/latex/xbsql_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xbsql_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbsql.h File Reference}
+\label{xbsql_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbsql.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbsql.h}}
diff --git a/docs/doxygen/latex/xbsql_8h_source.tex b/docs/doxygen/latex/xbsql_8h_source.tex
new file mode 100644
index 0000000..ae69922
--- /dev/null
+++ b/docs/doxygen/latex/xbsql_8h_source.tex
@@ -0,0 +1,75 @@
+\hypertarget{xbsql_8h_source}{}\doxysection{xbsql.\+h}
+\label{xbsql_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbsql.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbsql.h}}
+\mbox{\hyperlink{xbsql_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbsql.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{This class manages a list of open tables, open indices are connected to the open tables}}
+\DoxyCodeLine{15 \textcolor{comment}{}}
+\DoxyCodeLine{16 \textcolor{comment}{*/}}
+\DoxyCodeLine{17 }
+\DoxyCodeLine{18 }
+\DoxyCodeLine{19 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBSQL\_H\_\_}}
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#define \_\_XB\_XBSQL\_H\_\_}}
+\DoxyCodeLine{21 }
+\DoxyCodeLine{22 \textcolor{preprocessor}{\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{23 \textcolor{preprocessor}{\#pragma interface}}
+\DoxyCodeLine{24 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{preprocessor}{\#ifdef XB\_SQL\_SUPPORT}}
+\DoxyCodeLine{28 }
+\DoxyCodeLine{29 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{30 }
+\DoxyCodeLine{31 }
+\DoxyCodeLine{32 \textcolor{keyword}{class }XBDLLEXPORT xbSql : \textcolor{keyword}{public} xbSsv \{}
+\DoxyCodeLine{33 \textcolor{keyword}{public}:}
+\DoxyCodeLine{34 \textcolor{comment}{// xbSql();}}
+\DoxyCodeLine{35 xbSql( \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xbXBase}} *x );}
+\DoxyCodeLine{36 \string~xbSql();}
+\DoxyCodeLine{37 }
+\DoxyCodeLine{38 xbInt16 ExecuteNonQuery( \textcolor{keyword}{const} xbString \&sCmdLine );}
+\DoxyCodeLine{39 \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xbXBase}} *GetXbasePtr() \textcolor{keyword}{const};}
+\DoxyCodeLine{40 }
+\DoxyCodeLine{41 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{42 }
+\DoxyCodeLine{43 \textcolor{keyword}{private}:}
+\DoxyCodeLine{44 }
+\DoxyCodeLine{45 xbInt16 SqlCreateTable( \textcolor{keyword}{const} xbString \&sCmdLine );}
+\DoxyCodeLine{46 xbInt16 SqlCreateIndex( \textcolor{keyword}{const} xbString \&sCmdLine );}
+\DoxyCodeLine{47 }
+\DoxyCodeLine{48 xbInt16 SqlDropIndex( \textcolor{keyword}{const} xbString \&sCmdLine );}
+\DoxyCodeLine{49 xbInt16 SqlDropTable( \textcolor{keyword}{const} xbString \&sCmdLine );}
+\DoxyCodeLine{50 }
+\DoxyCodeLine{51 }
+\DoxyCodeLine{52 \textcolor{comment}{// xbInt16 SqlCreateView( const xbString \&sCmdLine );}}
+\DoxyCodeLine{53 \textcolor{comment}{// xbInt16 SqlDropView( const xbString \&sCmdLine );}}
+\DoxyCodeLine{54 \textcolor{comment}{// xbInt16 SqlUpdate( const xbString \&sCmdLine );}}
+\DoxyCodeLine{55 \textcolor{comment}{// xbInt16 SqlSelect( const xbString \&sCmdLine );}}
+\DoxyCodeLine{56 }
+\DoxyCodeLine{57 \textcolor{keywordtype}{void} SqlHelp() \textcolor{keyword}{const};}
+\DoxyCodeLine{58 xbInt16 SqlInsert( \textcolor{keyword}{const} xbString \&sCmLine );}
+\DoxyCodeLine{59 xbInt16 SqlSet( \textcolor{keyword}{const} xbString \&sCmdLine );}
+\DoxyCodeLine{60 xbInt16 SqlUse( \textcolor{keyword}{const} xbString \&sCmdLine );}
+\DoxyCodeLine{61 }
+\DoxyCodeLine{62 \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xbXBase}} *xbase;}
+\DoxyCodeLine{63 xbUda uda;}
+\DoxyCodeLine{64 }
+\DoxyCodeLine{65 \};}
+\DoxyCodeLine{66 }
+\DoxyCodeLine{67 \} \textcolor{comment}{/* namespace xb */}}
+\DoxyCodeLine{68 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* XB\_SQL\_SUPPORT */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{69 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_XBSQL\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbssv_8cpp.tex b/docs/doxygen/latex/xbssv_8cpp.tex
new file mode 100644
index 0000000..9f23133
--- /dev/null
+++ b/docs/doxygen/latex/xbssv_8cpp.tex
@@ -0,0 +1,13 @@
+\hypertarget{xbssv_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbssv.cpp File Reference}
+\label{xbssv_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbssv.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbssv.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+const xb\+Error\+Message \mbox{\hyperlink{namespacexb_a04be228a037d220dd5564f5ef618adcc}{xb\+::xb\+Error\+Messages}} \mbox{[}$\,$\mbox{]}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbssv_8h.tex b/docs/doxygen/latex/xbssv_8h.tex
new file mode 100644
index 0000000..cfffb14
--- /dev/null
+++ b/docs/doxygen/latex/xbssv_8h.tex
@@ -0,0 +1,17 @@
+\hypertarget{xbssv_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbssv.h File Reference}
+\label{xbssv_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbssv.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbssv.h}}
+\doxysubsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classxb_1_1xbSsv}{xb\+::xb\+Ssv}}
+\begin{DoxyCompactList}\small\item\em Class for handling shared system variables. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+class XBDLLEXPORT \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xb\+::xb\+XBase}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbssv_8h_source.tex b/docs/doxygen/latex/xbssv_8h_source.tex
new file mode 100644
index 0000000..f0a7055
--- /dev/null
+++ b/docs/doxygen/latex/xbssv_8h_source.tex
@@ -0,0 +1,170 @@
+\hypertarget{xbssv_8h_source}{}\doxysection{xbssv.\+h}
+\label{xbssv_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbssv.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbssv.h}}
+\mbox{\hyperlink{xbssv_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbssv.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBSSV\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_XBSSV\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{21 \textcolor{preprocessor}{\#pragma interface}}
+\DoxyCodeLine{22 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 }
+\DoxyCodeLine{25 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbXBase}{xbXBase}};}
+\DoxyCodeLine{28 }
+\DoxyCodeLine{30 \textcolor{keyword}{struct }XBDLLEXPORT xbErrorMessage\{}
+\DoxyCodeLine{31 xbInt16 iErrorNo;}
+\DoxyCodeLine{32 \textcolor{keyword}{const} \textcolor{keywordtype}{char} *sErrorText;}
+\DoxyCodeLine{33 \};}
+\DoxyCodeLine{35 }
+\DoxyCodeLine{36 }
+\DoxyCodeLine{38 }
+\DoxyCodeLine{49 \textcolor{comment}{// By design, DBase allows mutliple records in a table all having the same key, but only one entry in a unique index}}
+\DoxyCodeLine{50 \textcolor{comment}{// XB\_HALT\_ON\_DUP\_KEY tells the library to not allow appending records which generate duplicate keys in a unique index}}
+\DoxyCodeLine{51 \textcolor{comment}{//}}
+\DoxyCodeLine{52 \textcolor{preprocessor}{\#if defined (XB\_NDX\_SUPPORT) || defined (XB\_MDX\_SUPPORT)}}
+\DoxyCodeLine{53 \textcolor{preprocessor}{\#define XB\_HALT\_ON\_DUPKEY 0}}
+\DoxyCodeLine{54 \textcolor{preprocessor}{\#define XB\_EMULATE\_DBASE 1}}
+\DoxyCodeLine{55 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{56 }
+\DoxyCodeLine{57 }
+\DoxyCodeLine{58 }
+\DoxyCodeLine{59 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbSsv}{xbSsv}}\{}
+\DoxyCodeLine{60 \textcolor{keyword}{public}:}
+\DoxyCodeLine{61 \mbox{\hyperlink{classxb_1_1xbSsv}{xbSsv}}();}
+\DoxyCodeLine{62 \textcolor{keyword}{const} \textcolor{keyword}{static} \textcolor{keywordtype}{char} *ErrorCodeText[];}
+\DoxyCodeLine{63 }
+\DoxyCodeLine{64 \textcolor{keywordtype}{void} DisplayError ( xbInt16 ErrorCode ) \textcolor{keyword}{const};}
+\DoxyCodeLine{65 \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& GetDefaultDateFormat () \textcolor{keyword}{const};}
+\DoxyCodeLine{66 \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& GetDataDirectory () \textcolor{keyword}{const};}
+\DoxyCodeLine{67 xbInt16 GetEndianType () \textcolor{keyword}{const};}
+\DoxyCodeLine{68 }
+\DoxyCodeLine{69 \textcolor{keyword}{const} \textcolor{keywordtype}{char} *GetErrorMessage ( xbInt16 ErrorCode ) \textcolor{keyword}{const};}
+\DoxyCodeLine{70 \textcolor{keywordtype}{void} SetDataDirectory ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sDataDirectory );}
+\DoxyCodeLine{71 \textcolor{keywordtype}{void} SetDefaultDateFormat ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sDefaultDateFormat );}
+\DoxyCodeLine{72 }
+\DoxyCodeLine{73 }
+\DoxyCodeLine{74 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} BitSet ( \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} c, xbInt16 iBitNo ) \textcolor{keyword}{const};}
+\DoxyCodeLine{75 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{76 \textcolor{keywordtype}{void} BitDump ( \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} c ) \textcolor{keyword}{const};}
+\DoxyCodeLine{77 \textcolor{keywordtype}{void} BitDump ( \textcolor{keywordtype}{char} c ) \textcolor{keyword}{const};}
+\DoxyCodeLine{78 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{79 }
+\DoxyCodeLine{80 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetDefaultAutoCommit () \textcolor{keyword}{const};}
+\DoxyCodeLine{81 \textcolor{keywordtype}{void} SetDefaultAutoCommit ( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bDefaultAutoCommit );}
+\DoxyCodeLine{82 }
+\DoxyCodeLine{83 \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& GetDefaultLogDirectory () \textcolor{keyword}{const};}
+\DoxyCodeLine{84 \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& GetDefaultLogFileName () \textcolor{keyword}{const};}
+\DoxyCodeLine{85 \textcolor{keywordtype}{void} SetDefaultLogDirectory ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sDefaultLogDirectory );}
+\DoxyCodeLine{86 }
+\DoxyCodeLine{87 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetMultiUser () \textcolor{keyword}{const};}
+\DoxyCodeLine{88 \textcolor{keywordtype}{void} SetMultiUser ( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bMultiUser );}
+\DoxyCodeLine{89 }
+\DoxyCodeLine{90 \textcolor{preprocessor}{ \#if defined (XB\_NDX\_SUPPORT) || defined (XB\_MDX\_SUPPORT)}}
+\DoxyCodeLine{91 xbInt16 GetUniqueKeyOpt () \textcolor{keyword}{const};}
+\DoxyCodeLine{92 xbInt16 SetUniqueKeyOpt ( xbInt16 iUniqueKeyOpt );}
+\DoxyCodeLine{93 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{94 }
+\DoxyCodeLine{95 \textcolor{preprocessor}{ \#ifdef XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{96 xbInt16 GetDefaultLockRetries () \textcolor{keyword}{const};}
+\DoxyCodeLine{97 \textcolor{keywordtype}{void} SetDefaultLockRetries ( xbInt16 iRetryCount );}
+\DoxyCodeLine{98 xbInt32 GetDefaultLockWait () \textcolor{keyword}{const};}
+\DoxyCodeLine{99 \textcolor{keywordtype}{void} SetDefaultLockWait ( xbInt32 lRetryWait );}
+\DoxyCodeLine{100 xbInt16 GetDefaultLockFlavor () \textcolor{keyword}{const};}
+\DoxyCodeLine{101 \textcolor{keywordtype}{void} SetDefaultLockFlavor ( xbInt16 iLockFlavor );}
+\DoxyCodeLine{102 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetDefaultAutoLock () \textcolor{keyword}{const};}
+\DoxyCodeLine{103 \textcolor{keywordtype}{void} SetDefaultAutoLock ( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bAutoLock );}
+\DoxyCodeLine{104 \textcolor{keywordtype}{void} EnableDefaultAutoLock ();}
+\DoxyCodeLine{105 \textcolor{keywordtype}{void} DisableDefaultAutoLock ();}
+\DoxyCodeLine{106 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{107 }
+\DoxyCodeLine{108 \textcolor{preprocessor}{ \#ifdef XB\_MDX\_SUPPORT}}
+\DoxyCodeLine{109 xbInt16 GetCreateMdxBlockSize() \textcolor{keyword}{const};}
+\DoxyCodeLine{110 xbInt16 SetCreateMdxBlockSize( xbInt16 ulBlockSize );}
+\DoxyCodeLine{111 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{112 }
+\DoxyCodeLine{113 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{114 }
+\DoxyCodeLine{115 \textcolor{keywordtype}{void} SetEndianType ();}
+\DoxyCodeLine{116 }
+\DoxyCodeLine{117 \textcolor{keyword}{static} xbInt16 \mbox{\hyperlink{classxb_1_1xbSsv_a5849e813f5e8e1cd180f0366637adbf3}{iEndianType}}; \textcolor{comment}{// B=Big Endian L=Little Endian}}
+\DoxyCodeLine{118 \textcolor{keyword}{static} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \mbox{\hyperlink{classxb_1_1xbSsv_a9dec3164c3b264882df634915ecf21da}{sNullString}}; \textcolor{comment}{// Null String}}
+\DoxyCodeLine{119 }
+\DoxyCodeLine{120 }
+\DoxyCodeLine{121 \textcolor{keyword}{private}:}
+\DoxyCodeLine{122 }
+\DoxyCodeLine{123 \textcolor{keyword}{static} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} sDefaultDateFormat;}
+\DoxyCodeLine{124 \textcolor{keyword}{static} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} sDataDirectory; \textcolor{comment}{//Data file directory}}
+\DoxyCodeLine{125 }
+\DoxyCodeLine{126 \textcolor{preprocessor}{ \#ifdef XB\_LOGGING\_SUPPORT}}
+\DoxyCodeLine{127 \textcolor{keyword}{static} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} sDefaultLogDirectory; \textcolor{comment}{//Default location to store log files}}
+\DoxyCodeLine{128 \textcolor{keyword}{static} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} sDefaultLogFileName; \textcolor{comment}{//Default LogFileName}}
+\DoxyCodeLine{129 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{130 }
+\DoxyCodeLine{131 \textcolor{keyword}{static} xbInt16 iDefaultFileVersion; \textcolor{comment}{// 3 = DBase 3}}
+\DoxyCodeLine{132 \textcolor{comment}{// 4 = DBase 4}}
+\DoxyCodeLine{133 \textcolor{comment}{// default version used in CreateTable command}}
+\DoxyCodeLine{134 \textcolor{comment}{// can be over ridden at the Xbase level, or table level}}
+\DoxyCodeLine{135 \textcolor{comment}{// Different versions can be open simultaneously}}
+\DoxyCodeLine{136 }
+\DoxyCodeLine{137 \textcolor{keyword}{static} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bDefaultAutoCommit; \textcolor{comment}{// Default dbf auto commit switch}}
+\DoxyCodeLine{138 }
+\DoxyCodeLine{139 \textcolor{keyword}{static} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bMultiUser; \textcolor{comment}{// True if multi user mode is turned on}}
+\DoxyCodeLine{140 \textcolor{comment}{// Turn this off for better performance in single user mode}}
+\DoxyCodeLine{141 \textcolor{comment}{// This needs to be turned on or off before any data tables are opened}}
+\DoxyCodeLine{142 \textcolor{comment}{// turning this on after tables are opened, can result in out of date}}
+\DoxyCodeLine{143 \textcolor{comment}{// file buffers if multiple users are sharing the files}}
+\DoxyCodeLine{144 }
+\DoxyCodeLine{145 \textcolor{preprocessor}{\#ifdef XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{146 \textcolor{keyword}{static} xbInt32 lDefaultLockWait; \textcolor{comment}{// Number of milliseconds between lock retries}}
+\DoxyCodeLine{147 \textcolor{keyword}{static} xbInt16 iDefaultLockRetries; \textcolor{comment}{// Number of times to retry a lock before conceding}}
+\DoxyCodeLine{148 \textcolor{keyword}{static} xbInt16 bDefaultAutoLock; \textcolor{comment}{// Autolocking enabled?}}
+\DoxyCodeLine{149 \textcolor{keyword}{static} xbInt16 iDefaultLockFlavor; \textcolor{comment}{// 1 = DBase}}
+\DoxyCodeLine{150 \textcolor{comment}{// 2 = Clipper -\/ not developed yet}}
+\DoxyCodeLine{151 \textcolor{comment}{// 3 = FoxPro -\/ not developed yet}}
+\DoxyCodeLine{152 \textcolor{comment}{// 9 = Xbase64 -\/ not developed yet}}
+\DoxyCodeLine{153 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{154 }
+\DoxyCodeLine{155 }
+\DoxyCodeLine{156 }
+\DoxyCodeLine{157 \textcolor{preprocessor}{\#if defined (XB\_NDX\_SUPPORT) || defined (XB\_MDX\_SUPPORT)}}
+\DoxyCodeLine{158 }
+\DoxyCodeLine{159 \textcolor{keyword}{static} xbInt16 iUniqueKeyOpt;}
+\DoxyCodeLine{160 }
+\DoxyCodeLine{161 \textcolor{comment}{// is one of:}}
+\DoxyCodeLine{162 \textcolor{comment}{// XB\_HALT\_ON\_DUPKEY}}
+\DoxyCodeLine{163 \textcolor{comment}{// XB\_EMULATE\_DBASE}}
+\DoxyCodeLine{164 }
+\DoxyCodeLine{165 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{166 }
+\DoxyCodeLine{167 }
+\DoxyCodeLine{168 \textcolor{preprocessor}{\#ifdef XB\_MDX\_SUPPORT}}
+\DoxyCodeLine{169 \textcolor{keyword}{static} xbInt16 iCreateMdxBlockSize; \textcolor{comment}{// System level Mdx Block Size}}
+\DoxyCodeLine{170 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_MDX\_SUPPORT}}
+\DoxyCodeLine{171 }
+\DoxyCodeLine{172 }
+\DoxyCodeLine{173 }
+\DoxyCodeLine{174 \};}
+\DoxyCodeLine{175 }
+\DoxyCodeLine{176 \} \textcolor{comment}{/* namespace xb */}}
+\DoxyCodeLine{177 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_XBSSV\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbstring_8cpp.tex b/docs/doxygen/latex/xbstring_8cpp.tex
new file mode 100644
index 0000000..852e57f
--- /dev/null
+++ b/docs/doxygen/latex/xbstring_8cpp.tex
@@ -0,0 +1,13 @@
+\hypertarget{xbstring_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbstring.cpp File Reference}
+\label{xbstring_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbstring.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbstring.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Functions}
+\begin{DoxyCompactItemize}
+\item
+std\+::ostream \& \mbox{\hyperlink{namespacexb_ad27f348219e895c44f74addba8e1889a}{xb\+::operator$<$$<$}} (std\+::ostream \&os, const xb\+String \&s)
+\begin{DoxyCompactList}\small\item\em Stream insertion operator \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<}. \end{DoxyCompactList}\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbstring_8h.tex b/docs/doxygen/latex/xbstring_8h.tex
new file mode 100644
index 0000000..6e8f52b
--- /dev/null
+++ b/docs/doxygen/latex/xbstring_8h.tex
@@ -0,0 +1,14 @@
+\hypertarget{xbstring_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbstring.h File Reference}
+\label{xbstring_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbstring.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbstring.h}}
+{\ttfamily \#include $<$stdlib.\+h$>$}\newline
+{\ttfamily \#include $<$iostream$>$}\newline
+\doxysubsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classxb_1_1xbString}{xb\+::xb\+String}}
+\begin{DoxyCompactList}\small\item\em Class for handling string data. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbstring_8h_source.tex b/docs/doxygen/latex/xbstring_8h_source.tex
new file mode 100644
index 0000000..b87d4d6
--- /dev/null
+++ b/docs/doxygen/latex/xbstring_8h_source.tex
@@ -0,0 +1,169 @@
+\hypertarget{xbstring_8h_source}{}\doxysection{xbstring.\+h}
+\label{xbstring_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbstring.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbstring.h}}
+\mbox{\hyperlink{xbstring_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbstring.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 \textcolor{preprocessor}{\#ifndef \_\_XBSTRING\_H\_\_}}
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#define \_\_XBSTRING\_H\_\_}}
+\DoxyCodeLine{18 }
+\DoxyCodeLine{19 \textcolor{preprocessor}{\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#pragma interface}}
+\DoxyCodeLine{21 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{22 }
+\DoxyCodeLine{23 \textcolor{preprocessor}{\#include <stdlib.h>}}
+\DoxyCodeLine{24 \textcolor{preprocessor}{\#include <iostream>}}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{27 }
+\DoxyCodeLine{28 }
+\DoxyCodeLine{30 }
+\DoxyCodeLine{50 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \{}
+\DoxyCodeLine{51 }
+\DoxyCodeLine{52 \textcolor{keyword}{public}:}
+\DoxyCodeLine{53 \textcolor{comment}{//Various constructors}}
+\DoxyCodeLine{54 \mbox{\hyperlink{classxb_1_1xbString}{xbString}}(xbUInt32 size);}
+\DoxyCodeLine{55 \mbox{\hyperlink{classxb_1_1xbString}{xbString}}(\textcolor{keywordtype}{char} c);}
+\DoxyCodeLine{56 \mbox{\hyperlink{classxb_1_1xbString}{xbString}}(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *s, xbUInt32 lMaxLen);}
+\DoxyCodeLine{57 \mbox{\hyperlink{classxb_1_1xbString}{xbString}}(\textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s);}
+\DoxyCodeLine{58 \mbox{\hyperlink{classxb_1_1xbString}{xbString}}(\textcolor{keyword}{const} \textcolor{keywordtype}{char} * = \textcolor{stringliteral}{"{}"{}});}
+\DoxyCodeLine{59 \mbox{\hyperlink{classxb_1_1xbString}{xbString}}( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} d );}
+\DoxyCodeLine{60 \mbox{\hyperlink{classxb_1_1xbString}{\string~xbString}}();}
+\DoxyCodeLine{61 }
+\DoxyCodeLine{62 \textcolor{comment}{//operators}}
+\DoxyCodeLine{63 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&operator= (\textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s);}
+\DoxyCodeLine{64 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&operator= (\textcolor{keyword}{const} \textcolor{keywordtype}{char} *s);}
+\DoxyCodeLine{65 \textcolor{keyword}{operator} \textcolor{keyword}{const} \textcolor{keywordtype}{char} *() \textcolor{keyword}{const};}
+\DoxyCodeLine{66 \textcolor{keywordtype}{char} \&operator[](xbUInt32 n) \textcolor{keyword}{const};}
+\DoxyCodeLine{67 \textcolor{keywordtype}{char} \&operator[](xbInt32 n) \textcolor{keyword}{const};}
+\DoxyCodeLine{68 }
+\DoxyCodeLine{69 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&operator+=(\textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s);}
+\DoxyCodeLine{70 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&operator+=(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *s);}
+\DoxyCodeLine{71 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&operator+=(\textcolor{keywordtype}{char} c);}
+\DoxyCodeLine{72 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&operator-\/=(\textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s);}
+\DoxyCodeLine{73 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&operator-\/=(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *s);}
+\DoxyCodeLine{74 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&operator-\/=(\textcolor{keywordtype}{char} c);}
+\DoxyCodeLine{75 }
+\DoxyCodeLine{76 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator == ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{77 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator == ( \textcolor{keyword}{const} \textcolor{keywordtype}{char} * ) \textcolor{keyword}{const};}
+\DoxyCodeLine{78 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator != ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{79 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator != ( \textcolor{keyword}{const} \textcolor{keywordtype}{char} * ) \textcolor{keyword}{const};}
+\DoxyCodeLine{80 }
+\DoxyCodeLine{81 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator < ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{82 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator > ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{83 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator <= ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{84 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} operator >= ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& ) \textcolor{keyword}{const};}
+\DoxyCodeLine{85 }
+\DoxyCodeLine{86 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} operator-\/( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s );}
+\DoxyCodeLine{87 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} operator+( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *s );}
+\DoxyCodeLine{88 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} operator+( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s );}
+\DoxyCodeLine{89 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} operator+( \textcolor{keyword}{const} \textcolor{keywordtype}{char} c );}
+\DoxyCodeLine{90 }
+\DoxyCodeLine{91 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&AddBackSlash( \textcolor{keywordtype}{char} c );}
+\DoxyCodeLine{92 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Append(\textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s);}
+\DoxyCodeLine{93 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Append(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *s);}
+\DoxyCodeLine{94 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Append(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *s, xbUInt32 iByteCount );}
+\DoxyCodeLine{95 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Append(\textcolor{keywordtype}{char} c);}
+\DoxyCodeLine{96 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Assign(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *srcStr, xbUInt32 lStartPos, xbUInt32 lCopyLen );}
+\DoxyCodeLine{97 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Assign(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *srcStr, xbUInt32 lStartPos );}
+\DoxyCodeLine{98 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Assign(\textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s, xbUInt32 pos, xbUInt32 n );}
+\DoxyCodeLine{99 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Assign(\textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s, xbUInt32 n );}
+\DoxyCodeLine{100 }
+\DoxyCodeLine{101 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} Copy() \textcolor{keyword}{const};}
+\DoxyCodeLine{102 xbUInt32 CountChar( \textcolor{keywordtype}{char} c ) \textcolor{keyword}{const};}
+\DoxyCodeLine{103 xbUInt32 CountChar( \textcolor{keywordtype}{char} c, xbInt16 iOpt ) \textcolor{keyword}{const};}
+\DoxyCodeLine{104 xbInt16 CvtHexChar( \textcolor{keywordtype}{char} \&cOut );}
+\DoxyCodeLine{105 xbInt16 CvtHexString( \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{106 xbInt16 CvtULongLong( xbUInt64 \&ullOut );}
+\DoxyCodeLine{107 xbInt16 CvtLongLong( xbInt64 \&llOut );}
+\DoxyCodeLine{108 }
+\DoxyCodeLine{109 \textcolor{preprocessor}{ \#ifdef XB\_DEBUG\_SUPPORT}}
+\DoxyCodeLine{110 \textcolor{keywordtype}{void} Dump( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *title ) \textcolor{keyword}{const};}
+\DoxyCodeLine{111 \textcolor{keywordtype}{void} Dump( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *title, xbInt16 iOption ) \textcolor{keyword}{const};}
+\DoxyCodeLine{112 \textcolor{keywordtype}{void} DumpHex( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *title ) \textcolor{keyword}{const};}
+\DoxyCodeLine{113 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{114 }
+\DoxyCodeLine{115 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&ExtractElement(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *src, \textcolor{keywordtype}{char} delim, xbUInt32 iCnt, xbInt16 iOpt = 0 );}
+\DoxyCodeLine{116 \textcolor{keywordtype}{char} GetCharacter( xbUInt32 lPos ) \textcolor{keyword}{const};}
+\DoxyCodeLine{117 xbUInt32 GetLastPos(\textcolor{keywordtype}{char} c) \textcolor{keyword}{const};}
+\DoxyCodeLine{118 xbUInt32 GetLastPos(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *s) \textcolor{keyword}{const};}
+\DoxyCodeLine{119 \textcolor{keywordtype}{char} GetPathSeparator() \textcolor{keyword}{const};}
+\DoxyCodeLine{120 xbUInt32 GetSize() \textcolor{keyword}{const};}
+\DoxyCodeLine{121 }
+\DoxyCodeLine{122 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} HasAlphaChars() \textcolor{keyword}{const};}
+\DoxyCodeLine{123 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsEmpty() \textcolor{keyword}{const};}
+\DoxyCodeLine{124 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} IsNull() \textcolor{keyword}{const};}
+\DoxyCodeLine{125 }
+\DoxyCodeLine{126 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Left( xbUInt32 ulLen );}
+\DoxyCodeLine{127 xbUInt32 Len() \textcolor{keyword}{const}; \textcolor{comment}{// returns the length of the string}}
+\DoxyCodeLine{128 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Ltrim();}
+\DoxyCodeLine{129 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Ltrunc( xbUInt32 ulCnt );}
+\DoxyCodeLine{130 }
+\DoxyCodeLine{131 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Mid(xbUInt32 ulPos, xbUInt32 lLen );}
+\DoxyCodeLine{132 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&PadLeft( \textcolor{keywordtype}{char} c, xbUInt32 ulLen );}
+\DoxyCodeLine{133 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&PadRight( \textcolor{keywordtype}{char} c, xbUInt32 ulLen );}
+\DoxyCodeLine{134 xbUInt32 Pos(\textcolor{keywordtype}{char} c) \textcolor{keyword}{const};}
+\DoxyCodeLine{135 xbUInt32 Pos(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *s) \textcolor{keyword}{const};}
+\DoxyCodeLine{136 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&PutAt(xbUInt32 ulPos, \textcolor{keywordtype}{char} c);}
+\DoxyCodeLine{137 }
+\DoxyCodeLine{138 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Remove( xbUInt32 ulPos, xbUInt32 ulN );}
+\DoxyCodeLine{139 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Resize( xbUInt32 lSize );}
+\DoxyCodeLine{140 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Rtrim();}
+\DoxyCodeLine{141 }
+\DoxyCodeLine{142 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Set( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *s );}
+\DoxyCodeLine{143 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Set( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s );}
+\DoxyCodeLine{144 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Set( \textcolor{keyword}{const} \textcolor{keywordtype}{char} *s, xbUInt32 ulSize );}
+\DoxyCodeLine{145 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&SetNum( xbInt32 lNum );}
+\DoxyCodeLine{146 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Sprintf(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *format, ...);}
+\DoxyCodeLine{147 }
+\DoxyCodeLine{148 \textcolor{keyword}{const} \textcolor{keywordtype}{char} *Str() \textcolor{keyword}{const};}
+\DoxyCodeLine{149 \textcolor{keywordtype}{char} *strncpy( \textcolor{keywordtype}{char} * cDest, xbUInt32 n ) \textcolor{keyword}{const};}
+\DoxyCodeLine{150 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&SwapChars( \textcolor{keywordtype}{char} from, \textcolor{keywordtype}{char} to );}
+\DoxyCodeLine{151 }
+\DoxyCodeLine{152 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&ToLowerCase();}
+\DoxyCodeLine{153 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&ToUpperCase();}
+\DoxyCodeLine{154 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&Trim();}
+\DoxyCodeLine{155 }
+\DoxyCodeLine{156 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} ValidLogicalValue() \textcolor{keyword}{const};}
+\DoxyCodeLine{157 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} ValidNumericValue() \textcolor{keyword}{const};}
+\DoxyCodeLine{158 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&ZapChar( \textcolor{keywordtype}{char} c );}
+\DoxyCodeLine{159 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&ZapLeadingChar( \textcolor{keywordtype}{char} c );}
+\DoxyCodeLine{160 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&ZapTrailingChar( \textcolor{keywordtype}{char} c );}
+\DoxyCodeLine{161 }
+\DoxyCodeLine{162 \textcolor{keyword}{friend} std::ostream\& \mbox{\hyperlink{namespacexb_ad27f348219e895c44f74addba8e1889a}{operator<< }}( std::ostream\& os, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}}\& s );}
+\DoxyCodeLine{163 }
+\DoxyCodeLine{164 \textcolor{keyword}{private}:}
+\DoxyCodeLine{165 }
+\DoxyCodeLine{166 \textcolor{keyword}{static} \textcolor{keyword}{const} \textcolor{keywordtype}{char} * NullString;}
+\DoxyCodeLine{167 \textcolor{keyword}{static} \textcolor{keywordtype}{char} cJunkBuf;}
+\DoxyCodeLine{168 }
+\DoxyCodeLine{169 \textcolor{keywordtype}{char} *data; \textcolor{comment}{// pointer to actual string data}}
+\DoxyCodeLine{170 xbUInt32 size; \textcolor{comment}{// size of string plus null terminating byte}}
+\DoxyCodeLine{171 }
+\DoxyCodeLine{172 \textcolor{keywordtype}{void} ctor(\textcolor{keyword}{const} \textcolor{keywordtype}{char} *s);}
+\DoxyCodeLine{173 \textcolor{comment}{// xbUInt32 CalcSprintfBufSize(const char *format, ...);}}
+\DoxyCodeLine{174 }
+\DoxyCodeLine{175 \textcolor{comment}{// char * xb\_realloc( char *pIn, xbUInt32 iLen );}}
+\DoxyCodeLine{176 }
+\DoxyCodeLine{177 \textcolor{comment}{// next routine could result in buffer over runs if used with improperly sized buffers}}
+\DoxyCodeLine{178 \textcolor{keywordtype}{char} * xb\_strcpy ( \textcolor{keywordtype}{char} *target, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *source);}
+\DoxyCodeLine{179 }
+\DoxyCodeLine{180 \};}
+\DoxyCodeLine{181 }
+\DoxyCodeLine{182 \} \textcolor{comment}{/* namespace */}}
+\DoxyCodeLine{183 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XBSTRING\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbtag_8cpp.tex b/docs/doxygen/latex/xbtag_8cpp.tex
new file mode 100644
index 0000000..9b867a3
--- /dev/null
+++ b/docs/doxygen/latex/xbtag_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbtag_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbtag.cpp File Reference}
+\label{xbtag_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbtag.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbtag.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbtag_8h.tex b/docs/doxygen/latex/xbtag_8h.tex
new file mode 100644
index 0000000..4ef8990
--- /dev/null
+++ b/docs/doxygen/latex/xbtag_8h.tex
@@ -0,0 +1,7 @@
+\hypertarget{xbtag_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbtag.h File Reference}
+\label{xbtag_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtag.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtag.h}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbtag_8h_source.tex b/docs/doxygen/latex/xbtag_8h_source.tex
new file mode 100644
index 0000000..605c6f3
--- /dev/null
+++ b/docs/doxygen/latex/xbtag_8h_source.tex
@@ -0,0 +1,69 @@
+\hypertarget{xbtag_8h_source}{}\doxysection{xbtag.\+h}
+\label{xbtag_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtag.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtag.h}}
+\mbox{\hyperlink{xbtag_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbtag.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBTAG\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_XBTAG\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 \textcolor{comment}{//\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{21 \textcolor{comment}{//\#pragma interface}}
+\DoxyCodeLine{22 \textcolor{comment}{//\#endif}}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{preprocessor}{\#ifdef XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{28 }
+\DoxyCodeLine{29 \textcolor{keyword}{class }XBDLLEXPORT xbIx;}
+\DoxyCodeLine{30 }
+\DoxyCodeLine{31 }
+\DoxyCodeLine{32 }
+\DoxyCodeLine{34 }
+\DoxyCodeLine{45 \textcolor{keyword}{class }XBDLLEXPORT xbTag \{}
+\DoxyCodeLine{46 }
+\DoxyCodeLine{47 \textcolor{keyword}{public}:}
+\DoxyCodeLine{48 xbTag( xbIx *pIx, \textcolor{keywordtype}{void} *vpTag, xbString \&sType, xbString \&sTagName, xbString \&sExpression, xbString \&sFilter, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bUnique, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bSort );}
+\DoxyCodeLine{49 }
+\DoxyCodeLine{50 xbIx *GetIx() \textcolor{keyword}{const};}
+\DoxyCodeLine{51 \textcolor{keywordtype}{void} *GetVpTag() \textcolor{keyword}{const};}
+\DoxyCodeLine{52 \textcolor{keyword}{const} xbString \&GetType() \textcolor{keyword}{const};}
+\DoxyCodeLine{53 \textcolor{keyword}{const} xbString \&GetTagName() \textcolor{keyword}{const};}
+\DoxyCodeLine{54 \textcolor{keyword}{const} xbString \&GetExpression() \textcolor{keyword}{const};}
+\DoxyCodeLine{55 \textcolor{keyword}{const} xbString \&GetFilter() \textcolor{keyword}{const};}
+\DoxyCodeLine{56 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetUnique() \textcolor{keyword}{const};}
+\DoxyCodeLine{57 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetSort() \textcolor{keyword}{const};}
+\DoxyCodeLine{58 }
+\DoxyCodeLine{59 \textcolor{keyword}{private}:}
+\DoxyCodeLine{60 xbIx *pIx;}
+\DoxyCodeLine{61 \textcolor{keywordtype}{void} *vpTag;}
+\DoxyCodeLine{62 xbString sType;}
+\DoxyCodeLine{63 xbString sTagName;}
+\DoxyCodeLine{64 xbString sExpression;}
+\DoxyCodeLine{65 xbString sFilter;}
+\DoxyCodeLine{66 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bUnique;}
+\DoxyCodeLine{67 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bSort; \textcolor{comment}{// 0 = Ascending, 1 = Descending}}
+\DoxyCodeLine{68 \};}
+\DoxyCodeLine{69 }
+\DoxyCodeLine{70 \textcolor{preprocessor}{\#endif }\textcolor{comment}{// XB\_INDEX\_SUPPORT}}
+\DoxyCodeLine{71 }
+\DoxyCodeLine{72 }
+\DoxyCodeLine{73 \} \textcolor{comment}{/* namespace xb */}}
+\DoxyCodeLine{74 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_TAG\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbtblmgr_8cpp.tex b/docs/doxygen/latex/xbtblmgr_8cpp.tex
new file mode 100644
index 0000000..8c83985
--- /dev/null
+++ b/docs/doxygen/latex/xbtblmgr_8cpp.tex
@@ -0,0 +1,8 @@
+\hypertarget{xbtblmgr_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbtblmgr.cpp File Reference}
+\label{xbtblmgr_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbtblmgr.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbtblmgr.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbtblmgr_8h.tex b/docs/doxygen/latex/xbtblmgr_8h.tex
new file mode 100644
index 0000000..494f1f9
--- /dev/null
+++ b/docs/doxygen/latex/xbtblmgr_8h.tex
@@ -0,0 +1,19 @@
+\hypertarget{xbtblmgr_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbtblmgr.h File Reference}
+\label{xbtblmgr_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtblmgr.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtblmgr.h}}
+\doxysubsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+struct \mbox{\hyperlink{structxb_1_1xbTblList}{xb\+::xb\+Tbl\+List}}
+\item
+class \mbox{\hyperlink{classxb_1_1xbTblMgr}{xb\+::xb\+Tbl\+Mgr}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+class XBDLLEXPORT \mbox{\hyperlink{namespacexb_ab2eae4b4732466698a7fdd89d77ba53b}{xb\+::xb\+Dbf}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbtblmgr_8h_source.tex b/docs/doxygen/latex/xbtblmgr_8h_source.tex
new file mode 100644
index 0000000..4e43990
--- /dev/null
+++ b/docs/doxygen/latex/xbtblmgr_8h_source.tex
@@ -0,0 +1,67 @@
+\hypertarget{xbtblmgr_8h_source}{}\doxysection{xbtblmgr.\+h}
+\label{xbtblmgr_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtblmgr.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtblmgr.h}}
+\mbox{\hyperlink{xbtblmgr_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbtblmgr.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{This class manages a list of open tables, open indices are connected to the open tables}}
+\DoxyCodeLine{15 \textcolor{comment}{}}
+\DoxyCodeLine{16 \textcolor{comment}{*/}}
+\DoxyCodeLine{17 }
+\DoxyCodeLine{18 }
+\DoxyCodeLine{19 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBMGR\_H\_\_}}
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#define \_\_XB\_XBMGR\_H\_\_}}
+\DoxyCodeLine{21 }
+\DoxyCodeLine{22 \textcolor{preprocessor}{\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{23 \textcolor{preprocessor}{\#pragma interface}}
+\DoxyCodeLine{24 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{27 }
+\DoxyCodeLine{28 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}};}
+\DoxyCodeLine{29 }
+\DoxyCodeLine{30 \textcolor{comment}{/* this structure is a linked list of open tables */}}
+\DoxyCodeLine{31 \textcolor{keyword}{struct }XBDLLEXPORT \mbox{\hyperlink{structxb_1_1xbTblList}{xbTblList}}\{}
+\DoxyCodeLine{32 \mbox{\hyperlink{structxb_1_1xbTblList}{xbTblList}} *\mbox{\hyperlink{structxb_1_1xbTblList_a3fd169fcf0fd4df927544e5342db583c}{pNext}};}
+\DoxyCodeLine{33 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} *\mbox{\hyperlink{structxb_1_1xbTblList_a02c3b0c47fd104ef9758b375ecdcfd0f}{psTblName}}; \textcolor{comment}{/* Name of table -\/ same table can be opened multiple times, but must have unique alias */}}
+\DoxyCodeLine{34 \mbox{\hyperlink{classxb_1_1xbString}{xbString}} *\mbox{\hyperlink{structxb_1_1xbTblList_ac87742c8a6b1cf2e7e35218e96966a05}{psTblAlias}}; \textcolor{comment}{/* TblAliasName must be unique */}}
+\DoxyCodeLine{35 \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} *\mbox{\hyperlink{structxb_1_1xbTblList_a387d3f6bbf291a1fb96d276ed9bb96b6}{pDbf}};}
+\DoxyCodeLine{36 \};}
+\DoxyCodeLine{37 }
+\DoxyCodeLine{38 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbTblMgr}{xbTblMgr}} : \textcolor{keyword}{public} \mbox{\hyperlink{classxb_1_1xbSsv}{xbSsv}} \{}
+\DoxyCodeLine{39 \textcolor{keyword}{public}:}
+\DoxyCodeLine{40 \mbox{\hyperlink{classxb_1_1xbTblMgr}{xbTblMgr}}();}
+\DoxyCodeLine{41 \mbox{\hyperlink{classxb_1_1xbTblMgr}{\string~xbTblMgr}}();}
+\DoxyCodeLine{42 xbInt16 AddTblToTblList ( \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} *d, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTblName );}
+\DoxyCodeLine{43 xbInt16 AddTblToTblList ( \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} *d, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTblName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTblAlias );}
+\DoxyCodeLine{44 xbInt16 DisplayTableList () \textcolor{keyword}{const};}
+\DoxyCodeLine{45 \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} * GetDbfPtr ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTblAlias ) \textcolor{keyword}{const};}
+\DoxyCodeLine{46 \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} * GetDbfPtr ( xbInt16 sItemNo ) \textcolor{keyword}{const};}
+\DoxyCodeLine{47 xbInt16 GetOpenTableCount () \textcolor{keyword}{const};}
+\DoxyCodeLine{48 xbInt16 RemoveTblFromTblList ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTblAlias );}
+\DoxyCodeLine{49 xbInt16 RemoveTblFromTblList ( \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} *d );}
+\DoxyCodeLine{50 }
+\DoxyCodeLine{51 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{52 }
+\DoxyCodeLine{53 \textcolor{keyword}{private}:}
+\DoxyCodeLine{54 \mbox{\hyperlink{structxb_1_1xbTblList}{xbTblList}} * TblList; \textcolor{comment}{// List of open database tables}}
+\DoxyCodeLine{55 xbInt16 iOpenTableCount; \textcolor{comment}{// Number of open tables}}
+\DoxyCodeLine{56 }
+\DoxyCodeLine{57 \};}
+\DoxyCodeLine{58 }
+\DoxyCodeLine{59 \} \textcolor{comment}{/* namespace xb */}}
+\DoxyCodeLine{60 }
+\DoxyCodeLine{61 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_XBMGR\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbtypes_8h.tex b/docs/doxygen/latex/xbtypes_8h.tex
new file mode 100644
index 0000000..fb4d143
--- /dev/null
+++ b/docs/doxygen/latex/xbtypes_8h.tex
@@ -0,0 +1,48 @@
+\hypertarget{xbtypes_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbtypes.h File Reference}
+\label{xbtypes_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtypes.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtypes.h}}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Macros}
+\begin{DoxyCompactItemize}
+\item
+\#define \mbox{\hyperlink{xbtypes_8h_ab0ae00665298fe7f5292691cb98ec2d9}{xb\+True}}~1
+\item
+\#define \mbox{\hyperlink{xbtypes_8h_adc4b6ca5ad299f63675136d9e03938cc}{xb\+False}}~0
+\item
+\#define \mbox{\hyperlink{xbtypes_8h_a2c65f692ac861990861575e18f72f6eb}{xb\+File\+No}}~fileno
+\end{DoxyCompactItemize}
+\doxysubsection*{Typedefs}
+\begin{DoxyCompactItemize}
+\item
+typedef float \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xb\+::xb\+Float}}
+\item
+typedef double \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xb\+::xb\+Double}}
+\item
+typedef short int \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xb\+::xb\+Bool}}
+\item
+typedef xb\+UInt64 \mbox{\hyperlink{namespacexb_ac963d9fde6debb416303cfbed35fb793}{xb\+::xb\+OffT}}
+\end{DoxyCompactItemize}
+
+
+\doxysubsection{Macro Definition Documentation}
+\mbox{\Hypertarget{xbtypes_8h_adc4b6ca5ad299f63675136d9e03938cc}\label{xbtypes_8h_adc4b6ca5ad299f63675136d9e03938cc}}
+\index{xbtypes.h@{xbtypes.h}!xbFalse@{xbFalse}}
+\index{xbFalse@{xbFalse}!xbtypes.h@{xbtypes.h}}
+\doxysubsubsection{\texorpdfstring{xbFalse}{xbFalse}}
+{\footnotesize\ttfamily \#define xb\+False~0}
+
+\mbox{\Hypertarget{xbtypes_8h_a2c65f692ac861990861575e18f72f6eb}\label{xbtypes_8h_a2c65f692ac861990861575e18f72f6eb}}
+\index{xbtypes.h@{xbtypes.h}!xbFileNo@{xbFileNo}}
+\index{xbFileNo@{xbFileNo}!xbtypes.h@{xbtypes.h}}
+\doxysubsubsection{\texorpdfstring{xbFileNo}{xbFileNo}}
+{\footnotesize\ttfamily \#define xb\+File\+No~fileno}
+
+\mbox{\Hypertarget{xbtypes_8h_ab0ae00665298fe7f5292691cb98ec2d9}\label{xbtypes_8h_ab0ae00665298fe7f5292691cb98ec2d9}}
+\index{xbtypes.h@{xbtypes.h}!xbTrue@{xbTrue}}
+\index{xbTrue@{xbTrue}!xbtypes.h@{xbtypes.h}}
+\doxysubsubsection{\texorpdfstring{xbTrue}{xbTrue}}
+{\footnotesize\ttfamily \#define xb\+True~1}
+
diff --git a/docs/doxygen/latex/xbtypes_8h_source.tex b/docs/doxygen/latex/xbtypes_8h_source.tex
new file mode 100644
index 0000000..61b6d34
--- /dev/null
+++ b/docs/doxygen/latex/xbtypes_8h_source.tex
@@ -0,0 +1,61 @@
+\hypertarget{xbtypes_8h_source}{}\doxysection{xbtypes.\+h}
+\label{xbtypes_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtypes.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbtypes.h}}
+\mbox{\hyperlink{xbtypes_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbtypes.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 \textcolor{preprocessor}{\#ifndef \_\_XB\_XTYPES\_H\_\_}}
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#define \_\_XB\_XTYPES\_H\_\_}}
+\DoxyCodeLine{18 }
+\DoxyCodeLine{19 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{20 }
+\DoxyCodeLine{21 }
+\DoxyCodeLine{22 \textcolor{keyword}{typedef} \textcolor{keywordtype}{float} \mbox{\hyperlink{namespacexb_a83aa6a550398db55973aa9fb4257e66e}{xbFloat}};}
+\DoxyCodeLine{23 \textcolor{keyword}{typedef} \textcolor{keywordtype}{double} \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}};}
+\DoxyCodeLine{24 \textcolor{keyword}{typedef} \textcolor{keywordtype}{short} \textcolor{keywordtype}{int} \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}};}
+\DoxyCodeLine{25 \textcolor{keyword}{typedef} xbUInt64 \mbox{\hyperlink{namespacexb_ac963d9fde6debb416303cfbed35fb793}{xbOffT}};}
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 }
+\DoxyCodeLine{28 \textcolor{preprocessor}{\#define xbTrue 1}}
+\DoxyCodeLine{29 \textcolor{preprocessor}{\#define xbFalse 0}}
+\DoxyCodeLine{30 }
+\DoxyCodeLine{31 }
+\DoxyCodeLine{32 \textcolor{preprocessor}{\#ifdef HAVE\_\_FILENO\_F}}
+\DoxyCodeLine{33 \textcolor{preprocessor}{ \#define xbFileNo \_fileno}}
+\DoxyCodeLine{34 \textcolor{preprocessor}{\#else}}
+\DoxyCodeLine{35 \textcolor{preprocessor}{ \#define xbFileNo fileno}}
+\DoxyCodeLine{36 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{37 }
+\DoxyCodeLine{38 \textcolor{preprocessor}{\#ifdef XB\_LOCKING\_SUPPORT}}
+\DoxyCodeLine{39 \textcolor{preprocessor}{ \#if defined( HAVE\_LONG\_LONG )}}
+\DoxyCodeLine{40 \textcolor{preprocessor}{ \#define LK4026531839 4026531839LL}}
+\DoxyCodeLine{41 \textcolor{preprocessor}{ \#define LK4026531838 4026531838LL}}
+\DoxyCodeLine{42 \textcolor{preprocessor}{ \#define LK3026531838 3026531838LL}}
+\DoxyCodeLine{43 \textcolor{preprocessor}{ \#define LK1000000000 1000000000LL}}
+\DoxyCodeLine{44 \textcolor{preprocessor}{ \#else}}
+\DoxyCodeLine{45 \textcolor{preprocessor}{ \#define LK4026531839 4026531839L}}
+\DoxyCodeLine{46 \textcolor{preprocessor}{ \#define LK4026531838 4026531838L}}
+\DoxyCodeLine{47 \textcolor{preprocessor}{ \#define LK3026531838 3026531838L}}
+\DoxyCodeLine{48 \textcolor{preprocessor}{ \#define LK1000000000 1000000000L}}
+\DoxyCodeLine{49 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{50 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{51 }
+\DoxyCodeLine{52 }
+\DoxyCodeLine{53 }
+\DoxyCodeLine{54 \} \textcolor{comment}{/* namespace */}}
+\DoxyCodeLine{55 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_XTYPES\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbuda_8cpp.tex b/docs/doxygen/latex/xbuda_8cpp.tex
new file mode 100644
index 0000000..26c239e
--- /dev/null
+++ b/docs/doxygen/latex/xbuda_8cpp.tex
@@ -0,0 +1,3 @@
+\hypertarget{xbuda_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbuda.cpp File Reference}
+\label{xbuda_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbuda.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbuda.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
diff --git a/docs/doxygen/latex/xbuda_8h.tex b/docs/doxygen/latex/xbuda_8h.tex
new file mode 100644
index 0000000..d8e1907
--- /dev/null
+++ b/docs/doxygen/latex/xbuda_8h.tex
@@ -0,0 +1,2 @@
+\hypertarget{xbuda_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbuda.h File Reference}
+\label{xbuda_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbuda.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbuda.h}}
diff --git a/docs/doxygen/latex/xbuda_8h_source.tex b/docs/doxygen/latex/xbuda_8h_source.tex
new file mode 100644
index 0000000..7438671
--- /dev/null
+++ b/docs/doxygen/latex/xbuda_8h_source.tex
@@ -0,0 +1,58 @@
+\hypertarget{xbuda_8h_source}{}\doxysection{xbuda.\+h}
+\label{xbuda_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbuda.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbuda.h}}
+\mbox{\hyperlink{xbuda_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbuda.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{This class manages the user data area (UDA)}}
+\DoxyCodeLine{15 \textcolor{comment}{}}
+\DoxyCodeLine{16 \textcolor{comment}{*/}}
+\DoxyCodeLine{17 }
+\DoxyCodeLine{18 }
+\DoxyCodeLine{19 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBUDA\_H\_\_}}
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#define \_\_XB\_XBUDA\_H\_\_}}
+\DoxyCodeLine{21 }
+\DoxyCodeLine{22 \textcolor{preprocessor}{\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{23 \textcolor{preprocessor}{\#pragma interface}}
+\DoxyCodeLine{24 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 }
+\DoxyCodeLine{27 \textcolor{preprocessor}{\#ifdef XB\_EXPRESSION\_SUPPORT}}
+\DoxyCodeLine{28 }
+\DoxyCodeLine{29 }
+\DoxyCodeLine{30 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{31 }
+\DoxyCodeLine{32 \textcolor{keyword}{class }XBDLLEXPORT xbUda \{}
+\DoxyCodeLine{33 }
+\DoxyCodeLine{34 \textcolor{keyword}{public}:}
+\DoxyCodeLine{35 xbUda();}
+\DoxyCodeLine{36 \string~xbUda();}
+\DoxyCodeLine{37 }
+\DoxyCodeLine{38 xbInt16 AddTokenForKey( \textcolor{keyword}{const} xbString \&sKey, \textcolor{keyword}{const} xbString \&sToken );}
+\DoxyCodeLine{39 \textcolor{keywordtype}{void} Clear();}
+\DoxyCodeLine{40 xbInt16 DelTokenForKey( \textcolor{keyword}{const} xbString \&sKey );}
+\DoxyCodeLine{41 xbInt16 GetTokenCnt() \textcolor{keyword}{const};}
+\DoxyCodeLine{42 xbInt16 GetTokenForKey( \textcolor{keyword}{const} xbString \&sKey, xbString \&sData );}
+\DoxyCodeLine{43 xbInt16 UpdTokenForKey( \textcolor{keyword}{const} xbString \&sKey, \textcolor{keyword}{const} xbString \&sToken );}
+\DoxyCodeLine{44 \textcolor{keywordtype}{void} DumpUda() \textcolor{keyword}{const};}
+\DoxyCodeLine{45 }
+\DoxyCodeLine{46 \textcolor{keyword}{private}:}
+\DoxyCodeLine{47 xbLinkListOrd<xbString> llOrd;}
+\DoxyCodeLine{48 }
+\DoxyCodeLine{49 \};}
+\DoxyCodeLine{50 \} \textcolor{comment}{/* namespace */}}
+\DoxyCodeLine{51 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* XB\_EXPRESSION\_SUPPORT */}\textcolor{preprocessor}{}}
+\DoxyCodeLine{52 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XBUDA\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/doxygen/latex/xbxbase_8cpp.tex b/docs/doxygen/latex/xbxbase_8cpp.tex
new file mode 100644
index 0000000..c803e2f
--- /dev/null
+++ b/docs/doxygen/latex/xbxbase_8cpp.tex
@@ -0,0 +1,8 @@
+\hypertarget{xbxbase_8cpp}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/core/xbxbase.cpp File Reference}
+\label{xbxbase_8cpp}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbxbase.cpp@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/core/xbxbase.cpp}}
+{\ttfamily \#include \char`\"{}xbase.\+h\char`\"{}}\newline
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbxbase_8h.tex b/docs/doxygen/latex/xbxbase_8h.tex
new file mode 100644
index 0000000..0a1702e
--- /dev/null
+++ b/docs/doxygen/latex/xbxbase_8h.tex
@@ -0,0 +1,17 @@
+\hypertarget{xbxbase_8h}{}\doxysection{/mnt/1\+Tdata/xbase/xbase64-\/4.0.2/src/include/xbxbase.h File Reference}
+\label{xbxbase_8h}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbxbase.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbxbase.h}}
+\doxysubsection*{Data Structures}
+\begin{DoxyCompactItemize}
+\item
+class \mbox{\hyperlink{classxb_1_1xbXBase}{xb\+::xb\+XBase}}
+\begin{DoxyCompactList}\small\item\em xb\+Xbase class. \end{DoxyCompactList}\end{DoxyCompactItemize}
+\doxysubsection*{Namespaces}
+\begin{DoxyCompactItemize}
+\item
+namespace \mbox{\hyperlink{namespacexb}{xb}}
+\end{DoxyCompactItemize}
+\doxysubsection*{Variables}
+\begin{DoxyCompactItemize}
+\item
+class XBDLLEXPORT \mbox{\hyperlink{namespacexb_a4a31fbe9110c9e55495ce71e642d785c}{xb\+::xb\+Log}}
+\end{DoxyCompactItemize}
diff --git a/docs/doxygen/latex/xbxbase_8h_source.tex b/docs/doxygen/latex/xbxbase_8h_source.tex
new file mode 100644
index 0000000..fb56397
--- /dev/null
+++ b/docs/doxygen/latex/xbxbase_8h_source.tex
@@ -0,0 +1,224 @@
+\hypertarget{xbxbase_8h_source}{}\doxysection{xbxbase.\+h}
+\label{xbxbase_8h_source}\index{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbxbase.h@{/mnt/1Tdata/xbase/xbase64-\/4.0.2/src/include/xbxbase.h}}
+\mbox{\hyperlink{xbxbase_8h}{Go to the documentation of this file.}}
+\begin{DoxyCode}{0}
+\DoxyCodeLine{1 \textcolor{comment}{/* xbxbase.h}}
+\DoxyCodeLine{2 \textcolor{comment}{}}
+\DoxyCodeLine{3 \textcolor{comment}{XBase64 Software Library}}
+\DoxyCodeLine{4 \textcolor{comment}{}}
+\DoxyCodeLine{5 \textcolor{comment}{Copyright (c) 1997,2003,2014,2022 Gary A Kunkel}}
+\DoxyCodeLine{6 \textcolor{comment}{}}
+\DoxyCodeLine{7 \textcolor{comment}{The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.}}
+\DoxyCodeLine{8 \textcolor{comment}{}}
+\DoxyCodeLine{9 \textcolor{comment}{Email Contact:}}
+\DoxyCodeLine{10 \textcolor{comment}{}}
+\DoxyCodeLine{11 \textcolor{comment}{ XDB-\/devel@lists.sourceforge.net}}
+\DoxyCodeLine{12 \textcolor{comment}{ XDB-\/users@lists.sourceforge.net}}
+\DoxyCodeLine{13 \textcolor{comment}{}}
+\DoxyCodeLine{14 \textcolor{comment}{*/}}
+\DoxyCodeLine{15 }
+\DoxyCodeLine{16 }
+\DoxyCodeLine{17 \textcolor{preprocessor}{\#ifndef \_\_XB\_XBDBLIST\_H\_\_}}
+\DoxyCodeLine{18 \textcolor{preprocessor}{\#define \_\_XB\_XBDBLIST\_H\_\_}}
+\DoxyCodeLine{19 }
+\DoxyCodeLine{20 \textcolor{preprocessor}{\#ifdef CMAKE\_COMPILER\_IS\_GNUCC}}
+\DoxyCodeLine{21 \textcolor{preprocessor}{\#pragma interface}}
+\DoxyCodeLine{22 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{23 }
+\DoxyCodeLine{24 \textcolor{keyword}{namespace }\mbox{\hyperlink{namespacexb}{xb}}\{}
+\DoxyCodeLine{25 }
+\DoxyCodeLine{26 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{namespacexb_a4a31fbe9110c9e55495ce71e642d785c}{xbLog}};}
+\DoxyCodeLine{27 }
+\DoxyCodeLine{28 \textcolor{comment}{/************************************************************************/}}
+\DoxyCodeLine{29 \textcolor{comment}{/* }}
+\DoxyCodeLine{30 \textcolor{comment}{ Xbase functions}}
+\DoxyCodeLine{31 \textcolor{comment}{}}
+\DoxyCodeLine{32 \textcolor{comment}{ Min Parm Count is the minimum number of input parms needed by the function}}
+\DoxyCodeLine{33 \textcolor{comment}{}}
+\DoxyCodeLine{34 \textcolor{comment}{ Return Type}}
+\DoxyCodeLine{35 \textcolor{comment}{ C Char or string}}
+\DoxyCodeLine{36 \textcolor{comment}{ D Date}}
+\DoxyCodeLine{37 \textcolor{comment}{ L Logical}}
+\DoxyCodeLine{38 \textcolor{comment}{ N Numeric}}
+\DoxyCodeLine{39 \textcolor{comment}{ 1 Varies -\/ pull return type from first sibling}}
+\DoxyCodeLine{40 \textcolor{comment}{ 2 Varies -\/ pull return type from second sibling}}
+\DoxyCodeLine{41 \textcolor{comment}{*/}}
+\DoxyCodeLine{42 }
+\DoxyCodeLine{43 \textcolor{preprocessor}{\#ifdef XB\_FUNCTION\_SUPPORT}}
+\DoxyCodeLine{44 }
+\DoxyCodeLine{45 \textcolor{comment}{/*}}
+\DoxyCodeLine{46 \textcolor{comment}{struct XBDLLEXPORT xbFunctionInfo \{}}
+\DoxyCodeLine{47 \textcolor{comment}{ const char * FuncName; // function name}}
+\DoxyCodeLine{48 \textcolor{comment}{ char ReturnType; // return type of function}}
+\DoxyCodeLine{49 \textcolor{comment}{ xbInt16 iReturnLenCalc; // used to calculate the function return value is}}
+\DoxyCodeLine{50 \textcolor{comment}{ // 1 = use value specified in iReturnLenVal}}
+\DoxyCodeLine{51 \textcolor{comment}{ // 2 = use length of operand specified in col 4}}
+\DoxyCodeLine{52 \textcolor{comment}{ // 3 = use valued of numeric operand specified in col 4}}
+\DoxyCodeLine{53 \textcolor{comment}{ // 4 = length of parm 1 * numeric value parm}}
+\DoxyCodeLine{54 \textcolor{comment}{ // 5 = larger length of parm 2 or length of parm 3}}
+\DoxyCodeLine{55 \textcolor{comment}{ // 6 = if two or more parms, use numeric value from second parm,}}
+\DoxyCodeLine{56 \textcolor{comment}{ // otherwise use col4 value}}
+\DoxyCodeLine{57 \textcolor{comment}{ xbInt16 iReturnLenVal; // Used in combination with iReturnLenCalc}}
+\DoxyCodeLine{58 \textcolor{comment}{}}
+\DoxyCodeLine{59 \textcolor{comment}{\};}}
+\DoxyCodeLine{60 \textcolor{comment}{*/}}
+\DoxyCodeLine{61 \textcolor{comment}{/*}}
+\DoxyCodeLine{62 \textcolor{comment}{static xbFunctionInfo FunctionList[] =}}
+\DoxyCodeLine{63 \textcolor{comment}{// Func Return -\/Rtrn Len-\/}}
+\DoxyCodeLine{64 \textcolor{comment}{// Name Type -\/Calc Val-\/}}
+\DoxyCodeLine{65 \textcolor{comment}{\{}}
+\DoxyCodeLine{66 \textcolor{comment}{ \{ "{}ABS"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{67 \textcolor{comment}{ \{ "{}ALLTRIM"{}, 'C', 2, 1 \},}}
+\DoxyCodeLine{68 \textcolor{comment}{ \{ "{}ASC"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{69 \textcolor{comment}{ \{ "{}AT"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{70 \textcolor{comment}{ \{ "{}CDOW"{}, 'C', 1, 9 \},}}
+\DoxyCodeLine{71 \textcolor{comment}{ \{ "{}CHR"{}, 'C', 1, 1 \},}}
+\DoxyCodeLine{72 \textcolor{comment}{ \{ "{}CMONTH"{}, 'C', 1, 9 \},}}
+\DoxyCodeLine{73 \textcolor{comment}{ \{ "{}CTOD"{}, 'D', 1, 8 \},}}
+\DoxyCodeLine{74 \textcolor{comment}{ \{ "{}DATE"{}, 'D', 1, 8 \},}}
+\DoxyCodeLine{75 \textcolor{comment}{ \{ "{}DAY"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{76 \textcolor{comment}{ \{ "{}DEL"{}, 'C', 1, 1 \},}}
+\DoxyCodeLine{77 \textcolor{comment}{ \{ "{}DELETED"{}, 'L', 1, 1 \},}}
+\DoxyCodeLine{78 \textcolor{comment}{ \{ "{}DESCEND"{}, '1', 2, 1 \},}}
+\DoxyCodeLine{79 \textcolor{comment}{ \{ "{}DOW"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{80 \textcolor{comment}{ \{ "{}DTOC"{}, 'C', 1, 8 \},}}
+\DoxyCodeLine{81 \textcolor{comment}{ \{ "{}DTOS"{}, 'C', 1, 8 \},}}
+\DoxyCodeLine{82 \textcolor{comment}{ \{ "{}EXP"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{83 \textcolor{comment}{ \{ "{}IIF"{}, 'C', 5, 0 \},}}
+\DoxyCodeLine{84 \textcolor{comment}{ \{ "{}INT"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{85 \textcolor{comment}{ \{ "{}ISALPHA"{}, 'L', 1, 1 \},}}
+\DoxyCodeLine{86 \textcolor{comment}{ \{ "{}ISLOWER"{}, 'L', 1, 1 \},}}
+\DoxyCodeLine{87 \textcolor{comment}{ \{ "{}ISUPPER"{}, 'L', 1, 1 \},}}
+\DoxyCodeLine{88 \textcolor{comment}{ \{ "{}LEFT"{}, 'C', 3, 2 \},}}
+\DoxyCodeLine{89 \textcolor{comment}{ \{ "{}LEN"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{90 \textcolor{comment}{ \{ "{}LOG"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{91 \textcolor{comment}{ \{ "{}LOWER"{}, 'C', 2, 1 \},}}
+\DoxyCodeLine{92 \textcolor{comment}{ \{ "{}LTRIM"{}, 'C', 2, 1 \},}}
+\DoxyCodeLine{93 \textcolor{comment}{ \{ "{}MAX"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{94 \textcolor{comment}{ \{ "{}MIN"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{95 \textcolor{comment}{ \{ "{}MONTH"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{96 \textcolor{comment}{ \{ "{}RECNO"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{97 \textcolor{comment}{ \{ "{}RECCOUNT"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{98 \textcolor{comment}{ \{ "{}REPLICATE"{}, 'C', 4, 0 \},}}
+\DoxyCodeLine{99 \textcolor{comment}{ \{ "{}RIGHT"{}, 'C', 3, 2 \},}}
+\DoxyCodeLine{100 \textcolor{comment}{ \{ "{}RTRIM"{}, 'C', 2, 1 \},}}
+\DoxyCodeLine{101 \textcolor{comment}{ \{ "{}SPACE"{}, 'C', 3, 1 \},}}
+\DoxyCodeLine{102 \textcolor{comment}{ \{ "{}SQRT"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{103 \textcolor{comment}{ \{ "{}STOD"{}, 'D', 1, 8 \},}}
+\DoxyCodeLine{104 \textcolor{comment}{ \{ "{}STR"{}, 'C', 6, 10 \},}}
+\DoxyCodeLine{105 \textcolor{comment}{ \{ "{}STRZERO"{}, 'C', 3, 2 \},}}
+\DoxyCodeLine{106 \textcolor{comment}{ \{ "{}SUBSTR"{}, 'C', 3, 3 \},}}
+\DoxyCodeLine{107 \textcolor{comment}{ \{ "{}TRIM"{}, 'C', 2, 1 \},}}
+\DoxyCodeLine{108 \textcolor{comment}{ \{ "{}UPPER"{}, 'C', 2, 1 \},}}
+\DoxyCodeLine{109 \textcolor{comment}{ \{ "{}VAL"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{110 \textcolor{comment}{ \{ "{}YEAR"{}, 'N', 1, 4 \},}}
+\DoxyCodeLine{111 \textcolor{comment}{ \{ 0, 0, 0, 0 \},}}
+\DoxyCodeLine{112 \textcolor{comment}{\};}}
+\DoxyCodeLine{113 \textcolor{comment}{*/}}
+\DoxyCodeLine{114 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{115 }
+\DoxyCodeLine{116 }
+\DoxyCodeLine{117 }
+\DoxyCodeLine{119 }
+\DoxyCodeLine{123 \textcolor{keyword}{class }XBDLLEXPORT \mbox{\hyperlink{classxb_1_1xbXBase}{xbXBase}} : \textcolor{keyword}{public} \mbox{\hyperlink{classxb_1_1xbTblMgr}{xbTblMgr}}\{}
+\DoxyCodeLine{124 \textcolor{keyword}{public}:}
+\DoxyCodeLine{125 \mbox{\hyperlink{namespacexb_a97858ddeb1c4b0100f3edc1a46d3a8b0}{xbXBase}}();}
+\DoxyCodeLine{126 \mbox{\hyperlink{classxb_1_1xbXBase}{\string~xbXBase}}();}
+\DoxyCodeLine{127 }
+\DoxyCodeLine{128 xbInt16 CloseAllTables();}
+\DoxyCodeLine{129 \textcolor{keywordtype}{void} DisableMsgLogging();}
+\DoxyCodeLine{130 \textcolor{keywordtype}{void} EnableMsgLogging ();}
+\DoxyCodeLine{131 xbInt16 FlushLog();}
+\DoxyCodeLine{132 }
+\DoxyCodeLine{133 \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&GetLogDirectory () \textcolor{keyword}{const};}
+\DoxyCodeLine{134 \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&GetLogFileName () \textcolor{keyword}{const};}
+\DoxyCodeLine{135 \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&GetLogFqFileName() \textcolor{keyword}{const};}
+\DoxyCodeLine{136 \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} GetLogStatus () \textcolor{keyword}{const};}
+\DoxyCodeLine{137 }
+\DoxyCodeLine{138 xbInt16 \mbox{\hyperlink{classxb_1_1xbXBase_aa957eb502ecd076e5df89e7415cb094b}{OpenHighestVersion}}( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sAlias, \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} \&dbf, \textcolor{keywordtype}{int} dummy );}
+\DoxyCodeLine{139 xbInt16 OpenHighestVersion( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sAlias, \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} **dbf );}
+\DoxyCodeLine{140 }
+\DoxyCodeLine{141 \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} * Open( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName, xbInt16 \&iRc );}
+\DoxyCodeLine{142 \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} * Open( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTableName, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sAlias, xbInt16 iOpenMode, xbInt16 iShareMode, xbInt16 iVersion, xbInt16 \&iRc );}
+\DoxyCodeLine{143 \textcolor{keywordtype}{void} SetLogDirectory( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sLogFileDirectory );}
+\DoxyCodeLine{144 \textcolor{keywordtype}{void} SetLogFileName ( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sLogFileName );}
+\DoxyCodeLine{145 \textcolor{keywordtype}{void} SetLogSize ( \textcolor{keywordtype}{size\_t} lSize );}
+\DoxyCodeLine{146 xbInt16 WriteLogMessage( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sLogMessage, xbInt16 iOutputOpt = 0 );}
+\DoxyCodeLine{147 xbInt16 WriteLogBytes ( xbUInt32 lCnt, \textcolor{keyword}{const} \textcolor{keywordtype}{char} *p );}
+\DoxyCodeLine{148 }
+\DoxyCodeLine{149 \textcolor{keywordtype}{void} xbSleep ( xbInt32 lMillisecs );}
+\DoxyCodeLine{150 }
+\DoxyCodeLine{151 }
+\DoxyCodeLine{152 \textcolor{comment}{/* xbase functions */}}
+\DoxyCodeLine{153 \textcolor{preprocessor}{ \#ifdef XB\_FUNCTION\_SUPPORT}}
+\DoxyCodeLine{154 xbInt16 ABS( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dOut );}
+\DoxyCodeLine{155 xbInt16 ALLTRIM( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{156 xbInt16 ASC( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dAscOut );}
+\DoxyCodeLine{157 xbInt16 AT( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sSrchFor, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sBase, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dPos );}
+\DoxyCodeLine{158 xbInt16 CDOW( \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dInDate, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOutDow );}
+\DoxyCodeLine{159 xbInt16 CHR( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dAsciCd, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{160 xbInt16 CMONTH( \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dInDate, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOutMonth );}
+\DoxyCodeLine{161 xbInt16 CTOD( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sInDate, \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dOutDate );}
+\DoxyCodeLine{162 xbInt16 DATE( \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dOutDate );}
+\DoxyCodeLine{163 xbInt16 DAY( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dInDate, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dOutDay );}
+\DoxyCodeLine{164 xbInt16 DEL( \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} * d, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut, xbInt16 iRecBufSw = 0 );}
+\DoxyCodeLine{165 xbInt16 DELETED( \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} * d, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} \&bOut, xbInt16 iRecBufSw = 0 );}
+\DoxyCodeLine{166 xbInt16 DESCEND( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{167 xbInt16 DESCEND( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dInDate, \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dOutDate );}
+\DoxyCodeLine{168 xbInt16 DESCEND( \textcolor{keyword}{const} \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dsOut );}
+\DoxyCodeLine{169 xbInt16 DOW( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&sInDate, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dDowOut );}
+\DoxyCodeLine{170 xbInt16 DTOC( \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dInDate, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOutFmtDate );}
+\DoxyCodeLine{171 xbInt16 DTOS( \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dInDate, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOutFmtDate );}
+\DoxyCodeLine{172 xbInt16 EXP( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dOut );}
+\DoxyCodeLine{173 xbInt16 IIF( \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} bResult, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sTrueResult, \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sFalseResult, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sResult );}
+\DoxyCodeLine{174 xbInt16 INT( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dOut );}
+\DoxyCodeLine{175 xbInt16 ISALPHA( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} \&bResult );}
+\DoxyCodeLine{176 xbInt16 ISLOWER( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} \&bResult );}
+\DoxyCodeLine{177 xbInt16 ISUPPER( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&s, \mbox{\hyperlink{namespacexb_ab1a750481dd487f0d384aa1d200dff0f}{xbBool}} \&bResult );}
+\DoxyCodeLine{178 xbInt16 LEFT( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, xbUInt32 lCharCnt, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{179 xbInt16 LEN( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dLen );}
+\DoxyCodeLine{180 xbInt16 LOG( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dOut );}
+\DoxyCodeLine{181 xbInt16 LOWER( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{182 xbInt16 LTRIM( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \& sOut );}
+\DoxyCodeLine{183 xbInt16 MAX( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn1, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn2, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dOut );}
+\DoxyCodeLine{184 xbInt16 MIN( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn1, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn2, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dOut );}
+\DoxyCodeLine{185 xbInt16 MONTH( \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dInDate, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dMonthOut );}
+\DoxyCodeLine{186 xbInt16 RECCOUNT( \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} * d, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dRecOut );}
+\DoxyCodeLine{187 xbInt16 RECNO( \mbox{\hyperlink{classxb_1_1xbDbf}{xbDbf}} * d, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dRecOut );}
+\DoxyCodeLine{188 xbInt16 REPLICATE( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, xbUInt32 ulRepCnt, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{189 xbInt16 RIGHT( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, xbUInt32 iCharCnt, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{190 xbInt16 RTRIM( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{191 xbInt16 SPACE( xbInt32 lCnt, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{192 xbInt16 SQRT( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dBase, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dSqrRt );}
+\DoxyCodeLine{193 xbInt16 STOD( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&sDateOut );}
+\DoxyCodeLine{194 xbInt16 STR( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{195 xbInt16 STR( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn, xbUInt32 ulLen, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{196 xbInt16 STR( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn, xbUInt32 ulLen, xbUInt32 ulDec, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{197 xbInt16 STR( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn, xbUInt32 ulLen, xbUInt32 ulDec, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sPadChar, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{198 xbInt16 STRZERO( \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} dIn, xbUInt32 ulLen, xbUInt32 ulDec, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{199 xbInt16 SUBSTR( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, xbUInt32 ulStartPos, xbUInt32 ulLen, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{200 xbInt16 TRIM( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{201 xbInt16 UPPER( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sOut );}
+\DoxyCodeLine{202 xbInt16 VAL( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sIn, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dOut );}
+\DoxyCodeLine{203 xbInt16 YEAR( \mbox{\hyperlink{classxb_1_1xbDate}{xbDate}} \&dInDate, \mbox{\hyperlink{namespacexb_a25f47b226ce924a5c78f97989b0744a2}{xbDouble}} \&dOutYear );}
+\DoxyCodeLine{204 \textcolor{preprocessor}{ \#endif}}
+\DoxyCodeLine{205 }
+\DoxyCodeLine{206 \textcolor{keyword}{protected}:}
+\DoxyCodeLine{207 \textcolor{keyword}{friend} \textcolor{keyword}{class }xbBcd;}
+\DoxyCodeLine{208 \textcolor{keyword}{friend} \textcolor{keyword}{class }xbExp;}
+\DoxyCodeLine{209 }
+\DoxyCodeLine{210 xbInt16 \mbox{\hyperlink{classxb_1_1xbXBase_ae52e53340593b4253936c1372ec15ee1}{GetFunctionInfo}}( \textcolor{keyword}{const} \mbox{\hyperlink{classxb_1_1xbString}{xbString}} \&sExpLine, \textcolor{keywordtype}{char} \&cReturnType, xbInt16 \&iReturnLenCalc, xbInt32 \&lReturnLenVal ) \textcolor{keyword}{const};}
+\DoxyCodeLine{211 \textcolor{keyword}{static} xbInt16 xbMemcmp( \textcolor{keyword}{const} \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} *s1, \textcolor{keyword}{const} \textcolor{keywordtype}{unsigned} \textcolor{keywordtype}{char} *s2, \textcolor{keywordtype}{size\_t} n );}
+\DoxyCodeLine{212 }
+\DoxyCodeLine{213 \textcolor{keyword}{private}:}
+\DoxyCodeLine{214 }
+\DoxyCodeLine{215 \textcolor{preprocessor}{\#ifdef XB\_LOGGING\_SUPPORT}}
+\DoxyCodeLine{216 \mbox{\hyperlink{namespacexb_a4a31fbe9110c9e55495ce71e642d785c}{xbLog}} *xLog;}
+\DoxyCodeLine{217 \textcolor{preprocessor}{\#endif}}
+\DoxyCodeLine{218 }
+\DoxyCodeLine{219 \};}
+\DoxyCodeLine{220 }
+\DoxyCodeLine{221 \} \textcolor{comment}{/* namespace xb */}}
+\DoxyCodeLine{222 \textcolor{preprocessor}{\#endif }\textcolor{comment}{/* \_\_XB\_DBLIST\_H\_\_ */}\textcolor{preprocessor}{}}
+
+\end{DoxyCode}
diff --git a/docs/howto/AddAnIndex.txt b/docs/howto/AddAnIndex.txt
new file mode 100755
index 0000000..251caf8
--- /dev/null
+++ b/docs/howto/AddAnIndex.txt
@@ -0,0 +1,11 @@
+
+
+How to create an index
+
+1) Derive a child class from xbIx Pure Virtual Class
+
+2) Create header file
+3) Create cpp file
+
+4) SQL updates
+ - xbcrix.cpp
diff --git a/docs/howto/GettingStarted.txt b/docs/howto/GettingStarted.txt
new file mode 100755
index 0000000..a88698f
--- /dev/null
+++ b/docs/howto/GettingStarted.txt
@@ -0,0 +1,86 @@
+
+To build the xbase library
+
+1) Verify you have the correct software prerequisites installed
+ A) cmake 2.6 or LATER
+ B) Compiler and linker
+
+2) Verify you have access to the target location of the library
+
+3) Unpack the tar or zip file
+
+4) For Linux 64 bit or 32 bit plat forms
+
+ cd xbase/build/Linux64 or xbase/build/Linux32
+ cmake .
+ make
+ make test
+ sudo make install
+
+ Verify the ld.so.conf file has the library target directory
+ For example
+ update file /etc/ld.so.conf to include /usr/local/lib
+ and run ldconfig
+ Your milage may vary depending on Linux Distro
+
+
+ To update the configuration file
+ cd xbase/build/Linux64 or xbase/build/Linux32
+ ccmake .
+
+
+
+5) For Mac
+
+ Verify you have xcode installed and operational
+ cd xbase/build/Mac
+ cmake . -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
+ make
+ make test
+
+
+6) For Windows 64 bit with Visual Studio
+
+ Open a Visual Studio 64 bit Shell
+ cd xbase\build\Win64VS
+ buildwin.bat
+ nmake test
+
+ From a VS Studio 64 bit shell in admin mode
+ nmake install
+
+ Also of note: cleanwin.bat resets everything
+
+7) For Windows 32 bit with Visual Studio
+
+ Open a Visual Studio 32 bit Shell
+ cd xbase\build\Win32VS
+ buildwin.bat
+ nmake test
+
+ From a VS Studio 32 bit shell in admin mode
+ nmake install
+
+
+
+8) For Windows 32 bit with Borland 5.5 free compiler
+
+ cd xbase\build\Win32Borland
+ BuildBorland.bat
+ make test
+
+
+9) For other platforms
+
+ Here is something to start with...
+
+ cd xbase
+ md MyPlatform
+ cd MyPlatform
+ cp ../Cmake/CmakeLists.txt .
+
+ Enter the appropriate make command for your environment - check the cmake web site for help
+ On Linux, it is .cmake, then make
+ your mileage may vary
+
+ Send your results to the library maintainer so it can be added to this library
diff --git a/docs/howto/Hacking.txt b/docs/howto/Hacking.txt
new file mode 100755
index 0000000..3447490
--- /dev/null
+++ b/docs/howto/Hacking.txt
@@ -0,0 +1,28 @@
+
+
+How to modify the library:
+
+
+The library was redesigned with a structure in mind to allow additional
+dbf, memo and index files to be added relatively easily without trashing
+the underlying codebase.
+
+
+To add functionality to add a DBF, or tailor a particular dbf class,
+create a new derived class using the xbdbf class as a base class.
+The core xbdbf base class encompasses the DBASE III code base.
+
+At one time there was "Real Delete" processing embedded in the code. It
+was removed from the core classes because it would be incompatible with
+later versions of the xbase file structures. If you were interested in
+adding this back into the library, you could derive a new dbf class
+and add the mods into the new derived class, leaving the base class
+as it stands.
+
+
+To add additional memo functionality, create a new derived class from
+the xbMemo class.
+
+
+
+Update xbFile::DetermineXbaseVersion to identify Xbase file type \ No newline at end of file
diff --git a/docs/howto/Locking.txt b/docs/howto/Locking.txt
new file mode 100755
index 0000000..b3cc832
--- /dev/null
+++ b/docs/howto/Locking.txt
@@ -0,0 +1,53 @@
+
+Xbase64 - Multi user / Record Locking
+
+
+
+If you are using the Xbase64 library in a multi user environment,
+
+The Record Locking functionality of Xbase64 is designed to work in an evironment
+where the files are not cached on a local client machine.
+
+If you are using the Xbase64 library in a multi user environment, you will need
+to verify that Oplocks are turned off for the files in question.
+
+Oplocks is short for Opportunistic Locking.
+
+
+If you are using Samba software as your file server software, you will
+need to add the following to your smb.conf config files.
+
+
+In the global section of the smb.conf file:
+
+[global]
+veto oplock files = /*.dbf/*.DBF/*.dbt/*.DBT/*.ndx/*.NDX/*.cdx/*.CDX/*.mdx/*.MDX
+
+
+Or you could set this at the share level
+[share_name]
+veto oplock files = /*.dbf/*.DBF/*.dbt/*.DBT/*.ndx/*.NDX/*.cdx/*.CDX/*.mdx/*.MDX
+
+
+Sometimes locking issues can be related to the network config, more than the programs
+For example, the locking logic might fail if the underlying file structure does not
+support it.
+
+Mac OSX does not support locking functionality on SMB / Samba shares
+Mac OSX does support locking functionality on NFS shares
+Per Apple, this is by design
+
+
+Function: xbase::SetMultiUser( xbTrue || xbFalse )
+
+ Use this function to turn multi user mode on or off.
+ This function needs to be called before any files are opened or created.
+ If this function is called after files are opened or created, the files
+ will need to be closed and reopened for this setting to take effect.
+
+ This setting turns file buffering on and off. In a single user environment,
+ set this switch to off to improve the performance of the application.
+
+
+
+
diff --git a/docs/howto/mac_cmake_compile.txt b/docs/howto/mac_cmake_compile.txt
new file mode 100755
index 0000000..4ec0ad6
--- /dev/null
+++ b/docs/howto/mac_cmake_compile.txt
@@ -0,0 +1 @@
+cmake . -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
diff --git a/docs/html/index.htm b/docs/html/index.htm
new file mode 100755
index 0000000..3c992f5
--- /dev/null
+++ b/docs/html/index.htm
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC>
+<HTML><TITLE>Xbase DBMS Documentation Table of Contents</TITLE>
+<BODY BGCOLOR=#FFFFFF>
+<H1><p align="center">Xbase DBMS<br>
+Last Updated 11/21/22<br>Version 4.x.x</p></H1>
+<h2>Documentation Table Of Contents</h2>
+<h3>Section 1 - Xbase Concepts</h3>
+<h4>
+<A HREF="xbc1.htm">Chapter 1 - Getting Started</A><br>
+<A HREF="xbc2.htm">Chapter 2 - Database Overview</A><br>
+<A HREF="xbc3.htm">Chapter 3 - Fields and Strings</A><br>
+<A HREF="xbc4.htm">Chapter 4 - Date Processing</A><br>
+<A HREF="xbc5.htm">Chapter 5 - Expression Handling</A><br>
+<A HREF="xbc6.htm">Chapter 6 - Index Overview</A><br>
+<A HREF="xbc7.htm">Chapter 7 - NDX (DBase) Indices</A><br>
+<A HREF="xbc8.htm">Chapter 8 - MDX (DBase) Indices</A><br>
+<A HREF="xbc9.htm">Chapter 9 - NTX (Clipper) Indices</A><br>
+<A HREF="xbc10.htm">Chapter 10 - CDX (FoxPro) Indices</A><br>
+<A HREF="xbc11.htm">Chapter 11 - IDX (FoxPro) Indices</A><br>
+<A HREF="xbc12.htm">Chapter 12 - Record and File Locking</A><br>
+<A HREF="xbc13.htm">Chapter 13 - Logfile Support</A><br>
+<A HREF="xbc14.htm">Chapter 14 - SQL Support</A><br>
+<A HREF="xbc15.htm">Chapter 15 - Utility programs</A><br>
+
+</h4>
+<h3>Section 3 - Appendices</h3>
+<h4>
+<A HREF="copying.lib">Appendix C - GPL Library License</A><br>
+<A HREF="xbbib.htm">Appendix D - Bibliography</A><br>
+</h4>
+<p><img src="xbase.jpg"><br><hr>
+</BODY>
+</HTML>
diff --git a/html/xbase.jpg b/docs/html/xbase.jpg
index 5070fcb..5070fcb 100755
--- a/html/xbase.jpg
+++ b/docs/html/xbase.jpg
Binary files differ
diff --git a/html/xbbib.htm b/docs/html/xbbib.htm
index 70e4e82..70e4e82 100755
--- a/html/xbbib.htm
+++ b/docs/html/xbbib.htm
diff --git a/docs/html/xbc1.htm b/docs/html/xbc1.htm
new file mode 100755
index 0000000..bb04aec
--- /dev/null
+++ b/docs/html/xbc1.htm
@@ -0,0 +1,185 @@
+<!DOCTYPE HTML PUBLIC>
+<HTML>
+<TITLE>Xbase DBMS Chapter 1</TITLE>
+<BODY BGCOLOR=#FFFFFF>
+
+<h1><p align="center">Getting Started</p></h1>
+<p align="center">Chapter Updated 11/21/22</p>
+
+<hr><h2>Overview</h2>
+
+Welcome to Xbase64 DBMS, a collection of specifications, programs,
+utilities and a C++ class library for manipulating legacy Xbase (DBF) type
+data files and indices.
+<br><br>
+
+The term Xbase is often used used to describe the format of the original
+DBase, Clipper and Foxbase (.DBF) files. The XBase file format is well
+documented and has stood the test of time. Various popular programs
+still create and read xbase formatted files.<br><br>
+
+The purpose of the Xbase64 library is to provide reliable and usable
+programming tools for reading, writing and updating DBF databases,
+indices and memo fields. Version 4.x.x has been tested for compatability
+with DBase III (TM) and DBase IV (TM) version data files and indices
+*.DBF (data), *.NDX (single tag index), *.MDX (multi tag index) and
+*.DBT (memo).<br><br>
+
+Version 4.x.x is a major rewrite of the library to strenghen error
+processing and bring consistency across modules. It includes updates
+to the locking process and also includes a module to support MDX multi
+tag indices.<br><br>
+
+Earlier versions of the library have included NTX and CDX index formats
+and that code will be re-incorporated into the latest version in the
+future.
+
+
+
+<br><br><br>
+
+<hr><h2>System Requirements</h2>
+
+To build the Xbase64 library, the following items are needed:<br><br>
+
+A computer, a C/C++ compiler and CMAKE.<br><br>
+
+The original source code was developed on a Linux platform with the GCC
+public domain C/C++ compiler.
+<br><br>
+
+Xbase64 DBMS has been successfully ported and runs on Linux, Mac and and Windows.
+<br><br>
+
+<hr><h2>Classes and User Interface</h2>
+
+<a href="..\doxygen\html\index.html">Classes and User Interface Documentation via Doxygen</a>
+
+<br><br>
+<hr><h2>Portability, Type Defs and Structures</h2>
+
+To make the Xbase64 library as portable as possible, the following things occurred:
+<br><br>
+<li>The software was developed to compile and run on either 32 or 64 bit architectures.
+<li>The software was developed to compile and run on either big endian or little endian archtectures.
+<li>All numeric data is stored in little endian format.
+<li>The library is built using <a href="https://cmake.org">Cmake</a> to provide support on a wide variety of platforms.
+<li>Field types were defined to be consistent across various OS and CPU configurations.
+Xbase64 defines the following field types:<br><br><br>
+<CENTER>
+<TABLE BORDER>
+<CAPTION ALIGN=TOP><h3>Field Types</h3></CAPTION>
+<TR ALIGN=BASELINE>
+<TR><TH ALIGN=LEFT>Type<TD>Description
+<TR><TH ALIGN=LEFT>xbInt16<TD>16 bit int
+<TR><TH ALIGN=LEFT>xbUInt16<TD>16 bit unsigned int
+<TR><TH ALIGN=LEFT>xbInt32<TD>32 bit int
+<TR><TH ALIGN=LEFT>xbUInt32<TD>32 bit unsigned int
+<TR><TH ALIGN=LEFT>xbInt64<TD>64 bit int
+<TR><TH ALIGN=LEFT>xbUInt64<TD>64 bit unsigned int
+<TR><TH ALIGN=LEFT>xbDouble<TD>double
+<TR><TH ALIGN=LEFT>char<TD>char
+<TR><TH ALIGN=LEFT>void<TD>void
+<TR><TH ALIGN=LEFT>struct SCHEMA<TD>Used for defining record structures
+</TABLE></CENTER>
+<br><br>
+
+Xbase64 was designed for portability utilizing standard ANSI-C/C++ compliant
+code. If you decide to write updates to the Xbase64 project, please try
+to keep your work to standard C/C++ generic calls and use the above predefined field types.<br><br>
+
+<hr><h2>Compilation Overview</h2>
+To build the xbase64 library, verify you have:<br>
+<li>Xbase64 source code
+<li>cmake 2.6 or LATER
+<li>Compiler and linker
+
+<br><br>
+Verify you have access rights to the target location of the library
+
+<br><br>
+For Linux:
+<br><br>
+<li>cd xbase/Linux
+<li>cmake .
+<li>make
+<li>make test
+<li>sudo make install
+<li>Verify the ld.so.conf file has the library target directory. For example
+update file /etc/ld.so.conf to include /usr/local/lib and run ldconfig.
+<br><br>
+
+For Mac:
+<br><br>
+<li>Verify you have xcode installed and operational.
+<li>cd xbase/Mac
+<li>cmake . -DCMAKE_OSX_SYSROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk
+<li>make
+<li>make test
+<br><br>
+
+For Windows 64 bit with Visual Studio:
+<br><br>
+<li>Open a Visual Studio 64 bit Shell
+<li>cd xbase\Win64VS
+<li>buildwin.bat
+<li>nmake test
+<li>From a VS Studio 64 bit shell in admin mode: nmake install
+<br><br>
+
+For Windows 32 bit with Visual Studio:
+<br><br>
+<li>Open a Visual Studio 32 bit Shell
+<li>cd xbase\Win32VS
+<li>buildwin.bat
+<li>nmake test
+<li>From a VS Studio 32 bit shell in admin mode: nmake install
+<br><br>
+
+For Windows 32 bit with Borland 5.5 free compiler
+<br><br>
+<li>cd xbase\Win32Borland
+<li>BuildBorland.bat
+<li>make test
+<br><br>
+
+For other platforms:
+<br><br>
+Here is something to start with...
+<li>cd xbase
+<li>md MyPlatform
+<li>cd MyPlatform
+<li>cp ../Cmake/CmakeLists.txt.
+<li>Enter the appropriate make command for your environment. Check the cmake web site for help.<br>
+ On Linux, it is .cmake, then make
+ your mileage may vary
+
+ Send your results to the library maintainer so it can be added to this library
+
+
+
+To use the Xbase classes, include the following header file in the program:
+<br><br>
+
+#include &lt;xbase.h&gt;<br><br>
+
+For more information on getting started, check out the sample programs in the src/examples folder.
+<br><br>
+
+<hr><br>
+<h2>System Limitations</h2>
+<br>
+Maximum size of a database file is the size of LONG - 2,147,483,647 bytes<br>
+Total number of fields in a database - 255 <br>
+Total number of characters in all fields - 32767<br>
+Maximum number of characters in a field - 254<br>
+Total number of records in a file - 1 billion<br>
+Maximum index key length - 100 bytes<br>
+Maximum .DBT file memo block size - 32256<br>
+Maximum expression result length - 100 bytes<br>
+Maximum NDX index key length - 100 bytes<br><br>
+<hr><br><br>
+
+<p><img src=xbase.jpg><br><hr>
+</BODY>
+</HTML>
diff --git a/docs/html/xbc10.htm b/docs/html/xbc10.htm
new file mode 100755
index 0000000..04f5158
--- /dev/null
+++ b/docs/html/xbc10.htm
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC>
+<HTML>
+<TITLE>Xbase DBMS Chapter 10</TITLE>
+<BODY BGCOLOR=#FFFFFF>
+<H2><p align="center">CDX Indices</p></H2>
+<p align="center">Chapter Updated 11/28/22</p><hr>
+
+<h3>Pending CDX index module development.</h3>
+
+<hr>
+</BODY>
+</HTML>
diff --git a/docs/html/xbc11.htm b/docs/html/xbc11.htm
new file mode 100755
index 0000000..4230f3f
--- /dev/null
+++ b/docs/html/xbc11.htm
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC>
+<HTML>
+<TITLE>Xbase DBMS Chapter 10</TITLE>
+<BODY BGCOLOR=#FFFFFF>
+<H2><p align="center">CDX Indices</p></H2>
+<p align="center">Chapter Updated 11/28/22</p><hr>
+
+<h3>Pending IDX index module development.</h3>
+
+<hr>
+</BODY>
+</HTML>
diff --git a/docs/html/xbc12.htm b/docs/html/xbc12.htm
new file mode 100755
index 0000000..f9fe114
--- /dev/null
+++ b/docs/html/xbc12.htm
@@ -0,0 +1,72 @@
+<!DOCTYPE HTML PUBLIC>
+<HTML>
+<TITLE>Xbase DBMS Chapter 8</TITLE>
+<BODY BGCOLOR=#FFFFFF>
+<H1><p align="center">Record and File Locking</p></H1>
+<p align="center">Chapter Updated 11/29/22</p><hr>
+
+<h3>Locking Overview</h3>
+
+Xbase64 supports multi-user processing through file and record locks.
+Record locking restricts multiple cooperating programs from simultaneously
+accessing the same data and corrupting it. Without record and file locking
+in a multi-user environment, simultaneous access to the data and index files
+can cause the files to become inaccurate and unusable.<br><br>
+
+Automatic record locking is on by default in the Xbase64 library. To disable it,
+use method xbXBase::DisableDefaultAutoLock() and to enable it, use method xbXBase::EnableDefaultAutoLock().
+
+Locking can also be enabled / disabled at the table level with with xbDbf::SetAutoLock().
+
+
+<br><br>
+The current Xbase64 record locking logic is modeled after DBase (tm) V7 locking.
+<br><br>
+
+The locking methods return either XB_LOCK_FAILED or XB_NO_ERROR. If they return
+XB_LOCK_FAILED the actual reason can be found in the global variable
+<em>errno</em> or function <em>perror()</em> can be executed to view the
+results.
+<br><br>
+
+The errno field may contain one of the following values if the lock was not
+successful.<br><br>
+<TABLE BORDER>
+<TR VALIGN="BASELINE">
+<TR><TH ALIGN="LEFT">Error Code<TD>Description
+<TR><TH ALIGN="LEFT">EBADF<TD>Invalid file descriptor
+<TR><TH ALIGN="LEFT">EINVAL<TD>Invalid lock information or file does not support locks
+<TR><TH ALIGN="LEFT">EACCESS<BR>EAGAIN<TD>Lock can not be set because it is blocked by an existing lock on the file.
+<TR><TH ALIGN="LEFT">ENOLCK<TD>The system is out of lock resources, too many file locks in place.
+<TR><TH ALIGN="LEFT">EDEADLK<TD>Deadlock condition
+<TR><TH ALIGN="LEFT">EINTR<TD>Process was interrupted by a signal while it was waiting
+</TABLE>
+<br><br>
+
+<h3>Linux/Windows File Locking Compatibility Issue</h3>
+
+There is a compatibility locking issue to be aware of. Windows environments allow for the exclusive
+opening of file handles and Linux/Unix platforms do not. If you are writing an application that will be
+using a tool like Dbase on a Windows machine, accessing a file on a Linux/Samba configure machine,
+be aware that the file could be opened in exclusive mode by DBase on the Windows system, and the same file could
+be simultaneously opened with a program on the Unix box. That could cause some issues.
+
+<br><br>
+In Unix, a program can not lock a file so another process can not access it.<br>
+In Windows, a program can lock a file so another process can not access it.<br>
+DBase(tm) supports routines to open files exclusively, preventing other users from opening a file.<br>
+
+<br><h3>Samba settings</h3>
+
+If you will be using Samba on Linux/Unix and sharing files between Linux and Windows machines,
+you will need to disable oplocks. In the smb.conf file, set:<br>
+<h4>oplocks = no</h4>
+
+
+
+
+<br>
+<hr><br>
+<p><img src="xbase.jpg"><br><hr>
+</BODY>
+</HTML>
diff --git a/docs/html/xbc13.htm b/docs/html/xbc13.htm
new file mode 100755
index 0000000..9f51a85
--- /dev/null
+++ b/docs/html/xbc13.htm
@@ -0,0 +1,46 @@
+
+<!DOCTYPE HTML PUBLIC>
+<HTML>
+<TITLE>Xbase DBMS Chapter 13</TITLE>
+<BODY BGCOLOR=#FFFFFF>
+<H2><p align="center">Logfiles</p></H2>
+<p align="center">Chapter Updated 11/29/22</p><hr>
+
+
+<h3>Logging</h3>
+
+The Xbase library includes a logging module that can be turned on or off for auditing purposes.
+
+See example code below for how to use the logging routines.
+
+<hr>
+
+#include "xbase.h"<br>
+using namespace xb;<br>
+<br>
+int main( int argCnt, char **av ){<br>
+
+ #ifdef XB_LOGGING_SUPPORT<br>
+ xbString sMsg;<br>
+ xbString sLogFileName;<br>
+ xbXBase x;<br>
+ sLogFileName = "/home/xbase/logfiles/LogFile.txt";<br>
+ x.SetLogFileName( sLogFileName );<br>
+ x.EnableMsgLogging(); <br><br>
+
+
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;<br>
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );<br>
+ x.WriteLogMessage( sMsg );<br>
+ std::cout << "Logging status is " << x.GetLogStatus() << std::endl;<br>
+ sMsg = "A logfile message";<br>
+ x.WriteLogMessage( sMsg );<br>
+ x.DisableMsgLogging();<br>
+ #endif /* XB_LOGGING_SUPPORT */<br>
+ return 0;<br>
+}<br>
+
+<hr>
+<p><img src="xbase.jpg"><hr>
+</BODY>
+</HTML>
diff --git a/docs/html/xbc14.htm b/docs/html/xbc14.htm
new file mode 100755
index 0000000..fdcf949
--- /dev/null
+++ b/docs/html/xbc14.htm
@@ -0,0 +1,12 @@
+<!DOCTYPE HTML PUBLIC>
+<HTML>
+<TITLE>Xbase DBMS Chapter 14</TITLE>
+<BODY BGCOLOR=#FFFFFF>
+<H2><p align="center">CDX Indices</p></H2>
+<p align="center">Chapter Updated 11/30/22</p><hr>
+
+<h3>Pending SQL module development.</h3>
+
+<hr>
+</BODY>
+</HTML>
diff --git a/docs/html/xbc15.htm b/docs/html/xbc15.htm
new file mode 100755
index 0000000..89bab09
--- /dev/null
+++ b/docs/html/xbc15.htm
@@ -0,0 +1,34 @@
+<!DOCTYPE HTML PUBLIC>
+<HTML>
+<TITLE>Xbase DBMS Chapter 15</TITLE>
+<BODY BGCOLOR=#FFFFFF>
+<H1><p align=center>Sample Programs</p></H1>
+<p align=center>Page Updated 11/30/22</p><hr><br><br>
+Sample Xbase DBMS programs include in the library.<br><br>
+<CENTER>
+<TABLE BORDER>
+<CAPTION ALIGN=TOP><H3>XBase Sample Programs</H3></CAPTION>
+<TR ALIGN=BASELINE>
+<TR><TH ALIGN=LEFT>Program<TD>Program Description
+<TR><TH ALIGN=LEFT>xb_cfg_check<TD>This program prints the compile settings and options in use
+<TR><TH ALIGN=LEFT>xb_copydbf<TD>This program copies a DBF file structure
+<TR><TH ALIGN=LEFT>xb_dbfutil1<TD>Menu program for executing Xbase functions
+<TR><TH ALIGN=LEFT>xb_deletall<TD>This program marks all records in a DBF file for deletion
+<TR><TH ALIGN=LEFT>xb_dumpdbt<TD>Debug memo files
+<TR><TH ALIGN=LEFT>xb_dumphdr<TD>This program opens an Xbase file and prints its header
+<TR><TH ALIGN=LEFT>xb_dumprecs<TD>This program dumps records for an X-Base file
+<TR><TH ALIGN=LEFT>xb_ex_string<TD>Example string program
+<TR><TH ALIGN=LEFT>xb_ex_v3_create_dbf<TD>Example program to create V3 DBF file
+<TR><TH ALIGN=LEFT>xb_ex_v3_upd_dbf<TD>Example program to update V3 DBF file
+<TR><TH ALIGN=LEFT>xb_ex_v4_create_dbf<TD>Example Program to create V4 DBF file
+<TR><TH ALIGN=LEFT>xb_ex_v4_upd_dbf<TD>Example program to update V4 DBF file
+<TR><TH ALIGN=LEFT>xb_execsql<TD>This program executes SQL statements
+<TR><TH ALIGN=LEFT>xb_pack<TD>This program packs (removes deleted records) from a DBF database file
+<TR><TH ALIGN=LEFT>xb_undelall<TD>This program undeletes all deleted records in a dbf file
+<TR><TH ALIGN=LEFT>xb_zap<TD>This program removes all records from a DBF file
+</TABLE></CENTER>
+<br><br>
+<hr>
+<p><img src="xbase.jpg"><br><hr>
+</BODY>
+</HTML>
diff --git a/html/xbc2.htm b/docs/html/xbc2.htm
index ac4800e..72a6009 100755
--- a/html/xbc2.htm
+++ b/docs/html/xbc2.htm
@@ -3,7 +3,7 @@
<TITLE>Xbase DBMS Chapter 2</TITLE>
<BODY BGCOLOR=#FFFFFF>
<H2><p align="center">Database Overview</p></H2>
-<p align="center">Chapter Updated 3/18/04</p><hr>
+<p align="center">Chapter Updated 11/21/22</p><hr>
The objective of this chapter is to provide information regarding how
the database files are utilized and document the various record structures.
@@ -12,7 +12,7 @@ information presented in this chapter is not required to use the
Xbase library. It is mainly information describing internal file
structures utilized by the Xbase routines.<br><br>
-Xbase files are comprised of a variable length header record which stores
+Xbase DBF files are comprised of a variable length header record which stores
information about the file and describes
the fixed length record format, followed by a series of fixed length
data records.
@@ -43,41 +43,50 @@ Zero, one or many database files can be open simultaneously.<br><br>
When using the Xbase routines, each open data file has a record buffer
which is manipulated by calling the database, index and field routines.
+<br><br>
-Updates are committed from the record buffer to the database when a write,
-or append is performed. The library will automatically write updates
-to the database if the buffer has been updated and the record is
-repositioned or the database is closed.<br><br>
+If <i>AutoCommit</i> is turned on (Default), updates are committed from
+the record buffer to the database when a write, or append is performed.
+The library automatically writes updates to the database if the buffer has
+been updated and the record is repositioned or the database is closed.
+<br><br>
+If <i>AutoCommit</i> is turned off, updates will need to be explicity
+committed to the database file with one of <i>dbf->Put(), dbf->Append()
+or dbf->Commit()</i> command depending on context..
+Updates can be cancelled with the <i>Abort()</i> command.
+<br><br>
The record buffer is not used for handling the actual data portion of
memo fields. When working with memo fields, the application program must
-allocate enough buffer space for reading and writing memo fields.<br><br>
+allocate enough buffer space for reading and writing memo fields or use
+the xbString class for handling memo data.<br><br>
Internal to the library, there is an additional record buffer which
stores the original value of the data record before any changes are made.
This is used by the index routines for finding and deleting original key
values from any open indices before adding the new keys. If the key values
-are not changed, no index updates occur.
+are not changed, no index updates occur. Additionally, calling the Abort()
+method will back out any updates to the record buffer.
<br><br>
<hr>
<br>
-<h3>Xbase Database File Header</h3>
+<h3>Xbase Database File Header - DBF Version III and Version IV</h3>
The Xbase file header, located at the beginning of the database, describes
the .DBF database. Knowledge of this structure is not necessary to
-effectively utilize the Xbase libraries.<br><br><br>
+effectively utilize the Xbase64 libraries.<br><br><br>
<TABLE BORDER>
<TR valign="BASELINE">
<TR><TH ALIGN="LEFT">Position<TD>Length<TD>Description
<TR><TH ALIGN="LEFT">0<TD>1 byte<TD>file version number<br>
- (03H without a .DBT file)<br>
- (83H with a .DBT file)
+ (03H without a .DBT file)<br>
+ (83H with a .DBT file)
<TR><TH ALIGN="LEFT">1-3<TD>3 bytes<TD>date of last update<br>
- (YY MM DD) in binary format
+ (YY MM DD) in binary format
<TR><TH ALIGN="LEFT">4-7<TD>32 bit number<TD>number of records in data file
<TR><TH ALIGN="LEFT">8-9<TD>16 bit number<TD>length of header structure
<TR><TH ALIGN="LEFT">10-11<TD>16 bit number<TD>length of the record
@@ -119,7 +128,7 @@ Data are stored in ASCII format in the database as follows:<br><br>
<TR><TH ALIGN="LEFT">Logical<TD>? Y y N n T t F f (? when not initialized)
<TR><TH ALIGN="LEFT">Memo<TD>10 digits representing a .DBT block number
<TR><TH ALIGN="LEFT">Numeric<TD>. 0 1 2 3 4 5 6 7 8 9 + -, right justified, left blank filled
-<TR><TH ALIGN="LEFT">Float<TD>. 0 1 2 3 4 5 6 7 8 9 + -, right justified, left blank filled
+<TR><TH ALIGN="LEFT">Float (Version IV only)<TD>. 0 1 2 3 4 5 6 7 8 9 + -, right justified, left blank filled
</TABLE>
<BR><BR>
@@ -252,24 +261,6 @@ is added to the free block chain.
Version 3 and 4 memo fields are terminated with two contiguous 0x1A bytes of data.
<br><br>
<hr>
-<h3>64 Bit File Support</h3>
-Beginning with Release 3.0 of the library, Xbase was renamed to Xbase64 and
-64 bit file support was incorporated into the library.
-<br><br>
-This functionality currently works on Linux/Unix platforms which support
-64 bit file structures. 64 bit support was not tested with Windows
-because the author didn't have access to a compiler which creates 64
-bit Windows apps. If you need this functionality for Windows, consider
-donating a Windows 64 bit compiler to the project and I'll get 64 bit
-support working for Windows.
-<br><br>
-It is not advisable to use Xbase 64 bit file support in combination with
-32 bit Xbase applications such as older versions of DBase, Clipper and Foxpro.
-Xbase64 can extend the files well beyond any limits in the older 32 bit
-application development environments.
-<br><br>
-If Xbase is being built with glibc, verify it is at least version 2.2.3.
-<br><br><hr>
<p><img src="xbase.jpg"><hr>
</BODY>
</HTML>
diff --git a/html/xbc3.htm b/docs/html/xbc3.htm
index b944a1b..f2f4a1d 100755
--- a/html/xbc3.htm
+++ b/docs/html/xbc3.htm
@@ -3,17 +3,11 @@
<TITLE>Xbase DBMS Chapter 3</TITLE>
<BODY BGCOLOR=#FFFFFF>
<H1><p align="center">Fields and Strings</p></H1>
-<p align="center">Chapter Updated 8/20/03</p><hr>
+<p align="center">Chapter Updated 11/21/22</p><hr>
<br><br>
-The title of this chapter almost sounds like a popular North American
-magazine called Field and Stream. The difference between this chapter and
-that magazine is there are no dead animal carcuses or fishing lures in
-this chapter. For those you will need to get a copy of Field and Stream.
-
-<br><br>
-The main objective of this chapter is to provide information regarding the
-basic concepts of manipulating data via the field methods.<br><br>
+The main objective of this chapter is to provide basic information regarding
+various field types supported by the library.<br><br>
Field names can be up to ten bytes in length and can contain characters, numbers
or special characters in the name. The field methods are used to manipulate
@@ -36,7 +30,7 @@ the data in a record of a data file. There are several types of fields.<br><br>
<br><br>
Field names, types and lengths are defined when a data file is created.
After the file is created, the field characteristics can not be changed. To
-change field characteristics, a new database must be defined with the new
+change field characteristics, a new database table must be defined with the new
field requirements.<br><br>
<h2>Memo Fields</h2>
@@ -63,27 +57,15 @@ which is large enough to handle the memo data.<br><br>
The Xbase routines can access field data via using field names or field
numbers. Field numbers are numbered 0-n where the first field in a datafile
is field 0 going through the last field n. Accessing fields by number is
-more efficient than accessing by name.<br><br>
-
-<h2>Record Schema</h2>
-
-The record schema of a file can be found in the documentation for method
-CreateDatabase in the Database Methods chapter, or view example program
-sample1.cpp.</A><br><br>
+slightly more efficient than accessing by name.<br><br>
<h2>Strings</h2>
-Beginning with Release 1.8.0a, Xbase includes support for a string class
-<em>xbString</em>. The original thinking was not to include a string
-class in the library, and encourage users to use the string class
-native to the user's compiler. But as C++ does not have a native way
-to handle strings, and there is not a standard string class across C++
-compilers, it was decided to include a lightweight string class with the
-library. In some cases this is redundant, but it is portable.
-<br><br>
-The xbString class interface was derived from the <em>Draft Standard C++
-Library by P.J. Plauger</em> and modified. If you are familiar with
-other string classes, this one should feel similar.
+Xbase64 includes support for a string class <em>xbString</em>.
+The xbString class interface was originally derived from the
+<em>Draft Standard C++ Library by P.J. Plauger</em> and modified.
+If you are familiar with other string classes, this one should be similar.
+Strings can be used to manage strings of character data.
<br><br>
<hr>
<p><img src="xbase.jpg"><hr>
diff --git a/html/xbc4.htm b/docs/html/xbc4.htm
index f570ed7..f494629 100755
--- a/html/xbc4.htm
+++ b/docs/html/xbc4.htm
@@ -9,16 +9,6 @@ The objective of this chapter is to provide information regarding
the basic concepts of date arithmetic and supply generic
C/C++ date methods.<br><br>
-Two common things of all programmers is that if they write
-enough code, they will eventually have to deal with dates. They
-may be Julian dates, Gregorian dates, or a date with their best
-freind's girl, but they'll eventually be working with dates. The
-other thing is that most programmers don't have the time or don't
-want to spend time writing mundane date routines.<br><br>
-
-To explain how dates work, I'll give a brief overview and history of Julian
-dates, Gregorian dates, leap years and leap centuries.
-
<h2>Leap Years</h2>
Due to the fact that it actually takes about 365 1/4 days for
@@ -66,7 +56,7 @@ To calculate a future or past date, convert the base date to a Julian date,
add (or subtract) the number of days necessary to (from) it and convert the
julian date back to a Gregorian date.<br><br>
-The Julian date routines use a base date of 01/01/1900.<br><br>
+The Julian date routines use a base date of 01/01/0001.<br><br>
<h2>Gregorian Dates</h2>
@@ -79,72 +69,11 @@ The methods supplied with this software are based on gregorian dates with
the format of CCYYMMDD for century, year, month and day.<br><br>
-<h2>CASTELLANO options</h2>
-
-There is an option in the <em>options.h</em> file for enabling the date routines
-to return Spanish values for days, weeks and months.<br><br>
-#define CASTELLANO<br><br>
-
<h2>Date Formats</h2>
All dates are stored in the .DBF files with format CCYYMMDD.<br><br>
-
All date routines work with dates formated with the same CCYYMMDD format.<br><br>
-<h2>Sample Program</h2>
-
-<xmp>
-#include <iostream.h>
-#include <xbase/xbase.h>
-
-main()
-{
- xbXBase x;
- long l;
-
- cout << "\nThis program tests the XDATE routines\n\n";
-
-
- cout << "\nThis year is " << x.YearOf ( x.Sysdate() );
- cout << "\nThis Month is " << x.MonthOf( x.Sysdate() );
- cout << "\nToday is day " << x.DayOf( WEEK, x.Sysdate()) << " of the week";
- cout << "\nToday is day " << x.DayOf( MONTH, x.Sysdate()) << " of the month";
- cout << "\nToday is day " << x.DayOf( YEAR, x.Sysdate()) << " of the year";
-
- if( x.IsLeapYear( x.Sysdate()))
- cout << "\nThis is a leapyear";
- else
- cout << "\nThis is not a leap year.";
-
- cout << "\nToday is " << x.Sysdate();
-
- if( x.DateIsValid( "19951301" ))
- cout << "\n19951301 is a valid date";
- else
- cout << "\n19951301 is not a valid date";
-
- l = x.JulianDays( "19951101" ) - x.JulianDays( "19951001" );
-
- cout << "\nThere are " << l
- << " days between 10/1/95 and 11/1/95.";
-
- cout << "\nIn 7 days it will be "
- << x.JulToDate8( x.JulianDays( x.Sysdate()) + 7L );
-
- cout << "\nToday is " << x.CharDayOf( x.Sysdate());
- cout << "\nThis month is " << x.CharMonthOf( x.Sysdate());
-
- cout << "\nFormat (YYDDD) ";
- cout << x.FormatDate( "YYDDD", x.Sysdate());
- cout << "\nFormat (MM/DD/YY) ";
- cout << x.FormatDate( "MM/DD/YY", x.Sysdate());
- cout << "\nFormat (MMMM DD,YYYY) ";
- cout << x.FormatDate( "MMMM DD,YYYY", x.Sysdate());
- cout << "\nFormat (DDDD, MMMM DD YYYY) ";
- cout << x.FormatDate( "DDDD, MMMM DD YYYY", x.Sysdate());
- cout << "\n";
-}
-</xmp>
<hr>
<p><img src="xbase.jpg"><br><hr>
</BODY>
diff --git a/docs/html/xbc5.htm b/docs/html/xbc5.htm
new file mode 100755
index 0000000..f798125
--- /dev/null
+++ b/docs/html/xbc5.htm
@@ -0,0 +1,205 @@
+<!DOCTYPE HTML PUBLIC>
+<html>
+<title>Xbase DBMS Chapter 5</title>
+<body bgcolor=#FFFFFF>
+<h1><p align="center">Expression Handling<br></h1>
+<p align="center">Chapter Updated 11/27/22</p><hr>
+
+<h3>Overview</h3>
+
+The main objective of this chapter is to provide information regarding the
+basic concepts of using the Xbase64 Expression module.<br><br>
+
+The Xbase64 library includes an expression parsing routine which assists
+application programmers by providing a high level data manipulation tool and
+also allows for building complex index keys.
+
+The functions included were derived from dBASE III Plus, dBASE IV and Clipper.
+<br><br>
+Expressions are primarily used for index key definitions and filter criteria, but
+can also be used for other tasks as well.
+<br><br>
+
+<h3>Internal fuctioning</h3>
+The expression module works in two phases. Firstly, method
+<em>ParseExpression</em> is called and builds an expression tree from
+all the components of the expression. The tree is made up of individual
+nodes. The expression is checked for valid field names, literals,
+operands and functions. Any field references are resolved. If fields
+are used in an expression and the database name for the field is not
+included in the name with the -> operand, the routines assume the
+associated database has been successfully opened.
+<br><br>
+Secondly, method <em>ProcessExpression</em> is called to process the
+expression tree created by ParseExpression(). The routine parses each
+node in the expression tree, executing functions, processing operands
+and manipulating data to produce the desired result.<br><br>
+
+If an expression will be processed repeatedly, it is best to pre-parse the
+tree using <em>ParseExpression</em>, then for each new call to the expression,
+execute method <em>ProcessExpression</em> which processes the tree.
+
+
+<h3>Expression Return Types</h3>
+Expressions will return a type of CHAR, NUMERIC, DATE or LOGICAL.<br><br>
+
+An expression return type can be determined with method <em>
+GetExpressionResultType</em> after parsing it.<br><br>
+
+Expressions returning a return type of CHAR are limited to a 200 byte internal
+buffer. There is also a 100 byte limit for NDX and MDX index key support. If
+the 200 byte limit is not large enough for your application, adjust field
+<em>enum { WorkBufMaxLen = 200 };</em> in file <em>exp.h</em>.
+
+<br><br>
+<table border=1>
+<tr><th>Return Type</th><th>XBase Type</th></tr>
+<tr><td>CHAR</td><td>xbString</td></tr>
+<tr><td>NUMERIC</td><td>xbDouble</td></tr>
+<tr><td>DATE</td><td>xbDate</td></tr>
+<tr><td>LOGICAL</td><td>xbBool</td></tr>
+</table>
+
+<br><br>
+Date routines return an xbDate result. In addition, the date value can be
+extracted using GetStringResult() which returns YYYYMMDD or GetDoubleResult()
+which returns a julian value.
+
+<br><br>
+<h3>Expression Functions</h3>
+Each expression function also has a corresponding C++ function. It is
+slightly more efficient to call the C++ functions directly, rather than
+execute the expression parsing routines.<br><br>
+
+To add a new function, find a function that is similar to what you need, copy
+the code and modify xbxbase.h, xbfuncs.cpp, xbexp.cpp and xb_test_expression.cpp.
+
+
+<table border=1>
+<tr><th>Function Name</th><th>Return Type</th><th>Description</th></tr>
+<tr><td>ABS</td><td>N</td><td>Calculate absolute value of numeric expression</td></tr>
+<tr><td>ALLTRIM</td><td>C</td><td>Trim leading andtrailing whitespace from a string</td></tr>
+<tr><td>ASC</td><td>N</td><td>Return ASCII code for first character in a string</td></tr>
+<tr><td>AT</td><td>N</td><td>Return starting position of a string within a string</td></tr>
+<tr><td>CDOW</td><td>C</td><td>Retun character weekday name for a date</td></tr>
+<tr><td>CHR</td><td>C</td><td>Convert numeric expression to a character</td></tr>
+<tr><td>CMONTH</td><td>C</td><td>Return month name for a date</td></tr>
+<tr><td>CTOD</td><td>D</td><td>Return date from a character date input</td></tr>
+<tr><td>DATE</td><td>D</td><td>Return system date</td></tr>
+<tr><td>DAY</td><td>N</td><td>Return the day of the month from a date</td></tr>
+<tr><td>DEL</td><td>C</td><td>Return record deletion status for a record</td></tr>
+<tr><td>DELETED</td><td>L</td><td>Return record deletion status for a record<</td></tr>
+<tr><td>DESCEND</td><td>1</td><td>Clipper DESCEND function</td></tr>
+<tr><td>DOW</td><td>N</td><td>Return number of day of week</td></tr>
+<tr><td>DTOC</td><td>C</td><td>Return character date from input date</td></tr>
+<tr><td>DTOS</td><td>C</td><td>Return character CCYYMMDD date from input date</td></tr>
+<tr><td>EXP</td><td>N</td><td>Return exponent value</td></tr>
+<tr><td>IIF</td><td>C</td><td>Immediate If</td></tr>
+<tr><td>INT</td><td>N</td><td>Convert number to integer, truncate any decimals</td></tr>
+<tr><td>ISALPHA</td><td>L</td><td>Check if string begins with alpha character</td></tr>
+<tr><td>ISLOWER</td><td>L</td><td>Check if string begins with lower case alpha character</td></tr>
+<tr><td>ISUPPER</td><td>L</td><td>Check if string begins with upper case character</td></tr>
+<tr><td>LEFT</td><td>C</td><td>Return left characters from a string</td></tr>
+<tr><td>LEN</td><td>N</td><td>Return lenght of string</td></tr>
+<tr><td>LOG</td><td>N</td><td>Calculate logarithm</td></tr>
+<tr><td>LOWER</td><td>C</td><td>Convert upper case to lower case</td></tr>
+<tr><td>LTRIM</td><td>C</td><td>Trim left side of a string</td></tr>
+<tr><td>MAX</td><td>N</td><td>Return higher of two values</td></tr>
+<tr><td>MIN</td><td>N</td><td>Return lesser of two values</td></tr>
+<tr><td>MONTH</td><td>N</td><td>Return number of month for a given date</td></tr>
+<tr><td>RECNO</td><td>N</td><td>Return current rec number for a given table</td></tr>
+<tr><td>RECCOUNT</td><td>N</td><td>Return number of records in a given table</td></tr>
+<tr><td>REPLICATE</td><td>C</td><td>Repeat character expression N times</td></tr>
+<tr><td>RIGHT</td><td>C</td><td>Return right characters from as tring</td></tr>
+<tr><td>RTRIM</td><td>C</td><td>Trim right side of string</td></tr>
+<tr><td>SPACE</td><td>C</td><td>Generate a string of N spaces</td></tr>
+<tr><td>SQRT</td><td>N</td><td>Calculate square root</td></tr>
+<tr><td>STOD</td><td>D</td><td>Convert 8 byte CCYYMMDD date to date</td></tr>
+<tr><td>STR</td><td>C</td><td>Convert number to character string</td></tr>
+<tr><td>STRZERO</td><td>C</td><td>Convert number to character string with leading zeroes</td></tr>
+<tr><td>SUBSTR</td><td>C</td><td>Extract portion oif one string from another string</td></tr>
+<tr><td>TRIM</td><td>C</td><td>Trim left and right sides of a string</td></tr>
+<tr><td>UPPER</td><td>C</td><td>Conver lower case to upper case</td></tr>
+<tr><td>VAL</td><td>N</td><td>Convert numeric characters to number</td></tr>
+<tr><td>YEAR</td><td>N</td><td>Return year for a given date</td></tr>
+</table>
+
+<br><br>
+<h3>Expression Components</h3>
+Expressions are made up of one or more tokens. A token is one of literal,
+database field, operand or function. Literals are either numeric or character.
+Character literals are enclosed in 'single' or "double" quotes. numeric
+literals are a series of one or more contiguous numerals, ".", "+" or "-'".
+<br><br>
+A field is simply a field name in the default database, or is in the form
+of database->fieldname.
+
+
+<br><br>
+<h3>Expression Literals</h3>
+
+<table border=1>
+<tr><th>Type</th><th>Example</th></tr>
+<tr><td>CHAR</td><td>"literal" or 'literal'</td></tr>
+<tr><td>NUMERIC</td><td>+99999.99</td></tr>
+<tr><td>DATE</td><td>{10/07/60} or {02/09/1989}</td></tr>
+</table>
+
+
+
+<br><br>
+<h3>Expression Operators</h3>
+<table border=1>
+<tr><th>Type</th><th>Operator</th><th>Precedence</th><th>Result</th><th>Notes</th></tr>
+<tr><td>Parens</td><td>()</td><td>12</td></tr>
+<tr><td>Numeric Operator</td><td>+ (unary)</td><td>11</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>- (unary)</td><td>11</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>--X</td><td>10</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>++X</td><td>10</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>**</td><td>9</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>^</td><td>9</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>%</td><td>8</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>*</td><td>8</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>/</td><td>8</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>+ Addition</td><td>7</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>- Subtraction</td><td>7</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>X--</td><td>6</td><td>N</td></tr>
+<tr><td>Numeric Operator</td><td>X++</td><td>6</td><td>N</td></tr>
+<tr></tr>
+<tr><td>String Operator</td><td>+</td><td>5</td><td>C</td><td>Concatonate 1</td></tr>
+<tr><td>String Operator</td><td>-</td><td>5</td><td>C</td><td>Concatonate 2</td></tr>
+<tr></tr>
+<tr><td>Relational Operator</td><td>=</td><td>4</td><td>L</td><td>N,C,D</td></tr>
+<tr><td>Relational Operator</td><td>#, <>, !=</td><td>4</td><td?L</td><td>N,C,D</td></tr>
+<tr><td>Relational Operator</td><td><</td><td>4</td><td>L</td><td>N,C,D</td></tr>
+<tr><td>Relational Operator</td><td>></td><td>4</td><td>L</td><td>N,C,D</td></tr>
+<tr><td>Relational Operator</td><td><=</td><td>4</td><td>L</td><td>N,C,D</td></tr>
+<tr><td>Relational Operator</td><td>>=</td><td>4</td><td>L</td><td>N,C,D</td></tr>
+<tr><td>Relational Operator</td><td>$</td><td>4</td><td>L</td><td>N,C,D</td></tr>
+<tr><td>Relational Operator</td><td>==</td><td></td><td></td><td>Clipper operator, not implemented yet</td></tr>
+<tr></tr>
+<tr><td>Logical Operator</td><td>NOT</td><td>3</td><td>L</td><td>Evaluated after all math and relational operators</td></tr>
+<tr><td>Logical Operator</td><td>.NOT.</td><td>3</td><td>L</td><td>Evaluated after all math and relational operators</td></tr>
+<tr><td>Logical Operator</td><td>AND</td><td>2</td><td>L</td><td>Evaluated after all math and relational operators</td></tr>
+<tr><td>Logical Operator</td><td>.AND.</td><td>2</td><td>L</td><td>Evaluated after all math and relational operators</td></tr>
+<tr><td>Logical Operator</td><td>OR</td><td>1</td><td>L</td><td>Evaluated after all math and relational operators</td></tr>
+<tr><td>Logical Operator</td><td>.OR.</td><td>1</td><td>L</td><td>Evaluated after all math and relational operators</td></tr>
+</table>
+
+<br><br>
+<h3>Examples</h3>
+<li>CUSTOMERS->LNAME + ", " + CUSTOMERS->FNAME
+<li>LNAME + ", " + FNAME
+<li>STARTDT + 90
+<li>YEAR( TODAY() )
+<li>IIF( "A" = "N", "true result", "false result" )
+<li>IIF( "A" = "N" .OR. 2 > 1 , "true result", "false result" )
+<li>IIF( .NOT. "A" = "N", "true result", "false result" )
+<li>.NOT. DELETED()
+<br><br>
+
+
+<hr>
+<p><img src="xbase.jpg"><br><hr>
+</BODY>
+</HTML>
diff --git a/docs/html/xbc6.htm b/docs/html/xbc6.htm
new file mode 100755
index 0000000..a7e1746
--- /dev/null
+++ b/docs/html/xbc6.htm
@@ -0,0 +1,137 @@
+<!DOCTYPE HTML PUBLIC>
+<HTML>
+<TITLE>Xbase DBMS Chapter 6</TITLE>
+<BODY BGCOLOR=#FFFFFF>
+<H1><p align="center">Index Overview</p></H1>
+<p align="center">Chapter Updated 11/27/222</p><hr>
+
+The objective of this chapter is to provide information regarding
+the basic concepts of index processing for the Xbase library.<br><br>
+
+
+<h2>Overview</h2>
+
+The Xbase library is designed to support multiple index types simultaneously.
+Dbase, Clipper and Foxbase each had their own index formats and ultimately the
+goal is to provide support for all the legacy index file formats.
+
+<br><br>
+The 4.0.x rewrite includes the NDX and MDX formats. Earlier versions of the
+library included NTX and CDX formats which will be brought forward into the
+library rewrite at some point in the future.
+
+
+<h2>Tags</h2>
+
+Each index file contains one or more tags depending on the file type. Each tag is a sort order
+and has characteristics: Sort order (ASC or DESC), unique or not unique and some formats support filtering.
+Each open table (dbf file) has an "active tag" for database operations.
+
+
+<h2>Index updates</h2>
+
+The library automatically updates all tags in all open index files.
+
+
+<br><br>
+<h2>Index File Types</h2>
+
+<table border=1>
+<tr><th>File<br>Type</th><th>Source</th><th>Max Tags<br>Per File</th><th>Auto Opened</th><th>Sort Order</th><th>Unique Keys</th>
+ <th>Reclaimed Nodes</th><th>Filter Support</th><th>Status</th></tr>
+<tr>
+ <td>NDX</td><td>dBase</td>
+ <td><center>1</center></td>
+ <td><center>Optional</center></td>
+ <td>ASC only</td>
+ <td><center>Y</center></td>
+ <td><center>N</center></td>
+ <td><center>N</center></td>
+ <td><center>Available in 4.0.1</center></td>
+</tr>
+<tr>
+ <td>MDX</td><td>dBase</td>
+ <td><center>47</center></td>
+ <td><center>Yes</center></td>
+ <td><center>ASC or DESC</center></td>
+ <td><center>Y</center></td>
+ <td><center>Y</center></td>
+ <td><center>Y</center></td>
+ <td><center>Available in 4.0.1</center></td>
+</tr>
+<tr>
+ <td>NTX</td>
+ <td>Clipper</td>
+ <td><center>1</center></td>
+ <td><center>Optional</center></td>
+ <td><center>?</center></td>
+ <td><center>?</center></td>
+ <td><center>?</center></td>
+ <td><center>?</center></td>
+ <td><center>Pending upgrades</center></td>
+</tr>
+<tr>
+ <td>CDX</td>
+ <td>Fox Pro</td>
+ <td><center>?</center></td>
+ <td><center>?</center></td>
+ <td><center>?</center></td>
+ <td><center>?</center></td>
+ <td><center>?</center></td>
+ <td><center>?</center></td>
+ <td><center>Pending upgrades</center></td>
+<tr>
+<tr>
+ <td>IDX</td><td>Fox Pro</td><td></td><td></td><td></td><td></td><td></td><td></td><td>Undeveloped</td>
+<tr>
+
+</table>
+
+<br><br>
+<h2>Index/Tag Methods</h2>
+<table border=1>
+<tr><th>Method</th><th>Description</th></tr>
+
+<tr>
+ <td>xbDbf::CheckTagIntegrity</td><td>Checks a tag for missing or duplicate entries. Available if XB_DEBUG_SUPPORT is on.</td>
+</tr>
+<tr>
+ <td>xbDbf::CreateTag</td><td>Create a new tag.</td>
+</tr>
+<tr>
+ <td>xbDbf::DeleteTag</td><td>Delete existing tag.</td>
+</tr>
+<tr>
+ <td>xbDbf::Find</td><td>Find key value for the active tag.</td>
+</tr>
+<tr>
+ <td>xbDbf::GetFirsKey</td><td>Retrieve the first key for the active tag.</td>
+</tr>
+<tr>
+ <td>xbDbf::GetLastKey</td><td>Retrieve the last key for the active tag.</td>
+</tr>
+<tr>
+ <td>xbDbf::GetNextKey</td><td>Retrieve the next key for the active tag.</td>
+</tr>
+<tr>
+ <td>xbDbf::GetPrevKey</td><td>Retrieve the previous key for the active tag.</td>
+</tr>
+<tr>
+ <td>xbDbf::GetCurTag</td><td>Retrieve the tag name key for the active tag.</td>
+</tr>
+<tr>
+ <td>xbDbf::OpenIndex</td><td>Open an index file. Only used for index files that aren't automatically opened.</td>
+</tr>
+<tr>
+ <td>xbDbf::Reindex</td><td>Rebuild a tag. Available if XB_DEBUG_SUPPORT is on.</td>
+</tr>
+<tr>
+ <td>xbDbf::SetCurTag</td><td>Set current tag.</td>
+</tr>
+</table>
+
+<br><br>
+<hr>
+<p><img src="xbase.jpg"><br><hr>
+</BODY>
+</HTML>
diff --git a/html/xbc6.htm b/docs/html/xbc7.htm
index f5cf75d..20a60de 100755
--- a/html/xbc6.htm
+++ b/docs/html/xbc7.htm
@@ -1,9 +1,9 @@
<!DOCTYPE HTML PUBLIC>
<HTML>
-<TITLE>Xbase DBMS Chapter 6</TITLE>
+<TITLE>Xbase DBMS Chapter 7</TITLE>
<BODY BGCOLOR=#FFFFFF>
<H2><p align="center">NDX Indices</p></H2>
-<p align="center">Chapter Updated 4/12/04</p><hr>
+<p align="center">Chapter Updated 11/27/22</p><hr>
The objective of this chapter is to provide information regarding the
basic concepts of how .NDX index files work in the Xbase environment.<br><br>
@@ -16,8 +16,11 @@ and by examining the structure of known good NDX indexes.<br><br>
<li>NDX indices maintain keys in ascending sort order only.<br><br>
<li>NDX indices support <em>unique</em> or <em>non unique</em> keys.<br><br>
-<em>Unique</em> keys must be unique. The database update routines will
-fail if an attempt to add a non-unique key is performed.<br><br>
+<em>Unique</em> keys must be unique if the UniqueKeyOption is not set to XB_EMULATE_DBASE.
+If the UniqueKeyOption is set to XB_EMULATE_DBASE, then the database update routines will
+add a record to the table, but not add a corresponding duplicate key to the index tag.
+The UniqueKeyOption is off (don't allow duplicates) by default.
+<br><br>
<em>Non-unique</em> Keys are not required to be unique, duplicate
keys are allowed if the index is created with the XB_NOT_UNIQUE
diff --git a/docs/html/xbc8.htm b/docs/html/xbc8.htm
new file mode 100755
index 0000000..cb47657
--- /dev/null
+++ b/docs/html/xbc8.htm
@@ -0,0 +1,79 @@
+<!DOCTYPE HTML PUBLIC>
+<HTML>
+<TITLE>Xbase DBMS Chapter 8</TITLE>
+<BODY BGCOLOR=#FFFFFF>
+<H2><p align="center">MDX Indices</p></H2>
+<p align="center">Chapter Updated 11/28/22</p><hr>
+
+The objective of this chapter is to provide information regarding the
+basic concepts of how .MDX index files work in the Xbase environment.<br><br>
+
+The information in this chapter has been gathered by searching the internet
+and by examining the structure of known good <DX indexes.<br><br>
+
+<h4>MDX Index File Characteristics</h4>
+
+<li>MDX files are the same name as the corresponding DBF file with an MDX extension.
+<li>MDX files are automatically opened by the library when the DBF file is opened.
+<li>MDX index files (aka prod indices) contain from one to 47 tags, where each tag has it's own key characteristics.
+<li>MDX indices maintain keys in either ascending or descending sort order.
+<li>MDX indices support filtered keys. For example, a filter of <b>.NOT. DELETED()</b> will keep deleted records out
+of the index tag.
+<li>MDX indices are automatically updated by the Xbase library after the
+indices are opened.
+
+<li>MDX indices support <em>unique</em> or <em>non unique</em> keys.<br><br>
+
+<em>Unique</em> keys must be unique if the UniqueKeyOption is not set to XB_EMULATE_DBASE.
+If the UniqueKeyOption is set to XB_EMULATE_DBASE, then the database update routines will
+add a record to the table, but not add a corresponding duplicate key to the index tag.
+The UniqueKeyOption is off (don't allow duplicates) by default.
+<br><br>
+
+<em>Non-unique</em> Keys are not required to be unique, duplicate
+keys are allowed if the index is created with the XB_NOT_UNIQUE
+setting. Duplicate keys are stored in record number order.<br><br>
+
+
+<li>Character keys are left justified and padded on the right with spaces.
+<li>Numeric keys are stored as twelve byte BCD values.
+<li>Date keys are stored as eight byte double julian values.
+
+<h4>MDX File Internals</h4>
+
+The following information is not needed to use the library, it is just included
+for general information.<br><br>
+
+MDX files are comprised of 512 pages where multiple pages make a block. The default
+setting is 1024 blocks, each block containing two pages.<br><br>
+
+The first four pages contain:
+<li>Bytes 0 - 543 contain general file information.
+<li>Bytes 544 - 2047 is a 47 item table containing specific tag information.
+<br><br>
+
+Pages five and beyound:
+<li>Bytes 2048 and beyond contain tag header blocks, interior nodes and leaf nodes.
+
+<br><br>
+
+<h4>Interior and Leaf Nodes</h4>
+
+Interior Nodes and Leaf Nodes share the same structure in an NDX file with
+the exception that interior nodes have a non zero number immediately
+after the rightmost key on the node.
+
+Interior nodes point to other interior nodes or leaf nodes and leaf nodes point
+to records in a DBF file. Interior nodes are optional nodes in an MDX file,
+however if there are more than a few keys in the index there will
+certainly be one or more interior nodes in the file. There will
+always be at least one leaf node per tag in the file. Leaf nodes
+contain DBF record numbers which point to the location of the record
+in the DBF file.<br><br>
+
+<br><br>
+
+<hr>
+<p><img src="xbase.jpg"><br><hr>
+</BODY>
+</HTML>
diff --git a/html/xbc7.htm b/docs/html/xbc9.htm
index bffb5ea..297a702 100755
--- a/html/xbc7.htm
+++ b/docs/html/xbc9.htm
@@ -1,9 +1,12 @@
<!DOCTYPE HTML PUBLIC>
<HTML>
-<TITLE>Xbase DBMS Chapter 7</TITLE>
+<TITLE>Xbase DBMS Chapter 9</TITLE>
<BODY BGCOLOR=#FFFFFF>
<H2><p align="center">NTX Indices</p></H2>
-<p align="center">Chapter Updated 2/12/99</p><hr>
+<p align="center">Chapter Updated 11/28/22</p><hr>
+
+
+<h3>This chapter might be out of date. The NTX module is pending review and updates for release 4.x.x</h3>
The objective of this chapter is to provide information regarding the
basic concepts of how .NTX index files work in the Xbase environment.<br><br>
diff --git a/docs/license/gpl-3.0.txt b/docs/license/gpl-3.0.txt
new file mode 100755
index 0000000..94a9ed0
--- /dev/null
+++ b/docs/license/gpl-3.0.txt
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/docs/license/preamble.txt b/docs/license/preamble.txt
new file mode 100755
index 0000000..a8988bf
--- /dev/null
+++ b/docs/license/preamble.txt
@@ -0,0 +1,11 @@
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net \ No newline at end of file
diff --git a/docs/misc/AutoUpdate.txt b/docs/misc/AutoUpdate.txt
new file mode 100755
index 0000000..909bc18
--- /dev/null
+++ b/docs/misc/AutoUpdate.txt
@@ -0,0 +1,54 @@
+
+Auto Update Design / Functionality
+
+
+Auto update functionality in the library is used to automatically update
+records in tables, when the user moves off a particular record without
+explicitly posting an update for the new data updates.
+
+The auto Update logic defaults to ON, and there is nothing that the
+end user needs to worry about.
+
+However, if it is desired to change the behavior of the library, the
+Auto Update logic can be turned off.
+
+There are two levels to the Auto Update logic.
+
+The first level is the DBMS level, which controls how all tables are
+handled, if the Auto Update logic is not over ridden at the table level.
+
+The second level is the table level. The DBMS Auto Update logic can
+be over ridden at the table level.
+
+
+For the DBMS level settings, see methods:
+ xBase::GetDefaultAutoUpdate
+ xBase::SetDefaultAutoUpdate
+
+At the DBMS level, there are two settings
+ xbFalse = AutoUpdate is off
+ xbTrue = AutoUpdate is on
+
+For the Table level settings, see methods:
+ xbDbf::SetAutoUpdate
+ xbDbf::GetAutoUpdate
+
+At the table level, there are three settings
+ -1 = Use the DBMS setting (this is the default)
+ 0 = Do not use Auto Update on this table
+ 1 = Use Auto Update on this table.
+
+These seetings would be for a more advanceed implementation of
+XBase64. For the most part, you can ignore these settings and
+use the defaults that are already set in the library and you should
+be OK.
+
+
+This document is missing some functions
+
+x:DisableDefaultAutoLock()
+x:EnableDefaultAutoLock()
+
+
+
+
diff --git a/docs/misc/DirectoryStructure.txt b/docs/misc/DirectoryStructure.txt
new file mode 100755
index 0000000..9a7ba66
--- /dev/null
+++ b/docs/misc/DirectoryStructure.txt
@@ -0,0 +1,32 @@
+
+6/14/14 - The directory structure was updated with xb64 V4.0.0
+
+
+
+xb64
+ xb64 (Source Tree)
+ include
+ xb64
+ examples
+ utils
+
+ docs
+ html
+ license
+ misc
+
+ Linux (Build Tree for Linux)
+ bin
+ Processor
+
+ Windows (Build Tree for Windows)
+ bin
+ Processor
+
+ Mac (Build Tree for Mac)
+ bin
+ Processor
+
+ OtherPlatforms (Build tree for other platforms)
+ bin
+ Processor \ No newline at end of file
diff --git a/docs/misc/ExpressionNotes.ods b/docs/misc/ExpressionNotes.ods
new file mode 100755
index 0000000..6817de2
--- /dev/null
+++ b/docs/misc/ExpressionNotes.ods
Binary files differ
diff --git a/docs/misc/Expressions.txt b/docs/misc/Expressions.txt
new file mode 100755
index 0000000..d6eed0d
--- /dev/null
+++ b/docs/misc/Expressions.txt
@@ -0,0 +1,13 @@
+
+
+
+Expression Date Logic
+
+
+ DATE - DATE returns number
+ DATE - Number returns date
+ DATE + Number returns date
+ DATE -= Number returns date
+ DATE += Number returns date
+ DATE ++ returns date
+ DATE -- returns date \ No newline at end of file
diff --git a/docs/misc/FileTypeByte.txt b/docs/misc/FileTypeByte.txt
new file mode 100755
index 0000000..11d4823
--- /dev/null
+++ b/docs/misc/FileTypeByte.txt
@@ -0,0 +1,53 @@
+
+
+
+Valid dBASE for Windows table file, bits 0-2 indicate version number: 3 for dBASE Level 5, 4 for dBASE Level 7.
+Bit 3 and bit 7 indicate presence of a dBASE IV or dBASE for Windows memo file;
+bits 4-6 indicate the presence of a dBASE IV SQL table;
+bit 7 indicates the presence of any .DBT memo file (either a dBASE III PLUS type or a dBASE IV or dBASE for Windows memo file).
+
+
+The first byte of the DBF file determines the xbase file version
+
+76543210
+00000000
+
+| - True if any memo file
+ | - True if Version 4 memo file
+ || - True for both V3 and V4 files
+
+
+
+
+00000011 - Could be a version III or version IV file, lib defaults to IV
+10000011 - Version III with memo
+10001011 - Version IV with memo
+
+
+
+Logic for checking for which version
+
+ 3 bit 4 not set, bit 5&6 set, if bit 0 set and bit 3 not set, then V3
+ 4 bit 4 not set, bit 5&6 set, if bit 0 set and bit 3 set
+ 5 bit 4 not set, bit 5&6 set, if bit 0 set and bit 3 set
+>=7 bit 4 set
+
+
+
+ bit 0 bit 3 bit 4 bit 5 bit 6
+V III Optional 0 0 1 1 No field type F
+V IV Optional if bit0 then 1 0 1 1 Supports field type F
+V V Optional if bit0 then 1 0 1 1 Supports field type F
+
+V VII ? ? 1 0 0
+
+
+
+pseudocode logic
+
+if not bit 4, and bit 5 and bit 6
+{
+ if V4 compiled in, if not (bit0 and not bit3) return V4
+ else
+ if V3 compiled in and not bit3, and not prod mdx, return V3
+} \ No newline at end of file
diff --git a/docs/misc/IndexNotes.ods b/docs/misc/IndexNotes.ods
new file mode 100755
index 0000000..0b3cabc
--- /dev/null
+++ b/docs/misc/IndexNotes.ods
Binary files differ
diff --git a/docs/misc/RealDelete.txt b/docs/misc/RealDelete.txt
new file mode 100755
index 0000000..7770afc
--- /dev/null
+++ b/docs/misc/RealDelete.txt
@@ -0,0 +1,88 @@
+
+
+Earlier versions of the library included an Xbase specific functin called "Real Delete"
+
+The analysis is as follows:
+
+Updates to xbdbf.h and xbdbf.cpp
+
+#ifdef XB_REAL_DELETE
+ ...
+#endif
+
+Functions included:
+
+ RealDeleteOn() Turns on RealDelete
+ RealDeleteOff() Turns off RealDelete
+ GetRealDelete() Returns the status of RealDelete
+
+Narrative:
+
+This should be done before creating a database with xbDbf::CreateDatabase() and
+thereafter before opening a database with xbDbfCreateDatabase()
+
+
+You can not turn on real deletes once a database has been created and records added
+
+
+In the Table header
+bytes 12-15 - FirstFreeRec;
+bytes 16-19 - RealNumRecs
+
+
+Updates to the following methods:
+WriteHeader()
+ReadHeader()
+
+The first four bytes of the deleted record is the record number to the next
+deleted record in the chain
+
+Append Record will pull next record from the chain and attempt to use that
+field, otherwise it will append a new record
+
+GetFirstRecord will skip over deleted records looking for the first record
+which is not deleted
+
+GetLastRecord will skip backwards to the next previous undeleted record
+
+GetPrevRecord skips backwards to the the next previous undeleted record
+
+DeleteRecord
+ -Deletes the memo data
+ - Adds the record to the front of the free chain
+
+UndeleteRecord
+ - Always returns XB_INVALID_RECORD
+
+PackDatafiles
+ - Deleted Records are skipped
+
+NoOfRecords
+ - Returns no of records not deleted
+
+PhysicalNoOfRecords()
+ - Return NoOfRecs - actual number of records in the file
+
+
+
+Conclusions:
+
+From a campatibility standpoint:
+
+ This setup will only work on the earlier version of the Xbase file format as this would
+ be library specific code.
+
+ Also, once past Dbase V3, the bytes used in the header file are used by Dbase 4,5,7
+
+
+Decision:
+
+ In an effort to make the library as portable as possible moving forward, a decision was made to
+ leave this code out of the basic library. To add this code in the future, a new class can be created
+ using the xbDbf class as a base class, and override the methods mentioned above.
+
+
+
+
+
+
diff --git a/docs/misc/Release.txt b/docs/misc/Release.txt
new file mode 100755
index 0000000..f73af11
--- /dev/null
+++ b/docs/misc/Release.txt
@@ -0,0 +1,34 @@
+
+xb64 4.0.0 Release notes
+
+ List of updates with xbase 4.0.0
+ 1) Converted from automake/autoconf to cmake
+ 2) Updated xbstring logic
+ 3) Created test programs for using in cmake
+ 4) Tested each method in the following environments
+ A) Linux Slackware 64 bit
+ B) Linux Slackware 32 bit
+ C) Mac OSX Lion, 64 bit build
+ D) Windows 64 bit build
+ E) Windows 32 bit build
+ F) Borland 32 bit build
+ 5) Updated the Get/Put field methods so they all have a
+ common look and feel. All the get/put methods now return
+ a return code indicating success/failure.
+ 6) Abstracted file i/o activity into xbFile class - used to
+ isolate the platform specifics out of the main dbms class
+ and improve portability. Utilized 64 bit functions where
+ possible
+ 7) Reworked the Lock logic, tested on various platforms.
+ Mac OSX supports on locking on NFS shares only.
+ Mac does not support locking on SMB shares - OS limitation.
+ Unix based file systems don't support file lock functionality,
+ if using in combination with sdoftware like DBase, Dbase supports
+ exclusive locking which is not supported on native Linux file systems
+ 8) Converted integer field names and checked for correct field lengths
+ xbInt16 16 bit integer
+ xbUInt16 16 bit unsigned integer
+ xbInt32 32 bit integer
+ xbUInt32 32 bit unsigned integer
+ xbInt64 64 bit integer
+ xbUInt64 64 bit unsigned integer
diff --git a/docs/misc/Versions.txt b/docs/misc/Versions.txt
new file mode 100755
index 0000000..2977341
--- /dev/null
+++ b/docs/misc/Versions.txt
@@ -0,0 +1,30 @@
+
+
+
+
+Differences between Dbase III and Dbase IV
+
+ Dbase IV adds field type "F" Float
+ Dbase IV adds a more sophisticated DBT memo file, utilizes logic to reclaim disk space on memo field updates
+ Dbase IV adds support for MDX multi tag indices
+
+
+
+
+Version III Field Types
+
+ C Char
+ N Numeric
+ D Date
+ M Memo
+ L Logical
+
+
+Version IV Field Types
+
+ C Char
+ N Numeric
+ D Date
+ M Memo
+ L Logical
+ F Float (Similar to numeric) \ No newline at end of file
diff --git a/docs/misc/xbTmpFiles.txt b/docs/misc/xbTmpFiles.txt
new file mode 100755
index 0000000..f81bee9
--- /dev/null
+++ b/docs/misc/xbTmpFiles.txt
@@ -0,0 +1,12 @@
+
+
+At times, the Xbase64 library will create temporary work files with the
+following naming pattern: xbtmpNNN.xxx Where NNN is a sequential
+number and xxx is either dbf, dbt, ndx, mdx.
+
+These files should be automatically deleted by the library when
+the task is complete. However, if the program crashes in a particular
+step, the temp files might not be cleaned up automatically.
+
+If you run into these files, and they have an older timestamp on them,
+it is safe to delete them. \ No newline at end of file
diff --git a/examples/Makefile.am b/examples/Makefile.am
deleted file mode 100755
index 248b1ec..0000000
--- a/examples/Makefile.am
+++ /dev/null
@@ -1,23 +0,0 @@
-
-INCLUDES= -I$(topdir) $(all_includes)
-LDADD = -L$(topdir)/xbase64 -lxbase64
-
-# for shadow passwords override the value
-INSTALL_PROGRAM = @INSTALL@
-
-noinst_PROGRAMS = sample1 sample2 sample3 sample4 sample5 \
- exfilter xbstring
-
-exfilter_SOURCES = exfilter.cpp
-sample1_SOURCES = sample1.cpp
-sample2_SOURCES = sample2.cpp
-sample3_SOURCES = sample3.cpp
-sample4_SOURCES = sample4.cpp
-sample5_SOURCES = sample5.cpp
-xbstring_SOURCES = xbstring.cpp
-
-noinst_HEADERS =
-
-EXTRA_DIST = makebcc.bat
-
-CLEANFILES = Makefile.in *.obj *.exe *.dbf *.dbt *.ndx *.ntx compout *.tds *.bak
diff --git a/examples/Makefile.in b/examples/Makefile.in
deleted file mode 100755
index 36e9f79..0000000
--- a/examples/Makefile.in
+++ /dev/null
@@ -1,417 +0,0 @@
-# Makefile.in generated by automake 1.6.3 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = @program_transform_name@
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-
-EXEEXT = @EXEEXT@
-OBJEXT = @OBJEXT@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-
-# for shadow passwords override the value
-INSTALL_PROGRAM = @INSTALL@
-AMTAR = @AMTAR@
-AS = @AS@
-AWK = @AWK@
-CC = @CC@
-CXX = @CXX@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
-GXXVER = @GXXVER@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-RELEASE = @RELEASE@
-RHREL = @RHREL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XSUBDIRS = @XSUBDIRS@
-am__include = @am__include@
-am__quote = @am__quote@
-doxygen = @doxygen@
-install_sh = @install_sh@
-topdir = @topdir@
-
-INCLUDES = -I$(topdir) $(all_includes)
-LDADD = -L$(topdir)/xbase64 -lxbase64
-
-noinst_PROGRAMS = sample1 sample2 sample3 sample4 sample5 \
- exfilter xbstring
-
-
-exfilter_SOURCES = exfilter.cpp
-sample1_SOURCES = sample1.cpp
-sample2_SOURCES = sample2.cpp
-sample3_SOURCES = sample3.cpp
-sample4_SOURCES = sample4.cpp
-sample5_SOURCES = sample5.cpp
-xbstring_SOURCES = xbstring.cpp
-
-noinst_HEADERS =
-
-EXTRA_DIST = makebcc.bat
-
-CLEANFILES = Makefile.in *.obj *.exe *.dbf *.dbt *.ndx *.ntx compout *.tds *.bak
-subdir = examples
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/xbase64/xbconfig.h
-CONFIG_CLEAN_FILES =
-noinst_PROGRAMS = sample1$(EXEEXT) sample2$(EXEEXT) sample3$(EXEEXT) \
- sample4$(EXEEXT) sample5$(EXEEXT) exfilter$(EXEEXT) \
- xbstring$(EXEEXT)
-PROGRAMS = $(noinst_PROGRAMS)
-
-am_exfilter_OBJECTS = exfilter.$(OBJEXT)
-exfilter_OBJECTS = $(am_exfilter_OBJECTS)
-exfilter_LDADD = $(LDADD)
-exfilter_DEPENDENCIES =
-exfilter_LDFLAGS =
-am_sample1_OBJECTS = sample1.$(OBJEXT)
-sample1_OBJECTS = $(am_sample1_OBJECTS)
-sample1_LDADD = $(LDADD)
-sample1_DEPENDENCIES =
-sample1_LDFLAGS =
-am_sample2_OBJECTS = sample2.$(OBJEXT)
-sample2_OBJECTS = $(am_sample2_OBJECTS)
-sample2_LDADD = $(LDADD)
-sample2_DEPENDENCIES =
-sample2_LDFLAGS =
-am_sample3_OBJECTS = sample3.$(OBJEXT)
-sample3_OBJECTS = $(am_sample3_OBJECTS)
-sample3_LDADD = $(LDADD)
-sample3_DEPENDENCIES =
-sample3_LDFLAGS =
-am_sample4_OBJECTS = sample4.$(OBJEXT)
-sample4_OBJECTS = $(am_sample4_OBJECTS)
-sample4_LDADD = $(LDADD)
-sample4_DEPENDENCIES =
-sample4_LDFLAGS =
-am_sample5_OBJECTS = sample5.$(OBJEXT)
-sample5_OBJECTS = $(am_sample5_OBJECTS)
-sample5_LDADD = $(LDADD)
-sample5_DEPENDENCIES =
-sample5_LDFLAGS =
-am_xbstring_OBJECTS = xbstring.$(OBJEXT)
-xbstring_OBJECTS = $(am_xbstring_OBJECTS)
-xbstring_LDADD = $(LDADD)
-xbstring_DEPENDENCIES =
-xbstring_LDFLAGS =
-
-DEFS = @DEFS@
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/xbase64
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/exfilter.Po ./$(DEPDIR)/sample1.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/sample2.Po ./$(DEPDIR)/sample3.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/sample4.Po ./$(DEPDIR)/sample5.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/xbstring.Po
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
-CXXFLAGS = @CXXFLAGS@
-DIST_SOURCES = $(exfilter_SOURCES) $(sample1_SOURCES) $(sample2_SOURCES) \
- $(sample3_SOURCES) $(sample4_SOURCES) $(sample5_SOURCES) \
- $(xbstring_SOURCES)
-HEADERS = $(noinst_HEADERS)
-
-DIST_COMMON = $(noinst_HEADERS) Makefile.am Makefile.in
-SOURCES = $(exfilter_SOURCES) $(sample1_SOURCES) $(sample2_SOURCES) $(sample3_SOURCES) $(sample4_SOURCES) $(sample5_SOURCES) $(xbstring_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .cpp .lo .o .obj
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && \
- $(AUTOMAKE) --gnu examples/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-clean-noinstPROGRAMS:
- @list='$(noinst_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
-exfilter$(EXEEXT): $(exfilter_OBJECTS) $(exfilter_DEPENDENCIES)
- @rm -f exfilter$(EXEEXT)
- $(CXXLINK) $(exfilter_LDFLAGS) $(exfilter_OBJECTS) $(exfilter_LDADD) $(LIBS)
-sample1$(EXEEXT): $(sample1_OBJECTS) $(sample1_DEPENDENCIES)
- @rm -f sample1$(EXEEXT)
- $(CXXLINK) $(sample1_LDFLAGS) $(sample1_OBJECTS) $(sample1_LDADD) $(LIBS)
-sample2$(EXEEXT): $(sample2_OBJECTS) $(sample2_DEPENDENCIES)
- @rm -f sample2$(EXEEXT)
- $(CXXLINK) $(sample2_LDFLAGS) $(sample2_OBJECTS) $(sample2_LDADD) $(LIBS)
-sample3$(EXEEXT): $(sample3_OBJECTS) $(sample3_DEPENDENCIES)
- @rm -f sample3$(EXEEXT)
- $(CXXLINK) $(sample3_LDFLAGS) $(sample3_OBJECTS) $(sample3_LDADD) $(LIBS)
-sample4$(EXEEXT): $(sample4_OBJECTS) $(sample4_DEPENDENCIES)
- @rm -f sample4$(EXEEXT)
- $(CXXLINK) $(sample4_LDFLAGS) $(sample4_OBJECTS) $(sample4_LDADD) $(LIBS)
-sample5$(EXEEXT): $(sample5_OBJECTS) $(sample5_DEPENDENCIES)
- @rm -f sample5$(EXEEXT)
- $(CXXLINK) $(sample5_LDFLAGS) $(sample5_OBJECTS) $(sample5_LDADD) $(LIBS)
-xbstring$(EXEEXT): $(xbstring_OBJECTS) $(xbstring_DEPENDENCIES)
- @rm -f xbstring$(EXEEXT)
- $(CXXLINK) $(xbstring_LDFLAGS) $(xbstring_OBJECTS) $(xbstring_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
- -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exfilter.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sample1.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sample2.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sample3.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sample4.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sample5.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbstring.Po@am__quote@
-
-distclean-depend:
- -rm -rf ./$(DEPDIR)
-
-.cpp.o:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-
-.cpp.obj:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(CXXCOMPILE) -c -o $@ `cygpath -w $<`
-
-.cpp.lo:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-CXXDEPMODE = @CXXDEPMODE@
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
- -rm -f libtool
-uninstall-info-am:
-
-ETAGS = etags
-ETAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- mkid -fID $$unique
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$tags$$unique" \
- || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
- @list='$(DISTFILES)'; for file in $$list; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
- dir="/$$dir"; \
- $(mkinstalldirs) "$(distdir)$$dir"; \
- else \
- dir=''; \
- fi; \
- if test -d $$d/$$file; then \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
- else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS) $(HEADERS)
-
-installdirs:
-
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
- mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
- distclean-generic distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-uninstall-am: uninstall-info-am
-
-.PHONY: GTAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstPROGRAMS distclean distclean-compile \
- distclean-depend distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am info info-am install \
- install-am install-data install-data-am install-exec \
- install-exec-am install-info install-info-am install-man \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- tags uninstall uninstall-am uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/examples/exfilter.cpp b/examples/exfilter.cpp
deleted file mode 100755
index 0dc6c0a..0000000
--- a/examples/exfilter.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/* exfilter.cpp
-
- Xbase project source code
-
- This program demonstrates the usage of the xbFilter class
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-dev@lists.sourceforge.net
-
-
-*/
-
-
-#include <xbase64/xbase64.h>
-
-int main()
-{
-#if defined(XB_FILTERS)
- xbShort rc;
- xbXBase x;
- xbDbf d( &x );
- xbNdx i( &d );
-
- std::cout << "exfilter program executing" << std::endl;
-
- if(( rc = d.OpenDatabase( "MYFILE.DBF" )) != XB_NO_ERROR ){
- std::cout << "Error opening database" << std::endl;
- return 1;
- }
-
- if(( rc = i.OpenIndex( "MYINDEX1.NDX" )) != XB_NO_ERROR ){
- std::cout << "Error opening index" << std::endl;
- return 2;
- }
-
- xbFilter f1( &d, 0, "FLOAT1>1" );
- /* use filter 1 w/o index */
- rc = f1.GetFirstFilterRec();
- while( rc == XB_NO_ERROR ){
- std::cout << "Filter 1 Found Record " << d.GetCurRecNo() << std::endl;
- rc = f1.GetNextFilterRec();
- }
- xbFilter f2( &d, &i, "FLOAT1>1" );
- /* use filter 2 w/ index */
- rc = f2.GetLastFilterRec();
-
- while( rc == XB_NO_ERROR ){
- std::cout << "Filter 2 Found Record " << d.GetCurRecNo() << std::endl;
- rc = f2.GetPrevFilterRec();
- }
- d.CloseDatabase();
-#else
- std::cout << "XB_FILTERS not compiled into library" << std::endl;
-#endif
-
- return 0;
-}
-
diff --git a/examples/makebcc.bat b/examples/makebcc.bat
deleted file mode 100755
index 2facb73..0000000
--- a/examples/makebcc.bat
+++ /dev/null
@@ -1,17 +0,0 @@
-
-rem This batch file builds the xbase sample programs
-rem using the borland 5.5 compiler
-
-del *.bak
-del *.tds
-del *.exe
-del *.obj
-
-bcc32 -I.. -I/borland/bcc55/include -L../xbase64 -L/borland/bcc55/lib sample1.cpp xbase64.lib > compout
-bcc32 -v -I.. -I/borland/bcc55/include -L../xbase64 -L/borland/bcc55/lib sample2.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L../xbase64 -L/borland/bcc55/lib sample3.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L../xbase64 -L/borland/bcc55/lib sample4.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L../xbase64 -L/borland/bcc55/lib sample5.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L../xbase64 -L/borland/bcc55/lib exfilter.cpp xbase64.lib >> compout
-bcc32 -I.. -I/borland/bcc55/include -L../xbase64 -L/borland/bcc55/lib xbstring.cpp xbase64.lib >> compout
-
diff --git a/examples/sample1.cpp b/examples/sample1.cpp
deleted file mode 100755
index 8d89d96..0000000
--- a/examples/sample1.cpp
+++ /dev/null
@@ -1,120 +0,0 @@
-/* sample1.cpp
-
- Xbase project source code
-
- This program creates a sample database and four indexes
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main()
-{
-
- xbSchema MyRecord[] =
- {
- { "FIRSTNAME", XB_CHAR_FLD, 15, 0 },
- { "LASTNAME", XB_CHAR_FLD, 20, 0 },
- { "BIRTHDATE", XB_DATE_FLD, 8, 0 },
- { "STARTDATE", XB_DATE_FLD, 8, 0 },
- { "AMOUNT", XB_NUMERIC_FLD, 9, 2 },
- { "SWITCH", XB_LOGICAL_FLD, 1, 0 },
- { "FLOAT1", XB_FLOAT_FLD, 9, 2 },
- { "FLOAT2", XB_FLOAT_FLD, 9, 1 },
- { "FLOAT3", XB_FLOAT_FLD, 9, 2 },
- { "FLOAT4", XB_FLOAT_FLD, 9, 3 },
- { "ZIPCODE", XB_NUMERIC_FLD, 5, 0 },
-#ifdef XB_MEMO_FIELDS
- { "MEMO1", XB_MEMO_FLD, 10, 0 },
-#endif
- { "",0,0,0 }
- };
-
- /* define the classes */
- xbXBase x; /* initialize xbase */
- xbDbf MyFile( &x ); /* class for table */
-
-// Create Dbase style indices
-#ifdef XB_INDEX_NDX
- xbNdx MyIndex1( &MyFile ); /* class for index 1 */
- xbNdx MyIndex2( &MyFile ); /* class for index 2 */
- xbNdx MyIndex3( &MyFile ); /* class for index 3 */
-#endif
-
-// Create Clipper style indices
-#ifdef XB_INDEX_NTX
- xbNtx MyIndex4( &MyFile ); /* class for index 4 */
- xbNtx MyIndex5( &MyFile ); /* class for index 5 */
-#endif
-
- xbShort rc;
- MyFile.SetVersion( 4 ); /* create dbase IV style files */
-
- if(( rc = MyFile.CreateDatabase( "MYFILE.DBF", MyRecord, XB_OVERLAY ))
- != XB_NO_ERROR )
- x.DisplayError( rc );
- else
- {
-
-#ifdef XB_INDEX_NDX
- /* define a simple index */
- if(( rc = MyIndex1.CreateIndex(
- "MYINDEX1.NDX", "LASTNAME", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- x.DisplayError( rc );
- /* define a multi-field index "LASTNAME FIRSTNAME" */
- if(( rc = MyIndex2.CreateIndex(
- "MYINDEX2.NDX", "LASTNAME+FIRSTNAME", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- x.DisplayError( rc );
- /* define a numeric index "ZIPCODE" */
- if(( rc = MyIndex3.CreateIndex(
- "MYINDEX3.NDX", "ZIPCODE", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- x.DisplayError( rc );
-
-
-#endif
-#ifdef XB_INDEX_NTX
- /* define a multi-field index "LASTNAMEFIRSTNAME" */
- if(( rc = MyIndex4.CreateIndex(
- "MYINDEX4.NTX", "LASTNAME-FIRSTNAME", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- x.DisplayError( rc );
- /* define a numeric index "ZIPCODE" */
- if(( rc = MyIndex5.CreateIndex(
- "MYINDEX5.NTX", "ZIPCODE", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- x.DisplayError( rc );
-#endif
- }
-
- MyFile.CloseDatabase(); /* Close database and associated indexes */
- return 0;
-}
diff --git a/examples/sample2.cpp b/examples/sample2.cpp
deleted file mode 100755
index c755b39..0000000
--- a/examples/sample2.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-/* sample2.cpp
-
- Xbase64 project source code
-
- This sample program updates the database created by the sample1
- program
-
- This program demonstrates the use of the following functions/methods
- OpenDatabase, GetFieldNo, BlankRecord, AppendRecord,
- PutField and CloseDatabase
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-
-#include <xbase64/xbase64.h>
-#include <xbase64/xbdbf.cpp>
-#include <xbase64/xbexp.cpp>
-#include <xbase64/xbexpprc.cpp>
-#include <xbase64/xbexpfnc.cpp>
-#include <xbase64/xbfields.cpp>
-#include <xbase64/xbindex.cpp>
-#include <xbase64/xbmemo.cpp>
-#include <xbase64/xbndx.cpp>
-#include <xbase64/xbntx.cpp>
-#include <xbase64/xbase64.cpp>
-#include <xbase64/xbdate.cpp>
-#include <xbase64/xbfilter.cpp>
-#include <xbase64/xblock.cpp>
-#include <xbase64/xbstring.cpp>
-#include <xbase64/xbfile.cpp>
-
-
-
-int main()
-{
- xbShort lname, fname, birthdate, startdate;
- xbShort amount, sw, f1, f2, f3, f4, m1, rc, z;
- xbFloat f;
-
- xbXBase x;
- xbDbf MyFile( &x );
- MyFile.AutoLockOff(); // turn off locking
-
- char bigBuf[4096];
-
-#undef XB_INDEX_NTX
-
-#ifdef XB_INDEX_NDX
- xbNdx MyIndex1( &MyFile );
- xbNdx MyIndex2( &MyFile );
- xbNdx MyIndex3( &MyFile );
-#endif
-
-#ifdef XB_INDEX_NTX
- xbNtx MyIndex4( &MyFile );
- xbNtx MyIndex5( &MyFile );
-#endif
-
- xbDate d;
-
- if(( rc = MyFile.OpenDatabase( "MYFILE.DBF" )) != XB_NO_ERROR )
- x.DisplayError( rc );
-
-#ifdef XB_INDEX_NDX
- if(( rc = MyIndex1.OpenIndex( "MYINDEX1.NDX" )) != XB_NO_ERROR )
- x.DisplayError( rc );
- if(( rc = MyIndex2.OpenIndex( "MYINDEX2.NDX" )) != XB_NO_ERROR )
- x.DisplayError( rc );
- if(( rc = MyIndex3.OpenIndex( "MYINDEX3.NDX" )) != XB_NO_ERROR )
- x.DisplayError( rc );
-#endif
-
-#ifdef XB_INDEX_NTX
- if(( rc = MyIndex4.OpenIndex( "MYINDEX4.NTX" )) != XB_NO_ERROR )
- x.DisplayError( rc );
- if(( rc = MyIndex5.OpenIndex( "MYINDEX5.NTX" )) != XB_NO_ERROR )
- x.DisplayError( rc );
-#endif
-
- fname = MyFile.GetFieldNo( "FIRSTNAME" );
- lname = MyFile.GetFieldNo( "LASTNAME" );
- birthdate = MyFile.GetFieldNo( "BIRTHDATE" );
- startdate = MyFile.GetFieldNo( "STARTDATE" );
- amount = MyFile.GetFieldNo( "AMOUNT" );
- sw = MyFile.GetFieldNo( "SWITCH" );
- f1 = MyFile.GetFieldNo( "FLOAT1" );
- f2 = MyFile.GetFieldNo( "FLOAT2" );
- f3 = MyFile.GetFieldNo( "FLOAT3" );
- f4 = MyFile.GetFieldNo( "FLOAT4" );
- m1 = MyFile.GetFieldNo( "MEMO1" );
- z = MyFile.GetFieldNo( "ZIPCODE" );
-
- std::cout << "First Name Id = " << fname << std::endl;
- std::cout << "Last Name Id = " << lname << std::endl;
- std::cout << "Birthdate Id = " << birthdate << std::endl;
- std::cout << "Startdate Id = " << startdate << std::endl;
- std::cout << "Amount Id = " << amount << std::endl;
- std::cout << "Switch Id = " << sw << std::endl;
- std::cout << "Float 1 Id = " << f1 << std::endl;
- std::cout << "Float 2 Id = " << f2 << std::endl;
- std::cout << "Float 3 Id = " << f3 << std::endl;
- std::cout << "Float 4 Id = " << f4 << std::endl;
- std::cout << "Zipcode Id = " << z << std::endl;
-#ifdef XB_MEMO_FIELDS
- std::cout << "Memo1 Id = " << m1 << std::endl << std::endl;;
-#endif
-
- /* build record one */
- MyFile.BlankRecord(); /* blank out the record buffer */
- MyFile.PutField( lname, "Queue" ); /* a name */
- MyFile.PutField( fname, "Suzy" ); /* a name */
- MyFile.PutField( birthdate, d.Sysdate()); /* a date */
- MyFile.PutField( startdate, "20040506" );
- MyFile.PutField( amount, "99.99" ); /* an amount */
- MyFile.PutField( sw, "Y" ); /* a switch */
- f = 1.466f;
- MyFile.PutFloatField( f1, f );
- MyFile.PutFloatField( "FLOAT2", f );
- MyFile.PutField( f3, "1" );
- MyFile.PutField( f4, "1" );
- MyFile.PutField( z, "76262" );
-
- if(( rc = MyFile.AppendRecord()) != XB_NO_ERROR ) /* write it */
- x.DisplayError( rc );
-
- /* build record two */
- MyFile.BlankRecord(); /* blank out the record buffer */
- MyFile.PutField( lname, "Bob" ); /* a name */
- MyFile.PutField( fname, "Billy" ); /* a name */
- MyFile.PutField( birthdate, "19970304" ); /* a date */
- MyFile.PutField( startdate, "19970310" ); /* a date */
- MyFile.PutField( amount, "88.88" ); /* an amount */
- MyFile.PutField( sw, "N" ); /* a switch */
- f = -2.1f;
- MyFile.PutFloatField( f1, f );
- MyFile.PutFloatField( "FLOAT2", -2.1f );
- MyFile.PutField( f1, "-2.1" );
- MyFile.PutField( f2, "-2.1" );
- MyFile.PutField( f3, "-2.1" );
- MyFile.PutField( f4, "-2.1" );
- MyFile.PutField( z, "76261" );
-#ifdef XB_MEMO_FIELDS
- memset( bigBuf, 0x00, 4096 );
- memset( bigBuf, 'a', 596 );
- bigBuf[0] = '[';
- strcat( bigBuf, "EOD]" );
- MyFile.UpdateMemoData( m1, strlen( bigBuf ), bigBuf, XB_LOCK );
-#endif
- if(( rc = MyFile.AppendRecord()) != XB_NO_ERROR ) /* write it */
- x.DisplayError( rc );
- /* build record three */
- MyFile.BlankRecord(); /* blank out the record buffer */
- MyFile.PutField( lname, "Slippery" ); /* a name */
- MyFile.PutField( fname, "Sam" ); /* a name */
- MyFile.PutField( birthdate, "19970406" ); /* a date */
- MyFile.PutField( startdate, "19990101" ); /* a date */
- MyFile.PutField( amount, "77.77" ); /* an amount */
- MyFile.PutField( sw, "T" ); /* a switch */
- f = 3.21f;
- MyFile.PutFloatField( f1, f );
- MyFile.PutFloatField( "FLOAT2", 3.21f );
- MyFile.PutField( f1, "3.21" );
- MyFile.PutField( f2, "3.21" );
- MyFile.PutField( f3, "3.21" );
- MyFile.PutField( f4, "3.21" );
- MyFile.PutField( z, "76263" );
-#ifdef XB_MEMO_FIELDS
- MyFile.UpdateMemoData( m1, 20, "Sample memo field 3", XB_LOCK );
-#endif
-
- if(( rc = MyFile.AppendRecord()) != XB_NO_ERROR ) /* write it */
- x.DisplayError( rc );
-
- /* build record four */
- MyFile.BlankRecord(); /* blank out the record buffer */
- MyFile.PutField( lname, "Lucas" ); /* a name */
- MyFile.PutField( fname, "George" ); /* a name */
- MyFile.PutField( birthdate, "19470406" ); /* a date */
- MyFile.PutField( amount, "77.77" ); /* an amount */
- MyFile.PutField( sw, "T" ); /* a switch */
- f = 4.321f;
- MyFile.PutFloatField( f1, f );
- MyFile.PutFloatField( "FLOAT2", 4.321f );
- MyFile.PutField( f1, "4.321" );
- MyFile.PutField( f2, "4.321" );
- MyFile.PutField( f3, "4.321" );
- MyFile.PutField( f4, "4.321" );
- MyFile.PutField( z, "76260" );
-#ifdef XB_MEMO_FIELDS
- MyFile.UpdateMemoData( m1, 20, "Sample memo field 4", XB_LOCK );
-#endif
- if(( rc = MyFile.AppendRecord()) != XB_NO_ERROR ) /* write it */
- x.DisplayError( rc );
-
- MyFile.CloseDatabase(); /* close database */
- return 0;
-}
diff --git a/examples/sample3.cpp b/examples/sample3.cpp
deleted file mode 100755
index 137ee54..0000000
--- a/examples/sample3.cpp
+++ /dev/null
@@ -1,137 +0,0 @@
-/* sample3.cpp
-
- Xbase64 project source code
-
- This sample program reads the database created and updated by the sample1
- and sample2 program
-
- This program demonstrates the use of the following functions/methods
- OpenDatabase, GetFieldNo, GetRecord, GetLastRecord, GetFirstRecord,
- GetNextRecord, GetPrevRecord, NoOfRecords and CloseDatabase, FieldCount
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main()
-{
- char buf[40];
- xbShort rc,i;
- xbShort lname, fname, birthdate, amount, sw, f1, memo;
- char *p;
- xbFloat f;
-
- xbXBase x;
- xbDbf MyFile( &x );
- MyFile.OpenDatabase( "MYFILE.DBF" );
- MyFile.AutoLockOff();
-
- lname = MyFile.GetFieldNo( "LASTNAME" );
- fname = MyFile.GetFieldNo( "FIRSTNAME" );
- birthdate = MyFile.GetFieldNo( "BIRTHDATE" );
- amount = MyFile.GetFieldNo( "AMOUNT" );
- sw = MyFile.GetFieldNo( "SWITCH" );
- f1 = MyFile.GetFieldNo( "FLOAT1" );
- memo = MyFile.GetFieldNo( "MEMO1" );
-
- std::cout << "There are " << MyFile.FieldCount()
- << " fields in the file" << std::endl;
- std::cout << "There are " << MyFile.NoOfRecords()
- << " records in the file." << std::endl;
- std::cout << "LASTNAME is type: " << MyFile.GetFieldType( lname )
- << " length: " << MyFile.GetFieldLen( lname )
- << std::endl;
- std::cout << "FIRSTNAME is type: " << MyFile.GetFieldType( fname )
- << " length: " << MyFile.GetFieldLen( fname )
- << std::endl;
- std::cout << "BIRTHDATE is type: " << MyFile.GetFieldType( birthdate )
- << " length: " << MyFile.GetFieldLen( birthdate )
- << std::endl;
- std::cout << "AMOUNT is type: " << MyFile.GetFieldType( amount )
- << " length: " << MyFile.GetFieldLen( amount )
- << std::endl;
- std::cout << "SWITCH is type: " << MyFile.GetFieldType( sw )
- << " length: " << MyFile.GetFieldLen( sw )
- << std::endl;
- std::cout << "MEMO1 is type: " << MyFile.GetFieldType( memo )
- << " length: " << MyFile.GetFieldLen( memo )
- << std::endl << std::endl;
-
- std::cout << "Sample GetRecord" << std::endl;
- MyFile.GetRecord( 1L );
- MyFile.GetField( lname, buf );
- std::cout << "Name 1 = " << buf << std::endl;
- std::cout << "Name 1 = " << MyFile.GetStringField( lname ) << std::endl;
-
- f = MyFile.GetFloatField( f1 );
- std::cout << "FLOAT1 = " << f << std::endl;
- f = MyFile.GetFloatField( "FLOAT2" );
- std::cout << "FLOAT2 = " << f << std::endl;
-
- std::cout << "Sample GetRecordBuf" << std::endl;
- p = MyFile.GetRecordBuf(); /* pointer to record buffer */
- for( i = 0; i < 49; i++ ) std::cout << *p++; /* display the buffer */
-
- std::cout << std::endl << "Loop through forwards..." << std::endl;
- rc = MyFile.GetFirstRecord();
- while( rc == XB_NO_ERROR ) {
- MyFile.GetField( lname, buf );
- std::cout << MyFile.GetCurRecNo();
- std::cout << " Name = " << buf << std::endl;
- rc = MyFile.GetNextRecord();
-#ifdef XB_MEMO_FIELDS
- if( MyFile.MemoFieldExists( memo ))
- std::cout << "Memo field MEMO1 len = " << MyFile.GetMemoFieldLen(memo)
- << std::endl;
-#endif
- }
-
- std::cout << "Sample PutRecord" << std::endl;
- MyFile.PutField( lname, "Stantonbob" );
- MyFile.PutField( lname, "Sally" );
- MyFile.PutRecord( MyFile.GetCurRecNo() );
-
- std::cout << "Loop through backwards.." << std::endl;
- rc = MyFile.GetLastRecord();
- while( rc == XB_NO_ERROR ){
- std::cout << "Last Name = " << MyFile.GetStringField( lname ) << std::endl;
- std::cout << "Logical Field = " << MyFile.GetLogicalField( "SWITCH" )
- << std::endl;
- rc = MyFile.GetPrevRecord();
- }
-
- std::cout << std::endl;
- MyFile.CloseDatabase(); /* close database */
- return 0;
-}
diff --git a/examples/sample4.cpp b/examples/sample4.cpp
deleted file mode 100755
index 16acada..0000000
--- a/examples/sample4.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/* sample4.cpp
-
- Xbase64 project source code
-
- This sample program reads the database created and updated by the sample1
- and sample2 program
-
- This program demonstrates the use of the following functions/methods
- DeleteRecord, UndeleteRecord, RecordDeleted
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main()
-{
- xbShort rc;
- xbXBase x;
- xbDbf MyFile( &x );
- MyFile.AutoLockOff();
-
-#ifdef XB_INDEX_NDX
- xbNdx MyIndex1( &MyFile );
- xbNdx MyIndex2( &MyFile );
- xbNdx MyIndex3( &MyFile );
-#endif
-#ifdef XB_INDEX_NTX
- xbNtx MyIndex4( &MyFile );
- xbNtx MyIndex5( &MyFile );
-#endif
-
- if(( rc = MyFile.OpenDatabase( "MYFILE.DBF" )) != XB_NO_ERROR ){
- std::cout << "Error opening file" << std::endl;
- x.DisplayError( rc );
- exit(1);
- }
-
-#ifdef XB_INDEX_NDX
- if(( rc = MyIndex1.OpenIndex( "MYINDEX1.NDX" )) != XB_NO_ERROR ){
- std::cout << "\nError opening index1" << std::endl;
- x.DisplayError( rc );
- exit(1);
- }
-
- if(( rc = MyIndex2.OpenIndex( "MYINDEX2.NDX" )) != XB_NO_ERROR ){
- std::cout << "\nError opening index2" << std::endl;
- x.DisplayError( rc );
- exit(1);
- }
-
- if(( rc = MyIndex3.OpenIndex( "MYINDEX3.NDX" )) != XB_NO_ERROR ){
- std::cout << "\nError opening index3" << std::endl;
- x.DisplayError( rc );
- exit(1);
- }
-
-#endif
-#ifdef XB_INDEX_NTX
- if(( rc = MyIndex4.OpenIndex( "MYINDEX4.NTX" )) != XB_NO_ERROR ){
- std::cout << "\nError opening index4" << std::endl;
- x.DisplayError( rc );
- exit(1);
- }
- if(( rc = MyIndex5.OpenIndex( "MYINDEX5.NTX" )) != XB_NO_ERROR ){
- std::cout << "\nError opening index5" << std::endl;
- x.DisplayError( rc );
- exit(1);
- }
-#endif
-
- std::cout << "Sample GetRecord\n";
-
-// MyFile.ExclusiveLock( XB_LOCK ); /* lock the files for our exclusive use */
-
- MyFile.GetRecord( 2L ); /* get the second record */
-
- MyFile.DeleteRecord(); /* delete it */
-
- if( MyFile.RecordDeleted() )
- std::cout << "Record is deleted..." << std::endl;
- else
- std::cout << "Record is not deleted..." << std::endl;
-
-/* to undelete a record the following commented code could be used
- MyFile.UndeleteRecord();
- if( MyFile.RecordDeleted() )
- std::cout << "Record is deleted...\n";
- else
- std::cout << "Record is not deleted...\n";
-*/
-
-/* to permanently remove deleted records from the file, pack the database */
-
- if(( rc = MyFile.PackDatabase( XB_LOCK )) != XB_NO_ERROR ){
- std::cout << "Error packing database" << std::endl;
- x.DisplayError( rc );
- }
- else
- std::cout << "Database packed." << std::endl;
-
-// MyFile.ExclusiveUnlock(); /* unlock the files */
- MyFile.CloseDatabase(); /* close database */
- return 0;
-}
diff --git a/examples/sample5.cpp b/examples/sample5.cpp
deleted file mode 100755
index a0071bd..0000000
--- a/examples/sample5.cpp
+++ /dev/null
@@ -1,135 +0,0 @@
-/* sample5.cpp
-
- Xbase64 project source code
-
- This program demonstrates NDX index usage. It is not very useful
- if NDX index logic has been disabled
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include <xbase64/xbase64.h>
-
-int main()
-{
- xbShort rc; /* return code */
- xbXBase x;
- xbDbf d( &x );
- d.AutoLockOff();
-
-// dbase indices
-#ifdef XB_INDEX_NDX
- xbNdx i1( &d );
- xbNdx i2( &d );
- xbNdx i3( &d );
-#endif
-
-// clipper indices
-#ifdef XB_INDEX_NTX
- xbNtx i4( &d );
- xbNtx i5( &d );
-#endif
-
- rc = d.OpenDatabase( "MYFILE" );
- x.DisplayError( rc );
-
-#ifdef XB_INDEX_NDX
- rc = i1.OpenIndex( "MYINDEX1" );
- std::cout << "OpenIndex 1 - ";
- x.DisplayError( rc );
-
- rc = i2.OpenIndex( "MYINDEX2" );
- std::cout << "OpenIndex 2 - ";
- x.DisplayError( rc );
-
- rc = i3.OpenIndex( "MYINDEX3" );
- std::cout << "OpenIndex 3 - ";
- x.DisplayError( rc );
-
-
-#endif
-
-#ifdef XB_INDEX_NTX
- rc = i4.OpenIndex( "MYINDEX4" );
- std::cout << "OpenIndex 4 - ";
- x.DisplayError( rc );
-
- rc = i5.OpenIndex( "MYINDEX5" );
- std::cout << "OpenIndex 5 - ";
- x.DisplayError( rc );
-#endif
-
-#ifdef XB_INDEX_NDX
- rc = i1.FindKey( "Queue" ); /* alpha search */
- std::cout << "NDX Find alpha key - ";
- x.DisplayError( rc );
-
- rc = i3.FindKey( (xbDouble) 76262 );
- std::cout << "NDX Find numeric key - ";
- x.DisplayError( rc );
-#endif
-
-
-#ifdef XB_INDEX_NTX
- rc = i4.FindKey( "Queue" ); /* alpha search */
- std::cout << "NTX Find alpha key - ";
- x.DisplayError( rc );
-
-// looks like ntx doesn't support numeric keys
- rc = i5.FindKey( (xbDouble) 76262 ); /* numeric search */
- std::cout << "NTX Find numeric key - ";
- x.DisplayError( rc );
-#endif
-
-#ifdef XB_INDEX_NDX
-
- rc = i1.GetFirstKey();
- std::cout << "Get first key - ";
- x.DisplayError( rc );
-
- rc = i1.GetNextKey();
- std::cout << "Get next key - ";
- x.DisplayError( rc );
-
- rc = i1.GetLastKey();
- std::cout << "Get last key - ";
- x.DisplayError( rc );
-
- rc = i1.GetPrevKey();
- std::cout << "Get prev key - ";
- x.DisplayError( rc );
-#endif
-
- d.CloseDatabase();
- return 0;
-}
diff --git a/examples/xbstring.cpp b/examples/xbstring.cpp
deleted file mode 100755
index fb4f843..0000000
--- a/examples/xbstring.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/* xbstring.cpp
-
- Xbase64 project source code
-
- This program demonstrates the usage of the xbString class
-
- Copyright (C) 1997,2003 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-
-#include <xbase64/xbase64.h>
-
-int main()
-{
- xbString s1;
- xbString s2;
-
- std::cout << "Xbstring sample program" << std::endl;
- std::cout << "This program demonstrates xbString class usage" << std::endl;
-
- s1 = "Some string data";
- s2 = "some more string data";
-
- std::cout << "s1 => " << s1 << std::endl;
- std::cout << "s2 => " << s2 << std::endl;
-
-
- s1 = "s1 ";
- s2 = "s2";
- s1 -= s2;
-
- std::cout << "-= operator => " << s1 << std::endl;
-
- s1 = "s1 ";
- s2 = "s2";
- s1 += s2;
-
- std::cout << "+= operator => " << s1 << std::endl;
-
- s1 = "some data";
- s2 = s1.mid( 2, 3 );
- std::cout << "mid() = " << s2 << std::endl;
-
-
- s1.setNum( (xbLong ) 123456789 );
- std::cout << "setNum(xbLong) = " << s1 << std::endl;
-
- s1.setNum( "4.4", (xbDouble ) 1234.56789 );
- std::cout << "setNum(xbDouble) = " << s1 << std::endl;
-
-
- return 0;
-}
-
diff --git a/html/Makefile.am b/html/Makefile.am
deleted file mode 100755
index 62aaa21..0000000
--- a/html/Makefile.am
+++ /dev/null
@@ -1,34 +0,0 @@
-## Process this file with automake to produce Makefile.in
-##
-# This file is part of the XBase libraries
-# Copyright (C) 1998,1999 Vitaly Fedrushkov <fedrushkov@acm.org>
-
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Library General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Library General Public License for more details.
-
-# You should have received a copy of the GNU Library General Public
-# License along with this library; see the file COPYING.LIB. If not,
-# write to the Free Software Foundation, Inc., or see
-# http://www.gnu.org/.
-
-EXTRA_DIST = COPYING.LIB Xb2cpp.htm xbase.jpg index.htm xba1.htm \
- xba2.htm xbapps.htm xbbib.htm xbc1.htm xbc2.htm xbc3.htm \
- xbc4.htm xbc12.htm xbc13.htm xbc14.htm xbc15.htm xbc16.htm \
- xbc17.htm xbc18.htm xbc2.htm xbc3.htm xbc4.htm xbc5.htm xbc6.htm \
- xbc7.htm xbc8.htm xblock.htm xbc11.htm
-
-## Uncomment these to have docs installed by `make install`:
-
-## htmldir = $(prefix)/doc/$(PACKAGE)-$(VERSION)/html
-## html_DATA = $(EXTRA_DIST)
-
-MAINTAINERCLEANFILES = Makefile.in
-
-CLEANFILES = *.bak Makefile.in \ No newline at end of file
diff --git a/html/Makefile.in b/html/Makefile.in
deleted file mode 100755
index 2902a47..0000000
--- a/html/Makefile.in
+++ /dev/null
@@ -1,254 +0,0 @@
-# Makefile.in generated by automake 1.6.3 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# This file is part of the XBase libraries
-# Copyright (C) 1998,1999 Vitaly Fedrushkov <fedrushkov@acm.org>
-
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Library General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Library General Public License for more details.
-
-# You should have received a copy of the GNU Library General Public
-# License along with this library; see the file COPYING.LIB. If not,
-# write to the Free Software Foundation, Inc., or see
-# http://www.gnu.org/.
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = @program_transform_name@
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-
-EXEEXT = @EXEEXT@
-OBJEXT = @OBJEXT@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-AMTAR = @AMTAR@
-AS = @AS@
-AWK = @AWK@
-CC = @CC@
-CXX = @CXX@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
-GXXVER = @GXXVER@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-RELEASE = @RELEASE@
-RHREL = @RHREL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XSUBDIRS = @XSUBDIRS@
-am__include = @am__include@
-am__quote = @am__quote@
-doxygen = @doxygen@
-install_sh = @install_sh@
-topdir = @topdir@
-
-EXTRA_DIST = COPYING.LIB Xb2cpp.htm xbase.jpg index.htm xba1.htm \
- xba2.htm xbapps.htm xbbib.htm xbc1.htm xbc2.htm xbc3.htm \
- xbc4.htm xbc12.htm xbc13.htm xbc14.htm xbc15.htm xbc16.htm \
- xbc17.htm xbc18.htm xbc2.htm xbc3.htm xbc4.htm xbc5.htm xbc6.htm \
- xbc7.htm xbc8.htm xblock.htm xbc11.htm
-
-
-MAINTAINERCLEANFILES = Makefile.in
-
-CLEANFILES = *.bak Makefile.in
-subdir = html
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/xbase64/xbconfig.h
-CONFIG_CLEAN_FILES =
-DIST_SOURCES =
-DIST_COMMON = COPYING.LIB Makefile.am Makefile.in
-all: all-am
-
-.SUFFIXES:
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && \
- $(AUTOMAKE) --gnu html/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
- -rm -f libtool
-uninstall-info-am:
-tags: TAGS
-TAGS:
-
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
- @list='$(DISTFILES)'; for file in $$list; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
- dir="/$$dir"; \
- $(mkinstalldirs) "$(distdir)$$dir"; \
- else \
- dir=''; \
- fi; \
- if test -d $$d/$$file; then \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
- else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile
-
-installdirs:
-
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
- -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-am
-
-clean-am: clean-generic clean-libtool mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-generic distclean-libtool
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-generic mostlyclean-libtool
-
-uninstall-am: uninstall-info-am
-
-.PHONY: all all-am check check-am clean clean-generic clean-libtool \
- distclean distclean-generic distclean-libtool distdir dvi \
- dvi-am info info-am install install-am install-data \
- install-data-am install-exec install-exec-am install-info \
- install-info-am install-man install-strip installcheck \
- installcheck-am installdirs maintainer-clean \
- maintainer-clean-generic mostlyclean mostlyclean-generic \
- mostlyclean-libtool uninstall uninstall-am uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/html/Xb2cpp.htm b/html/Xb2cpp.htm
deleted file mode 100755
index aa9d532..0000000
--- a/html/Xb2cpp.htm
+++ /dev/null
@@ -1,81 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE>Xbase to Xbase DBMS C++ Converter</TITLE>
-</HEAD>
-<BODY>
-
-<H1>Xbase to Xbase DBMS C++ Converter</H1>
-
-<H2>Program Xb2cpp.pl V0.1 26-11-98</P>
-<H2>Author</H2>
-<A HREF="mailto:kehl@informatik.tu-muenchen.de">Hubertus Kehl</A>, kehl@informatik.tu-muenchen.de, kehlh@hotmail.com
-<BR>Please send suggestions, bug reports, patches, etc. one of these email
-adresses.
-<H2>Language</H2>
-<P>Perl 5.0</P>
-<H2>Purpose</H2>
-<P>Convert Dbase, Clipper, FOXPRO Source Code to XBASE C++ Code for use with
-<A HREF="http://xdb.sourceforge.net">XBASE DBMS Library</A></P>
-<H2>Output</H2>
-<P>.cpp File and .h File</P>
-<H2>Arguments</H2>
-<P>1st arg = filename</P>
-<H2>Remarks</H2>
-<P>The script tries to keep track of the databases used in different workareas.
-But the flow through your program cannot be determined, so in some cases
-you have to help the script a bit by giving additional info.</P>
-<P>Three special comments have been designed to add this info:</P>
-<PRE>* XB2CPP(SelectedArea)
-or&nbsp; * XB2CPP(SelectedArea,Workarea1,Alias1,Wa2,Al2...)
-or&nbsp; * XB2CPP(SelA,WA1,Al1[Total1, Active1],Wa2, Al2[Tot2,Act2])</PRE>
-<P>e.g. * XB2CPP(3,3,ZP,2,PL) will inform the script for example at the beginning
-of a PROCEDURE that a database with Alias ZP is opened in workarea 3 and
-a database with alias PL is opened in workarea2 and when calling this procedure
-always workarea 3 is selected.</P>
-<P>The third alternative of this statement makes it possible to define
-the number of open indices and which one is the active index, as given
-by a previous SET INDEX TO or USE and SET ORDER TO statements. The script
-cannot know, which procedures, statements have been executed before and
-opened indices.... So * XB2CPP(2,2,ZP[2,1]) will inform the script about
-an open database alias ZP in workarea 2 which is currently selected and
-has two open indices where the first one is the active one.</P>
-<H2>Hints</H2>
-
-<OL>
-<LI>Always give an ALIAS in USE-Statements this is needed for generation
-of the Database Classnames</LI>
-<LI>Give the above described additional infos where necessary.</LI>
-<LI>Use ALIASes in Expressions with database fields, this helps the script
-in knowing where database references are.</LI>
-<LI>Replace the XXX in PutXXXField or GetXXXField manually the script is
-not able to determine variable or field types. The code for getting a Textfield
-(GetField) must also be corrected. Xbase DBMS Syntax requires the buffer
-as second parameter, the string will not be returned ! You may use a C++
-String wrapper for this job.</LI>
-<LI>PROCEDURES that will operate on two different databases where some statements
-are used for both cannot be converted The script needs to know everytime
-on which database the statements are operating. Either duplicate such procedures,
-(one for each database), or write a generic C++ routine with pointers to
-databases.</LI>
-<LI>Don't assume any compilable or even working C++ source code as output.
-The ambigous DBASE language, which lacks type and variable definitions
-is one reason for this. This script only will help you for about 10-30%
-of the conversion. The rest (which remained uppercase) has to be done manually
-:)</LI>
-</OL>
-
-<H2>Copyright</H2>
-<P>This program is free software; you can redistribute it and/or modify it
-under the terms of the GNU General Public License as published by the Free
-Software Foundation (version 2 of the License)</P>
-
-<P>This program is distributed in the hope that it will be useful, but
-WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-or FITNESS FOR A PARTICULAR PURPOSE.&nbsp; See the GNU General Public License
-for more details.</P>
-<HR>
-<ADDRESS>
-<A HREF="mailto:kehl@informatik.tu-muenchen.de">Hubertus Kehl</A>,29-11-1998
-</ADDRESS>
-</BODY>
-</HTML>
diff --git a/html/copying.lib b/html/copying.lib
deleted file mode 100755
index e3df74a..0000000
--- a/html/copying.lib
+++ /dev/null
@@ -1,443 +0,0 @@
-NOTE! The LGPL below is copyrighted by the Free Software Foundation, but
-the instance of code that it refers to (the XBase libraries) are copyrighted
-by the authors who actually wrote it.
-
----------------------------------------------------------------------------
- GNU LIBRARY GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1991 Free Software Foundation, Inc.
- 59 Temple Place - Suite 330
- Boston, MA 02111-1307, USA.
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the library GPL. It is
- numbered 2 because it goes with version 2 of the ordinary GPL.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Library General Public License, applies to some
-specially designated Free Software Foundation software, and to any
-other libraries whose authors decide to use it. You can use it for
-your libraries, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if
-you distribute copies of the library, or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link a program with the library, you must provide
-complete object files to the recipients so that they can relink them
-with the library, after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- Our method of protecting your rights has two steps: (1) copyright
-the library, and (2) offer you this license which gives you legal
-permission to copy, distribute and/or modify the library.
-
- Also, for each distributor's protection, we want to make certain
-that everyone understands that there is no warranty for this free
-library. If the library is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original
-version, so that any problems introduced by others will not reflect on
-the original authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that companies distributing free
-software will individually obtain patent licenses, thus in effect
-transforming the program into proprietary software. To prevent this,
-we have made it clear that any patent must be licensed for everyone's
-free use or not licensed at all.
-
- Most GNU software, including some libraries, is covered by the ordinary
-GNU General Public License, which was designed for utility programs. This
-license, the GNU Library General Public License, applies to certain
-designated libraries. This license is quite different from the ordinary
-one; be sure to read it in full, and don't assume that anything in it is
-the same as in the ordinary license.
-
- The reason we have a separate public license for some libraries is that
-they blur the distinction we usually make between modifying or adding to a
-program and simply using it. Linking a program with a library, without
-changing the library, is in some sense simply using the library, and is
-analogous to running a utility program or application program. However, in
-a textual and legal sense, the linked executable is a combined work, a
-derivative of the original library, and the ordinary General Public License
-treats it as such.
-
- Because of this blurred distinction, using the ordinary General
-Public License for libraries did not effectively promote software
-sharing, because most developers did not use the libraries. We
-concluded that weaker conditions might promote sharing better.
-
- However, unrestricted linking of non-free programs would deprive the
-users of those programs of all benefit from the free status of the
-libraries themselves. This Library General Public License is intended to
-permit developers of non-free programs to use free libraries, while
-preserving your freedom as a user of such programs to change the free
-libraries that are incorporated in them. (We have not seen how to achieve
-this as regards changes in header files, but we have achieved it as regards
-changes in the actual functions of the Library.) The hope is that this
-will lead to faster development of free libraries.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, while the latter only
-works together with the library.
-
- Note that it is possible for a library to be covered by the ordinary
-General Public License rather than by this special one.
-
- GNU LIBRARY GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library which
-contains a notice placed by the copyright holder or other authorized
-party saying it may be distributed under the terms of this Library
-General Public License (also called "this License"). Each licensee is
-addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also compile or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- c) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- d) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the source code distributed need not include anything that is normally
-distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Library General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
diff --git a/html/index.htm b/html/index.htm
deleted file mode 100755
index 2825ac4..0000000
--- a/html/index.htm
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<HTML><TITLE>Xbase DBMS Documentation Table of Contents</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align="center">Xbase DBMS<br>
-Last Updated 3/19/04<br>Version 3.0</p></H1>
-<h2>Documentation Table Of Contents</h2>
-<h3>Section 1 - Xbase Concepts</h3>
-<h4>
-<A HREF="xbc1.htm">Chapter 1 - Getting Started</A><br>
-<A HREF="xbc2.htm">Chapter 2 - Database Overview</A><br>
-<A HREF="xbc3.htm">Chapter 3 - Fields and Strings</A><br>
-<A HREF="xbc4.htm">Chapter 4 - Date Processing</A><br>
-<A HREF="xbc5.htm">Chapter 5 - Expression Handling</A><br>
-<A HREF="xbc6.htm">Chapter 6 - NDX (DBase) Indices</A><br>
-<A HREF="xbc7.htm">Chapter 7 - NTX (Clipper) Indices</A><br>
-<A HREF="xbc8.htm">Chapter 8 - Record and File Locking</A><br>
-</h4>
-<h3>Section 2 - Using the Library</h3>
-<h4>
-<A HREF="xbc11.htm">Chapter 11 - Library Options and Methods</A><br>
-<A HREF="xbc12.htm">Chapter 12 - Database Methods</A><br>
-<A HREF="xbc13.htm">Chapter 13 - Field Methods</A><br>
-<A HREF="xbc14.htm">Chapter 14 - String Methods</A><br>
-<A HREF="xbc15.htm">Chapter 15 - Date Methods</A><br>
-<A HREF="xbc16.htm">Chapter 16 - Expression Reference</A><br>
-<A HREF="xbc17.htm">Chapter 17 - Index Methods</A><br>
-<A HREF="xbc18.htm">Chapter 18 - Locking Methods</A><br>
-</h4>
-<h3>Section 3 - Appendices</h3>
-<h4>
-<A HREF="xba1.htm">Appendix A - Return Codes and Exception Processing</A><br>
-<A HREF="xba2.htm">Appendix B - Quick Reference</A><br>
-<A HREF="copying.lib">Appendix C - GPL Library License</A><br>
-<A HREF="xbbib.htm">Appendix D - Bibliography</A><br>
-<A HREF="Xb2cpp.htm">Appendix F - Xbase DBMS Perl conversion program</A><br>
-</h4>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xba1.htm b/html/xba1.htm
deleted file mode 100755
index 7125e79..0000000
--- a/html/xba1.htm
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<HTML>
-<TITLE>Xbase DBMS Appendix A</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align="center">Xbase Return Codes</p></H1>
-<p align="center">Page Updated 2/19/04</p><hr>
-
-
-Beginning with release 3.0 exception processing has been removed from the
-library. There were reports that it was not 100% working, so I trimmed the
-library back to working code. If there are any volunteers to re-install the
-exception processing, AND test it, let me know. Thanks - Gary
-
-It is generally a good idea to check the method return codes to verify an
-error hasn't occured. Most Xbase DBMS methods return a SHORT return code
-value which corresponds to a value in this table.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Xbase Return Codes</h3></CAPTION>
-<TR ALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Number<TD>Error<TD>Description<TD>Type
-<TR><TH ALIGN="LEFT">0<TD>XB_NO_ERROR<TD>Success<TD>General
-<TR><TH ALIGN="LEFT">100<TD>XB_XBASE_EOF<TD>End of file<TD>Database<br>Index
-<TR><TH ALIGN="LEFT">102<TD>XB_NO_MEMORY<TD>Error when allocating memory<TD>General
-<TR><TH ALIGN="LEFT">103<TD>XB_FILE_EXISTS<TD>File Already Exists<TD>Database
-<TR><TH ALIGN="LEFT">104<TD>XB_OPEN_ERROR<TD>Error when opening file<TD>Database
-<TR><TH ALIGN="LEFT">105<TD>XB_WRITE_ERROR<TD>Error occured when writing to file<TD>Database<br>Index
-<TR><TH ALIGN="LEFT">106<TD>XB_UNKNOWN_FIELD_TYPE<TD>Field was not one of:<br>
-XB_CHAR_FLD<br>XB_FLOAT_FLD<br>XB_NUMERIC_FLD<br>XB_DATE_FLD<br>
-XB_LOGICAL_FLD or XB_MEMO_FLD<br><TD>Field
-<TR><TH ALIGN="LEFT">107<TD>XB_ALREADY_OPEN<TD>Can't open the same file twice<TD>Database<br>Index
-<TR><TH ALIGN="LEFT">108<TD>XB_NOT_XBASE<TD>Can't open non X-Base file with<br>
- X-Base routines<TD>Database
-<TR><TH ALIGN="LEFT">109<TD>XB_INVALID_RECORD<TD>Not a valid record<TD>Database
-<TR><TH ALIGN="LEFT">110<TD>XB_INVALID_OPTION<TD>Not a valid option<TD>General
-<TR><TH ALIGN="LEFT">112<TD>XB_SEEK_ERROR<TD>Could not position in file<TD>Database<br>Index
-<TR><TH ALIGN="LEFT">114<TD>XB_NOT_FOUND<TD>Record for key not found<TD>Index
-<TR><TH ALIGN="LEFT">116<TD>XB_INVALID_KEY<TD>Invalid key argument given<TD>Index
-<TR><TH ALIGN="LEFT">118<TD>XB_KEY_NOT_UNIQUE<TD>Trying to add a duplicate key for an unique index<TD>Index
-<TR><TH ALIGN="LEFT">119<TD>XB_INVALID_KEY_EXPRESSION<TD>An invalid key expression given<TD>Index
-<TR><TH ALIGN="LEFT">121<TD>XB_INVALID_KEY_TYPE<TD>Invalid Key Type<TD>Index
-<TR><TH ALIGN="LEFT">122<TD>XB_INVALID_NODE_NO<TD>Internal index error, notify tech support<TD>Index
-<TR><TH ALIGN="LEFT">123<TD>XB_NODE_FULL<TD>Internal index error, notify tech support<TD>Index
-<TR><TH ALIGN="LEFT">124<TD>XB_INVALID_FIELDNO<TD>Attempt to access invalid field number<TD>Field
-<TR><TH ALIGN="LEFT">125<TD>XB_INVALID_DATA<TD>Invalid data encountered<TD>Field
-<TR><TH ALIGN="LEFT">126<TD>XB_NOT_LEAFNODE<TD>Internal index error, notify tech support<TD>Index
-<TR><TH ALIGN="LEFT">127<TD>XB_LOCK_FAILED<TD>Lock function failed<BR>See errno for detail
- <TD>Lock
-<TR><TH ALIGN="LEFT">128<TD>XB_CLOSE_ERROR<TD>Error closing file<TD>Database<br>Index
-<TR><TH ALIGN="LEFT">129<TD>XB_INVALID_SCHEMA<TD>Error with schema definition, check decimal points<TD>Database
-<TR><TH ALIGN="LEFT">130<TD>XB_INVALID_NAME<TD>Invalid database name<TD>Memo
-<TR><TH ALIGN="LEFT">131<TD>XB_INVALID_BLOCK_SIZE<TD>Block size is invalid, must be increment of 512<TD>Memo
-<TR><TH ALIGN="LEFT">132<TD>XB_INVALID_BLOCK_NO<TD>Invalid block number used<TD>Memo
-<TR><TH ALIGN="LEFT">133<TD>XB_NOT_MEMO_FIELD<TD>Not a memo field<TD>Memo
-<TR><TH ALIGN="LEFT">134<TD>XB_NO_MEMO_DATA<TD>No memo data<TD>Memo
-<TR><TH ALIGN="LEFT">135<TD>XB_EXP_SYNTAX_ERROR<TD>Expression syntax error<TD>Expression
-<TR><TH ALIGN="LEFT">136<TD>XB_PARSE_ERROR<TD>Parse error in expression<TD>Expression
-<TR><TH ALIGN="LEFT">137<TD>XB_NO_DATA<TD>No data for expression<TD>Expression
-<TR><TH ALIGN="LEFT">140<TD>XB_INVALID_FIELD<TD>Invalid field in expression<TD>Expression
-<TR><TH ALIGN="LEFT">141<TD>XB_INSUFFICIENT_PARMS<TD>Insufficient paramaters for function<TD>Expression
-<TR><TH ALIGN="LEFT">142<TD>XB_INVALID_FUNCTION<TD>Invalid function encountered<TD>Expression
-</TABLE><br><br><hr>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xba2.htm b/html/xba2.htm
deleted file mode 100755
index 4a39d3c..0000000
--- a/html/xba2.htm
+++ /dev/null
@@ -1,110 +0,0 @@
-<!DOCTYPE xbHtml PUBLIC>
-<xbHtml>
-<TITLE>Xbase DBMS Appendix B</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align="center">Xbase DBMS Quick Reference</p></H1>
-<p align="center">Page Updated 2/19/04</p><hr>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Xbase Quick Reference Method List</h3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::AppendRecord()
-<TR><TH ALIGN="LEFT">void xbDbf::AutoLockOff()
-<TR><TH ALIGN="LEFT">void xbDbf::AutoLockOn()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::BlankRecord()
-<TR><TH ALIGN="LEFT">xbLong cs xbDbf::CalcCheckSum()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::CloseDatabase()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::CopyDbfStructure( char * NewFileName, xbShort Overlay )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::CreateDatabase( char * FileName, xbSchema * RecordLayout, xbShort Overlay )
-<TR><TH ALIGN="LEFT">xbULong RecNo xbDbf::CurrentRecNo()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::DeleteAllRecords()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::DeleteRecord()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::DumpHeader( xbShort Option )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::DumpRecord( xbULong RecNo )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::ExclusiveLock( xbShort WaitOption )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::ExclusiveUnlock()
-<TR><TH ALIGN="LEFT">xbLong NoOfFields xbDbf::FieldCount()
-<TR><TH ALIGN="LEFT">xbLong RecNo xbDbf::GetCurRecNo()
-<TR><TH ALIGN="LEFT">xbDouble Val xbDbf::GetDoubleField( char * FieldName)
-<TR><TH ALIGN="LEFT">xbDouble Val xbDbf::GetDoubleField( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::GetField( xbShort FieldNo, char * FieldName )
-<TR><TH ALIGN="LEFT">xbShort DecimalCount xbDbf::GetFieldDecimal( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">xbShort FieldLen xbDbf::GetFieldLen( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">char * FieldName xbDbf::GetFieldName( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">xbShort FieldNo xbDbf::GetFieldNo( char * FieldName )
-<TR><TH ALIGN="LEFT">char Type xbDbf::GetFieldType( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::GetFirstRecord()
-<TR><TH ALIGN="LEFT">xbFloat FloatVal xbDbf::GetFloatField( char * FieldName )
-<TR><TH ALIGN="LEFT">xbFloat FloatVal xbDbf::GetFloatField( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::GetLastRecord()
-<TR><TH ALIGN="LEFT">xbShort Val xbDbf::GetLogicalField( char * FieldName )
-<TR><TH ALIGN="LEFT">xbShort Val xbDbf::GetLogicalField( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">xbLong LongVal xbDbf::GetLongField( char * FieldName )
-<TR><TH ALIGN="LEFT">xbLong LongVal xbDbf::GetLongField( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::GetMemoField( xbShort FieldNo, xbLong len, char * Buf )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::GetMemoFieldLen( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::GetNextRecord()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::GetPrevRecord()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::GetRecord( xbLong RecNo )
-<TR><TH ALIGN="LEFT">char * BufPtr xbDbf::GetRecordBuf()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::LockDatabase( xbShort WaitOption, xbShort LockType, xbLong RecNo )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::MemoFieldExists( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::MemoFieldsPresent()
-<TR><TH ALIGN="LEFT">xbLong RecCnt xbDbf::NoOfRecords()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::OpenDatabase( char * FileName )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::PackDatabase( xbShort WaitOption )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::PutDoubleField( char * FieldName,xbDouble DoubleValue )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::PutDoubleField( xbShort FieldNo,xbDouble DoubleValue )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::PutField( xbShort FieldNo, char * Buf )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::PutFloatField( char * FieldName, xbFloat FloatValue )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::PutFloatField( xbShort FieldNo, xbFloat FloatValue )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::PutLongField( char * FieldName, xbLong LongValue )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::PutLongField( xbShort FieldNo, xbLong LongValue )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::PutRecord( xbLong RecNo )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::RebuildAllIndices()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::RecordDeleted()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::SetVersion( xbShort Version )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::UndeleteAllRecords()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::UndeleteRecord()
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::UpdateMemoData( xbShort FieldNo, xbLong len, char * Buf, xbShort LockOption )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::ValidLogicalData( xbShort FieldNo )
-<TR><TH ALIGN="LEFT">xbShort rc xbDbf::ValidNumericData( xbShort FieldNo )
-
-
-<TR><TH ALIGN="LEFT">char * Day xbXBase::CharDayOf( char * Date8 )
-<TR><TH ALIGN="LEFT">char * Month xbXBase::CharMonthOf( char * Date8 )
-<TR><TH ALIGN="LEFT">xbShort rc xbXBase::DateIsValid( char * Date8 )
-<TR><TH ALIGN="LEFT">xbShort Day xbXBase::DayOf( xbShort Format, char * Date8 )
-<TR><TH ALIGN="LEFT">char * Date xbXBase::FormatDate( char * Format, char * Date8 )
-<TR><TH ALIGN="LEFT">xbString & Result xbXBase::GetStringResult()
-<TR><TH ALIGN="LEFT">xbDouble * Result xbXBase::GetDoubleResult()
-<TR><TH ALIGN="LEFT">XB_EXPRESSION * Exp xbXBase::GetExpressionHandle()
-<TR><TH ALIGN="LEFT">char Type xbXBase::GetExpressionResultType( XB_EXPRESSION * )
-<TR><TH ALIGN="LEFT">xbLong * result xbXBase::GetIntResult()
-<TR><TH ALIGN="LEFT">xbShort rc xbXBase::IsLeapYear( char * Date8 )
-<TR><TH ALIGN="LEFT">xbLong JulVal xbXBase::JulianDays( char * Date8 )
-<TR><TH ALIGN="LEFT">char * Date8 xbXBase::JulToDate8( xbLong JulVal )
-<TR><TH ALIGN="LEFT">xbLong JulVal xbXBase::LastDayOfMonth( char * Date8 )
-<TR><TH ALIGN="LEFT">xbShort Month xbXBase::MonthOf( char * Date8 )
-<TR><TH ALIGN="LEFT">xbShort rc xbXBase::ParseExpression( char * exp, xbDbf * d )
-<TR><TH ALIGN="LEFT">xbShort rc xbXBase::ProcessExpression( XB_EXPRESSION * )
-<TR><TH ALIGN="LEFT">char * Date8 xbXBase::Sysdate()
-<TR><TH ALIGN="LEFT">xbShort Year xbXBase::YearOf( char * Date8 )
-
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::CheckNdxIntegrity( xbShort Option )
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::CloseIndex()
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::CreateIndex( char * IndexName, char * KeyExpression, xbShort Unique, xbShort Overlay )
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::FindKey( char * SearchValue )
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::FindKey( xbDouble SearchValue )
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::GetFirstKey()
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::GetLastKey()
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::GetNextKey()
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::GetPrevKey()
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::KeyExists( char * SearchValue )
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::KeyExists( xbDouble SearchValue )
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::LockIndex( xbShort WaitOption, xbShort LockType )
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::OpenIndex( char * IndexName )
-<TR><TH ALIGN="LEFT">xbShort rc xbNdx::ReIndex()
-</TABLE>
-<br><br><hr>
-<p><img src="xbase.jpg"><br><hr>
diff --git a/html/xbapps.htm b/html/xbapps.htm
deleted file mode 100755
index 7a87d02..0000000
--- a/html/xbapps.htm
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<HTML>
-<TITLE>Xbase DBMS Sample Application</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align=center>Sample Programs</p></H1>
-<p align=center>Page Updated 2/12/04</p><hr><br><br>
-Sample Xbase DBMS programs are located in the xbase/samples and xbase/bin
-directories.<br><br>
-<CENTER>
-<TABLE BORDER>
-<CAPTION ALIGN=TOP><H3>X-Base Sample Programs</H3></CAPTION>
-<TR ALIGN=BASELINE>
-<TR><TH ALIGN=LEFT>Program<TD>Program Description
-<TR><TH ALIGN=LEFT>checkndx<TD>This program checks an NDX file
-<TR><TH ALIGN=LEFT>copydbf<TD>This program copies a DBF file structure
-<TR><TH ALIGN=LEFT>dbfxtrct<TD>Extract data from dbf file and load into
-<TR><TH ALIGN=LEFT>dbfutil1<TD>Menu program for executing Xbase functions
-<TR><TH ALIGN=LEFT>deletall<TD>This program marks all records in a DBF file for deletion
-<TR><TH ALIGN=LEFT>dumpdbt<TD>Debug memo files
-<TR><TH ALIGN=LEFT>dumphdr<TD>This program opens an Xbase file and prints its header
-<TR><TH ALIGN=LEFT>dumprecs<TD>This program dumps records for an X-Base file
-<TR><TH ALIGN=LEFT>exfilter<TD>Expression filter test program
-<TR><TH ALIGN=LEFT>packdbf<TD>This program packs a database file
-<TR><TH ALIGN=LEFT>reindex<TD>This program rebuilds an index
-<TR><TH ALIGN=LEFT>sample1<TD>This program creates an Xbase file MYFILE.DBF
-<TR><TH ALIGN=LEFT>sample2<TD>This program populates file MYFILE.DBF created by program sample1
-<TR><TH ALIGN=LEFT>sample3<TD>This program lists MYFILE.DBF data populated by program sample2
-<TR><TH ALIGN=LEFT>sample4<TD>This program deletes records, undeletes records, locks and packs datafile MYFILE.DBF
-<TR><TH ALIGN=LEFT>sample5<TD>This program demonstrates NDX class usage
-<TR><TH ALIGN=LEFT>testdate<TD>This program tests the Xbase date methods
-<TR><TH ALIGN=LEFT>undelall<TD>This program undeletes all deleted records in a dbf file
-<TR><TH ALIGN=LEFT>zap<TD>This program removes all records from a DBF file
- comma delimitedoutput file suitable for input into an awk or perl script
-</TABLE></CENTER>
-P<br><br>
-<hr>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xbc1.htm b/html/xbc1.htm
deleted file mode 100755
index 72c9904..0000000
--- a/html/xbc1.htm
+++ /dev/null
@@ -1,232 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<HTML>
-<TITLE>Xbase DBMS Chapter 1</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-
-<h1><p align="center">Getting Started</p></h1>
-<p align="center">Chapter Updated 8/14/03</p>
-
-<hr><h2>Overview</h2>
-
-Welcome to Xbase DBMS. Xbase DBMS is a collection of specifications,
-programs, utilities and a C++ class library for manipulating Xbase type
-datafiles and indices. Xbase has been developed and produced by several
-people from around the world via the internet.
-<br><br>
-
-The term Xbase is often used used to describe the format of the original
-DBase, Clipper and Foxbase (.DBF) files. Many vendors support the industry
-standard Xbase file format and are committed to this technology for many
-years to come, thus insuring continued support.<br><br>
-
-The original purpose of the Xbase library was to provide reliable and
-economical programming tools to programmers for reading, writing and updating
-DBF databases, indices and memo fields.<br><br><br>
-
-<hr><h2>System Requirements</h2>
-
-To use Xbase DBMS, the following items are needed:<br><br>
-
-A computer and C/C++ compiler.<br><br>
-
-The original source code is developed on a Linux platform with the GCC
-public domain C/C++ compiler.
-<br><br>
-
-Xbase DBMS has been successfully ported and runs on Linux, Sun Solaris,
-OpenVMS, FreeBSD, OS2 and DOS/Windows (Using the large memory model).
-<br><br>
-
-This software is not intended to be used on any system using an SCO operating
-system.
-<br><br>
-
-<hr><h2>Classes and User Interface</h2>
-
-There are six classes in the Xbase library which are available
-for use in a typical Xbase application program.<br><br><br>
-
-<CENTER><TABLE BORDER>
-<CAPTION ALIGN=TOP><H3>Xbase Classes - Version 1.8.0 and newer</H3></CAPTION>
-<TR VALIGN=BASELINE>
-<TR><TH ALIGN=LEFT>Class<TD>Basic Description<TD>How Used<TD>Old Class<br>Name
-<TR><TH ALIGN=LEFT>xbXBase<TD>Basic Xbase Class<TD>Every program gets one of these<TD>XBASE
-<TR><TH ALIGN=LEFT>xbDbf<TD>Database and Field class<TD>Need one of these for each open DBF file<TD>DBF
-<TR><TH ALIGN=LEFT>xbNdx<TD>Ndx index class<TD>Need one of these for each open NDX index<TD>NDX
-<TR><TH ALIGN=LEFT>xbNtx<TD>Ntx index class<TD>Need one of these for each open NTX index
-<TR><TH ALIGN=LEFT>xbString<TD>String class<TD>Used for handling strings
-<TR><TH ALIGN=LEFT>xbHtml<TD>Html generation class<TD>Needed for creating HTML code<TD>HTML
-</TABLE></CENTER>
-<br><br>
-There are other classes used internally by these Xbase classes, but most
-application programs need not to be concerned with. These classes are
-xbStack - used for stack data structures, xbExpn - used for expression
-logic, and xbDate - used for date manipulation logic.
-
-<br><br>
-<hr><h2>Portability, Type Defs and Structures</h2>
-
-To effectively make the Xbase library as portable across platforms as possible,
-three things occured.
-<br><br>
-<li>First, the software was developed to run and compile on either big endian
-or little endian computers and store all numeric data in little endian format.
-<br><br>
-<li>Secondly, field types must be consistently defined in each environment. The <em>types.h</em>
-file defines the xbase data types. To modify the Xbase code base to function
-in a different (non ported to yet) environment, start by modifying the <em>types.h</em>
-file for your site and recompile.<br><br>
-<li>Thirdly, support for unix automake and autoconf has been to provided
-support on a wide variety of unices.
-<hr><br><br>
-<CENTER>
-<TABLE BORDER>
-<CAPTION ALIGN=TOP><h3>Field Types</h3></CAPTION>
-<TR ALIGN=BASELINE>
-<TR><TH ALIGN=LEFT>Type<TD>Description
-<TR><TH ALIGN=LEFT>xbULong<TD>unsigned long int
-<TR><TH ALIGN=LEFT>xbUShort<TD>unsigned short int
-<TR><TH ALIGN=LEFT>xbShort<TD>short int
-<TR><TH ALIGN=LEFT>xbLong<TD>long
-<TR><TH ALIGN=LEFT>xbFloat<TD>float
-<TR><TH ALIGN=LEFT>xbDouble<TD>double
-<TR><TH ALIGN=LEFT>char<TD>char
-<TR><TH ALIGN=LEFT>void<TD>void
-<TR><TH ALIGN=LEFT>struct SCHEMA<TD>Used for defining record structures
-</TABLE></CENTER>
-<br><br>
-
-Xbase was designed for portability utilizing standard ANSI-C compliant
-code. If you decide to write updates to the Xbase project, please try
-to keep your work to standard generic ANSI-C (no special DOS/WINDOWS Calls).
-<br><br>
-
-<hr><h2>Compilation Overview</h2>
-If you are building the sources on a Linux/Unix platform:<br><br>
-Download the source<br>
-./configure<br>
-make<br>
-su<br>
-make install<br>
-exit<br><br>
-
-<br><br>
-Before compiling the library, you may need to modify the options for your
-environment. Do "./configure --help" for a list of the current options
-
-<br><br>
-On my server, I had to:
-<li>Verify the library and associated links were copied from xbase/xbase/.libs
-into /usr/local/lib
-<li>Add /usr/local/lib is in /etc/ld.so.conf
-<li>execute program <em>ldconfig</em> as root to refresh the new libs
-
-<br><br>
-Actual milage at your site may vary.
-<br><br>
-
-<hr><h2>Building a program with the Xbase library</H2>
-
-Create a directory for your project:<br><br>
-
-cd /home/me<br>
-mkdir MyProject<br>
-cd MyProject<br>
-vi MyProg.cpp<br><br>
-
-To use the Xbase classes, include the following header file in the program:
-<br><br>
-
-#include &lt;xbase/xbase.h&gt;<br><br>
-
-For more details, check out the sample programs in the
-xbase/examples directory.
-<br><br>
-<hr><h2>Compiling and Linking Unix Application Program for v3.0 later</h2>
-
-The install script should have provided specific instructions for your
-environment on how to link with the xbase library. <br><br>
-
-In the Linux environment, assuming that you are using shared libraries,
-and usr/local/lib has been added to
-the /etc/ld.so.conf file, and the ldconfig command was executed
-<br><br>
-
-To Compile:<br>
-g++ -c -Wall -I/usr/include -I/usr/src/linux/include-asm-i386 -I/usr/local/include
--I/usr/local/xbase myprog.cpp<br><br>
-To Link Edit:<br>
-g++ -o myprog myprog.o libxbase.so<br><br>
-
-<hr><h2>Compiling an Application Program with Borland v4.5 C/C++compiler</h2>
-With Borland C compiler: bcc -Ic:\xbase\src myprog.cpp -Lc:\xbase\src\xbase.lib
-<br><br>
-
-<hr><h2>Getting the latest development version of XBase</h2>
-
-<br>The Xbase project is in an ongoing state of development with new
-enhancements being added and bug fixes being applied as they are found
-and the package maintainers have time. There are several programmers
-from various parts of the world working on Xbase. If you would like to
-get the latest version of the Xbase library for your project, it is
-available on sourceforge.net.
-
-<br><h3>Notes about using the current development library</h3>
-<li>1 - Library functions may or may not be documented
-<li>2 - The library may or may not be stable. This is the development library
-and is being updated with current code changes. If you are using it, and it
-does not behave the way you think it should, you may want to drop a note to
-<A HREF="mailto:xdb-devel@lists.sourceforeg.net">xdb-devel@lists.sourceforge.net
-</A> This may sound a little unsettling, but the
-library is generally stable. It goes through periods of time where it is in
-a state of flux when major changes are occurring, but for the most part it is
-probably OK to use.
-<li>3 - If you have changes to contribute to the library, mail your updates
-to<A HREF="mailto:xdb-devel@lists.sourceforge.net">
-xdb-devel@lists.sourceforge.net</A><br>.
-
-<hr><br>
-<h2>System Limitations</h2>
-<br>
-Maximum size of a database file is the size of LONG - 2,147,483,647 bytes<br>
-Total number of fields in a database - 1024 <br>
-Total number of characters in all fields - 32767<br>
-Maximum number of characters in a field - 254<br>
-Total number of records in a file - 1 billion<br>
-Maximum index key length - 100 bytes<br>
-Maximum .DBT file memo block size - 32256<br>
-Maximum expression result length - 100 bytes<br>
-Maximum NDX index key length - 100 bytes<br><br>
-<hr><br><br>
-
-<CENTER>
-<TABLE BORDER>
-<CAPTION ALIGN=TOP><H3>Xbase Options - Unix Automake environment</H3></CAPTION>
-<TR VALIGN=BASELINE>
-<TR><TH ALIGN=LEFT>OPTION<TD>DESCRIPTION
-<TR><TH ALIGN=LEFT>--without-xbase-debug<TD>Turns off xbase debugging code
-<TR><TH ALIGN=LEFT>--without-index-ndx<TD>Turns off NDX index options
-<TR><TH ALIGN=LEFT>--without-index-ntx<TD>Turns off NTX index options
-<TR><TH ALIGN=LEFT>--without-memo-fields<TD>Turns off memo fields
-<TR><TH ALIGN=LEFT>--without-expressions<TD>Turns off expression processing
-<TR><TH ALIGN=LEFT>--without-ui-html<TD>Turns off HTML user interface class
-<TR><TH ALIGN=LEFT>--without-xbase-locking<TD>Turns off xbase locking
-<TR><TH ALIGN=LEFT>--without-xbase-debug<TD>Turns off debug logic
-<TR><TH ALIGN=LEFT>--without-exceptions<TD>Turns on exception processing
-<TR><TH ALIGN=LEFT>--with-castellano<TD>Turn on castellano/spanish date options
-<TR><TH ALIGN=LEFT>--without-realdelete<TD>Turn off Xbase record deletion
-<TR><TH ALIGN=LEFT>--without-xbase-filter<TD>Turn off Xbase filter logic
-</TABLE></CENTER>
-<br><br>
-
-Use these options on the command line when executing the <em>./configure</em>
-command. Also, you can execute <em>./configure --help</em> for a complete
-list of all unix configure options.
-<br><br>
-<B>Q</B> Why turn any of thes options off?<br>
-<B>A</B> Smaller library<br><br><hr>
-
-
-<p><img src=xbase.jpg><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xbc11.htm b/html/xbc11.htm
deleted file mode 100755
index 9af3860..0000000
--- a/html/xbc11.htm
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<HTML>
-<TITLE>Xbase DBMS Chapter 11</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align="center">Library Options and Methods<br></H1>
-<p align="center">Chapter Updated 2/1/99</p><hr>
-<br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>xbXbase Class Methods</H3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Method<TD>Description
-<TR><TH ALIGN="LEFT">void xbXBase::DisplayError(xbShort ErrorNumber)<TD>Display error text
-<TR><TH ALIGN="LEFT">char * xbXbase::GetDefaultDateFormat()<TD>Return the default date format
-<TR><TH ALIGN="LEFT">void xbXBase::SetDefaultDateFormat(char * Format)<TD>Set the default date format
-</TABLE>
-<br><br>
-<hr>
-<h2>Method Definitions</h2>
-<hr>
-<h4>Method void xbXbase::DisplayError( xbShort ErrorNo )</h4><br>
-This method prints a text description of an error code.
-<h4>Example Code Snipit:</h4>
-
-<xmp>
-xbShort rc;
-rc = d.SomeXbaseFunction(...);
-if( rc < 0 )
- x.DisplayError( rc );
-else
- DoSomethingUsefull();
-</xmp>
-<hr>
-<h4>Method char * xbXBase::GetDefaultDateFormat( void )<br>
-Method void xbXBase::SetDefaultDateFormat( char * NewDateFormat )</h4><br>
-These methods are used for retrieving and setting the default date format
-which is used by expression function DTOC.
-<br><br><hr>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xbc12.htm b/html/xbc12.htm
deleted file mode 100755
index af33408..0000000
--- a/html/xbc12.htm
+++ /dev/null
@@ -1,566 +0,0 @@
-<!DOCTYPE xbHtml PUBLIC>
-<xbHtml>
-<TITLE>Xbase DBMS Chapter 12</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align="center">Database Methods</p></H1>
-<p align="center">Chapter Updated 1/30/99</p><hr>
-<br>
-This chapter lists the database methods and provides links to examples of how
-to use them.<br><br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Xbase Database Method List</h3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Method<TD>Description
-<TR><TH ALIGN="LEFT">xbShort rc AppendRecord()<TD>Append a new record to the end of an open database
-<TR><TH ALIGN="LEFT">void AutoLockOn()<TD>Turns on automatic record locking (see locking chapter)
-<TR><TH ALIGN="LEFT">void AutoLockOff()<TD>Turns off automatic record locking (see locking chapter)
-<TR><TH ALIGN="LEFT">void BlankRecord()<TD>Fill the current record buffer with blanks
-<TR><TH ALIGN="LEFT">xbLong csum CalcCheckSum()<TD>Calculate checksum on a data record
-<TR><TH ALIGN="LEFT">xbShort rc CloseDatabase()<TD>Close an open database
-<TR><TH ALIGN="LEFT">xbShort rc CopyDbfStructure(<br> char * NewFileName,<br>
- xbShort OverlaySwitch )<TD>Copies the structure of a xbDbf file to a new file
-<TR><TH ALIGN="LEFT">xbShort rc CreateDatabase(<br>char * FileName,
- XbSchema *s, xbShort OverlaySwitch )<TD>Close an open database
-<TR><TH ALIGN="LEFT">xbULong CurrentRecNo()<TD>Returns the current record number
-<TR><TH ALIGN="LEFT">xbShort rc DeleteAllRecords()<TD>Mark all records for deletion
-<TR><TH ALIGN="LEFT">xbShort rc DeleteRecord()<TD>Mark a record for deletion
-<TR><TH ALIGN="LEFT">xbShort rc DumpHeader(xbShort option)<TD>Display information about a .DBF file header
-<TR><TH ALIGN="LEFT">xbShort rc DumpRecord(<br>xbULong RecNo)<TD>Dump a record for a database
-<TR><TH ALIGN="LEFT">xbLong cnt FieldCount()<TD>Returns number of fields in database
-<TR><TH ALIGN="LEFT">xbLong recno GetCurRecNo()<TD>Returns current record number
-<TR><TH ALIGN="LEFT">xbShort rc GetFirstRecord()<TD>Get the first record in the database
-<TR><TH ALIGN="LEFT">xbShort rc GetLastRecord()<TD>Get the last record in the database
-<TR><TH ALIGN="LEFT">xbShort rc GetNextRecord()<TD>Get the next record in the database
-<TR><TH ALIGN="LEFT">xbShort rc GetPrevRecord()<TD>Get the previous record in the database
-<TR><TH ALIGN="LEFT">xbShort rc GetRecord(xbLong RecNo)<TD>Get a record by record number from an open database
-<TR><TH ALIGN="LEFT">char * buf GetRecordBuf()<TD>Returns a pointer to the record buffer
-<TR><TH ALIGN="LEFT">xbLong RecCnt NoOfRecords()<TD>Returns the number of records in an open database
-<TR><TH ALIGN="LEFT">xbShort rc OpenDatabase(char * FileName)<TD>Open an existing database
-<TR><TH ALIGN="LEFT">xbShort rc PackDatabase(<br>xbShort WaitOption)<TD>Compress file and remove deleted records
-<TR><TH ALIGN="LEFT">xbShort rc PutRecord(xbULong RecNo)<TD>Put a record in an open database
-<TR><TH ALIGN="LEFT">xbShort rc RebuildAllIndices()<TD>Rebuilds all open indices
-<TR><TH ALIGN="LEFT">xbShort dflag RecordDeleted()<TD>Determine if a record has been deleted
-<TR><TH ALIGN="LEFT">xbShort version SetVersion(xbShort Ver)<TD>Set version to xbase III+ or IV style xbDbf files
-<TR><TH ALIGN="LEFT">xbShort rc UndeleteAllRecords()<TD>Unmark all deleted records
-<TR><TH ALIGN="LEFT">xbShort rc UndeleteRecord()<TD>Unmark a deleted record
-<TR><TH ALIGN="LEFT">xbShort rc Zap(xbShort WaitOption)<TD>Deletes all records from a database
-</TABLE>
-<BR><BR><hr>
-<h2>Method Definitions</h2>
-<hr>
-<h3>Method xbShort xbDbf::AppendRecord( void )</h3><br>
-This method appends the contents of the database record buffer to the end of
-the .DBF file and updates the date and number of records in the header of the
-datafile.<br><br>
-This method also updates any open indexes associated with the database.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Write lock not successful
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Unsuccessful write operation
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample2.cpp">sample2.cpp</A> for an example
-of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::BlankRecord( void )</h3><br>
-This method overlays the database record buffer with space (0x20)
-CHARacters. This method is useful for initializing the record buffer.<br>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample2.cpp">sample2.cpp</A> for an example of
-how to use this method.
-<hr>
-
-<h3>Method xbLong xbDbf::CalcCheckSum( void )</h3><br>
-This method calculates the checksum of a database record.
-<hr>
-
-<h3>Method xbShort xbDbf::CloseDatabase( void )</h3><br>
-This method closes an Xbase (.DBF) file
-which was previously opened by CreateDatabase or OpenDatabase
-and frees any previously allocated memory which is no LONGer needed.<br><br>
-This method automatically closes any open indexes associated with the
-database before closing the database.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>If there is no error
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample2.cpp">sample2.cpp</A> for an example
-of how to use this method.
-<hr>
-
-
-<h3>Method xbShort xbDbf::CopyDbfStructure( char *NewFileName, xbShort OverLay )</h3><br>
-This method copies the structure of an Xbase (.DBF) file to file <em>NewFileName</em>.
-If there are memo fields, they are included.
-<br><br>
-The <em>OverLay</em> switch is
-used to determine what to do if a xbDbf file with the same name
-already exists. If <em>OverLay</em> is set to XB_OVERLAY and the file exists,
-the file is overwritten, otherwise an error is returned.<br><br>
-<em>Overlay Switch</em> is:<br>
-<li>XB_OVERLAY = Overlay file if it exists<br>
-<li>XB_DONTOVERLAY = Return with error if file exists<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_FILE_EXISTS<TD>If a file exists and OverLay switch = FALSE
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Couldn't open the file
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory allocation error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Couldn't write to disk
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek routine error
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/copydbf.cpp">copydbf.cpp</A> for an example
-of how to use this method.
-<hr>
-
-
-<h3>Method: xbShort xbDbf::CreateDatabase( char *FileName,
- xbSchema *s, xbShort OverLay )</h3><br>
-This method creates an Xbase (.DBF) file with the name
-of FileName and builds the header record with the format as
-defined in the <em>xbSchema</em> parameter. The <em>OverLay</em> switch is
-used to determine what to do if a xbDbf file with the same name
-already exists. If <em>OverLay</em> is set to XB_OVERLAY and the file exists,
-the file is overwritten, otherwise an error is returned.<br><br>
-<em>Overlay Switch</em> is:<br>
-<li>XB_OVERLAY = Overlay file if it exists<br>
-<li>XB_DONTOVERLAY = Return with error if file exists<br><br>
-<em>xbSchema</em> has the following format:<br>
-<xmp>
-xbSchema MyRecordSchema[] =
-{
- { FieldName, Type, FieldLength, NoOfDecimals },
- { FieldName2, Type, FieldLength, NoOfDecimals },
- ...
- { "",0,0,0 }
-};
-</xmp>
-Where:<br>
-<li><em>FieldName</em> is the name of the data field.<br>
-<li><em>Type</em><br><br>
-<h4>Version 1.7.4 and greater:</h4>
-XB_CHAR_FLD or C<br>
-XB_DATE_FLD or D<br>
-XB_LOGICAL_FLD or L<br>
-XB_MEMO_FLD or M<br>
-XB_FLOAT_FLD or F<br>
-XB_NUMERIC_FLD or N<br><br>
-<li><em>FieldLength</em> is the length of the field.<br>
-<li><em>NoOfDecimals</em> is the number of decimals for NUMERIC fields.<br>
-<br>
-The record buffer is automatically set to spaces when this method is called.
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_FILE_EXISTS<TD>If a file exists and OverLay switch = FALSE
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Couldn't open the file
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory allocation error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Couldn't write to disk
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample1.cpp">sample1.cpp</A> for an example
-of how to use this method.
-<hr>
-<h3>Method xbULong xbDbf::CurrentRecNo( void )</h3><br>
-This method returns the current record number.<br><br>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/dumprecs.cpp">dumprecs.cpp</A> for an example
-of how to use this method.
-
-<hr>
-<h3>Method xbShort xbDbf::DeleteAllRecords( void )</h3><br>
-This method marks all unmarked records in the database for deletion.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>No error encountered
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Could not mark record
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>If the file is not open
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek routine error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Write routine error
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/deletall.cpp">deletall.cpp</A> for an example
-of how to use this method.
-
-<hr>
-<h3>Method xbShort xbDbf::DeleteRecord( void )</h3><br>
-This method marks the current record for deletion in the database.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>No error encountered
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Could not mark record
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample4.cpp">sample4.cpp</A> for an example
-of how to use this method.
-
-<hr>
-<h3>Method xbShort xbDbf::DumpHeader( xbShort Option )</h3><br>
-This method displays information about a .DBF file header to stdout.
-This method is only available if the DEBUG option is turned on in the
-<em>options.h</em> file<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Options</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Option<TD>Action
-<TR><TH ALIGN="LEFT">1<TD>Print Header Only
-<TR><TH ALIGN="LEFT">2<TD>Field Data Only
-<TR><TH ALIGN="LEFT">3<TD>Header and Field Data
-</TABLE>
-<br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_INVALID_OPTION<TD>Option must be 1,2 or 3
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>File is not open
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>No error encountered
-</TABLE>
-<br>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/dumphdr.cpp">dumphdr.cpp</A> for an
-example of how to use this method.
-
-<hr>
-<h3>Method xbShort xbDbf::DumpRecord( xbULong RecNo )</h3><br>
-This method dumps record RecNo for the database to stdout.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>No error encountered
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Invalid record for RecNo parameter
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/dumprecs.cpp">dumprecs.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbLong xbDbf::FieldCount( void )</h3><br>
-This method returns the number of fields defined in the database.
-<br><br>
-<hr>
-<h3>Method xbLong xbDbf::GetCurRecNo( void )</h3><br>
-This method returns the current record number of the record in the record buffer.
-<br><br>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::GetFirstRecord( void )</h3><br>
-This method loads the first record of the file into the record buffer.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Invalid record number
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Unsuccessful lock operation
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>If the file is not open
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek routine error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Write routine error
-</TABLE>
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::GetLastRecord( void )</h3><br>
-
-This method loads the last record of the file into the record buffer.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Read lock not successful
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_EOF<TD>At end of file
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>If the file is not open
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Invalid record number
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek routine error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Write routine error
-</TABLE>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an example
-of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::GetNextRecord( void )</h3><br>
-
-This method loads the next record of the file into the record buffer.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Read lock not successful
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_EOF<TD>At end of file
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>If the file is not open
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Invalid record number
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek routine error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Write routine error
-</TABLE>
-</TABLE>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::GetPrevRecord( void )</h3><br>
-
-This method loads the previous record of the file into the record buffer.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Read lock not successful
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_BOF<TD>At beginning of file
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>If the file is not open
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Invalid record number
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek routine error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Write routine error
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::GetRecord( xbLong RecNo )</h3><br>
-This method retrieves record RecNo from the database into the record buffer.
-<br><br>
-This method will call the PutRec method and flush all updates to disk if
-necessary before moving to the specified record. If PutRecord is not
-successful, this method will return the return code from PutRecord.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Read lock not successful
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>If the file is not open
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Invalid record number
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek routine error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Write routine error
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method char * xbDbf::GetRecordBuf( void )</h3><br>
-This method returns a pointer to the record buffer.
-<br><br>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbLong xbDbf::NoOfRecords( void )</h3><br>
-This method returns the number of records in the file.<br><br>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::OpenDatabase( char * FileName )</h3><br>
-This method opens an Xbase (.DBF) file with the name
-of FileName. <em>FileName</em> must a valid filename which can include
-drives identifier, directory, filename and extension. <br><br>
-The OpenDatabase method does not position to any any particular
-data record. After opening a database, use GetRecord, GetFirstRecord
-or GetLastRecord to position to a particular data record and load
-a data record into the record buffer.<br><br>
-The record buffer is automatically set to spaces when this method is called.
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Couldn't open the file
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory allocation error
-<TR><TH ALIGN="LEFT">XB_NOT_XBASE<TD>Not an xbXBase type file
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample2.cpp">sample2.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::PackDatabase( xbShort WaitOption )</h3><br>
-This method removes all records marked for deletion from an Xbase (.DBF) file
-and reindexes any open index files. This method also reorganizes any memo
-fields stored in a .DBT memo file.
-<br><br>
-<em>WaitOption</em> is one of:<br><br>
-<li>F_SETLK - returns if the xbDbf file can not be exclusively locked
-<li>F_SETLKW - will wait to execute until it can exclusively lock the file
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_CLOSE_ERROR<TD>If intermediate work file can not be closed
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open file
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory allocation error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Error writing to file
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek error encountered
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Can not lock file or index
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/packdbf.cpp">packdbf.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::PutRecord( xbLong RecNo )</h3><br>
-This method copies the record buffer into record <em>RecNo</em> in the database.
-This method can be used for updating records which were retrieved by
-the GetRecord method.<br><br>
-This method updates any open index files.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Write lock not successful
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>Database is not open
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Invalid record number
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek operation failed
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Write operation failed
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-
-<h3>Method xbShort xbDbf::RebuildAllIndicis( void )</h3><br>
-This method rebuilds all opened indicis for the database file.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Error writing data
-<TR><TH ALIGN="LEFT">XB_CLOSE_ERROR<TD>Error closing work file
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/reindex.cpp">reindex.cpp</A> for an
-example of how to use this method.
-<hr>
-
-
-
-<h3>Method xbShort xbDbf::RecordDeleted( void )</h3><br>
-This method returns TRUE (or 1) if a record is marked for deletion and
-returns FALSE (or 0) if the record is not marked for deletion. <br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">TRUE (1)<TD>Record is marked for deletion
-<TR><TH ALIGN="LEFT">FALSE (0)<TD>Record is not marked for deletion
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample4.cpp">sample4.cpp</A> for an
-example of how to use this method.
-<hr>
-
-
-<h3>Method xbShort xbDbf::SetVersion( xbShort Vswitch )</h3><br>
-
-This method sets the version of xbDbf and DBT database files and memo files
-to be created using the CreateDatabase method. The default setting is
-3 - dBASE III+ version files. It can be set to 4 - for dBASE IV style
-files.<br><br>
-Vswitch is one of:<br>
-0 - return current setting<br>
-3 - Set to create version III files (default)<br>
-4 - Set to create version IV files<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>Setting updated
-<TR><TH ALIGN="LEFT">3 or 4<TD>If Vswitch = 0, it returns current version setting
-<TR><TH ALIGN="LEFT">XB_INVALID_OPTION<TD>Vswictch not one of 0,3 or 4
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample1.cpp">sample1.cpp</A> for an
-example of how to use this method.
-<hr>
-
-<h3>Method xbShort xbDbf::UndeleteAllRecords( void )</h3><br>
-This method unmarks all marked for deletion records in the database.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>No error encountered
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Could not mark record
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>If the file is not open
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek routine error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Write routine error
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/undelall.cpp">undelall.cpp</A> for an example
-of how to use this method.
-<hr>
-
-<h3>Method xbShort xbDbf::UndeleteRecord( void )</h3><br>
-This method removes the mark for deletion on the current record in the
-database.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>No error encountered
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Could not unmark record
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample4.cpp">sample4.cpp</A> for an
-example of how to use this method.
-<hr>
-
-<h3>Method xbShort xbDbf::Zap( xbShort WaitOption )</h3><br>
-This method removes all records from a database and any open indices.
-<br><br>
-<em>WaitOption</em> is one of:<br><br>
-<li>F_SETLK - returns if the xbDbf file can not be exclusively locked
-<li>F_SETLKW - will wait to execute until it can exclusively lock the file
-<br><br>
-<TABLE BORDER>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>No error encountered
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Could not lock file
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Could not write to file
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open temp database
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/zap.cpp">zap.cpp</A> for an
-example of how to use this method.
-<hr>
-
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</xbHtml>
diff --git a/html/xbc13.htm b/html/xbc13.htm
deleted file mode 100755
index e085157..0000000
--- a/html/xbc13.htm
+++ /dev/null
@@ -1,470 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<HTML>
-<TITLE>Xbase DBMS Chapter 13</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align="center">Field Methods</p></H1>
-<p align="center">Chapter Updated 2/1/99</p><hr>
-
-This chapter lists the field methods and provides examples of how to use
-them.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Xbase Field Method List</h3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Method<TD>Description
-<TR><TH ALIGN="LEFT">xbLong cnt FieldCount()<TD>Returns the number of fields
- in the file
-<TR><TH ALIGN="LEFT">xbDouble d GetDoubleField(char * FieldName)<TD>Returns a xbDouble field for field name
-<TR><TH ALIGN="LEFT">xbDouble d GetDoubleField(xbShort FieldNo)<TD>Returns a xbDouble field for field number
-<TR><TH ALIGN="LEFT">xbShort rc GetField(xbShort,char *buf)<TD>Gets field data from the record buffer
-<TR><TH ALIGN="LEFT">xbShort d GetFieldDecimal(xbShort FieldNo)<TD>Gets field decimal count
-<TR><TH ALIGN="LEFT">xbShort len GetFieldLen(xbShort FieldNo)<TD>Returns the length of a given field
-<TR><TH ALIGN="LEFT">char * name GetFieldName(xbShort FieldNo)<TD>Returns field name for field number
-<TR><TH ALIGN="LEFT">xbShort FieldNo GetFieldNo(char * FieldName)<TD>Returns the field ID number for a given field
-<TR><TH ALIGN="LEFT">char type GetFieldType(xbShort FieldNo)<TD>Returns the type of a given field
-<TR><TH ALIGN="LEFT">xbFloat f GetFloatField(char * FieldName)<TD>Returns a float field for field name
-<TR><TH ALIGN="LEFT">xbFloat f GetFloatField(xbShort FieldNo)<TD>Returns a float field for field number
-<TR><TH ALIGN="LEFT">xbShort l GetLogicalField(xbShort FieldNo)<TD>Returns logical field data
-<TR><TH ALIGN="LEFT">xbShort l GetLogicalField(char * FieldName)<TD>Returns logical field data
-<TR><TH ALIGN="LEFT">xbLong l GetLongField(char * FieldName)<TD>Returns a long field for field name
-<TR><TH ALIGN="LEFT">xbLong l GetLongField(xbShort FieldNo)<TD>Returns a long field for field number
-<TR><TH ALIGN="LEFT">xbShort rc GetMemoField(xbShort FieldNo,<br>xbLong len,char * buf)<TD>Get memo field data
-<TR><TH ALIGN="LEFT">xbLong len GetMemoFieldLen(xbShort FieldNo)<TD>Get memo field data length
-<TR><TH ALIGN="LEFT">xbShort s MemoFieldsPresent()<TD>Determine if memo fields exist in DBF file
-<TR><TH ALIGN="LEFT">xbShort s MemoFieldExists(xbShort FieldNo)<TD>Determine if a particular memo field has data
-<TR><TH ALIGN="LEFT">xbShort rc PutDoubleField(char * FieldName,<br>xbDouble d)<TD>Updates a xbDouble field for field name
-<TR><TH ALIGN="LEFT">xbShort rc PutDoubleField(xbShort FieldNo,<br>xbDouble d)<TD>Updates a xbDouble field for field number
-<TR><TH ALIGN="LEFT">xbShort rc PutField(xbShort FieldNo,char * val)<TD>Fills or overlays a field in the current record buffer
-</TABLE>
-
-<br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Xbase Field Method List (cont)</h3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Method<TD>Description
-<TR><TH ALIGN="LEFT">xbShort rc PutFloatField(char * FieldName,<br>xbFloat f)<TD>Updates a float field for field name
-<TR><TH ALIGN="LEFT">xbShort rc PutFloatField(xbShort FieldNo,<br>xbFloat f)<TD>Updates a float field for field number
-<TR><TH ALIGN="LEFT">xbShort rc PutLongField(char * FieldName,<br>xbLong l)<TD>Updates a long field for field name
-<TR><TH ALIGN="LEFT">xbShort rc PutLongField(xbShort FieldNo,<br>xbLong l)<TD>Updates a long field for field number
-<TR><TH ALIGN="LEFT">xbShort rc UpdateMemoData(xbShort FieldNo,<br>xbLong len,char * buf,
-xbShort LockOpt)<TD>Update memo field data
-<TR><TH ALIGN="LEFT">xbShort l ValidLogicalData( char * buf )<TD>Check for valid logical data
-<TR><TH ALIGN="LEFT">xbShort l ValidNumericData( char * buf )<TD>Check for valid numeric data
-</TABLE>
-<BR><BR>
-
-<hr>
-<h2>Method Definitions</h2>
-<hr>
-
-<h3>Method xbLong xbDbf::FieldCount( void )</h3><br>
-This method returns the number of fields which exist in the database.
-<br><br>
-<h4>Method Return Codes</h4><br>
-If successful, this method returns the number of fields in the database.
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-
-<h3>Method xbDouble xbDbf::GetxbDoubleField( char * FieldNo )</h3><br>
-This method returns a xbDouble value for field FieldNo. Fieldno can be retrieved
-by using method GetFieldNo.
-<br><br>
-<hr>
-
-<h3>Method xbDouble xbDbf::GetxbDoubleField( char * FieldName )</h3><br>
-This method returns a xbDouble value for field FieldName. If multiple accesses
-for this particular field will be made from within the program, it is more
-efficient to access the data utlizing the field's number, rather than its name.
-<br><br>
-
-<hr>
-<h3>Method xbShort xbDbf::GetField( xbShort FieldNo, char * buf )</h3><br>
-
-This method fills an application program supplied buffer *buf with data
-from the record buffer for field number FieldNo. FieldNo can be retrieved
-by using method GetFieldNo.<br><br>
-
-It is the responsibility of the application program to verify the buffer is
-large enough to hold the data. No checking is done by method GetField to
-verify the buffer is large enough to hold the data.<br><br>
-If successful, this method returns the length of the field in bytes.
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-
-<hr>
-<h3>Method xbShort xbDbf::GetFieldDecimal( xbShort FieldNo )</h3><br>
-
-This method returns the decimal count of field FieldNo. FieldNo can be retrieved
-by using method GetFieldNo.<br><br>
-If successful, this method returns the decimal count.
-
-<hr>
-<h3>Method xbShort xbDbf::GetFieldLen( xbShort FieldNo )</h3><br>
-
-This method returns the length of field FieldNo. FieldNo can be retrieved
-by using method GetFieldNo.<br><br>
-If successful, this method returns the length of the field in bytes.
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an example
-of how to use this method.
-
-<hr>
-<h3>Method char * xbDbf::GetFieldName( xbShort FieldNo )</h3><br>
-
-This method returns a pointer to the name of field FieldNo. FieldNo can be retrieved
-by using method GetFieldNo.<br><br>
-If successful, this method returns the field name.<br>
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/dumpdbt.cpp">dumpdbt.cpp</A> for an example
-of how to use this method.
-<hr>
-
-<h3>Method xbShort xbDbf::GetFieldNo( char * FieldName )</h3><br>
-
-This method is used to get a field's ID number based on paramater
-FieldName. Where FieldName is a valid name of a field in the database.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">-1<TD>Field not found in record
-<TR><TH ALIGN="LEFT">0 through n<TD>The field number for field FieldName
-</TABLE>
-<br><br>
-<h4>Example Program:</h4>
-
-See sample program <A HREF="/XbaseSamples/sample2.cpp">sample2.cpp</A> for an example
-of how to use this method.
-
-<hr>
-<h3>Method xbShort xbDbf::GetFieldType( xbShort FieldNo )</h3><br>
-
-This method returns the type of field FieldNo. FieldNo can be retrieved
-by using method GetFieldNo.<br><br>
-
-<h4>Method Return Codes</h4><br>
-If successful, this method returns the field type.<br>
-C = character<br>
-D = Date<br>
-L = Logical<br>
-M = Memo<br>
-N = Numeric<br>
-F = Float<br><br>
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an example
-of how to use this method.
-<hr>
-
-<h3>Method xbFloat xbDbf::GetFloatField( char * FieldName )</h3><br>
-
-This method returns a float value for field FieldName. If multiple accesses
-for this particular field will be made from within the program, it is more
-efficient to access the data utlizing the field's number, rather than its name.
-<br><br>
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbFloat xbDbf::GetFloatField( xbShort * FieldNo )</h3><br>
-
-This method returns a float value for field number FieldNo.
-<br><br>
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/sample3.cpp">sample3.cpp</A> for an
-example of how to use this method.
-<hr>
-
-
-<h3>Method xbShort xbDbf::GetLogicalField( xbShort FieldNo )</h3><br>
-
-<h3>Method xbShort xbDbf::GetLogicalField( char * FieldName )</h3><br>
-
-This method returns -1 if field <em>FieldName</em> or <em>FieldNo</em> is not
-a logical field.
-It returns 1 if field <em>FieldName</em> is a 'T','t','Y' or 'y'. It returns
-0 if not 'T','t','Y' or 'y'.
-<br>
-<hr>
-<h3>Method xbLong xbDbf::GetLongField( xbShort * FieldNo )</h3><br>
-
-<h3>Method xbLong xbDbf::GetLongField( char * FieldName )</h3><br>
-
-This method returns a long value for field FieldName. If multiple accesses
-for this particular field will be made from within the program, it is more
-efficient to access the data utlizing the field's number, rather than its name.
-<br><br>
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/zips/zipinit.cpp">zipinit.cpp</A> for an
-example of how to use this method.
-
-<hr>
-<h3>Method xbLong xbDbf::GetLongField( xbShort * FieldNo )</h3><br>
-
-This method returns a long value for field FieldNo. FieldNo can be
-determined by utilizing method GetFieldNo.
-<br><br>
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/zips/zipinq.cpp">zipinq.cpp</A> for an
-example of how to use this method.
-
-
-
-<hr>
-<h3>Method xbShort xbDbf::GetMemoField( xbShort FieldNo, xbLong len, char * Buf, xbShort LockOption )</h3><br>
-
-This method returns <em>Len</em> bytes of memo field <em>FieldNo</em>. <em>Buf</em>
-is a user supplied buffer large enough to contain the data. No checking
-of the field's size is performed by this method.<br><br>
-
-
-<em>Lock Option</em>is one of:<br>
-
-F_SETLK - return immediately if lock fails<br>
-F_SETLKW - wait until lock function executes<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_INVALID_FIELDNO<TD>An invalid field number was used
-<TR><TH ALIGN="LEFT">XB_NOT_MEMO_FIELD<TD>Not a memo field
-<TR><TH ALIGN="LEFT">XB_NO_MEMO_DATA<TD>No memo data exists
-<TR><TH ALIGN="LEFT">XB_INVALID_BLOCK_NO<TD>Internal error, notify tech support
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Disk Error
-<TR><TH ALIGN="LEFT">XB_READ_ERROR<TD>Disk Error
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>No Error
-</TABLE>
-<br><br>
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/dumpdbt.cpp">dumpdbt.cpp</A> for
-an example of how to use this method.
-
-<hr>
-<h3>Method xbLong xbDbf::GetMemoFieldLen( xbShort FieldNo )</h3><br>
-
-This method returns the length of memo field FieldNo. FieldNo can be
-retrieved by using method GetFieldNo.<br><br>
-If successful, this method returns the length of the memo field in bytes.
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/dumpdbt.cpp">dumpdbt.cpp</A> for
-an example of how to use this method.
-
-<hr>
-
-<h3>Method xbShort xbDbf::MemoFieldExists( xbShort FieldNo )</h3><br>
-
-This method returns true (1) if field FieldNo has any memo data. Otherwise
-it returns false (0).
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">0<TD>Data file does not have any memo fields
-<TR><TH ALIGN="LEFT">1<TD>Data file has memo fields
-</TABLE>
-<br><br>
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/dumpdbt.cpp">dumpdbt.cpp</A> for an
-example of how to use this method.
-
-<hr>
-
-<h3>Method xbShort xbDbf::MemoFieldsPresent( void )</h3><br>
-
-This method returns true (1) if the file has any memo fields. Otherwise
-it returns false (0).
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">0<TD>Data file does not have any memo fields
-<TR><TH ALIGN="LEFT">1<TD>Data file has memo fields
-</TABLE>
-<br><br>
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/dumpdbt.cpp">dumpdbt.cpp</A> for an
-example of how to use this method.
-
-<hr>
-<h3>Method xbShort xbDbf::PutxbDoubleField( char * FieldName, xbDouble d )</h3><br>
-
-This method puts a xbDouble value d for field FieldName. If multiple accesses
-for this particular field will be made from within the program, it is more
-efficient to access the data utlizing the field's number.
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_INVALID_FIELDNO<TD>An invalid field number was used
-<TR><TH ALIGN="LEFT">XB_INVALID_DATA<TD>Attempt to load invalid numeric or logical data
-</TABLE>
-<br><br><hr>
-<h3>Method xbShort xbDbf::PutxbDoubleField( xbShort FieldNo, xbDouble d )</h3><br>
-This method puts a xbDouble value d for field FieldNo.
-<br><br>
-<h3>Method Return Codes</h3>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_INVALID_FIELDNO<TD>An invalid field number was used
-<TR><TH ALIGN="LEFT">XB_INVALID_DATA<TD>Attempt to load invalid numeric or logical data
-</TABLE>
-<br><br>
-
-<hr>
-<h3>Method xbShort xbDbf::PutField( xbShort FieldNo, char * buf )</h3><br>
-
-This method fills field number FieldNo, with the data from buffer *buf.<br><br>
-It copies data from *buf until a 0x00 character is encountered or the buffer
-is filled. The field will be truncated if it is to long.<br><br>
-Use method GetFieldNo to determine the value for FieldNo.<br><br>
-If the field is type N or F, the field is loaded right justified, left blank
-filled onto the record buffer.<br><br>
-This method does check the validity of NUMERIC and LOGICAL data it is loading onto the
-record buffer. Ther can be no spaces or non-numeric data for numeric fields.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_INVALID_FIELDNO<TD>An invalid field number was used
-<TR><TH ALIGN="LEFT">XB_INVALID_DATA<TD>Attempt to load invalid numeric or logical data
-</TABLE>
-<br><br>
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/sample2.cpp">sample2.cpp</A> for an example
-of how to use this method.
-<hr>
-
-<h3>Method xbShort xbDbf::PutFloatField( char * FieldName, FLOAT f )</h3><br>
-
-This method puts a float value f for field FieldName. If multiple accesses
-for this particular field will be made from within the program, it is more
-efficient to access the data utlizing the field's number.
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_INVALID_FIELDNO<TD>An invalid field number was used
-<TR><TH ALIGN="LEFT">XB_INVALID_DATA<TD>Attempt to load invalid numeric or logical data
-</TABLE>
-<br><br>
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/sample2.cpp">sample2.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::PutFloatField( xbShort FieldNo, FLOAT f )</h3><br>
-This method puts a float value f for field number FieldNo.
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_INVALID_FIELDNO<TD>An invalid field number was used
-<TR><TH ALIGN="LEFT">XB_INVALID_DATA<TD>Attempt to load invalid numeric or logical data
-</TABLE>
-<br><br>
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/sample2.cpp">sample2.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbLong xbDbf::PutLongField( char * FieldName, xbLong Val )</h3><br>
-This method puts a long value Val for field FieldName. If multiple accesses
-for this particular field will be made from within the program, it is more
-efficient to access the data utlizing the field's number.
-<br><br>
-<h4>Example Program:</h4>
-See sample program <A HREF="/zips/zipinit.cpp">zipinit.cpp</A> for an
-example of how to use this method.
-
-<hr>
-<h3>Method xbLong xbDbf::PutLongField( xbShort FieldNo, xbLong Val )</h3><br>
-This method puts a long value Val for field FieldNo. FieldNo can be determined
-by utilizing method GetFieldNo.
-<br><br>
-
-<h4>Example Program:</h4>
-See sample program <A HREF="/zips/zipinq.cpp">zipinq.cpp</A> for an
-example of how to use this method.
-<hr>
-<h3>Method xbShort xbDbf::UpdateMemoData( xbShort FieldNo, xbLong len,
- char * Buf, xbShort LockOption )</h3><br>
-This method updates field <em>FieldNo</em> with <em>Len</em> bytes of
-data from <em>Buf</em>.<br><br>
-This is the only routine necessary to add, revise or delete memo field
-data. To delete a memo field, set the length to zero (0L).<br><br>
-
-<em>LockOption</em> is one of<br>
-<li>F_SETLK - return immediately if lock fails
-<li>F_SETLKW - wait until lock function executes
-<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Lock Failed
-<TR><TH ALIGN="LEFT">XB_INVALID_BLOCK_NO<TD>Internal error, notify tech support
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Disk Error
-<TR><TH ALIGN="LEFT">XB_READ_ERROR<TD>Disk Error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Disk Error
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>No Error
-</TABLE>
-<br><br>
-<h4>Example Program:</h4>
-See sample program <A HREF="/XbaseSamples/sample2.cpp">sample2.cpp</A> for
-an example of how to use this method.
-<hr>
-
-
-
-<h3>Method xbShort xbDbf::ValidLogicalData( char * data )</h3><br>
-
-This method returns true if <em>data</em> contains a valid logical data value.
-Otherwise, it returns false.
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">1<TD>Valid logical data
-<TR><TH ALIGN="LEFT">0<TD>Invalid logical data
-</TABLE>
-<br>
-<hr>
-
-<h3>Method xbShort xbDbf::ValidNumericData( char * data )</h3><br>
-This method returns true if <em>data</em> contains a valid numeric data value.
-Otherwise, it returns false.
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">1<TD>Valid numeric data
-<TR><TH ALIGN="LEFT">0<TD>Invalid numeric data
-</TABLE>
-<br>
-<hr>
-
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xbc14.htm b/html/xbc14.htm
deleted file mode 100755
index 032b57f..0000000
--- a/html/xbc14.htm
+++ /dev/null
@@ -1,200 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<html>
-<title>Base DBMS Chapter 14</title>
-<body bgcolor=#FFFFFF>
-<h1><p align="center">xbString Methods</p></h1>
-<p align="center">Chapter Updated 8/20/03</p><hr>
-<h2>This table lists the xbString methods.</h2><br><br>
-<table border>
-<caption align=top><h3>xbString Method List API</h3></caption>
-<tr valign=baseline>
-<tr><th align=left>Method<td>Description
-<tr><th align=left>xbString()<td>Class Constructor
-<tr><th align=left>xbString(size_t size)<td>Constructor, allocates space of size
-<tr><th align=left>xbString(char c)<td>Constructor, initialized to char c
-<tr><th align=left>xbString(const char *s)<td>Constructor, initialized to string s
-<tr><th align=left>xbString(const char *s, size_t maxlen<td>
-Constructor, initialized to string s, with minimal string buf size of max_len
-<tr><th align=left>xbString(const xbString &s)<td>Constructor, initialized to string s
-<tr><th align=left>~xbString()<td>Class Destructor
-<tr><th align=left>const char operator*()<td>Returns data
-<tr><th align=left>char operator[](int n)<td>Returns char in position n
-<tr><th align=left>xbString &operator=(const xbString &s)<br>
- xbString &operator=(const char *s)<br>xbString &operator=(char c)
- <td>Set string to <em>s</em> or <em>c</em>.
-<tr><th align=left>xbString &operator+=(const char *s)<br>
-xbSting &operator+=(char c)<td>Concatonate data to string
-<tr><th align=left>xbString &operator-=(const char *s)<br>
-xbSting &operator+=(char c)<td>Concatonate data and eliminate spaces between
-strings.
-<tr><th align=left>bool operator==(const xbString &)<td>
-Compare string ==
-<tr><th align=left>bool operator!=(const xbString &)<td>
-Compare string !=
-<tr><th align=left>bool operator<(const xbString &s)<td>
-Compare string <
-<tr><th align=left>bool operator>(const xbString &s)<td>
-Compare string >
-<tr><th align=left>bool operator<=(const xbString &s)<td>
-Compare string <=
-<tr><th align=left>bool operator<=(const xbString &s)<td>
-Compare string >=
-<tr><th align=left>xbString addBackSlash( char c )<td>Prefixes all
-char <em>c</em> with a backslash.
-<tr><th align=left>xbString& assign(const xbString& str, size_t pos = 0,
-int len = 1)<td>Assign data in <em>str</em> starting at position <em>pos</em>
-for a length of <em>len</em> and return a reference.
-<tr><th align=left>xbString& assign(const xbString& str, int len )<td>
-Assign data in <em>str</em> for a length of <em>len</em> and return a reference.
-<tr><th align=left>xbString copy() const<td>Used to copy a string
-<tr><th align=left>const char * c_str() const<td>Returns the string or NULL
-if string is null. Depreciated function.
-<tr><th align=left>int countChar( char c ) const<td>Returns the count
-of char <em>c</em>.
-<tr><th align=left>int cvtHexChar( char & out )<td>Converts a four byte
-string in the format of 0x00 to a one byte char value <em>out</em>. Returns
-0 on success, -1 on error.
-<tr><th align=left>int cvtHexString( zbString & out )<td>Converts a
-string of four byte groupings in the format of 0x00 to a string of one byte
-characters <em>out</em>. Returns 0 on success, -1 on error.
-<tr><th align=left>char getCharacter( int n ) const<td>Returns the character
-as position <em>n</em>.
-<tr><th align=left>const char *getdata() const<td>Returns the string
-<tr><th align=left>bool hasAlphaChars() const<td>Returns true is string
-contains any alpha characters, otherwise returns false.
-<tr><th align=left>bool isEmpty() const<td>Returns true if the string has
-no memory allocated, or memory allocated is a zero byte string, otherwise
-returns false
-<tr><th align=left>bool isNull() const<td>Returns true if the string
-has no memory allocated for the string, otherwise returns false
-<tr><th align=left>size_t len() const<br>size_t length() const
-<td>Returns length of string. It does not include the null terminating byte.
-<tr><th align=left>xbString mid( size_t pos, int len )<td>Pull a string of
-data out of another string of data, starting at position <em>pos</em> for a
-length of <em>len</em>.
-<tr><th align=left>void ltrunc( size_t cnt )<td>Left truncate the string
-<em>cnt</em> bytes.
-<tr><th align=left>int pos(char c)<td>Locate character in string
-<tr><th align=left>int pos(const char *s)<td>Locate string <em>s</em> in string
-<tr><th align=left>void swapChars(char from, char to)<td>Swap character
-<em>from</em> to character <em>to</em>.
-<tr><th align=left>void putAt(size_t pos, char c)<td>Put character c at position pos
-<tr><th align=left>void remove( size_t pos = 0, int len )<td>Remove data
-from the string to starting at <em>pos</em> for a lenght of <em>len</em>.
-<tr><th align=left>void setNum(long num)<td>This method sets the string
-to the numeric value <em>num</em>.
-<tr><th align=left>xbString &sprintf(const char * format, ... )<td>
-Used to format a string. See the standard C printf function for formatting
-details. Internal 256 byte buffer which can be overflowed.
-<tr><th align=left>void toLowerCase()<td>Converts string to lower case
-<tr><th align=left>void toUpperCase()<td>Converts string to upper case
-<tr><th align=left>void trim()<td>trim trailing spaces
-<tr><th align=left>void zapChar( char c )<td>Remove all instances of
-<em>c</em> from the string.
-<tr><th align=left>void zapLeadingChar( char c )<td>Left truncate all
-of <em>c</em> from the string.
-<tr><th align=left>
- xbString operator-(const xbString &s1, const xbString &s2)
-<td>Concatonate two strings together, eliminate spaces
-<tr><th align=left>
- xbString operator+(const xbString &s1, const xbString &s2)<br>
- xbString operator+(const xbString &s1, const char *s2)<br>
- xbString operator+(const char *s1, const xbString &s2)<br>
- xbString operator+(const xbString &s1, char c2)<br>
- xbString operator+(char c1, const xbString &s2)<td>Concatonate two
- strings together
-<tr><th align=left>bool operator==(const xbString &, const char *)<td>
-Compare string ==
-<tr><th align=left>bool operator!=(const xbString &, const char *)<td>
-Compare string !=
-</table><br><br><br>
-<h2>Sample program</h2>
-<xmp>
-
-/* string.cpp
-
- Xbase project source code
-
- This program demonstrates the usage of the xbString class
-
- Copyright (C) 1997 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Mail:
-
- Technology Associates, Inc.
- XBase Project
- 1455 Deming Way #11
- Sparks, NV 89434
- USA
-
- Email:
-
- xbase@techass.com
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
- Website:
-
- xdb.sourceforge.net
-
-*/
-
-
-#include <xbase/xbase.h>
-
-int main()
-{
- xbString s1;
- xbString s2;
-
- s1 = "Some string data";
- s2 = "some more string data";
-
- std::cout << "s1 => " << s1 << std::endl;
- std::cout << "s2 => " << s2 << std::endl;
-
-
- s1 = "s1 ";
- s2 = "s2";
- s1 -= s2;
-
- std::cout << "-= operator => " << s1 << std::endl;
-
- s1 = "s1 ";
- s2 = "s2";
- s1 += s2;
-
- std::cout << "+= operator => " << s1 << std::endl;
-
- s1 = "some data";
- s2 = s1.mid( 2, 3 );
- std::cout << "mid() = " << s2 << std::endl;
-
- return 0;
-}
-
-
-
-</xmp>
-
-
-<br><hr>
-<p><img src="xbase.jpg"><br><hr>
-</body>
-</html>
diff --git a/html/xbc15.htm b/html/xbc15.htm
deleted file mode 100755
index de01ec4..0000000
--- a/html/xbc15.htm
+++ /dev/null
@@ -1,338 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<html>
-<title>Xbase DBMS Chapter 15</title>
-<body bgcolor=#FFFFFF>
-<h1><p align="center">xbDate Methods</p></h1>
-<p align="center">Chapter Updated 8/21/03</p><hr><br>
-
-This chapter lists the xbDate methods and provides an example program to demonstrate usage.<br>
-Xbase .DBF files and the xbDate class handle dates in the format of CCYYMMDD (Date8).<br><br><br>
-
-<center>
-<table border>
-<caption align=top><h3>xbDate Method List API</h3></caption>
-
-<tr><th align=left>Method<td>Description
-
-<tr><th align=left>xbDate( const char * Date8 )<br>xbDate( const xbString & Date8 )<br>xbDate()
- <td>Class constructors. If no date provided, or invalid date provided, date is set to Sysdate().
-
-<tr><th align=left>~xbDate()<td>Class destructor
-
-<tr><th align=left>xbString & CharDayOf( const char *Date8 )<br>
- xbString & CharDayOf( const xbString & Date8 )<br>xbString & CharDayOf()
- <td>Returns <em>Sun - Sat</em> day of week for a given date
-
-<tr><th align=left>xbString & CharMonthOf( const char *Date8 )<br>xbString & CharMonthOf( const xbString & Date8 )<br>
- xbString & CharMonthOf()<td>Returns <em>Jan - Dec</em> month of year for a given date
-
-<tr><th align=left>int DateIsValid( const char *Date8 ) const<br>int DateIsValid( const xbString & Date8 ) const
- <td>Checks a date for validity, returns true (1) if date is valid
-
-<tr><th align=left>int DayOf( int Format, const char *Date8 ) const<br>int DayOf( int Format, const xbString &Date8 ) const<br>
- int DayOf( int Format ) const<td>Returns day of WEEK, MONTH or YEAR from a given date where <em>Format</em> is one of<br>
- <em>XB_FMT_WEEK</em> => Number of day in week 0-6 (sun-Sat)<br>
- <em>XB_FMT_MONTH</em> => Number of day in month 1-31<br>
- <em>XB_FMT_YEAR</em> => Number of day in year 1-366
-
-<tr><th align=left>xbString & Formatdate( const char * Format, const char * Date8 )<br>
- xbString & FormatDate( const xbString & Format, const char * Date8 )<br>
- xbString & FormatDate( const char * Format, const xbString & Date8 )<br>
- xbString & FormatDate( const xbString & Format, const xbString & Date8 )<br>
- xbString & FormatDate( const xbString & Format )<br>
- xbString & FormatDate( const char * )<br>
-
- <td>Return a formatted date.<br>
-
- Format - A format specifier with the following paramaters:<br>
-
- 1) YYDDD - A julian date format<br>
-
- 2) YY or YYYY will print a 2 or 4 digit year<br>
-
- 3) M,MM,MMM or MMMM<br>
-
- M - one digit month if no leading zero<br>
- MM - two digit month, contains leading zero<br>
- MMM - Jan through Dec<br>
- MMMM - January through December<br>
-
- 4) D,DD,DDD or DDDD<br>
-
- D - one digit dayif no leading zero<br>
- DD - two digit day, contains leading zero <br>
- DDD - Sun through Sat (or julian if YYDDD)<br>
- DDDD - Sunday through Saturday<br>
-
-
-<tr><th align=left>const xbString & GetDate() const<br>xbString & GetDate()<td>Return date
-
-<tr><th align=left>const xbString & GetFormattedDate() const<br>xbString & GetFormattedDate()<td>
- Returns formatted date. See notes on format paramaters.
-
-<tr><th align=left>int IsLeapYear( const char *Date8 ) const<br>int IsLeapYear( const xbString &Date8 ) const<br>
- int IsLeapYear() const<td>Returns true if given date is a leap year
-
-<tr><th align=left>long JulianDays( const char *Date8 ) const<br>long JulianDays( const xbString & Date8 ) const<br>
- long JulianDays() const<td>Returns number of days since 1/1/0100 to given date
-
-<tr><th align=left>xbString & JulToDate8( long )<td>Converts julian based date to CCYYMMDD format.
-
-<tr><th align=left>xbString & LastdayOfMonth( const char *Date8 )<br>xbString & LastDayOfMonth( const xbString & Date8 )<br>
- xbString & LastDayOfMonth()<td>Returns the Date8 format of the last day of the month for a given date
-
-<tr><th align=left>int MonthOf( const char *Date8 ) const<br>int MonthOf( const xbString &Date8) const<br>
-int MonthOf() const<td>Returns month of a date
-
-<tr><th align=left>int SetDate( const char * Date8 )<br>int SetDate( const xbString & Date8 )<td>
- Sets the xbDate to <em>Date8</em>. Return 1 on success, 0 on error.
-
-
-<tr><th align=left>xbString & Sysdate()<td>This method sets the class date and returns the system date
-
-<tr><th align=left>int YearOf( const char *Date8 ) const<br>int YearOf( const xbString &Date8 ) const<br>
-int YearOf() const<td>Returns century and year of a date
-
-<tr><th align=left>xbString &operator+=( int )<td>+= operator
-<tr><th align=left>xbString &operator-=( int )<td>-= operator
-<tr><th align=left>xbString &operator++( int )<td>++ operator
-<tr><th align=left>xbString &operator--( int )<td>-- operator
-<tr><th align=left>xbString &operator+( int )<td>+ operator
-<tr><th align=left>xbString &operator-( int )<td>- operator
-<tr><th align=left>long operator-( const xbDate & ) const<td>- operator
-<tr><th align=left>int operator==( const xbDate & ) const<td>== operator
-<tr><th align=left>int operator!=( const xbDate & ) const<td>!= operator
-<tr><th align=left>int operator<( const xbDate & ) const<td>< operator
-<tr><th align=left>int operator>( const xbDate & ) const<td>> operator
-<tr><th align=left>int operator<=( const xbDate & ) const<td><= operator
-<tr><th align=left>int operator>=( const xbDate & ) const<td>>= operator
-
-</table></center>
-<br><br><br>
-
-<h2>Sample program</h2><br>
-The source for this program is in the libtest directory. <br><br>
-
-<xmp>
- Xbase project source code
-
- This program tests the xdate routines
-
- Copyright (C) 1997 Gary A. Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Mail:
-
- Technology Associates, Inc.
- XBase Project
- 1455 Deming Way #11
- Sparks, NV 89434
- USA
-
- Email:
-
- xbase@techass.com
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
- Website:
-
- xdb.sourceforge.net
-
-
- This program tests and demonstrates usage of the various xbDate methods
-
- Several of the tests pass either StringDate or Chardate to the method
- being tested - this is done to test the class methods. In actual usage,
- this may not be necessary due to the instance of the class already
- containing a date value.
-*/
-
-#include "xbase.h"
-
-int main()
-{
- xbString StringDate( "19601007" ); /* oct 7 1960 */
- char CharDate[9] = "19611109"; /* nov 9 1961 */
-
- xbDate d1; /* today is default */
- xbDate d2( StringDate ); /* from string data */
- xbDate d3( CharDate ); /* from char data */
- xbDate d4; /* another date class */
-
- std::cout << "This program tests the XDATE routines" << std::endl;
- std::cout << "Date 1 (Sysdate) is " << d1.GetDate() << std::endl;
- std::cout << "Date 2 (StringDate) is " << d2.GetDate() << std::endl;
- std::cout << "Date 3 (CharDate) is " << d3.GetDate() << std::endl;
-
- std::cout << "This year is " << d1.YearOf() << std::endl;
- std::cout << "Year of xbString Date is " << d2.YearOf( StringDate )
- << std::endl;
- std::cout << "Year of char Date is " << d3.YearOf( CharDate )
- << std::endl;
-
- std::cout << "This Month is " << d1.MonthOf() << std::endl;
- std::cout << "Month of xbString Date is " << d2.MonthOf( StringDate )
- << std::endl;
- std::cout << "Month of char Date is " << d3.MonthOf( CharDate )
- << std::endl;
-
- std::cout << "Today is day " << d1.DayOf( XB_FMT_WEEK ) << " of the week"
- << std::endl;
- std::cout << "StringDate is day " << d2.DayOf( XB_FMT_MONTH, StringDate )
- << " of the month" << std::endl;
- std::cout << "CharDate is day " << d3.DayOf( XB_FMT_YEAR, CharDate )
- << " of the year" << std::endl;
-
- if( d1.IsLeapYear())
- std::cout << "This is a leapyear" << std::endl;
- else
- std::cout << "This is not a leap year." << std::endl;
-
- if( d2.IsLeapYear( StringDate ))
- std::cout << "StringDate is a leapyear" << std::endl;
- else
- std::cout << "StringDate is not a leap year." << std::endl;
-
- if( d3.IsLeapYear( CharDate ))
- std::cout << "CharDate is a leapyear" << std::endl;
- else
- std::cout << "CharDate is not a leap year." << std::endl;
-
- std::cout << "Today is " << d1.Sysdate() << std::endl;
-
- if( d1.DateIsValid( "19951301" ))
- std::cout << "19951301 is a valid date" << std::endl;
- else
- std::cout << "19951301 is not a valid date" << std::endl;
-
- if( d1.DateIsValid( "19920229" ))
- std::cout << "19920229 is a valid date" << std::endl;
- else
- std::cout << "19920229 is not a valid date" << std::endl;
-
- if( d2.DateIsValid( StringDate ))
- std::cout << StringDate << " is a valid date" << std::endl;
- else
- std::cout << StringDate << " is not a valid date" << std::endl;
-
- std::cout << "Today's Julian date " << d1.JulianDays() << std::endl;
- std::cout << "StringDate Julian date " << d2.JulianDays( StringDate )
- << std::endl;
-
- std::cout << "There are "
- << ( d1.JulianDays( "19951101" ) - d1.JulianDays( "19951001" ))
- << " days between 10/1/95 and 11/1/95." << std::endl;
-
- std::cout << "Todays Julian date (Number of days since Jan 1 0100):"
- << d1.JulianDays() << std::endl;
-
- d4 = d1; // set d4 class = to sysdate
- std::cout << "Object d4 initialized to " << d4.GetDate() << std::endl;
- std::cout << "This should be todays date: "
- << d4.JulToDate8(d4.JulianDays()) << std::endl;
- std::cout << "In 7 days it will be "
- << d4.JulToDate8(d4.JulianDays() + 7L ) << std::endl;
-
- std::cout << "Today is " << d1.CharDayOf() << std::endl;
- std::cout << "StringDate day is " << d2.CharDayOf( StringDate )
- << std::endl;
- std::cout << "This month is " << d1.CharMonthOf() << std::endl;
- std::cout << "StringDate month is " << d2.CharMonthOf() << std::endl;
-
-
- /* various format routines using different formats, strings and chars */
- xbString xbStFmt( "MM/DD/YY" );
- std::cout << "Format (YYDDD) " << d1.FormatDate( "YYDDD" ) << std::endl;
- std::cout << "Format (MM/DD/YY) " << d1.FormatDate( xbStFmt ) << std::endl;
- xbStFmt = "DD/MM/YY";
- std::cout << "Format (DD/MM/YY) " << d1.FormatDate(xbStFmt, "19730110")
- << std::endl;
- std::cout << "Format (MMMM DD,YYYY) "
- << d1.FormatDate( "MMMM DD,YYYY", d1.GetDate()) << std::endl;
- xbStFmt = "DDDD, MMMM DD YYYY";
- std::cout << "Format (DDDD, MMMM DD YYYY) "
- << d2.FormatDate( xbStFmt, d2.GetDate()) << std::endl;
-
- std::cout << "Last day this month " << d1.LastDayOfMonth() << std::endl;
- std::cout << "Last day of month for StringDate is "
- << d2.LastDayOfMonth( d2.GetDate()) << std::endl;
-
- std::cout << "Overloaded operators test..." << std::endl;
-
- if( d1 == d2 )
- std::cout << d1.GetDate() << " is equal to " << d2.GetDate()
- << std::endl;
- else
- std::cout << d1.GetDate() << " is not equal to " << d2.GetDate()
- << std::endl;
-
- if( d1 != d3 )
- std::cout << d1.GetDate() << " is not equal to " << d3.GetDate()
- << std::endl;
- else
- std::cout << d1.GetDate() << " is equal to " << d3.GetDate()
- << std::endl;
-
- if( d1 < d2 )
- std::cout << d1.GetDate() << " is less than " << d2.GetDate()
- << std::endl;
- else
- std::cout << d1.GetDate() << " is not less than " << d2.GetDate()
- << std::endl;
-
- if( d1 > d2 )
- std::cout << d1.GetDate() << " is greater than " << d2.GetDate()
- << std::endl;
- else
- std::cout << d1.GetDate() << " is not greater than " << d2.GetDate()
- << std::endl;
-
- if( d1 <= d2 )
- std::cout << d1.GetDate() << " is less than or equal to " << d2.GetDate()
- << std::endl;
- else
- std::cout << d1.GetDate() << " is not less than or equal to "
- << d2.GetDate() << std::endl;
-
- if( d1 >= d2 )
- std::cout << d1.GetDate() << " is greater than or equal to "
- << d2.GetDate() << std::endl;
- else
- std::cout << d1.GetDate() << " is not greater than or equal to "
- << d2.GetDate() << std::endl;
-
- d1.Sysdate();
- d1++;
- std::cout << "Tomorrow is " << d1.GetDate() << std::endl;
- d1-=2;
- std::cout << "Yesterday was " << d1.GetDate() << std::endl;
- std::cout << "There are " << d1 - d2 << " days between " << d1.GetDate()
- << " and " << d2.GetDate() << std::endl;
-
- return 0;
-}
-
-
-</xmp>
-<hr>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
-
-
diff --git a/html/xbc16.htm b/html/xbc16.htm
deleted file mode 100755
index b19511b..0000000
--- a/html/xbc16.htm
+++ /dev/null
@@ -1,202 +0,0 @@
-<!doctype html public>
-<html>
-<title>Xbase DBMS Chapter 16</title>
-<body bgcolor=#FFFFFF>
-<h1><p align="center">Expressions Reference<br></h1>
-<p align="center">Chapter Updated 2/19/04</p><hr>
-<br><br>
-<table border>
-<caption align=top><h3>Expression Operands</h3></caption>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Operand<TD>Type<TD>Function
-<TR><TH ALIGN="LEFT">+<TD>Alpha<TD>Concatonate
-<TR><TH ALIGN="LEFT">+<TD>Numeric<TD>Addition
-<TR><TH ALIGN="LEFT">-<TD>Alpha<TD>Concatonate, remove white space
-<TR><TH ALIGN="LEFT">-<TD>Numeric<TD>Subtraction
-<TR><TH ALIGN="LEFT">*<TD>Numeric<TD>Multiplication
-<TR><TH ALIGN="LEFT">/<TD>Numeric<TD>Division
-<TR><TH ALIGN="LEFT">**<TD>Numeric<TD>Exponentiation
-<TR><TH ALIGN="LEFT"><<TD>Logical<TD>Less Than
-<TR><TH ALIGN="LEFT">><TD>Logical<TD>Greater Than
-<TR><TH ALIGN="LEFT">=<TD>Logical<TD>Equal
-<TR><TH ALIGN="LEFT"><><TD>Logical<TD>Not Equal
-<TR><TH ALIGN="LEFT">#<TD>Logical<TD>Not Equal
-<TR><TH ALIGN="LEFT"><=<TD>Logical<TD>Less Than or Equal
-<TR><TH ALIGN="LEFT">>=<TD>Logical<TD>Greater Than or Equal
-<TR><TH ALIGN="LEFT">$<TD>Logical<TD>Contains
-<TR><TH ALIGN="LEFT">-><TD>N/A<TD>Identifies database field ie; DATABASE->FIELD
-<TR><TH ALIGN="LEFT">.AND.<TD>Logical<TD>Logical AND
-<TR><TH ALIGN="LEFT">.OR.<TD>Logical<TD>Logical OR
-</TABLE>
-
-<br><br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Expression Functions</h3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Expression Function<TD>Xbase C++ Method<TD>Description
-<TR><TH ALIGN="LEFT">ABS()<TD>xbDouble EXPN::ABS( xbDouble d )<TD>
-Returns absolute numeric value of argument.
-<TR><TH ALIGN="LEFT">ASC()<TD>xbLong EXPN::ASC( char * String )<TD>
-Returns ASCII code of left character of string.
-<TR><TH ALIGN="LEFT">AT()<TD>xbLong EXPN::AT( char *s1, char *s2 )<TD>
-Returns starting position of first alphanumeric argument in second argument.
-<TR><TH ALIGN="LEFT">CDOW()<TD>char * EXPN::CDOW( char Date8 )<TD>
-Returns name of the day of the week of Date8.
-<TR><TH ALIGN="LEFT">CHR()<TD>char * EXPN::CHR( xbLong l )<TD>
-Returns ASCII character corresponding to numeric value supplied.
-<TR><TH ALIGN="LEFT">CMONTH()<TD>char * EXPN::CMONTH( char * Date8 )<TD>
-Returns name of the month of Date8.
-<TR><TH ALIGN="LEFT">DATE()<TD>char * EXPN::DATE()<TD>
-Returns system date.
-<TR><TH ALIGN="LEFT">DAY()<TD>xbLong EXPN::DAY( char * Date8 )<TD>
-Returns numeric value of the day of the month for Date8.
-<TR><TH ALIGN="LEFT">DESCEND()<TD>EXPN::DESCEND()<TD>
-Descend - used to create descending indices
-<TR><TH ALIGN="LEFT">DTOC()<TD>char * EXPN::DTOC( char * Date8 )<TD>
-Returns a date converted to format MM/DD/YY.
-<TR><TH ALIGN="LEFT">EXP()<TD>xbDouble EXPN::EXP( xbDouble d )<TD>
-Returns exponential for supplied value.
-<TR><TH ALIGN="LEFT">IIF()<TD>
-char * EXPN::IIF( xbShort, const char *,const char *)<TD>If statement
-<TR><TH ALIGN="LEFT">INT()<TD>xbLong EXPN::INT( xbDouble d )<TD>
-Converts any numeric value to an integer.
-<TR><TH ALIGN="LEFT">ISALPHA()<TD>xbLong EXPN::ISALPHA( char * String )<TD>
-Returns TRUE if string is alpha.
-<TR><TH ALIGN="LEFT">ISLOWER()<TD>xbLong EXPN::ISLOWER( char * String )<TD>
-Returns TRUE if string is lower case.
-<TR><TH ALIGN="LEFT">ISUPPER()<TD>xbLong EXPN::ISUPPER( char * String )<TD>
-Returns TRUE if string is upper case.
-<TR><TH ALIGN="LEFT">LEFT()<TD>char * EXPN::LEFT( char * String, xbShort Len )<TD>
-Returns <em>Len</em> characters from the left side of <em>String</em>.
-<TR><TH ALIGN="LEFT">LEN()<TD>xbLong EXPN::LEN( char * String )<TD>
-eturns the number of characters in the String.
-<TR><TH ALIGN="LEFT">LOG()<TD>xbDouble EXPN::LOG( xbDouble d )<TD>
-Returns the natural log of d.
-<TR><TH ALIGN="LEFT">LOWER()<TD>char * EXPN::LOWER( char * String )<TD>
-Converts a string to lower case.
-<TR><TH ALIGN="LEFT">LTRIM()<TD>char * EXPN::LTRIM( char * String )<TD>
-Eliminates leading white space from String.
-<TR><TH ALIGN="LEFT">MAX()<TD>xbDouble EXPN::MAX( xbDouble d1, xbDouble d2 )<TD>
-Returns the larger of two numeric arguments.
-<TR><TH ALIGN="LEFT">MIN()<TD>xbDouble EXPN::MIN(xbDouble d1, xbDouble d2 )<TD>
-Returns the smaller of two numeric arguments.
-<TR><TH ALIGN="LEFT">MONTH()<TD>xbLong EXPN::MONTH( char * Date8 )<TD>
-Returns numeric month for Date8.
-<TR><TH ALIGN="LEFT">RECNO()<TD>xbLong EXPN::RECNO()<TD>
-Returns the current record number of the associated DBF file
-<TR><TH ALIGN="LEFT">REPLICATE()<TD>char * EXPN::REPLICATE( char * String, xbShort Count )<TD>
-Replicates String Conut times.
-<TR><TH ALIGN="LEFT">RIGHT()<TD>char * EXPN::RIGHT( char * String, xbShort Count )<TD>
-Returns Count characters from the right side of String.
-<TR><TH ALIGN="LEFT">RTRIM()<TD>char * EXPN::RTRIM( char * String )<TD>
-Removes trailing white space from String.
-<TR><TH ALIGN="LEFT">SPACE()<TD>char * EXPN::SPACE( xbShort Count )<TD>
-Returns a buffer filled with Count spaces.
-<TR><TH ALIGN="LEFT">SQRT()<TD>xbDouble EXPN::SQRT( xbDouble d )<TD>
-Returns square root of d.
-<TR><TH ALIGN="LEFT">STR()<TD>
-char * EXPN::STR( xbDouble d )<hr>
-char * EXPN::STR( xbDouble, xbShort )<hr>
-char * EXPN::STR( xbDouble, xbShort, xbShort )
-<TD>
-Converts a number to a string.
-<TR><TH ALIGN="LEFT">SUBSTR()<TD>char * EXPN::SUBSTR( char * String, xbShort StartPos, xbShort Len )<TD>
-Returns a string form String starting at position StartPos for a length of Len.
-<TR><TH ALIGN="LEFT">TRIM()<TD>char * EXPN::TRIM( char * String )<TD>
-Same as RTRIM.
-<TR><TH ALIGN="LEFT">UPPER()<TD>char * EXPN::UPPER( char * String )<TD>
-Converts a string to upper case.
-<TR><TH ALIGN="LEFT">VAL()<TD>xbLong EXPN::VAL( char * String )<TD>
-Converts a string to an integer.
-<TR><TH ALIGN="LEFT">YEAR()<TD>xbLong EXPN::YEAR( char * Date8 )<TD>
-Returns numeric year from Date8.
-</TABLE>
-
-
-
-<br><br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Expression Processing Method List</h3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Method<TD>Description
-<TR><TH ALIGN="LEFT">GetDoubleResult()<TD>Get xbDouble result from processed expression
-<TR><TH ALIGN="LEFT">GetIntResult()<TD>Get a xbLong result from processed expression
-<TR><TH ALIGN="LEFT">GetExpressionHandle()<TD>Get an expression's handle
-<TR><TH ALIGN="LEFT">GetExpressionResultType(xbExpression *)<TD>Get expression result type
-<TR><TH ALIGN="LEFT">GetStringResult()<TD>Get xbString & result from processed expression
-<TR><TH ALIGN="LEFT">ParseExpression(char *,xbDbf *)<TD>Parse an expression
-<TR><TH ALIGN="LEFT">ProcessExpression(xbExpression *)<TD>Process a parsed expression
-</TABLE>
-<br><hr>
-<h3>Method Definitions</h3>
-<hr>
-
-<h3>Method xbDouble xbXBase::GetDoubleResult()</h3><br>
-
-This method returns a xbDouble result from a processed expression.
-<br><br>
-See the program listing in chapter 5 for an example of how to use this method.
-
-<hr>
-<h3>Method xbLong xbXBase::GetIntResult()</h3><br>
-This method returns a xbLong result from a processed expression.
-<br><br>
-See the program listing in chapter 5 for an example of how to use this method.
-
-<hr>
-<h3>Method xbExpression * xbXBase::GetExpressionHandle()</h3><br>
-
-This method returns a handle to a recently parsed expression.
-<br><br>
-See the program listing in chapter 5 for an example of how to use this method.
-
-<hr>
-<h3>Method char xbXBase::GetExpressionResultType( xbExpression * e )</h3><br>
-
-This method returns the result type for a given expression <em>e</em>.
-
-<br>
-<br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code Value<TD>Description
-<TR><TH ALIGN="LEFT">C<TD>char * result from processed expression
-- use GetStringResult()
-<TR><TH ALIGN="LEFT">N<TD>xbDouble result from processed expression
-- use GetDoubleResult()
-<TR><TH ALIGN="LEFT">L<TD>xbLong (also logical) result from processed expression
-- use GetIntResult()
-</TABLE><br><br>
-
-See the program listing in chapter 5 for an example of how to use this method.
-
-<hr>
-<h3>Method char * xbXBase::GetStringResult()</h3><br>
-
-This method returns a xbString & result from a processed expression.
-<br><br>
-See the program listing in chapter 5 for an example of how to use this method.
-
-<hr
-
-<hr>
-<h3>Method xbShort ParseExpression( char * exp, DBF * d)</h3><br>
-
-This method parses expression <em>exp</em>.<br><em>d</em> is a pointer to
-a database used for resolving any fieldname which does not contain the
-<en>-></em> operator.
-
-<br><br>
-See the program listing in chapter 5 for an example of how to use this method.
-<hr>
-<h3>Method xbShort ProcessExpression( xbExpression * e )</h3><br>
-
-This method processes parsed expression <em>e</em>.
-<br><br>
-See the program listing in chapter 5 for an example of how to use this method.
-<br><br>
-<hr>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xbc17.htm b/html/xbc17.htm
deleted file mode 100755
index c1d2c37..0000000
--- a/html/xbc17.htm
+++ /dev/null
@@ -1,352 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<HTML>
-<TITLE>Xbase DBMS Chapter 17</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align="center">Index Methods</p></H1>
-<p align="center">Chapter Updated 2/12/99</p><hr>
-
-This chapter lists the xbNdx and xbNtx index methods and provides
-examples of how to use them.<br><br>
-
-There are many methods in the xbNdx and xbNtx classes which are used for
-maintaining and updating NDX and NTX files. Fortunately for the
-application programmer, most of the complexities of dealing with the
-NDX and NTX indices are automatically cared for by the Xbase library.<br><br>
-
-xbNdx and xbNtx methods which are used by application programs are documented here.
-With some exceptions (OpenIndex,CloseIndex and KeyExists) using the index
-routines automatically positions and returns the associated record in
-the DBF database.<br><br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Xbase xbNdx Index Method List</h3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Method<TD>Description
-<TR><TH ALIGN="LEFT">CheckIndxIntegrity<TD>Checks an index file for integrity
-<TR><TH ALIGN="LEFT">CloseIndex<TD>Optional, closes an index. Closing
- the DBF file will close any open indexes.
-<TR><TH ALIGN="LEFT">CreateIndex<TD>Create an index
-<TR><TH ALIGN="LEFT">FindKey<TD>Find a key in an index file
-<TR><TH ALIGN="LEFT">GetFirstKey<TD>Get the first key in an index
-<TR><TH ALIGN="LEFT">GetLastKey<TD>Get the last key in an index
-<TR><TH ALIGN="LEFT">GetNextKey<TD>Get the next key in an index
-<TR><TH ALIGN="LEFT">GetPrevKey<TD>Get the previous key in an index
-<TR><TH ALIGN="LEFT">KeyExists<TD>Determine if a key exists w/o positioning DBF file
-<TR><TH ALIGN="LEFT">OpenIndex<TD>Open an index
-<TR><TH ALIGN="LEFT">ReIndex<TD>Rebuilds an index
-</TABLE>in
-<BR><BR>
-<hr>
-<h2>Method Definitions</h2>
-<hr>
-
-<h3>Method xbShort xbNdx::CheckIndexIntegrity( xbShort option )</h3>
-<h3>Method xbShort xbNtx::CheckIndexIntegrity( xbShort option )</h3><br>
-
-This method checks an open index for accuracy or file corruption.
-If the option is non zero, the method will display informational messages.<br>
-<br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>Read lock not successfull
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>File not open
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>Invalid record number
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek routine error
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Write routine error
-</TABLE>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/checkndx.cpp">checkndx.cpp</A> for an example
-of how to use this method.
-
-<hr>
-
-<h3>Method xbShort xbNdx::CloseIndex( VOID )</h3>
-<h3>Method xbShort xbNtx::CloseIndex( VOID )</h3><br>
-
-This method closes an open NDX index. NDX indexes are closed automatically
-by the DBF::CloseDatabase routine, so this is an optional method.
-Closed indices are not updated by the Xbase routines.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-</TABLE>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample1.cpp">sample1.cpp</A> for an example
-of how to use this method.
-
-<hr>
-
-<h3>Method xbShort xbNdx::CreateIndex( char * IndexName, char * KeyExpression,
- xbShort Unique, xbShort OverLay )</h3>
-
-<h3>Method xbShort xbNtx::CreateIndex( char * IndexName, char * KeyExpression,
- xbShort Unique, xbShort OverLay )</h3><br>
-
-This method creates an index. Indices are created as either a
-character based index or a numeric based index, depending on the KeyExpression
-value.<br><br>
-<li><em>Indexname</em> - is the name of the physical index file name.
-<li><em>KeyExpression</em> - is the key of the index.
-<li><em>Unique</em> - XB_UNIQUE or XB_NOT_UNIQUE
-<li><em>Overlay</em> - XB_OVERLAY or XB_DONTOVERLAY<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory error
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open index file
-<TR><TH ALIGN="LEFT">XB_INVALID_KEY_EXPRESSION<TD>Bad index key expression
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>The database was not open
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek error encountered
-<TR><TH ALIGN="LEFT">XB_READ_ERROR<TD>Read error encountered
-</TABLE>
-
-<br><br>
-Index expressions can be a single field or multiple fields. Assuming a
-database has fields LASTNAME and FIRSTNAME, valid index expressions
-could be:<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Sample Index Expressions</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Expression<TD>Description
-<TR><TH ALIGN="LEFT">"LASTNAME"<TD>Index on LASTNAME only.
-<TR><TH ALIGN="LEFT">"LASTNAME+FIRSTNAME"<TD>Index on LASTNAME and FIRSTNAME
-<TR><TH ALIGN="LEFT">"LASTNAME-FIRSTNAME"<TD>Index on LASTNAME and FIRSTNAME,
-all spaces between the two fields removed.
-<TR><TH ALIGN="LEFT">"LASTNAME-','FIRSTNAME"<TD>Index on LASTNAME and
-FIRSTNAME, insert a comma between the two values, remove spaces between
-the two fields.
-</TABLE>
-<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><H3>Allowable Index Expression Operators</H3>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Operator<TD>Key Type<TD>Description
-<TR><TH ALIGN="LEFT">+<TD>Character<TD>Concatonate string fields
-<TR><TH ALIGN="LEFT">-<TD>Character<TD>
-Concatonate string fields, remove trailing spaces
-<TR><TH ALIGN="LEFT">'literal'<TD>Character<TD>include literal value
-<TR><TH ALIGN="LEFT">"literal"<TD>Character<TD>include literal value
-<TR><TH ALIGN="LEFT">+<TD>Numeric<TD>Add two numeric fields togethor
-<TR><TH ALIGN="LEFT">-<TD>Numeric<TD>Subtract one numeric field from another
-<TR><TH ALIGN="LEFT">*<TD>Numeric<TD>Mulitply two numeric fields togethor
-<TR><TH ALIGN="LEFT">/<TD>Numeric<TD>Divide one numeric field into another
-<TR><TH ALIGN="LEFT">**<TD>Numeric<TD>Exponential
-</TABLE>
-<br><br>
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample1.cpp">sample1.cpp</A> for an example
-of how to use this method.
-
-<hr>
-
-<h3>Method xbShort xbNdx::FindKey( char * SearchValue )</h3>
-<h3>Method xbShort xbNdx::FindKey( xbDouble SearchValue )</h3>
-<h3>Method xbShort xbNtx::FindKey( char * SearchValue )</h3>
-<h3>Method xbShort xbNtx::FindKey( xbDouble SearchValue )</h3><br>
-
-This method searches the index for key <em>SearchValue</em>.
-The routine positions in the index, then positions to the database record
-for the key. If the key is not
-found, the key value that is the next higher value is returned.<br><br>
-
-For character keys, the SearchValue should be a null terminated string.
-To find an exact match, use a key value which is as long as the key is,
-padded on the right with spaces.<br><br>
-
-For numeric keys, use a xbDouble value for a search value. This is because
-all numeric field indices are saved as double values.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_FOUND<TD>The key was found
-<TR><TH ALIGN="LEFT">XB_NOT_FOUND<TD>The key was not found
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory error
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open index file
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek error encountered
-<TR><TH ALIGN="LEFT">XB_READ_ERROR<TD>Read error encountered
-</TABLE>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample5.cpp">sample5.cpp</A> for an example
-of how to use this method.
-
-<hr>
-
-<h3>Method xbShort xbNdx::GetFirstKey( VOID )</h3>
-<h3>Method xbShort xbNtx::GetFirstKey( VOID )</h3><br>
-
-
-This method retrieves the record for the first key in the index.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory error
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open index file
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek error encountered
-<TR><TH ALIGN="LEFT">XB_READ_ERROR<TD>Read error encountered
-</TABLE>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample5.cpp">sample5.cpp</A> for an example
-of how to use this method.
-
-
-<hr>
-
-<h3>Method xbShort xbNdx::GetLastKey( VOID )</h3>
-<h3>Method xbShort xbNtx::GetLastKey( VOID )</h3><br>
-
-This method retrieves the record for the last key in the index.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory error
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open index file
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek error encountered
-<TR><TH ALIGN="LEFT">XB_READ_ERROR<TD>Read error encountered
-</TABLE>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample5.cpp">sample5.cpp</A> for an example
-of how to use this method.
-<hr><h3>Method xbShort xbNdx::GetNextKey( VOID )</h3><br>
-This method retrieves the record for the next key in the index. If the
-index is not positioned, a call to GetFirstKey is autoamtically executed.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory error
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open index file
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek error encountered
-<TR><TH ALIGN="LEFT">XB_READ_ERROR<TD>Read error encountered
-</TABLE>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample5.cpp">sample5.cpp</A> for an example
-of how to use this method.
-
-
-<hr><h3>Method xbShort xbNdx::GetPrevKey( VOID )</h3>
-<hr><h3>Method xbShort xbNtx::GetPrevKey( VOID )</h3><br>
-
-This method retrieves the record for the previous key in the index. If the
-index is not positioned, a call to GetLastKey is autoamtically executed.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory error
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open index file
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek error encountered
-<TR><TH ALIGN="LEFT">XB_READ_ERROR<TD>Read error encountered
-</TABLE>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample5.cpp">sample5.cpp</A> for an example
-of how to use this method.
-
-<hr>
-
-<h3>Method xbShort xbNdx::KeyExists( char * SearchValue )</h3>
-<h3>Method xbShort xbNdx::KeyExists( xbDouble SearchValue )</h3>
-<h3>Method xbShort xbNtx::KeyExists( char * SearchValue )</h3>
-<h3>Method xbShort xbNtx::KeyExists( xbDouble SearchValue )</h3><br>
-
-This method searches the index for the key <em>SearchValue</em>. The routine does not
-position the database record for the key. See the reference on FindKey for more
-information regarding KeyValue.<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_FOUND<TD>The key was found
-<TR><TH ALIGN="LEFT">XB_NOT_FOUND<TD>The key was not found
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory error
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open index file
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek error encountered
-<TR><TH ALIGN="LEFT">XB_READ_ERROR<TD>Read error encountered
-</TABLE>
-<h4>Example Program:</h4>
-<xmp>
-if( xbNdx::KeyExists( "MyKeyValue" ))
- cout << "\nKey was found";
-else
- cout << "\nKey was not found";
-</xmp>
-<hr>
-<h3>Method xbShort xbNdx::OpenIndex( char * IndexName )</h3>
-<h3>Method xbShort xbNtx::OpenIndex( char * IndexName )</h3><br>
-This method opens index <em>IndexName</em> for a given DBF database. An index must be
-opened before it will be automatically updated by the database update
-routines.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_NO_MEMORY<TD>Memory error
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open index file
-<TR><TH ALIGN="LEFT">XB_INVALID_KEY_EXPRESSION<TD>Bad key in index
-<TR><TH ALIGN="LEFT">XB_NOT_OPEN<TD>The database was not open
-<TR><TH ALIGN="LEFT">XB_SEEK_ERROR<TD>Seek error encountered
-<TR><TH ALIGN="LEFT">XB_READ_ERROR<TD>Read error encountered
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/sample1.cpp">sample1.cpp</A> for an example
-of how to use this method.
-<hr>
-<h3>Method xbShort xbNdx::ReIndex( VOID )</h3>
-<h3>Method xbShort xbNtx::ReIndex( VOID )</h3><br>
-This method rebuilds an index. It is used for optimizing an index, or recreating
-a damaged index. If the index is severly damaged (ie; the first 512 bytes are
-foobar) then the index must be recreated with the CreateIndex method before
-using the ReIndex method.<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3>Method Return Codes</h3></CAPTION><br>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>If there is no error
-<TR><TH ALIGN="LEFT">XB_OPEN_ERROR<TD>Could not open index file
-<TR><TH ALIGN="LEFT">XB_WRITE_ERROR<TD>Error writing data
-<TR><TH ALIGN="LEFT">XB_CLOSE_ERROR<TD>Error closing work file
-</TABLE>
-<h4>Example Program:</h4>
-See program <A HREF="/XbaseSamples/reindex.cpp">reindex.cpp</A> for an example
-of how to use this method.<br><br>
-<hr>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xbc18.htm b/html/xbc18.htm
deleted file mode 100755
index 78d8de6..0000000
--- a/html/xbc18.htm
+++ /dev/null
@@ -1,261 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<HTML>
-<TITLE>Xbase DBMS Chapter 18</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align="center">Locking Methods</p></H1>
-<p align="center">Chapter Updated 2/1/99</p><hr>
-
-The locking methods return either XB_LOCK_FAILED or XB_NO_ERROR. If they return
-LOCK_FAILED the actual reason can be found in the global variable
-<em>errno</em> or function <em>perror()</em> can be executed to view the
-results.
-<br><br>
-
-The errno field may contain one of the following values if the lock was not
-successful.<br><br>
-<TABLE BORDER>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Error Code<TD>Description
-<TR><TH ALIGN="LEFT">EBADF<TD>Invalid file descriptor
-<TR><TH ALIGN="LEFT">EINVAL<TD>Invalid lock information or file does not support locks
-<TR><TH ALIGN="LEFT">EACCESS<BR>EAGAIN<TD>Lock can not be set because it is blocked by an existing lock on the file.
-<TR><TH ALIGN="LEFT">ENOLCK<TD>The system is out of lock resources, too many file locks in place.
-<TR><TH ALIGN="LEFT">EDEADLK<TD>Deadlock condition
-<TR><TH ALIGN="LEFT">EINTR<TD>Process was interrupted by a signal while it was waiting
-</TABLE>
-<br><br>
-<h3>Types of Locks</h3>
-
-<li><em>Write or Exclusive Locks</em> provide exclusive access to a
-particular file location. No other process can lock the same location.<br><br>
-
-<li><em>Read or Shared Locks</em> prohibit any process from requesting a write
-lock on a specified part of the file. Other processes can request
-simultaneous read locks.<br><br><br>
-
-<h3>DBF File Locking Techniques</h3>
-
-Xbase DBMS uses the following protocol for DBF file and record locking:
-<br><br>
-
-To lock a record - the first byte of the record is locked.<br>
-To lock the file - the header bytes of the file are locked.<br><br>
-
-When a record is being appended to the file, the header bytes are locked.<br>
-When a record is being updated, the header bytes and the specific record are
-locked.<br><br>
-This locking protocol is probably not compatable with other Xbase type products.
-However, Xbase can be safely used for multi-user access when it is not
-simultaneously updating DBF or NDX files while other products/programs are.
-<br><br><br>
-
-<h3>NDX File Locking Techniques</h3>
-
-Xbase DBMS locks indexes by locking the first 512 bytes
-of the index file.
-The entire index is locked because any updates to the index potentially
-can modify significant portions of the index tree.
-<br><br><br>
-
-<h3>DBT File Locking Techniques</h3>
-
-Xbase DBMS locks memo files by locking the first 4 bytes
-of the memo file. This effectively locks the entire file. The entire file
-is locked because any updates to the free block chain can significantly
-change the structure of the file.
-<br><br><br>
-
-
-<h3>AutoLocking Features</h3>
-
-If XB_LOCKING_ON is set in the <em>options.h</em> file, the locking methods
-execute any appropriate locking logic. If XB_LOCKING_ON is not set in the
-<em>options.h</em> file, all locking methods return NO_ERROR without
-performing any actual record or file locking. This enables the application
-program to always call locking routines regardless of the XB_LOCKING_ON switch
-in the <em>options.h</em> file.
-<br><br>
-By leaving the autolocking features enabled, the application program does
-not need to address record, file or index locking. All locking is handled
-automatically by the Xbase routines. However, if access to the locking
-routines is required, they are available to the applciation programmer.
-<br><br>
-When the files are automatically locked by the Xbase routines, the database
-file is locked first, then it locks the indexes in alphabetical order. To
-avoid deadlock conditions, files and record locks should always be done in
-the same order. When the files are unlocked, then indexes are unlocked
-first, then the database is unlocked.
-<br><br>
-Auto-locking works well in an on-line transaction based environment.
-However, it does not function efficiently in batch mode. If you
-will be writing programs which process files in a batch mode, disabling
-auto-lock and locking the entire file at the beginning of the process
-and unlocking the file at the end of the process will significantly
-reduce process time. On a 586-200 class machine, a file with 45000 records
-can be read thru in a few seconds with the file locked in batch mode.
-In record-lock mode it takes about six minutes with the same processor.
-
-<br><br>For processing large files, locking the file instead of locking each
-record is far more efficient. This is how you do it.<br><br>
-
-For reading the file in batch mode:<br>
-xbDbf.AutoLockOff();<br>
-xbDbf.LockDatabase( F_SETLKW, F_RDLCK, 0L );<br><br>
-For updating the file in batch mode:<br>
-xbDbf.AutoLockOff();<br>
-xbDbf.LockDatabase( F_SETLKW, F_WRLCK, 0L );<br><br>
-<br>
-<hr><br>
-
-<h3>Method Table</h3>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3><Xbase Locking Method List</h3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Method<TD>Description
-<TR><TH ALIGN="LEFT">xbDbf::AutoLockOn<TD>Turns autolocking on
-<TR><TH ALIGN="LEFT">xbDbf::AutoLockOff<TD>Turns autolocking off
-<TR><TH ALIGN="LEFT">xbDbf::ExclusiveLock<TD>Lock file and indexes in exclusive mode
-<TR><TH ALIGN="LEFT">xbDbf::ExclusiveUnlock<TD>Unlock files and indexes
-<TR><TH ALIGN="LEFT">xbDbf::LockDatabase<TD>Locks or unlocks a DBF database
-<TR><TH ALIGN="LEFT">xbNdx::LockIndex<TD>Locks or unlocks an xbNdx index
-<TR><TH ALIGN="LEFT">xbNdx::LockMemoFile<TD>Locks or unlocks a DBT memo field file
-</TABLE>
-<BR><HR>
-
-<h4>Method Descriptions</h4>
-
-<h4>Method VOID xbDbf::AutoLockOn( VOID )</h4><br>
-
-This method turns automatic record locking on. Auto record locking is on
-by default if XB_LOCKING_ON is set in the options.h file.<br><br>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/zips/loadzips.cpp">loadzips.cpp</A> for an example of
-how to use this method.
-<hr>
-
-<h4>Method VOID xbDbf::AutoLockOff( VOID )</h4><br>
-
-This method turns automatic record locking off. Auto record locking is on
-by default if XB_LOCKING_ON is set in the options.h file.
-<br><br>
-Turning auto locking off will result in slightly better execution speeds
-but should not be used in multi-user environments when multiple users can
-update files simultanteously. If multiple users are accessing a file which
-is read only then it is safe to turn off auto-locking for a particular file.
-<br><br>
-Turning autolocking off will disable any index file locking which is
-particularly dangerous in a multi-user environment if updates on the files
-are permitted.
-
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/zips/loadzips.cpp">loadzips.cpp</A> for an example of
-how to use this method.
-
-<hr>
-<h4>Method SHORT xbDbf::ExclusiveLock( SHORT WaitOption )</h4>
-<h4>Method SHORT xbDbf::ExclusiveUnlock( VOID )</h4><br>
-
-ExclusiveLock and ExclusiveUnclock will lock the data file, memo file (if applicable)
-and any associated indexes in an exclusive mode. They also turn auto-lock
-on and off as appropriate.<br><br>
-
-WaitOption is either:<br><br>
-<li>F_SETLK - returns immediately regardless if success or failure<br>
-<li>F_SETLKW - waits until lock function executes<br><br>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample4.cpp">sample4.cpp</A> for an example of
-how to use this method.
-
-<hr>
-<h3>Method SHORT xbDbf::LockDatabase( SHORT WaitOption, SHORT LockType, LONG LRecNo )
-</h3><br>
-
-This method locks or unlocks an Xbase (.DBF) file which was previously opened.<br>
-<br>
-WaitOption is either:<br><br>
-<li>F_SETLK - returns immediately regardless if success or failure<br>
-<li>F_SETLKW - waits until lock function executes<br><br>
-
-LockType is one of:<br><br>
-<li>F_RDLCK - Perform a Read or Shared Lock<br>
-<li>F_WRLCK - Perform a Write or Exclusive Lock<br>
-<li>F_UNLCK - Unlock it<br><br>
-
-LRecNo is:<br><br>
-0 - Lock the header section of the file (use this to lock the file)<br>
-1 through n - Lock a particular record<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"<h4>Method Return Codes</h4></CAPTION>
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_INVALID_RECORD<TD>An invalid record given
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>The lock action failed, see errno
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>The lock was successful
-</TABLE>
-
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/zips/loadzips.cpp">loadzips.cpp</A> for an example of
-how to use this method.
-
-<hr>
-
-<h3>Method xbShort xbDbf::LockIndex( xbShort WaitOption, xbShort LockType )
-</h3><br>
-
-This method locks or unlocks an Index (.NDX) file which was previously opened.<br>
-<br>
-WaitOption is either:<br><br>
-<li>F_SETLK - returns immediately regardless if success or failure<br>
-<li>F_SETLKW - waits until lock function executes<br><br>
-
-LockType is one of:<br><br>
-<li>F_RDLCK - Perform a Read or Shared Lock<br>
-<li>F_WRLCK - Perform a Write or Exclusive Lock<br>
-<li>F_UNLCK - Unlock it<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"<h4>Method Return Codes</h4></CAPTION>
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>The lock action failed, see errno
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>The lock was successful
-</TABLE>
-
-<h4>Example Program:</h4>
-See program <A HREF="/zips/loadzips.cpp">loadzips.cpp</A> for an example of
-how to use this method.
-<hr>
-
-<h3>Method xbShort xbDbf::LockMemoFile( xbShort WaitOption, xbShort LockType )
-</h3><br>
-
-This method locks or unlocks a memo (.DBT) file which was previously opened.
-It is not necessary for an application to call this method as locking is
-handled automatically by other routines.<br><br>
-
-WaitOption is either:<br><br>
-<li>F_SETLK - returns immediately regardless if success or failure<br>
-<li>F_SETLKW - waits until lock function executes<br><br>
-
-LockType is one of:<br><br>
-<li>F_RDLCK - Perform a Read or Shared Lock<br>
-<li>F_WRLCK - Perform a Write or Exclusive Lock<br>
-<li>F_UNLCK - Unlock it<br><br>
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"<h4>Method Return Codes</h4></CAPTION>
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">XB_LOCK_FAILED<TD>The lock action failed, see errno
-<TR><TH ALIGN="LEFT">XB_NO_ERROR<TD>The lock was successful
-</TABLE>
-<hr>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xbc5.htm b/html/xbc5.htm
deleted file mode 100755
index 377129f..0000000
--- a/html/xbc5.htm
+++ /dev/null
@@ -1,156 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<html>
-<title>Xbase DBMS Chapter 5</title>
-<body bgcolor=#FFFFFF>
-<h1><p align="center">Expression Handling<br></h1>
-<p align="center">Chapter Updated 3/12/04</p><hr>
-
-<h3>Overview</h3>
-
-The main objective of this chapter is to provide information regarding the
-basic concepts of using the Xbase Expression module.<br><br>
-
-Beginning with release 1.7.4, the Xbase library includes an expression parsing
-routine which assists application programmers by providing a high level data
-manipulation tool and also allows for building complex index keys.
-
-The functions included were derived from dBASE III Plus, but not all
-dBASE III Plus functions have been implemented yet.
-<br><br>
-Release 3.0 brought some upgrades to the expression module of the library
-including bug fixes, additional operators and new functions. The expression
-module is usable and functional, but has some room for improvement.
-A future release of Xbase will include more comprehensive expresion logic.
-
-<br><br>
-
-<h3>Internal fuctioning</h3>
-The expression module works in two phases. Firstly, method
-<em>ParseExpression</em> is called and builds an expression tree from
-all the components of the expression. The tree is made up of indivdual
-nodes. The expression is checked for valid field names, literals,
-operands and functions. Any field references are resolved. If fields
-are used in an expression and the database name for the field is not
-included in the name with the -> operand, the routines assume the
-associated database has been successfully opened.
-<br><br>
-Secondly, method <em>ProcessExpression</em> is called to process the
-expression tree created by ParseExpression(). The routine parses each
-node in the expression tree, executing functions, processing operands
-and manipulating data to produce the desired result.<br><br>
-
-If an expression will be processed repeatedely, it is best to pre-parse the
-tree using <em>ParseExpression</em>, then for each new call to the expression,
-execute method <em>ProcessExpression</em> which processes the tree.
-
-
-<h3>Expression Return Types</h3>
-Expressions will return a type of CHAR *, NUMERIC or LOGICAL.<br><br>
-
-An expression return type can be determined with method <em>
-GetExpressionResultType</em> after parsing it.<br><br>
-
-Expressions returning a return type of CHAR are limited to a 200 byte internal
-buffer. There is also a 100 byte limit for NDX index key support. If
-the 200 byte limit is not large enough for your application, adjust field
-<em>enum { WorkBufMaxLen = 200 };</em> in file <em>exp.h</em>.
-
-<h3>Expression Functions</h3>
-Each expression function also has a corresponding C++ function. It is
-slightly more efficient to call the C++ functions directly, rather than
-execute the expression parsing routines.
-
-<h3>Expression Components</h3>
-Expressions are made up of one or more tokens. A token is one of literal,
-database field, operand or function. Literals are either numeric or character.
-Character literals are enclosed in 'single' or "double" quotes. numeric
-literals are a series of one or more contiguous numerals, ".", "+" or "-'".
-<br><br>
-A field is simply a field name in the default database, or is in the form
-of database->fieldname.
-
-<br><br>
-<hr>
-<h3>Sample Program Demonstrating Expression Processing</h3>
-<xmp>
-
-/* expressn.cpp */
-
-#ifdef DOS
-extern unsigned _stklen = 40000;
-#endif
-
-#include <xbase/xbase.h>
-xbSchema MyRecord[] =
-{
- { "FIELD1", 'C', 20, 0 },
- { "FIELD2", 'C', 20, 0 },
- { "NAME", 'C', 10, 0 },
- { "DOUB1", 'N', 7, 2 },
- { "FLOAT1", 'F', 8, 3 },
- { "DATE1", 'D', 8, 0 },
-};
-xbShort rc;
-xbXBase x;
-xbDbf d( &x );
-XB_EXPRESSION *e;
-
-/****************************************************************************/
-xbShort MyExpressionProcessor( char * Expression )
-{
- xbShort rc;
- char type;
-
- if(( rc = x.ParseExpression( Expression, &d )) != 0 )
- {
- cout << "\nParse Error " << rc;
- return rc;
- }
- e = x.GetExpressionHandle();
-
- if(( rc = x.ProcessExpression( e )) != 0 )
- {
- cout << "\nError processing expression rc = " << rc;
- return rc;
- }
- type = x.GetExpressionResultType( e );
- cout << "\nExpression " << Expression << " produced result = ";
- if( type == 'C' )
- cout << x.GetStringResult();
- else if( type == 'N' )
- cout << x.GetDoubleResult();
- else if( type == 'L' )
- cout << x.GetIntResult();
- else
- cout << "\nUnknown result type " << type;
- return 0;
-}
-/****************************************************************************/
-main()
-{
- e = NULL;
-
- d.CreateDatabase( "TEST", MyRecord, OVERLAY );
- d.BlankRecord();
- d.PutField( d.GetFieldNo( "FIELD1" ), "TESTA " );
- d.PutField( d.GetFieldNo( "FIELD2" ), " testb" );
- d.PutField( d.GetFieldNo( "DOUB1" ), "200.33" );
- d.PutField( d.GetFieldNo( "FLOAT1" ), "100.00" );
- d.PutField( d.GetFieldNo( "DATE1" ), "19980101" );
- d.AppendRecord();
-
- /* process 3 simple expressions */
- MyExpressionProcessor( "FIELD1+FIELD2" );
- MyExpressionProcessor( "FIELD1-UPPER(FIELD2)" );
- MyExpressionProcessor( "5+TEST->DOUB1" );
-
- d.CloseDatabase();
- return 1;
-}
-
-</xmp>
-
-<hr>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xbc8.htm b/html/xbc8.htm
deleted file mode 100755
index efab841..0000000
--- a/html/xbc8.htm
+++ /dev/null
@@ -1,130 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<HTML>
-<TITLE>Xbase DBMS Chapter 8</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align="center">Record and File Locking</p></H1>
-<p align="center">Chapter Updated 2/1/99</p><hr>
-
-<h3>Locking Overview</h3>
-
-Xbase DBMS supports multi-user processing through file and record locks.
-Record locking restricts multiple cooperating programs from simultaneously
-accessing the same data and corrupting it. Without record and file locking
-in a multi-user environment, simultaneous access to the data and index files
-can cause the files to become inaccurate and unusable.<br><br>
-
-Record locking is on by default in the Xbase DBMS library. To disable it,
-comment out the XB_LOCKING_ON option in the <em>options.h</em> file in the
-xbase/src directory.<br><br>
-
-The current Xbase DBMS record locking does not co-exist with other Xbase
-products and there is not yet support for locking in a DOS/Windows environment.
-The locking functions do work correctly for a Xbase DBMS only configuration.
-Future version of Xbase DBMS will have enhanced locking features for
-co-existing with other Xbase products and also include DOS/Windows support.
-<br><br>
-
-The locking methods return either XB_LOCK_FAILED or XB_NO_ERROR. If they return
-XB_LOCK_FAILED the actual reason can be found in the global variable
-<em>errno</em> or function <em>perror()</em> can be executed to view the
-results.
-<br><br>
-
-The errno field may contain one of the following values if the lock was not
-successful.<br><br>
-<TABLE BORDER>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Error Code<TD>Description
-<TR><TH ALIGN="LEFT">EBADF<TD>Invalid file descriptor
-<TR><TH ALIGN="LEFT">EINVAL<TD>Invalid lock information or file does not support locks
-<TR><TH ALIGN="LEFT">EACCESS<BR>EAGAIN<TD>Lock can not be set because it is blocked by an existing lock on the file.
-<TR><TH ALIGN="LEFT">ENOLCK<TD>The system is out of lock resources, too many file locks in place.
-<TR><TH ALIGN="LEFT">EDEADLK<TD>Deadlock condition
-<TR><TH ALIGN="LEFT">EINTR<TD>Process was interrupted by a signal while it was waiting
-</TABLE>
-<br><br>
-<h3>Types of Locks</h3>
-
-<li><em>Write or Exclusive Locks</em> provide exclusive access to a
-particular file location. No other process can lock the same location.<br><br>
-
-<li><em>Read or Shared Locks</em> prohibit any process from requesting a write
-lock on a specified part of the file. Other processes can request
-simultaneous read locks.<br><br><br>
-
-<h3>DBF File Locking Techniques</h3>
-
-Xbase DBMS uses the following protocol for DBF file and record locking:
-<br><br>
-
-To lock a record - the first byte of the record is locked.<br>
-To lock the file - the header bytes of the file are locked.<br><br>
-
-When a record is being appended to the file, the header bytes are locked.<br>
-When a record is being updated, the header bytes and the specific record are
-locked.<br><br>
-This locking protocol is probably not compatable with other Xbase type products.
-However, Xbase can be safely used for multi-user access when it is not
-simultaneously updating DBF or NDX files while other products/programs are.
-<br><br><br>
-
-<h3>NDX File Locking Techniques</h3>
-
-Xbase DBMS locks indexes by locking the first 512 bytes
-of the index file.
-The entire index is locked because any updates to the index potentially
-can modify significant portions of the index tree.
-<br><br><br>
-
-<h3>DBT File Locking Techniques</h3>
-
-Xbase DBMS locks memo files by locking the first 4 bytes
-of the memo file. This effectively locks the entire file. The entire file
-is locked because any updates to the free block chain can significantly
-change the structure of the file.
-<br><br><br>
-
-
-<h3>AutoLocking Features</h3>
-
-If XB_LOCKING_ON is set in the <em>options.h</em> file, the locking methods
-execute any appropriate locking logic. If XB_LOCKING_ON is not set in the
-<em>options.h</em> file, all locking methods return XB_NO_ERROR without
-performing any actual record or file locking. This enables the application
-program to always call locking routines regardless of the XB_LOCKING_ON switch
-in the <em>options.h</em> file.
-<br><br>
-By leaving the autolocking features enabled, the application program does
-not need to address record, file or index locking. All locking is handled
-automatically by the Xbase routines. However, if access to the locking
-routines is required, they are available to the applciation programmer.
-<br><br>
-When the files are automatically locked by the Xbase routines, the database
-file is locked first, then it locks the indexes in alphabetical order. To
-avoid deadlock conditions, files and record locks should always be done in
-the same order. When the files are unlocked, then indexes are unlocked
-first, then the database is unlocked.
-<br><br>
-Auto-locking works well in an on-line transaction based environment.
-However, it does not function efficiently in batch mode. If you
-will be writing programs which process files in a batch mode, disabling
-auto-lock and locking the entire file at the beginning of the process
-and unlocking the file at the end of the process will significantly
-reduce process time. On a 586-200 class machine, a file with 45000 records
-can be read thru in a few seconds with the file locked in batch mode.
-In record-lock mode it takes about six minutes with the same processor.
-
-<br><br>For processing large files, locking the file instead of locking each
-record is far more efficient. This is how you do it.<br><br>
-
-For reading the file in batch mode:<br>
-xbDbf.AutoLockOff();<br>
-xbDbf.LockDatabase( F_SETLKW, F_RDLCK, 0L );<br><br>
-For updating the file in batch mode:<br>
-xbDbf.AutoLockOff();<br>
-xbDbf.LockDatabase( F_SETLKW, F_WRLCK, 0L );<br><br>
-<br>
-<hr><br>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/html/xblock.htm b/html/xblock.htm
deleted file mode 100755
index e95f1e3..0000000
--- a/html/xblock.htm
+++ /dev/null
@@ -1,281 +0,0 @@
-<!DOCTYPE HTML PUBLIC>
-<HTML>
-<TITLE>Xbase DBMS Chapter 10</TITLE>
-<BODY BGCOLOR=#FFFFFF>
-<H1><p align="center">Xbase DBMS Record and File Locking</p></H1>
-<p align="center">Chapter Updated 4/8/98</p><hr>
-
-<h3>Locking Overview</h3>
-
-Xbase DBMS supports multi-user processing through file and record locks.
-Record locking restricts multiple cooperating programs from simultaneously
-accessing the same data and corrupting it. Without record and file locking
-in a multi-user environment, simultaneous access to the data and index files
-can cause the files to become inaccurate and unusable.<br><br>
-
-Record locking is on by default in the Xbase DBMS library. To disable it,
-comment out the LOCKING_ON option in the <em>options.h</em> file in the
-xbase/src directory.<br><br>
-
-The current Xbase DBMS record locking does not co-exist with other Xbase
-products and there is not yet support for locking in a DOS/Windows environment.
-The locking functions do work correctly for a Xbase DBMS only configuration.
-Future version of Xbase DBMS will have enhanced locking features for
-co-existing with other Xbase products and also include DOS/Windows support.
-<br><br>
-
-The locking methods return either LOCK_FAILED or NO_ERROR. If they return
-LOCK_FAILED the actual reason can be found in the global variable
-<em>errno</em> or function <em>perror()</em> can be executed to view the
-results.
-<br><br>
-
-The errno field may contain one of the following values if the lock was not
-successful.<br><br>
-<TABLE BORDER>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Error Code<TD>Description
-<TR><TH ALIGN="LEFT">EBADF<TD>Invalid file descriptor
-<TR><TH ALIGN="LEFT">EINVAL<TD>Invalid lock information or file does not support locks
-<TR><TH ALIGN="LEFT">EACCESS<BR>EAGAIN<TD>Lock can not be set because it is blocked by an existing lock on the file.
-<TR><TH ALIGN="LEFT">ENOLCK<TD>The system is out of lock resources, too many file locks in place.
-<TR><TH ALIGN="LEFT">EDEADLK<TD>Deadlock condition
-<TR><TH ALIGN="LEFT">EINTR<TD>Process was interrupted by a signal while it was waiting
-</TABLE>
-<br><br>
-<h3>Types of Locks</h3>
-
-<li><em>Write or Exclusive Locks</em> provide exclusive access to a
-particular file location. No other process can lock the same location.<br><br>
-
-<li><em>Read or Shared Locks</em> prohibit any process from requesting a write
-lock on a specified part of the file. Other processes can request
-simultaneous read locks.<br><br><br>
-
-<h3>DBF File Locking Techniques</h3>
-
-Xbase DBMS uses the following protocol for DBF file and record locking:
-<br><br>
-
-To lock a record - the first byte of the record is locked.<br>
-To lock the file - the header bytes of the file are locked.<br><br>
-
-When a record is being appended to the file, the header bytes are locked.<br>
-When a record is being updated, the header bytes and the specific record are
-locked.<br><br>
-This locking protocol is probably not compatable with other Xbase type products.
-However, Xbase can be safely used for multi-user access when it is not
-simultaneously updating DBF or NDX files while other products/programs are.
-<br><br><br>
-
-<h3>NDX File Locking Techniques</h3>
-
-Xbase DBMS locks indexes by locking the first 512 bytes
-of the index file.
-The entire index is locked because any updates to the index potentially
-can modify significant portions of the index tree.
-<br><br><br>
-
-<h3>DBT File Locking Techniques</h3>
-
-Xbase DBMS locks memo files by locking the first 4 bytes
-of the memo file. This effectively locks the entire file. The entire file
-is locked because any updates to the free block chain can significantly
-change the structure of the file.
-<br><br><br>
-
-
-<h3>AutoLocking Features</h3>
-
-If LOCKING_ON is set in the <em>options.h</em> file, the locking methods
-execute any appropriate locking logic. If LOCKING_ON is not set in the
-<em>options.h</em> file, all locking methods return NO_ERROR without
-performing any actual record or file locking. This enables the application
-program to always call locking routines regardless of the LOCKING_ON switch
-in the <em>options.h</em> file.
-<br><br>
-By leaving the autolocking features enabled, the application program does
-not need to address record, file or index locking. All locking is handled
-automatically by the Xbase routines. However, if access to the locking
-routines is required, they are available to the applciation programmer.
-<br><br>
-When the files are automatically locked by the Xbase routines, the database
-file is locked first, then it locks the indexes in alphabetical order. To
-avoid deadlock conditions, files and record locks should always be done in
-the same order. When the files are unlocked, then indexes are unlocked
-first, then the database is unlocked.
-<br><br>
-Auto-locking works well in an on-line transaction based environment.
-However, it does not function efficiently in batch mode. If you
-will be writing programs which process files in a batch mode, disabling
-auto-lock and locking the entire file at the beginning of the process
-and unlocking the file at the end of the process will significantly
-reduce process time. On a 586-200 class machine, a file with 45000 records
-can be read thru in a few seconds with the file locked in batch mode.
-In record-lock mode it takes about six minutes with the same processor.
-
-<br><br>For processing large files, locking the file instead of locking each
-record is far more efficient. This is how you do it.<br><br>
-
-For reading the file in batch mode:<br>
-DBF.AutoLockOff();<br>
-DBF.LockDatabase( F_SETLKW, F_RDLCK, 0L );<br><br>
-For updating the file in batch mode:<br>
-DBF.AutoLockOff();<br>
-DBF.LockDatabase( F_SETLKW, F_WRLCK, 0L );<br><br>
-<br>
-<hr><br>
-
-<h3>Method Table</h3>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"><h3><Xbase Locking Method List</h3></CAPTION>
-<TR VALIGN="BASELINE">
-<TR><TH ALIGN="LEFT">Method<TD>Description
-<TR><TH ALIGN="LEFT">DBF::AutoLockOn<TD>Turns autolocking on
-<TR><TH ALIGN="LEFT">DBF::AutoLockOff<TD>Turns autolocking off
-<TR><TH ALIGN="LEFT">DBF::ExclusiveLock<TD>Lock file and indexes in exclusive mode
-<TR><TH ALIGN="LEFT">DBF::ExclusiveUnlock<TD>Unlock files and indexes
-<TR><TH ALIGN="LEFT">DBF::LockDatabase<TD>Locks or unlocks a DBF database
-<TR><TH ALIGN="LEFT">NDX::LockIndex<TD>Locks or unlocks an NDX index
-<TR><TH ALIGN="LEFT">NDX::LockMemoFile<TD>Locks or unlocks a DBT memo field file
-</TABLE>
-<BR><HR>
-
-<h4>Method Descriptions</h4>
-
-<h4>Method VOID DBF::AutoLockOn( VOID )</h4><br>
-
-This method turns automatic record locking on. Auto record locking is on
-by default if LOCKING_ON is set in the options.h file.<br><br>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/zips/loadzips.cpp">loadzips.cpp</A> for an example of
-how to use this method.
-<hr>
-
-<h4>Method VOID DBF::AutoLockOff( VOID )</h4><br>
-
-This method turns automatic record locking off. Auto record locking is on
-by default if LOCKING_ON is set in the options.h file.
-<br><br>
-Turning auto locking off will result in slightly better execution speeds
-but should not be used in multi-user environments when multiple users can
-update files simultanteously. If multiple users are accessing a file which
-is read only then it is safe to turn off auto-locking for a particular file.
-<br><br>
-Turning autolocking off will disable any index file locking which is
-particularly dangerous in a multi-user environment if updates on the files
-are permitted.
-
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/zips/loadzips.cpp">loadzips.cpp</A> for an example of
-how to use this method.
-
-<hr>
-<h4>Method SHORT DBF::ExclusiveLock( SHORT WaitOption )</h4>
-<h4>Method SHORT DBF::ExclusiveUnlock( VOID )</h4><br>
-
-ExclusiveLock and ExclusiveUnclock will lock the data file, memo file (if applicable)
-and any associated indexes in an exclusive mode. They also turn auto-lock
-on and off as appropriate.<br><br>
-
-WaitOption is either:<br><br>
-<li>F_SETLK - returns immediately regardless if success or failure<br>
-<li>F_SETLKW - waits until lock function executes<br><br>
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/XbaseSamples/sample4.cpp">sample4.cpp</A> for an example of
-how to use this method.
-
-<hr>
-<h3>Method SHORT DBF::LockDatabase( SHORT WaitOption, SHORT LockType, LONG LRecNo )
-</h3><br>
-
-This method locks or unlocks an Xbase (.DBF) file which was previously opened.<br>
-<br>
-WaitOption is either:<br><br>
-<li>F_SETLK - returns immediately regardless if success or failure<br>
-<li>F_SETLKW - waits until lock function executes<br><br>
-
-LockType is one of:<br><br>
-<li>F_RDLCK - Perform a Read or Shared Lock<br>
-<li>F_WRLCK - Perform a Write or Exclusive Lock<br>
-<li>F_UNLCK - Unlock it<br><br>
-
-LRecNo is:<br><br>
-0 - Lock the header section of the file (use this to lock the file)<br>
-1 through n - Lock a particular record<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"<h4>Method Return Codes</h4></CAPTION>
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">INVALID_RECORD<TD>An invalid record given
-<TR><TH ALIGN="LEFT">LOCK_FAILED<TD>The lock action failed, see errno
-<TR><TH ALIGN="LEFT">NO_ERROR<TD>The lock was successful
-</TABLE>
-
-
-<h4>Example Program:</h4>
-
-See program <A HREF="/zips/loadzips.cpp">loadzips.cpp</A> for an example of
-how to use this method.
-
-<hr>
-
-<h3>Method SHORT DBF::LockIndex( SHORT WaitOption, SHORT LockType )
-</h3><br>
-
-This method locks or unlocks an Index (.NDX) file which was previously opened.<br>
-<br>
-WaitOption is either:<br><br>
-<li>F_SETLK - returns immediately regardless if success or failure<br>
-<li>F_SETLKW - waits until lock function executes<br><br>
-
-LockType is one of:<br><br>
-<li>F_RDLCK - Perform a Read or Shared Lock<br>
-<li>F_WRLCK - Perform a Write or Exclusive Lock<br>
-<li>F_UNLCK - Unlock it<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"<h4>Method Return Codes</h4></CAPTION>
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">LOCK_FAILED<TD>The lock action failed, see errno
-<TR><TH ALIGN="LEFT">NO_ERROR<TD>The lock was successful
-</TABLE>
-
-<h4>Example Program:</h4>
-See program <A HREF="/zips/loadzips.cpp">loadzips.cpp</A> for an example of
-how to use this method.
-<hr>
-
-<h3>Method SHORT DBF::LockMemoFile( SHORT WaitOption, SHORT LockType )
-</h3><br>
-
-This method locks or unlocks a memo (.DBT) file which was previously opened.
-It is not necessary for an application to call this method as locking is
-handled automatically by other routines.<br><br>
-
-WaitOption is either:<br><br>
-<li>F_SETLK - returns immediately regardless if success or failure<br>
-<li>F_SETLKW - waits until lock function executes<br><br>
-
-LockType is one of:<br><br>
-<li>F_RDLCK - Perform a Read or Shared Lock<br>
-<li>F_WRLCK - Perform a Write or Exclusive Lock<br>
-<li>F_UNLCK - Unlock it<br><br>
-
-<TABLE BORDER>
-<CAPTION ALIGN="TOP"<h4>Method Return Codes</h4></CAPTION>
-<TR><TH ALIGN="LEFT">Return Code<TD>Description
-<TR><TH ALIGN="LEFT">LOCK_FAILED<TD>The lock action failed, see errno
-<TR><TH ALIGN="LEFT">NO_ERROR<TD>The lock was successful
-</TABLE>
-<hr>
-<p><img src="xbase.jpg"><br><hr>
-</BODY>
-</HTML>
diff --git a/install b/install
deleted file mode 100755
index 334fc91..0000000
--- a/install
+++ /dev/null
@@ -1,186 +0,0 @@
-Basic Installation
-==================
-
-For xbase64 specific installation notes
-
-1) Review the README file in this directory
-
-and/or
-
-2) Review Chapter 1 in the manual on getting started.
-
-
-The remainder of this file is the generic installation
-instructions included with automake/autoconf.
-
- The `configure' shell script attempts to guess correct values for
-various system-dependent variables used during compilation. It uses
-those values to create a `Makefile' in each directory of the package.
-It may also create one or more `.h' files containing system-dependent
-definitions. Finally, it creates a shell script `config.status' that
-you can run in the future to recreate the current configuration, a file
-`config.cache' that saves the results of its tests to speed up
-reconfiguring, and a file `config.log' containing compiler output
-(useful mainly for debugging `configure').
-
- If you need to do unusual things to compile the package, please try
-to figure out how `configure' could check whether to do them, and mail
-diffs or instructions to the address given in the `README' so they can
-be considered for the next release. If at some point `config.cache'
-contains results you don't want to keep, you may remove or edit it.
-
- The file `configure.in' is used to create `configure' by a program
-called `autoconf'. You only need `configure.in' if you want to change
-it or regenerate `configure' using a newer version of `autoconf'.
-
-The simplest way to compile this package is:
-
- 1. `cd' to the directory containing the package's source code and type
- `./configure' to configure the package for your system. If you're
- using `csh' on an old version of System V, you might need to type
- `sh ./configure' instead to prevent `csh' from trying to execute
- `configure' itself.
-
- Running `configure' takes a while. While running, it prints some
- messages telling which features it is checking for.
-
- 2. Type `make' to compile the package.
-
- 3. Optionally, type `make check' to run any self-tests that come with
- the package.
-
- 4. Type `make install' to install the programs and any data files and
- documentation.
-
- 5. You can remove the program binaries and object files from the
- source code directory by typing `make clean'. To also remove the
- files that `configure' created (so you can compile the package for
- a different kind of computer), type `make distclean'. There is
- also a `make maintainer-clean' target, but that is intended mainly
- for the package's developers. If you use it, you may have to get
- all sorts of other programs in order to regenerate files that came
- with the distribution.
-
-Compilers and Options
-=====================
-
- Some systems require unusual options for compilation or linking that
-the `configure' script does not know about. You can give `configure'
-initial values for variables by setting them in the environment. Using
-a Bourne-compatible shell, you can do that on the command line like
-this:
- CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
-
-Or on systems that have the `env' program, you can do it like this:
- env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
-
-Compiling For Multiple Architectures
-====================================
-
- You can compile the package for more than one kind of computer at the
-same time, by placing the object files for each architecture in their
-own directory. To do this, you must use a version of `make' that
-supports the `VPATH' variable, such as GNU `make'. `cd' to the
-directory where you want the object files and executables to go and run
-the `configure' script. `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
-
- If you have to use a `make' that does not supports the `VPATH'
-variable, you have to compile the package for one architecture at a time
-in the source code directory. After you have installed the package for
-one architecture, use `make distclean' before reconfiguring for another
-architecture.
-
-Installation Names
-==================
-
- By default, `make install' will install the package's files in
-`/usr/local/kde/bin', `/usr/local/kde/lib', etc. You can specify an
-installation prefix other than `/usr/local/kde' by giving `configure'
-the option `--prefix=PATH'.
-
- You can specify separate installation prefixes for
-architecture-specific files and architecture-independent files. If you
-give `configure' the option `--exec-prefix=PATH', the package will use
-PATH as the prefix for installing programs and libraries.
-Documentation and other data files will still use the regular prefix.
-
- If the package supports it, you can cause programs to be installed
-with an extra prefix or suffix on their names by giving `configure' the
-option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
-
-Optional Features
-=================
-
- Some packages pay attention to `--enable-FEATURE' options to
-`configure', where FEATURE indicates an optional part of the package.
-They may also pay attention to `--with-PACKAGE' options, where PACKAGE
-is something like `gnu-as' or `x' (for the X Window System). The
-`README' should mention any `--enable-' and `--with-' options that the
-package recognizes.
-
- For packages that use the X Window System, `configure' can usually
-find the X include and library files automatically, but if it doesn't,
-you can use the `configure' options `--x-includes=DIR' and
-`--x-libraries=DIR' to specify their locations.
-
-Specifying the System Type
-==========================
-
- There may be some features `configure' can not figure out
-automatically, but needs to determine by the type of host the package
-will run on. Usually `configure' can figure that out, but if it prints
-a message saying it can not guess the host type, give it the
-`--host=TYPE' option. TYPE can either be a short name for the system
-type, such as `sun4', or a canonical name with three fields:
- CPU-COMPANY-SYSTEM
-
-See the file `config.sub' for the possible values of each field. If
-`config.sub' isn't included in this package, then this package doesn't
-need to know the host type.
-
- If you are building compiler tools for cross-compiling, you can also
-use the `--target=TYPE' option to select the type of system they will
-produce code for and the `--build=TYPE' option to select the type of
-system on which you are compiling the package.
-
-Sharing Defaults
-================
-
- If you want to set default values for `configure' scripts to share,
-you can create a site shell script called `config.site' that gives
-default values for variables like `CC', `cache_file', and `prefix'.
-`configure' looks for `PREFIX/share/config.site' if it exists, then
-`PREFIX/etc/config.site' if it exists. Or, you can set the
-`CONFIG_SITE' environment variable to the location of the site script.
-A warning: not all `configure' scripts look for a site script.
-
-Operation Controls
-==================
-
- `configure' recognizes the following options to control how it
-operates.
-
-`--cache-file=FILE'
- Use and save the results of the tests in FILE instead of
- `./config.cache'. Set FILE to `/dev/null' to disable caching, for
- debugging `configure'.
-
-`--help'
- Print a summary of the options to `configure', and exit.
-
-`--quiet'
-`--silent'
-`-q'
- Do not print messages saying which checks are being made.
-
-`--srcdir=DIR'
- Look for the package's source code in directory DIR. Usually
- `configure' can determine that directory automatically.
-
-`--version'
- Print the version of Autoconf used to generate the `configure'
- script, and exit.
-
-`configure' also accepts some other, not widely useful, options.
-
diff --git a/install-sh b/install-sh
deleted file mode 100755
index 11870f1..0000000
--- a/install-sh
+++ /dev/null
@@ -1,251 +0,0 @@
-#!/bin/sh
-#
-# install - install a program, script, or datafile
-# This comes from X11R5 (mit/util/scripts/install.sh).
-#
-# Copyright 1991 by the Massachusetts Institute of Technology
-#
-# Permission to use, copy, modify, distribute, and sell this software and its
-# documentation for any purpose is hereby granted without fee, provided that
-# the above copyright notice appear in all copies and that both that
-# copyright notice and this permission notice appear in supporting
-# documentation, and that the name of M.I.T. not be used in advertising or
-# publicity pertaining to distribution of the software without specific,
-# written prior permission. M.I.T. makes no representations about the
-# suitability of this software for any purpose. It is provided "as is"
-# without express or implied warranty.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch. It can only install one file at a time, a restriction
-# shared with many OS's install programs.
-
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-
-
-# put in absolute paths if you don't have them in your path; or use env. vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-transformbasename=""
-transform_arg=""
-instcmd="$mvprog"
-chmodcmd="$chmodprog 0755"
-chowncmd=""
-chgrpcmd=""
-stripcmd=""
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=""
-dst=""
-dir_arg=""
-
-while [ x"$1" != x ]; do
- case $1 in
- -c) instcmd="$cpprog"
- shift
- continue;;
-
- -d) dir_arg=true
- shift
- continue;;
-
- -m) chmodcmd="$chmodprog $2"
- shift
- shift
- continue;;
-
- -o) chowncmd="$chownprog $2"
- shift
- shift
- continue;;
-
- -g) chgrpcmd="$chgrpprog $2"
- shift
- shift
- continue;;
-
- -s) stripcmd="$stripprog"
- shift
- continue;;
-
- -t=*) transformarg=`echo $1 | sed 's/-t=//'`
- shift
- continue;;
-
- -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
- shift
- continue;;
-
- *) if [ x"$src" = x ]
- then
- src=$1
- else
- # this colon is to work around a 386BSD /bin/sh bug
- :
- dst=$1
- fi
- shift
- continue;;
- esac
-done
-
-if [ x"$src" = x ]
-then
- echo "install: no input file specified"
- exit 1
-else
- :
-fi
-
-if [ x"$dir_arg" != x ]; then
- dst=$src
- src=""
-
- if [ -d $dst ]; then
- instcmd=:
- chmodcmd=""
- else
- instcmd=$mkdirprog
- fi
-else
-
-# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
-# might cause directories to be created, which would be especially bad
-# if $src (and thus $dsttmp) contains '*'.
-
- if [ -f "$src" ] || [ -d "$src" ]
- then
- :
- else
- echo "install: $src does not exist"
- exit 1
- fi
-
- if [ x"$dst" = x ]
- then
- echo "install: no destination specified"
- exit 1
- else
- :
- fi
-
-# If destination is a directory, append the input filename; if your system
-# does not like double slashes in filenames, you may need to add some logic
-
- if [ -d $dst ]
- then
- dst="$dst"/`basename $src`
- else
- :
- fi
-fi
-
-## this sed command emulates the dirname command
-dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
-
-# Make sure that the destination directory exists.
-# this part is taken from Noah Friedman's mkinstalldirs script
-
-# Skip lots of stat calls in the usual case.
-if [ ! -d "$dstdir" ]; then
-defaultIFS='
- '
-IFS="${IFS-${defaultIFS}}"
-
-oIFS="${IFS}"
-# Some sh's can't handle IFS=/ for some reason.
-IFS='%'
-set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
-IFS="${oIFS}"
-
-pathcomp=''
-
-while [ $# -ne 0 ] ; do
- pathcomp="${pathcomp}${1}"
- shift
-
- if [ ! -d "${pathcomp}" ] ;
- then
- $mkdirprog "${pathcomp}"
- else
- :
- fi
-
- pathcomp="${pathcomp}/"
-done
-fi
-
-if [ x"$dir_arg" != x ]
-then
- $doit $instcmd $dst &&
-
- if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else : ; fi &&
- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else : ; fi &&
- if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else : ; fi &&
- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else : ; fi
-else
-
-# If we're going to rename the final executable, determine the name now.
-
- if [ x"$transformarg" = x ]
- then
- dstfile=`basename $dst`
- else
- dstfile=`basename $dst $transformbasename |
- sed $transformarg`$transformbasename
- fi
-
-# don't allow the sed command to completely eliminate the filename
-
- if [ x"$dstfile" = x ]
- then
- dstfile=`basename $dst`
- else
- :
- fi
-
-# Make a temp file name in the proper directory.
-
- dsttmp=$dstdir/#inst.$$#
-
-# Move or copy the file name to the temp name
-
- $doit $instcmd $src $dsttmp &&
-
- trap "rm -f ${dsttmp}" 0 &&
-
-# and set any options; do chmod last to preserve setuid bits
-
-# If any of these fail, we abort the whole thing. If we want to
-# ignore errors from any of these, just make sure not to ignore
-# errors from the above "$doit $instcmd $src $dsttmp" command.
-
- if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else :;fi &&
- if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else :;fi &&
- if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else :;fi &&
- if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else :;fi &&
-
-# Now rename the file to the real destination.
-
- $doit $rmcmd -f $dstdir/$dstfile &&
- $doit $mvcmd $dsttmp $dstdir/$dstfile
-
-fi &&
-
-
-exit 0
diff --git a/libtest/Makefile.am b/libtest/Makefile.am
deleted file mode 100755
index 9e84830..0000000
--- a/libtest/Makefile.am
+++ /dev/null
@@ -1,19 +0,0 @@
-
-INCLUDES= -I$(topdir)
-LDADD = -L$(topdir)/xbase64 -lxbase64
-
-INSTALL_PROGRAM = @INSTALL@
-
-noinst_PROGRAMS = indextst exptest locktest testdate lfiletst
-
-indextst_SOURCES = indextst.cpp
-exptest_SOURCES = exptest.cpp
-locktest_SOURCES = locktest.cpp
-testdate_SOURCES = testdate.cpp
-lfiletst_SOURCES = lfiletst.cpp
-
-noinst_HEADERS =
-
-EXTRA_DIST = readme makebcc.bat
-
-CLEANFILES = Makefile.in *.exe compout *.tds *.dbf *.dbt *.ndx *.ntx *.obj
diff --git a/libtest/Makefile.in b/libtest/Makefile.in
deleted file mode 100755
index 372dd58..0000000
--- a/libtest/Makefile.in
+++ /dev/null
@@ -1,391 +0,0 @@
-# Makefile.in generated by automake 1.6.3 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = @program_transform_name@
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-
-EXEEXT = @EXEEXT@
-OBJEXT = @OBJEXT@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-
-INSTALL_PROGRAM = @INSTALL@
-AMTAR = @AMTAR@
-AS = @AS@
-AWK = @AWK@
-CC = @CC@
-CXX = @CXX@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
-GXXVER = @GXXVER@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-RELEASE = @RELEASE@
-RHREL = @RHREL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XSUBDIRS = @XSUBDIRS@
-am__include = @am__include@
-am__quote = @am__quote@
-doxygen = @doxygen@
-install_sh = @install_sh@
-topdir = @topdir@
-
-INCLUDES = -I$(topdir)
-LDADD = -L$(topdir)/xbase64 -lxbase64
-
-noinst_PROGRAMS = indextst exptest locktest testdate lfiletst
-
-indextst_SOURCES = indextst.cpp
-exptest_SOURCES = exptest.cpp
-locktest_SOURCES = locktest.cpp
-testdate_SOURCES = testdate.cpp
-lfiletst_SOURCES = lfiletst.cpp
-
-noinst_HEADERS =
-
-EXTRA_DIST = readme makebcc.bat
-
-CLEANFILES = Makefile.in *.exe compout *.tds *.dbf *.dbt *.ndx *.ntx *.obj
-subdir = libtest
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = $(top_builddir)/xbase64/xbconfig.h
-CONFIG_CLEAN_FILES =
-noinst_PROGRAMS = indextst$(EXEEXT) exptest$(EXEEXT) locktest$(EXEEXT) \
- testdate$(EXEEXT) lfiletst$(EXEEXT)
-PROGRAMS = $(noinst_PROGRAMS)
-
-am_exptest_OBJECTS = exptest.$(OBJEXT)
-exptest_OBJECTS = $(am_exptest_OBJECTS)
-exptest_LDADD = $(LDADD)
-exptest_DEPENDENCIES =
-exptest_LDFLAGS =
-am_indextst_OBJECTS = indextst.$(OBJEXT)
-indextst_OBJECTS = $(am_indextst_OBJECTS)
-indextst_LDADD = $(LDADD)
-indextst_DEPENDENCIES =
-indextst_LDFLAGS =
-am_lfiletst_OBJECTS = lfiletst.$(OBJEXT)
-lfiletst_OBJECTS = $(am_lfiletst_OBJECTS)
-lfiletst_LDADD = $(LDADD)
-lfiletst_DEPENDENCIES =
-lfiletst_LDFLAGS =
-am_locktest_OBJECTS = locktest.$(OBJEXT)
-locktest_OBJECTS = $(am_locktest_OBJECTS)
-locktest_LDADD = $(LDADD)
-locktest_DEPENDENCIES =
-locktest_LDFLAGS =
-am_testdate_OBJECTS = testdate.$(OBJEXT)
-testdate_OBJECTS = $(am_testdate_OBJECTS)
-testdate_LDADD = $(LDADD)
-testdate_DEPENDENCIES =
-testdate_LDFLAGS =
-
-DEFS = @DEFS@
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/xbase64
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/exptest.Po ./$(DEPDIR)/indextst.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/lfiletst.Po ./$(DEPDIR)/locktest.Po \
-@AMDEP_TRUE@ ./$(DEPDIR)/testdate.Po
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
-CXXFLAGS = @CXXFLAGS@
-DIST_SOURCES = $(exptest_SOURCES) $(indextst_SOURCES) \
- $(lfiletst_SOURCES) $(locktest_SOURCES) $(testdate_SOURCES)
-HEADERS = $(noinst_HEADERS)
-
-DIST_COMMON = README $(noinst_HEADERS) Makefile.am Makefile.in
-SOURCES = $(exptest_SOURCES) $(indextst_SOURCES) $(lfiletst_SOURCES) $(locktest_SOURCES) $(testdate_SOURCES)
-
-all: all-am
-
-.SUFFIXES:
-.SUFFIXES: .cpp .lo .o .obj
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && \
- $(AUTOMAKE) --gnu libtest/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-clean-noinstPROGRAMS:
- @list='$(noinst_PROGRAMS)'; for p in $$list; do \
- f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f $$p $$f"; \
- rm -f $$p $$f ; \
- done
-exptest$(EXEEXT): $(exptest_OBJECTS) $(exptest_DEPENDENCIES)
- @rm -f exptest$(EXEEXT)
- $(CXXLINK) $(exptest_LDFLAGS) $(exptest_OBJECTS) $(exptest_LDADD) $(LIBS)
-indextst$(EXEEXT): $(indextst_OBJECTS) $(indextst_DEPENDENCIES)
- @rm -f indextst$(EXEEXT)
- $(CXXLINK) $(indextst_LDFLAGS) $(indextst_OBJECTS) $(indextst_LDADD) $(LIBS)
-lfiletst$(EXEEXT): $(lfiletst_OBJECTS) $(lfiletst_DEPENDENCIES)
- @rm -f lfiletst$(EXEEXT)
- $(CXXLINK) $(lfiletst_LDFLAGS) $(lfiletst_OBJECTS) $(lfiletst_LDADD) $(LIBS)
-locktest$(EXEEXT): $(locktest_OBJECTS) $(locktest_DEPENDENCIES)
- @rm -f locktest$(EXEEXT)
- $(CXXLINK) $(locktest_LDFLAGS) $(locktest_OBJECTS) $(locktest_LDADD) $(LIBS)
-testdate$(EXEEXT): $(testdate_OBJECTS) $(testdate_DEPENDENCIES)
- @rm -f testdate$(EXEEXT)
- $(CXXLINK) $(testdate_LDFLAGS) $(testdate_OBJECTS) $(testdate_LDADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
- -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exptest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/indextst.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lfiletst.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/locktest.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testdate.Po@am__quote@
-
-distclean-depend:
- -rm -rf ./$(DEPDIR)
-
-.cpp.o:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-
-.cpp.obj:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(CXXCOMPILE) -c -o $@ `cygpath -w $<`
-
-.cpp.lo:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-CXXDEPMODE = @CXXDEPMODE@
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
- -rm -f libtool
-uninstall-info-am:
-
-ETAGS = etags
-ETAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- mkid -fID $$unique
-
-TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$tags$$unique" \
- || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
- @list='$(DISTFILES)'; for file in $$list; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
- dir="/$$dir"; \
- $(mkinstalldirs) "$(distdir)$$dir"; \
- else \
- dir=''; \
- fi; \
- if test -d $$d/$$file; then \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
- else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS) $(HEADERS)
-
-installdirs:
-
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
- mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
- distclean-generic distclean-libtool distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-exec-am:
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-uninstall-am: uninstall-info-am
-
-.PHONY: GTAGS all all-am check check-am clean clean-generic \
- clean-libtool clean-noinstPROGRAMS distclean distclean-compile \
- distclean-depend distclean-generic distclean-libtool \
- distclean-tags distdir dvi dvi-am info info-am install \
- install-am install-data install-data-am install-exec \
- install-exec-am install-info install-info-am install-man \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- tags uninstall uninstall-am uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/libtest/exptest.cpp b/libtest/exptest.cpp
deleted file mode 100755
index d5330c6..0000000
--- a/libtest/exptest.cpp
+++ /dev/null
@@ -1,277 +0,0 @@
-/* exptest.cpp
-
- Xbase project source code
-
- This program tests the Xbase expression logic
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-
-*/
-
-#include "xbase64/xbase64.h"
-
-class ExpTestor{
- public:ExpTestor( xbXBase *, xbDbf * );
- xbShort TestExpression( const char * TestExpression,
- const char * ExpectedResult );
- xbShort TestExpression( const char * TestExpression,
- const xbDouble ExpectedResult );
- private:
- xbXBase *xbptr;
- xbDbf *dbfPtr;
-};
-/**************************************************************************/
-ExpTestor::ExpTestor( xbXBase *xp, xbDbf *dp )
-{
- xbptr = xp;
- dbfPtr = dp;
-}
-/**************************************************************************/
-xbShort ExpTestor::TestExpression( const char * Expression,
- const xbDouble ExpectedResult )
-{
-// xbExpNode * e;
- xbExpn * exp;
- xbShort rc;
-
- exp = new xbExpn( xbptr );
- if(( rc = exp->ParseExpression( Expression, dbfPtr )) != 0 ){
- std::cout << "Parse Error " << rc << " in expression " << Expression
- << std::endl;
- if( exp )
- delete exp;
- return 1;
- }
-
- if(( rc = exp->ProcessExpression()) != 0 ){
- std::cout << "Error " << rc << " processing expression " << Expression
- << std::endl;
- if( exp )
- delete exp;
- return 1;
- }
- char type = exp->GetExpressionResultType();
- if( type != 'N' && type != 'L' ){
- std::cout << "Expression " << Expression;
- std::cout << " Expected result type Numeric or Logical, actual was ";
- std::cout << type << std::endl;
- delete exp;
- return 1;
- }
-
- if( type == 'N' ){
- xbString d1;
- xbString d2;
- d1.setNum( "2.4", ExpectedResult );
- d2.setNum( "2.4", exp->GetDoubleResult());
- if( d1 != d2 ){
- std::cout << "Expression " << Expression;
- std::cout << " Actual result of " << d2 << " does not match";
- std::cout << " expected result of " << d1 << std::endl;
- delete exp;
- return 1;
- }
- }
- if( type == 'L' && ExpectedResult != (xbDouble) exp->GetIntResult()){
- std::cout << "Expression " << Expression;
- std::cout << " Actual result of " << exp->GetIntResult()
- << " does not match ";
- std::cout << " expected result of " << ExpectedResult << std::endl;
- delete exp;
- return 1;
- }
-
- std::cout << "Expression " << Expression << " returned " << ExpectedResult;
- std::cout << " OK" << std::endl;
- delete exp;
- return 0;
-}
-/**************************************************************************/
-xbShort ExpTestor::TestExpression( const char * Expression,
- const char * ExpectedResult )
-{
-// xbExpNode * e;
- xbExpn * exp;
- xbShort rc;
-
- exp = new xbExpn( xbptr );
- if(( rc = exp->ParseExpression( Expression, dbfPtr )) != 0 ){
- std::cout << "Parse Error " << rc << " in expression " << Expression
- << std::endl;
- if( exp )
- delete exp;
- return 1;
- }
-
- if(( rc = exp->ProcessExpression()) != 0 ){
- std::cout << "Error " << rc << " processing expression " << Expression
- << std::endl;
- delete exp;
- return 1;
- }
- char type = exp->GetExpressionResultType();
- if( type != 'C' ){
- std::cout << "Expression " << Expression;
- std::cout << " Expected result type Character, actual was " << type
- << std::endl;
- delete exp;
- return 1;
- }
-
- if( strlen( ExpectedResult ) != strlen( exp->GetStringResult())){
- std::cout << "Expression " << Expression;
- std::cout << " result length of "
- << strlen( exp->GetStringResult())
- << " different than expected of " << strlen( ExpectedResult )
- << std::endl;
- std::cout << "Calculated result =" << exp->GetStringResult()
- << "<" << std::endl;
- delete exp;
- return 1;
- }
-
- if( strcmp( ExpectedResult, exp->GetStringResult())){
- std::cout << "Expression " << Expression;
- std::cout << " Actual result of " << exp->GetStringResult()
- << " does not match ";
- std::cout << " expected result of " << ExpectedResult << std::endl;
- delete exp;
- return 1;
- }
-
- std::cout << "Expression " << Expression << " returned " << ExpectedResult;
- std::cout << " OK" << std::endl;
- return 0;
-}
-/*************************************************************************/
-int main()
-{
- xbSchema MyRecord[] =
- {
- { "FLOAT1", XB_FLOAT_FLD, 9, 2 },
- { "DATE1", XB_DATE_FLD, 8, 0 },
- { "DATE2", XB_DATE_FLD, 8, 0 },
- { "", 0, 0, 0 },
- };
-
- xbXBase x;
- xbDbf d( &x );
- xbExpn exp( &x );
-
- d.CreateDatabase( "TEST", MyRecord, XB_OVERLAY );
- d.PutFloatField( "FLOAT1", 5 );
- d.PutField( "DATE1", "19990110" );
- d.PutField( "DATE2", "19990120" );
- d.AppendRecord();
-
- std::cout << "XBase Expression testing program.." << std::endl;
- std::cout << "This program tests the XBase expression logic." << std::endl;
- ExpTestor * e = new ExpTestor( &x, &d );
-
-/* test functions which return a character value result */
- e->TestExpression( "CDOW( \"20000101\" )", "Saturday " );
- e->TestExpression( "CHR( 101 )", "e" );
- e->TestExpression( "CMONTH( \"20000101\" )", "January " );
- e->TestExpression( "DATE()", exp.DATE() );
- e->TestExpression( "DTOC( \"20000101\" )", "01/01/00" );
- e->TestExpression( "DTOS( \"20000101\" )", "20000101" );
- e->TestExpression( "LEFT( \"STRING\", 3 )", "STR" );
- e->TestExpression( "LTRIM( \" xxxxxx\" )", "xxxxxx" );
- e->TestExpression( "LOWER( \"AAAA\" )", "aaaa" );
-
- e->TestExpression( "REPLICATE( \"abc\", 3 )", "abcabcabc" );
- e->TestExpression( "RTRIM( \"zzz \" )", "zzz" );
- e->TestExpression( "RTRIM( \"zzz \" )+\"qqq\"", "zzzqqq" );
- e->TestExpression( "SPACE( 3 )", " " );
-
- e->TestExpression( "STR( -52.345 )", " -52" );
- e->TestExpression( "STR( -52.345, 3 )", "-52" );
- e->TestExpression( "STR( 52.34, 4, 1 )", "52.3" );
-
-// not sure what the STRZERO function is supposed to do
-/*
- e->TestExpression( "STRZERO( \"aaa\" )", "not sure" );
- e->TestExpression( "STRZERO( \"aaa\", 3, 3, )", "??" );
- e->TestExpression( "STRZERO( 22 )", "not sure" );
- e->TestExpression( "STRZERO( 22, 3 )", "not sure" );
- e->TestExpression( "STRZERO( 2, 3, 3 )", "not sure" );
- e->TestExpression( "STRZERO( \"ddd\", 4, 6 ), "not sure" );
-*/
- e->TestExpression( "TRIM( \"aaa \" )", "aaa" );
- e->TestExpression( "UPPER( \"abcde\" )", "ABCDE" );
-
-/* functions returning double values */
- e->TestExpression( "ABS( -222 )", 222 );
- e->TestExpression( "EXP( 1 )", (xbDouble) 2.7182800 );
- e->TestExpression( "LOG( 2 )", (xbDouble) 0.69314700 );
- e->TestExpression( "MAX( 10, 27 )", 27 );
- e->TestExpression( "MIN( 10, 5 )", 5 );
- e->TestExpression( "SQRT( 9 )", 3 );
-
-/* functions returning long values */
- e->TestExpression( "ASC( \"A\" )", 'A' );
- e->TestExpression( "AT( \"BC\", \"ABCD\" )", 2 );
- e->TestExpression( "DAY( 20000101 )", 1 );
-
- e->TestExpression( "DESCEND( 1500 )", -1500 );
-
- e->TestExpression( "DOW( 20000101 )", 6 );
- e->TestExpression( "INT( 621.5 )", 621 );
- e->TestExpression( "ISALPHA( \"A\" )", 1 );
- e->TestExpression( "ISLOWER( \"a\" )", 1 );
- e->TestExpression( "ISUPPER( \"A\" )", 1 );
- e->TestExpression( "LEN( \"AAAAA\" )", 5 );
- e->TestExpression( "MONTH( 20000101 )", 1 );
- e->TestExpression( "RECNO()", (xbDouble) 0 );
- e->TestExpression( "VAL( \"ABC\" )", 65 );
- e->TestExpression( "YEAR( \"20000101\" )", 2000 );
-
- e->TestExpression( "(25-3+2)*2", 48 );
- e->TestExpression( "(25+3+2)*2", 60 );
- e->TestExpression( "TEST->FLOAT1+1", 6 );
- e->TestExpression( "TEST->FLOAT1 + 1", 6 );
- e->TestExpression( "FLOAT1+1", 6 );
- e->TestExpression( "FLOAT1 + 1", 6 );
-
- e->TestExpression( "TEST->FLOAT1 < 1", (xbDouble) 0 );
- e->TestExpression( "TEST->FLOAT1 > 1", (xbDouble) 1 );
- e->TestExpression( "TEST->DATE2 - TEST->DATE1", (xbDouble) 10 );
-
- e->TestExpression( "IIF( \"TEST->FLOAT1>0\", \"T\", \"F\" )", "F" );
- e->TestExpression( "IIF( \"TEST->FLOAT1<=0\", \"T\", \"F\" )", "T" );
-
-
- delete e;
- return 0;
-}
diff --git a/libtest/indextst.cpp b/libtest/indextst.cpp
deleted file mode 100755
index c3a74be..0000000
--- a/libtest/indextst.cpp
+++ /dev/null
@@ -1,297 +0,0 @@
-/* indextst.cpp
-
- Xbase project source code
-
- This program creates a sample database and multiple indices.
- It tests the index logic.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-#include "xbase64/xbase64.h"
-
-int CheckIndex(
-#ifdef XB_INDEX_NDX
- xbNdx *indx1, xbNdx *indx2, xbNdx *indx3
-#endif
-#if defined( XB_INDEX_NDX ) && defined ( XB_INDEX_NTX )
- ,
-#endif
-#ifdef XB_INDEX_NTX
- xbNtx *intx1, xbNtx *intx2, xbNtx *intx3
-#endif
- );
-
-int main()
-{
- xbShort f1, f2, f3, rc, sts = 0;
- char charbuf[10];
-
- xbSchema MyRecord[] =
- {
- { "CHARFLD1", XB_CHAR_FLD, 6, 0 },
- { "CHARFLD2", XB_CHAR_FLD, 6, 0 },
- { "NUMFLD1", XB_NUMERIC_FLD, 6, 0 },
- { "",0,0,0 }
- };
-
- /* define the classes */
- xbXBase x; /* initialize xbase */
- xbDbf MyFile( &x ); /* class for table */
-
-#ifdef XB_INDEX_NDX
- xbNdx indx1( &MyFile ); /* class for ndx index 1 */
- xbNdx indx2( &MyFile ); /* class for ndx index 2 */
- xbNdx indx3( &MyFile ); /* class for ndx index 3 */
-#endif
-
-#ifdef XB_INDEX_NTX
- xbNtx intx1( &MyFile ); /* class for ntx index 1 */
- xbNtx intx2( &MyFile ); /* class for ntx index 2 */
- xbNtx intx3( &MyFile ); /* class for ntx index 3 */
-#endif
-
-#ifndef XBASE_DEBUG
- std::cout << "XBASE_DEBUG support option not compiled into library";
- return 1;
-#endif
-
-
- std::cout << "Creating test database and indices" << std::endl;
- if(( rc = MyFile.CreateDatabase( "IXTEST.DBF", MyRecord, XB_OVERLAY ))
- != XB_NO_ERROR )
- std::cout << "Error creating database = " << rc << "\n";
- else
- {
-#ifdef XB_INDEX_NDX
- if(( rc = indx1.CreateIndex(
- "IXNDX1.NDX", "CHARFLD1", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- {
- std::cout << "Error creating index 1 = " << rc << std::endl;
- exit( 1 );
- }
-
- if(( rc = indx2.CreateIndex(
- "IXNDX2.NDX", "CHARFLD1+CHARFLD2", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- {
- std::cout << "Error creating index 2 = " << rc << std::endl;
- exit( 1 );
- }
-
- if(( rc = indx3.CreateIndex(
- "IXNDX3.NDX", "NUMFLD1", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- {
- std::cout << "Error creating index 3 = " << rc << std::endl;
- exit( 1 );
- }
-#endif
-
-
-#ifdef XB_INDEX_NTX
- if(( rc = intx1.CreateIndex(
- "IXNTX1.NTX", "CHARFLD1", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- {
- std::cout << "Error creating index 4 = " << rc << std::endl;
- exit( 1 );
- }
-
- if(( rc = intx2.CreateIndex(
- "IXNTX2.NTX", "CHARFLD1+CHARFLD2", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- {
- std::cout << "Error creating index 5 = " << rc << std::endl;
- exit( 1 );
- }
-
- if(( rc = intx3.CreateIndex(
- "IXNTX3.NTX", "NUMFLD1", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR )
- {
- std::cout << "Error creating index 6 = " << rc << std::endl;
- exit( 1 );
- }
-#endif
- }
-
- f1 = MyFile.GetFieldNo( "CHARFLD1" );
- f2 = MyFile.GetFieldNo( "CHARFLD2" );
- f3 = MyFile.GetFieldNo( "NUMFLD1" );
-
- std::cout << "Populating database and indices with data" << std::endl;
- std::cout << ".";
- std::cout.flush();
- for( int i = 0; i < 10000; i++ ){
- if( i % 100 == 0){
- std::cout << ".";
- std::cout.flush();
- }
- memset( charbuf, 0x00, 10 );
- sprintf( charbuf, "%d", i );
- MyFile.BlankRecord();
- MyFile.PutField( f1, charbuf );
- MyFile.PutField( f2, charbuf );
- MyFile.PutLongField( f3, i );
- MyFile.AppendRecord();
-
-
- }
- std::cout << " Done." << std::endl;
-
- // Check all indices.
- sts += CheckIndex(
-#ifdef XB_INDEX_NDX
- &indx1, &indx2, &indx3
-#endif
-#if defined( XB_INDEX_NDX ) && defined( XB_INDEX_NTX )
- ,
-#endif
-#ifdef XB_INDEX_NTX
- &intx1, &intx2, &intx3
-#endif
- );
- //
- // Appending a "Z" to the records will cause the index delete
- // functions to be used.
- //
- // - Bob Cotton <bob@synxis.com>
- //
- std::cout << "Reversing records." << std::endl;
- std::cout << ".";
- std::cout.flush();
- for( xbLong j = 1; j < MyFile.NoOfRecords(); j++ ){
- if (j % 1000 == 0)
- {
- std::cout << ".";
- std::cout.flush();
- }
- MyFile.GetRecord(j);
- memset( charbuf, 0x00, 10 );
- sprintf( charbuf, "Z%d", (int)j-1 );
- MyFile.PutField( f1, charbuf );
- MyFile.PutField( f2, charbuf );
- MyFile.PutLongField( f3, j-1 );
- MyFile.PutRecord();
- }
- std::cout << " Done." << std::endl;
- // Check all indices
- sts += CheckIndex(
-#ifdef XB_INDEX_NDX
- &indx1, &indx2, &indx3
-#endif
-#if defined( XB_INDEX_NDX ) && defined( XB_INDEX_NTX )
- ,
-#endif
-#ifdef XB_INDEX_NTX
- &intx1, &intx2, &intx3
-#endif
- );
-
-
- std::cout << "Index testing completed" << std::endl;std::cout.flush();
- MyFile.CloseDatabase(); /* Close database and associated indexes */
- return sts;
-}
-
-
-int CheckIndex(
-#ifdef XB_INDEX_NDX
- xbNdx *indx1,
- xbNdx *indx2,
- xbNdx *indx3
-#endif
-#if defined( XB_INDEX_NDX ) && defined( XB_INDEX_NTX )
- ,
-#endif
-#ifdef XB_INDEX_NTX
- xbNtx *intx1,
- xbNtx *intx2,
- xbNtx *intx3
-#endif
- )
-{
- int rc;
- int sts = 0;
-
-#if defined( XB_INDEX_NDX ) && defined( XBASE_DEBUG )
- std::cout << "Testing NDX index 1 "; std::cout.flush();
- if(( rc = indx1->CheckIndexIntegrity(0)) != XB_NO_ERROR ){
- std::cout << "Error " << rc << " with index indx1" << std::endl;
- sts++;
- }
- else
- std::cout << "OK" << std::endl;
-
- std::cout << "Testing NDX index 2 ";std::cout.flush();
- if(( rc = indx2->CheckIndexIntegrity(0)) != XB_NO_ERROR ){
- std::cout << "Error " << rc << " with index indx2" << std::endl;
- sts++;
- }
- else
- std::cout << "OK" << std::endl;
-
-
- std::cout << "Testing NDX index 3 ";std::cout.flush();
- if(( rc = indx3->CheckIndexIntegrity(0)) != XB_NO_ERROR ){
- std::cout << "Error " << rc << " with index indx3" << std::endl;
- sts++;
- }
- else
- std::cout << "OK" << std::endl;
-#endif
-#if defined( XB_INDEX_NTX ) && defined( XBASE_DEBUG )
- std::cout << "Testing NTX index 1 ";std::cout.flush();
- if(( rc = intx1->CheckIndexIntegrity(0)) != XB_NO_ERROR ){
- std::cout << "Error " << rc << " with index intx1" << std::endl;
- sts++;
- }
- else
- std::cout << "OK" << std::endl;
-
- std::cout << "Testing NTX index 2 ";std::cout.flush();
- if(( rc = intx2->CheckIndexIntegrity(0)) != XB_NO_ERROR ){
- std::cout << "Error " << rc << " with index intx2" << std::endl;
- sts++;
- }
- else
- std::cout << "OK" << std::endl;
-
- std::cout << "Testing NTX index 3 ";std::cout.flush();
- if(( rc = intx3->CheckIndexIntegrity(0)) != XB_NO_ERROR ){
- std::cout << "Error " << rc << " with index intx3" << std::endl;
- sts++;
- }
- else
- std::cout << "OK" << std::endl;
-#endif
- return sts;
-
-}
-
diff --git a/libtest/lfiletst.cpp b/libtest/lfiletst.cpp
deleted file mode 100755
index 7e50c8f..0000000
--- a/libtest/lfiletst.cpp
+++ /dev/null
@@ -1,138 +0,0 @@
-/* lfiletst.cpp
-
- Xbase project source code
-
- This program creates a sample database and multiple indices.
- It tests the 64 bit file support logic.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-#include "xbase64/xbase64.h"
-
-int main()
-{
- xbShort f1, f2, f3, f4, rc;
-#ifdef XB_MEMO_FIELDS
- xbShort f5;
-#endif
- char charbuf[10];
-
- xbSchema MyRecord[] =
- {
- { "CHARFLD1", XB_CHAR_FLD, 10, 0 },
- { "NUMFLD1", XB_NUMERIC_FLD, 10, 0 },
- { "BIGFIELD1", XB_CHAR_FLD, 255, 0 },
- { "BIGFIELD2", XB_CHAR_FLD, 255, 0 },
- { "BIGFIELD3", XB_CHAR_FLD, 255, 0 },
- { "BIGFIELD4", XB_CHAR_FLD, 255, 0 },
-#ifdef XB_MEMO_FIELDS
- { "MEMOFLD", XB_MEMO_FLD, 10, 0 },
-#endif
- { "",0,0,0 }
- };
-
- /* define the classes */
- xbXBase x; /* initialize xbase */
- xbDbf MyFile( &x ); /* class for table */
-
-#ifdef XB_INDEX_NDX
- xbNdx indx1( &MyFile ); /* class for ndx index 1 */
-#endif
-
-#ifdef XB_INDEX_NTX
- xbNtx intx1( &MyFile ); /* class for ntx index 1 */
-#endif
-
-#ifndef XBASE_64_BIT
- std::cout << "XBASE_64_BIT support option not compiled into library";
- return 1;
-#endif
-
- std::cout << "Creating test database and indices" << std::endl;
- if(( rc = MyFile.CreateDatabase( "LFTEST.DBF", MyRecord, XB_OVERLAY ))
- != XB_NO_ERROR )
- std::cout << "Error creating database = " << rc << "\n";
- else
- {
-#ifdef XB_INDEX_NDX
- if(( rc = indx1.CreateIndex(
- "LFNDX1.NDX", "CHARFLD1", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR ){
- std::cout << "Error creating index 1 = " << rc << std::endl;
- exit( 1 );
- }
-#endif
-
-#ifdef XB_INDEX_NTX
- if(( rc = intx1.CreateIndex(
- "LFNTX1.NTX", "CHARFLD1", XB_NOT_UNIQUE, XB_OVERLAY )) != XB_NO_ERROR ){
- std::cout << "Error creating index 2 = " << rc << std::endl;
- exit( 1 );
- }
-#endif
- }
-
- f1 = MyFile.GetFieldNo( "CHARFLD1" );
- f2 = MyFile.GetFieldNo( "NUMFLD1" );
- f3 = MyFile.GetFieldNo( "BIGFIELD1" );
- f4 = MyFile.GetFieldNo( "BIGFIELD2" );
-#ifdef XB_MEMO_FIELDS
- f5 = MyFile.GetFieldNo( "MEMOFLD" );
-#endif
-
- std::cout << "sizeof( XbOffT ) = " << sizeof( xbOffT ) << std::endl;
- std::cout << "sizeof( xbLong ) = " << sizeof( xbLong ) << std::endl;
- std::cout << "Populating database and indices with data" << std::endl;
- std::cout << "This will take a while and consume some 20G of disk space" << std::endl;
- std::cout << "<ctrl><C> to kill this program" << std::endl;
- std::cout << ".";
- std::cout.flush();
- for( long i = 0; i < 20000000; i++ ){
- if( i % 5000 == 0){
- std::cout << ".";
- std::cout.flush();
- }
- memset( charbuf, 0x00, 10 );
- sprintf( charbuf, "%d", i );
- MyFile.BlankRecord();
- MyFile.PutField( f1, charbuf );
- MyFile.PutLongField( f2, i );
- MyFile.PutField( f3, charbuf );
- MyFile.PutField( f4, charbuf );
-#ifdef XB_MEMO_FIELDS
- MyFile.UpdateMemoData( f5, strlen( charbuf ), charbuf, 0 );
-#endif
- MyFile.AppendRecord();
- }
- std::cout << " Done." << std::endl;
-}
diff --git a/libtest/locktest.cpp b/libtest/locktest.cpp
deleted file mode 100755
index 01f75de..0000000
--- a/libtest/locktest.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- This debugging program tests Xbase locking functions
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-
-*/
-
-#include "xbase64/xbase64.h"
-
-int main(int, char**)
-{
-#if 0 // FIXME - seriously
-#ifdef XB_LOCKING_ON
- xbShort rc;
-
- if(2!=ac){
- cout << "\nUsage: locktest filename\n";
- return 1;
- }
-
- if(( rc = d.OpenDatabase( av[1] )) != XB_NO_ERROR ) {
- cout << "\nError " << rc << " opening file " << av[1] << endl;
- exit(0);
- }
- xbXBase x;
- xbDbf d( &x );
-
- cout << "\nGoing to lock database..." << endl;
- rc = d.LockDatabase( F_SETLKW, F_WRLCK, 1L );
- if ( rc == -1 ){
- perror("Lock Error");
- return 2;
- }
- cout << "Database locked\n\nEnter a keystroke to release lock\n";
- char xx[4];
- cin >> xx;
-
- rc = d.LockDatabase( F_SETLK, F_UNLCK, 1L );
- cout << "Unlock database rc = " << rc << "\n";
- d.CloseDatabase();
-#else
- cout << "\nXB_LOCKING_ON is not compiled in\n";
-#endif
-#endif
- return 0;
-}
diff --git a/libtest/makebcc.bat b/libtest/makebcc.bat
deleted file mode 100755
index bc38b05..0000000
--- a/libtest/makebcc.bat
+++ /dev/null
@@ -1,16 +0,0 @@
-
-rem This batch file builds the xbase sample programs
-rem using the borland 5.5 compiler
-
-del *.bak
-del *.tds
-del *.exe
-del *.obj
-del compout
-
-
-bcc32 -Id:\xbase64 -Id:\borland\bcc55\include -L\borland\bcc55\lib -L..\xbase64 indextst.cpp xbase64.lib >> compout
-bcc32 -Id:\xbase64 -Id:\borland\bcc55\include -L\borland\bcc55\lib -L..\xbase64 exptest.cpp xbase64.lib >> compout
-bcc32 -Id:\xbase64 -Id:\borland\bcc55\include -L\borland\bcc55\lib -L..\xbase64 locktest.cpp xbase64.lib >> compout
-bcc32 -Id:\xbase64 -Id:\borland\bcc55\include -L\borland\bcc55\lib -L..\xbase64 testdate.cpp xbase64.lib >> compout
-
diff --git a/libtest/readme b/libtest/readme
deleted file mode 100755
index 64f6b52..0000000
--- a/libtest/readme
+++ /dev/null
@@ -1,10 +0,0 @@
-The libtest directory includes programs which are designed for
-testing the basic functionality of the library. These programs
-are intended to be used to find bugs in the basic library functions
-after enhancements/updates or fixes have been applied to the library.
-
-testdate - used for testing date logic
-indextst - used for testing indices
-exptest - used for testing the expression logic
-locktest - used for the debugging of the record and file locking logic
-lfiletst - used for testing 64 bit file support \ No newline at end of file
diff --git a/libtest/testdate.cpp b/libtest/testdate.cpp
deleted file mode 100755
index 1049049..0000000
--- a/libtest/testdate.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- Xbase project source code
-
- This program tests the xdate routines
-
- This program tests and demonstrates usage of the various xbDate methods
-
- Several of the tests pass either StringDate or Chardate to the method
- being tested - this is done to test the class methods. In actual usage,
- this may not be necessary due to the instance of the class already
- containing a date value.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xbase64-devel@lists.sourceforge.net
- xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#include "xbase64/xbase64.h"
-
-int main()
-{
- xbString StringDate( "19701007" ); /* oct 7 1960 */
- char CharDate[9] = "19611109"; /* nov 9 1961 */
-
- xbDate d1; /* today is default */
- xbDate d2( StringDate ); /* from string data */
- xbDate d3( CharDate ); /* from char data */
- xbDate d4; /* another date class */
-
- std::cout << "This program tests the XDATE routines" << std::endl;
- std::cout << "Date 1 (Sysdate) is " << d1.GetDate() << std::endl;
- std::cout << "Date 2 (StringDate) is " << d2.GetDate() << std::endl;
- std::cout << "Date 3 (CharDate) is " << d3.GetDate() << std::endl;
-
- std::cout << "This year is " << d1.YearOf() << std::endl;
- std::cout << "Year of xbString Date is " << d2.YearOf( StringDate )
- << std::endl;
- std::cout << "Year of char Date is " << d3.YearOf( CharDate )
- << std::endl;
-
- std::cout << "This Month is " << d1.MonthOf() << std::endl;
- std::cout << "Month of xbString Date is " << d2.MonthOf( StringDate )
- << std::endl;
- std::cout << "Month of char Date is " << d3.MonthOf( CharDate )
- << std::endl;
-
- std::cout << "Today is day " << d1.DayOf( XB_FMT_WEEK ) << " of the week"
- << std::endl;
- std::cout << "StringDate is day " << d2.DayOf( XB_FMT_MONTH, StringDate )
- << " of the month" << std::endl;
- std::cout << "CharDate is day " << d3.DayOf( XB_FMT_YEAR, CharDate )
- << " of the year" << std::endl;
-
- if( d1.IsLeapYear())
- std::cout << "This is a leapyear" << std::endl;
- else
- std::cout << "This is not a leap year." << std::endl;
-
- if( d2.IsLeapYear( StringDate ))
- std::cout << "StringDate is a leapyear" << std::endl;
- else
- std::cout << "StringDate is not a leap year." << std::endl;
-
- if( d3.IsLeapYear( CharDate ))
- std::cout << "CharDate is a leapyear" << std::endl;
- else
- std::cout << "CharDate is not a leap year." << std::endl;
-
- std::cout << "Today is " << d1.Sysdate() << std::endl;
-
- if( d1.DateIsValid( "19951301" ))
- std::cout << "19951301 is a valid date" << std::endl;
- else
- std::cout << "19951301 is not a valid date" << std::endl;
-
- if( d1.DateIsValid( "19920229" ))
- std::cout << "19920229 is a valid date" << std::endl;
- else
- std::cout << "19920229 is not a valid date" << std::endl;
-
- if( d2.DateIsValid( StringDate ))
- std::cout << StringDate << " is a valid date" << std::endl;
- else
- std::cout << StringDate << " is not a valid date" << std::endl;
-
- std::cout << "Today's Julian date " << d1.JulianDays() << std::endl;
- std::cout << "Julian date of Jan 01, 1970 " << d2.JulianDays( "19700101" )
- << std::endl;
- std::cout << "StringDate Julian date " << d2.JulianDays( StringDate )
- << std::endl;
-
- std::cout << "There are "
- << ( d1.JulianDays( "19951101" ) - d1.JulianDays( "19951001" ))
- << " days between 10/1/95 and 11/1/95." << std::endl;
-
- std::cout << "Todays Julian date (Number of days since Jan 1 0100):"
- << d1.JulianDays() << std::endl;
-
- d4 = d1; // set d4 class = to sysdate
- std::cout << "Object d4 initialized to " << d4.GetDate() << std::endl;
- std::cout << "This should be todays date: "
- << d4.JulToDate8(d4.JulianDays()) << std::endl;
- std::cout << "In 7 days it will be "
- << d4.JulToDate8(d4.JulianDays() + 7L ) << std::endl;
-
- std::cout << "Today is " << d1.CharDayOf() << std::endl;
- std::cout << "StringDate day is " << d2.CharDayOf( StringDate )
- << std::endl;
- std::cout << "This month is " << d1.CharMonthOf() << std::endl;
- std::cout << "StringDate month is " << d2.CharMonthOf() << std::endl;
-
-
- /* various format routines using different formats, strings and chars */
- xbString xbStFmt( "MM/DD/YY" );
- std::cout << "Format (YYDDD) " << d1.FormatDate( "YYDDD" ) << std::endl;
- std::cout << "Format (MM/DD/YY) " << d1.FormatDate( xbStFmt ) << std::endl;
- xbStFmt = "DD/MM/YY";
- std::cout << "Format (DD/MM/YY) " << d1.FormatDate(xbStFmt, "19730110")
- << std::endl;
- std::cout << "Format (MMMM DD,YYYY) "
- << d1.FormatDate( "MMMM DD,YYYY", d1.GetDate()) << std::endl;
- xbStFmt = "DDDD, MMMM DD YYYY";
- std::cout << "Format (DDDD, MMMM DD YYYY) "
- << d2.FormatDate( xbStFmt, d2.GetDate()) << std::endl;
-
- std::cout << "Last day this month " << d1.LastDayOfMonth() << std::endl;
- std::cout << "Last day of month for StringDate is "
- << d2.LastDayOfMonth( d2.GetDate()) << std::endl;
-
- std::cout << "Overloaded operators test..." << std::endl;
-
- if( d1 == d2 )
- std::cout << d1.GetDate() << " is equal to " << d2.GetDate()
- << std::endl;
- else
- std::cout << d1.GetDate() << " is not equal to " << d2.GetDate()
- << std::endl;
-
- if( d1 != d3 )
- std::cout << d1.GetDate() << " is not equal to " << d3.GetDate()
- << std::endl;
- else
- std::cout << d1.GetDate() << " is equal to " << d3.GetDate()
- << std::endl;
-
- if( d1 < d2 )
- std::cout << d1.GetDate() << " is less than " << d2.GetDate()
- << std::endl;
- else
- std::cout << d1.GetDate() << " is not less than " << d2.GetDate()
- << std::endl;
-
- if( d1 > d2 )
- std::cout << d1.GetDate() << " is greater than " << d2.GetDate()
- << std::endl;
- else
- std::cout << d1.GetDate() << " is not greater than " << d2.GetDate()
- << std::endl;
-
- if( d1 <= d2 )
- std::cout << d1.GetDate() << " is less than or equal to " << d2.GetDate()
- << std::endl;
- else
- std::cout << d1.GetDate() << " is not less than or equal to "
- << d2.GetDate() << std::endl;
-
- if( d1 >= d2 )
- std::cout << d1.GetDate() << " is greater than or equal to "
- << d2.GetDate() << std::endl;
- else
- std::cout << d1.GetDate() << " is not greater than or equal to "
- << d2.GetDate() << std::endl;
-
- d1.Sysdate();
- d1++;
- std::cout << "Tomorrow is " << d1.GetDate() << std::endl;
- d1-=2;
- std::cout << "Yesterday was " << d1.GetDate() << std::endl;
- std::cout << "There are " << d1 - d2 << " days between " << d1.GetDate()
- << " and " << d2.GetDate() << std::endl;
-
- return 0;
-}
-
diff --git a/logs/Linux_x64.xbLog.txt b/logs/Linux_x64.xbLog.txt
new file mode 100644
index 0000000..3fb222f
--- /dev/null
+++ b/logs/Linux_x64.xbLog.txt
@@ -0,0 +1,254 @@
+2022-11-28 09:05:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_string] initializing...
+2022-11-28 09:05:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_string] terminating with [0] errors...
+2022-11-28 09:05:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_date] initializing...
+2022-11-28 09:05:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_date] terminating with [0] errors...
+2022-11-28 09:05:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_tblmgr] initializing...
+2022-11-28 09:05:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_tblmgr] terminating with [0] errors...
+2022-11-28 09:05:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_xbase] initializing...
+2022-11-28 09:05:24 - test
+2022-11-28 09:05:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_xbase] terminating with [0] errors...
+2022-11-28 09:05:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_file] initializing...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_file] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_log] initializing...
+2022-11-28 09:05:25 - Switching to logfile [Logfile2.txt]
+2022-11-28 09:05:25 - Test log message........
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_log] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_linklist] initializing...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_linklist] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v3_nomemos] initializing...
+2022-11-28 09:05:25 - Second create attempt
+2022-11-28 09:05:25 - xbdbf3::CreateTable() Exception Caught Error Stop = 10 rc = -200
+2022-11-28 09:05:25 - File Already Exists
+2022-11-28 09:05:25 - Table Name = [/mnt/1Tdata/xbase/xbase64-4.0.2/data/TestV3.DBF]
+2022-11-28 09:05:25 - Alias Name = [TestV3]
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v3_nomemos] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v3_memos] initializing...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v3_memos] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v4_nomemos] initializing...
+2022-11-28 09:05:25 - Second create attempt
+2022-11-28 09:05:25 - xbdbf4::CreateTable() Exception Caught Error Stop = 10 rc = -200
+2022-11-28 09:05:25 - File Already Exists
+2022-11-28 09:05:25 - Table Name = [/mnt/1Tdata/xbase/xbase64-4.0.2/data/TestV4.DBF]
+2022-11-28 09:05:25 - Alias Name = [TestV4]
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v4_nomemos] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v4_memos] initializing...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v4_memos] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_funcs] initializing...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_funcs] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_ndx] initializing...
+2022-11-28 09:05:25 - Checking index type [C]
+2022-11-28 09:05:25 - CheckTagIntegrity() Index entry count [589] matches dbf record count [589]
+2022-11-28 09:05:25 - Checking index type [D]
+2022-11-28 09:05:25 - CheckTagIntegrity() Index entry count [589] matches dbf record count [589]
+2022-11-28 09:05:25 - Checking index type [F]
+2022-11-28 09:05:25 - CheckTagIntegrity() Index entry count [589] matches dbf record count [589]
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_ndx] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_ndx2] initializing...
+2022-11-28 09:05:25 - Checking index type [C]
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_ndx2] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_mdx] initializing...
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [CITY_TAGA]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Filtered index entry count [0] does not match dbf record count [490] for tag [CITY_TAGF]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Exception Caught. Error Stop = [190] iRc = [-601] Tag = [CITY_TAGF]
+2022-11-28 09:05:25 - Index File Error
+2022-11-28 09:05:25 - xbdbf::CheckTagIntegrity() Exception Caught. Error Stop = [100] iRc = [-601]
+2022-11-28 09:05:25 - Index File Error
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Filtered index entry count [490] matches dbf record count [490] for tag [CITY_TAGF]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Filtered index entry count [490] matches dbf record count [490] for tag [CITY_TAGF]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Filtered index entry count [0] matches dbf record count [0] for tag [CITY_TAGF]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-28 09:05:25 - xbIxMdx::CheckTagIntegrity() Filtered index entry count [490] matches dbf record count [490] for tag [CITY_TAGF]
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_mdx] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_bcd] initializing...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_bcd] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_expnode] initializing...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_expnode] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_expression] initializing...
+2022-11-28 09:05:25 - xbexp::GetTokenParen() Exception Caught. Error Stop = [10] iRc = [-500]
+2022-11-28 09:05:25 - xbexp::GetNextToken() Exception Caught. Error Stop = [20] iRc = [-500] Expression = [{{NESTED}TOKEN + 55-100]
+2022-11-28 09:05:25 - xbexp::GetTokenCharConstant() Exception Caught. Error Stop = [10] iRc = [-500]
+2022-11-28 09:05:25 - xbexp::GetNextToken() Exception Caught. Error Stop = [30] iRc = [-500] Expression = ['SOMETOKEN4 ]
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_expression] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_uda] initializing...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_uda] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_sql] initializing...
+2022-11-28 09:05:25 - INSERT INTO TestSQL (CITY, STATE, ZIPCODE, NOTES, LASTUPDATE, ACTIVE ) VALUES ( 'San Diego', 'CA', 92007, 'San Diego is a cool place', '1989-02-09', 'Y')
+2022-11-28 09:05:25 - xbSql::SqlInsert() Exception Caught. Error Stop = [500] rc = [0] table = [TestSQL] field = [ACTIVE] data = [San Diego is a cool place]
+2022-11-28 09:05:25 - No Error
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_sql] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_filter] initializing...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_filter] terminating with [0] errors...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] initializing...
+2022-11-28 09:05:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing START command
+2022-11-28 09:05:26 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[START] RC=[0]
+2022-11-28 09:05:26 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [START] Result [OK] RC = [0]
+2022-11-28 09:05:26 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-28 09:05:26 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing TL command
+2022-11-28 09:05:26 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[TL] RC=[0]
+2022-11-28 09:05:26 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [TL] Result [OK] RC = [0]
+2022-11-28 09:05:26 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-28 09:05:27 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing TU command
+2022-11-28 09:05:27 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[TU] RC=[0]
+2022-11-28 09:05:27 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [TU] Result [OK] RC = [0]
+2022-11-28 09:05:27 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-28 09:05:27 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing RL command
+2022-11-28 09:05:28 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[RL] RC=[0]
+2022-11-28 09:05:28 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [RL] Result [OK] RC = [0]
+2022-11-28 09:05:28 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-28 09:05:28 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing RU command
+2022-11-28 09:05:28 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[RU] RC=[0]
+2022-11-28 09:05:28 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [RU] Result [OK] RC = [0]
+2022-11-28 09:05:28 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-28 09:05:28 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing ML command
+2022-11-28 09:05:29 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[ML] RC=[0]
+2022-11-28 09:05:29 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [ML] Result [OK] RC = [0]
+2022-11-28 09:05:29 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-28 09:05:29 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing MU command
+2022-11-28 09:05:30 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[MU] RC=[0]
+2022-11-28 09:05:30 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [MU] Result [OK] RC = [0]
+2022-11-28 09:05:30 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-28 09:05:30 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[EXIT] RC=[0]
+2022-11-28 09:05:30 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task terminating
+2022-11-28 09:05:30 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task terminating
+2022-11-28 09:05:30 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] terminating with [0] errors...
+2022-11-28 09:05:31 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] terminating with [0] errors...
+2022-11-30 17:12:18 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_string] initializing...
+2022-11-30 17:12:18 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_string] terminating with [0] errors...
+2022-11-30 17:12:18 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_date] initializing...
+2022-11-30 17:12:18 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_date] terminating with [0] errors...
+2022-11-30 17:12:18 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_tblmgr] initializing...
+2022-11-30 17:12:18 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_tblmgr] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_xbase] initializing...
+2022-11-30 17:12:19 - test
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_xbase] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_file] initializing...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_file] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_log] initializing...
+2022-11-30 17:12:19 - Switching to logfile [Logfile2.txt]
+2022-11-30 17:12:19 - Test log message........
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_log] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_linklist] initializing...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_linklist] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v3_nomemos] initializing...
+2022-11-30 17:12:19 - Second create attempt
+2022-11-30 17:12:19 - xbdbf3::CreateTable() Exception Caught Error Stop = 10 rc = -200
+2022-11-30 17:12:19 - File Already Exists
+2022-11-30 17:12:19 - Table Name = [/mnt/1Tdata/xbase/xbase64-4.0.2/data/TestV3.DBF]
+2022-11-30 17:12:19 - Alias Name = [TestV3]
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v3_nomemos] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v3_memos] initializing...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v3_memos] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v4_nomemos] initializing...
+2022-11-30 17:12:19 - Second create attempt
+2022-11-30 17:12:19 - xbdbf4::CreateTable() Exception Caught Error Stop = 10 rc = -200
+2022-11-30 17:12:19 - File Already Exists
+2022-11-30 17:12:19 - Table Name = [/mnt/1Tdata/xbase/xbase64-4.0.2/data/TestV4.DBF]
+2022-11-30 17:12:19 - Alias Name = [TestV4]
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v4_nomemos] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v4_memos] initializing...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_dbf_v4_memos] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_funcs] initializing...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_funcs] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_ndx] initializing...
+2022-11-30 17:12:19 - Checking index type [C]
+2022-11-30 17:12:19 - CheckTagIntegrity() Index entry count [589] matches dbf record count [589]
+2022-11-30 17:12:19 - Checking index type [D]
+2022-11-30 17:12:19 - CheckTagIntegrity() Index entry count [589] matches dbf record count [589]
+2022-11-30 17:12:19 - Checking index type [F]
+2022-11-30 17:12:19 - CheckTagIntegrity() Index entry count [589] matches dbf record count [589]
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_ndx] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_ndx2] initializing...
+2022-11-30 17:12:19 - Checking index type [C]
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_ndx2] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_mdx] initializing...
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [CITY_TAGA]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Filtered index entry count [0] does not match dbf record count [490] for tag [CITY_TAGF]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Exception Caught. Error Stop = [190] iRc = [-601] Tag = [CITY_TAGF]
+2022-11-30 17:12:19 - Index File Error
+2022-11-30 17:12:19 - xbdbf::CheckTagIntegrity() Exception Caught. Error Stop = [100] iRc = [-601]
+2022-11-30 17:12:19 - Index File Error
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Filtered index entry count [490] matches dbf record count [490] for tag [CITY_TAGF]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Filtered index entry count [490] matches dbf record count [490] for tag [CITY_TAGF]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Filtered index entry count [0] matches dbf record count [0] for tag [CITY_TAGF]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [ZIP_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Index entry count [490] matches dbf record count [490] for tag [DATE_TAG]
+2022-11-30 17:12:19 - xbIxMdx::CheckTagIntegrity() Filtered index entry count [490] matches dbf record count [490] for tag [CITY_TAGF]
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_mdx] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_bcd] initializing...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_bcd] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_expnode] initializing...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_expnode] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_expression] initializing...
+2022-11-30 17:12:19 - xbexp::GetTokenParen() Exception Caught. Error Stop = [10] iRc = [-500]
+2022-11-30 17:12:19 - xbexp::GetNextToken() Exception Caught. Error Stop = [20] iRc = [-500] Expression = [{{NESTED}TOKEN + 55-100]
+2022-11-30 17:12:19 - xbexp::GetTokenCharConstant() Exception Caught. Error Stop = [10] iRc = [-500]
+2022-11-30 17:12:19 - xbexp::GetNextToken() Exception Caught. Error Stop = [30] iRc = [-500] Expression = ['SOMETOKEN4 ]
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_expression] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_uda] initializing...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_uda] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_sql] initializing...
+2022-11-30 17:12:19 - INSERT INTO TestSQL (CITY, STATE, ZIPCODE, NOTES, LASTUPDATE, ACTIVE ) VALUES ( 'San Diego', 'CA', 92007, 'San Diego is a cool place', '1989-02-09', 'Y')
+2022-11-30 17:12:19 - xbSql::SqlInsert() Exception Caught. Error Stop = [500] rc = [0] table = [TestSQL] field = [ACTIVE] data = [San Diego is a cool place]
+2022-11-30 17:12:19 - No Error
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_sql] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_filter] initializing...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_filter] terminating with [0] errors...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] initializing...
+2022-11-30 17:12:19 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing START command
+2022-11-30 17:12:20 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[START] RC=[0]
+2022-11-30 17:12:20 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [START] Result [OK] RC = [0]
+2022-11-30 17:12:20 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-30 17:12:20 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing TL command
+2022-11-30 17:12:20 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[TL] RC=[0]
+2022-11-30 17:12:20 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [TL] Result [OK] RC = [0]
+2022-11-30 17:12:20 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-30 17:12:21 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing TU command
+2022-11-30 17:12:21 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[TU] RC=[0]
+2022-11-30 17:12:21 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [TU] Result [OK] RC = [0]
+2022-11-30 17:12:21 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-30 17:12:21 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing RL command
+2022-11-30 17:12:22 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[RL] RC=[0]
+2022-11-30 17:12:22 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [RL] Result [OK] RC = [0]
+2022-11-30 17:12:22 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-30 17:12:22 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing RU command
+2022-11-30 17:12:22 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[RU] RC=[0]
+2022-11-30 17:12:22 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [RU] Result [OK] RC = [0]
+2022-11-30 17:12:22 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-30 17:12:22 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing ML command
+2022-11-30 17:12:23 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[ML] RC=[0]
+2022-11-30 17:12:23 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [ML] Result [OK] RC = [0]
+2022-11-30 17:12:23 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-30 17:12:23 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task issuing MU command
+2022-11-30 17:12:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[MU] RC=[0]
+2022-11-30 17:12:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task [MU] Result [OK] RC = [0]
+2022-11-30 17:12:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task retrieved result [OK]
+2022-11-30 17:12:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task retrieved command=[EXIT] RC=[0]
+2022-11-30 17:12:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Parent task terminating
+2022-11-30 17:12:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] Child task terminating
+2022-11-30 17:12:24 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] terminating with [0] errors...
+2022-11-30 17:12:25 - Program [/mnt/1Tdata/xbase/xbase64-4.0.2/build/linux64/bin/x64/xb_test_lock] terminating with [0] errors...
diff --git a/ltconfig b/ltconfig
deleted file mode 100755
index 43049d1..0000000
--- a/ltconfig
+++ /dev/null
@@ -1,2105 +0,0 @@
-#! /bin/sh
-
-# ltconfig - Create a system-specific libtool.
-# Copyright (C) 1996-1998 Free Software Foundation, Inc.
-# Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# A lot of this script is taken from autoconf-2.10.
-
-# Check that we are running under the correct shell.
-SHELL=${CONFIG_SHELL-/bin/sh}
-echo=echo
-if test "X$1" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
-elif test "X$1" = X--fallback-echo; then
- # used as fallback echo
- shift
- cat <<EOF
-$*
-EOF
- exit 0
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
- # Yippee, $echo works!
- :
-else
- # Restart under the correct shell.
- exec "$SHELL" "$0" --no-reexec ${1+"$@"}
-fi
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi
-
-if test "X${echo_test_string+set}" != "Xset"; then
- # find a string as large as possible, as long as the shell can cope with it
- for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
- if (echo_test_string="`eval $cmd`") 2>/dev/null &&
- echo_test_string="`eval $cmd`" &&
- (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then
- break
- fi
- done
-fi
-
-if test "X`($echo '\t') 2>/dev/null`" != 'X\t' ||
- test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then
- # The Solaris, AIX, and Digital Unix default echo programs unquote
- # backslashes. This makes it impossible to quote backslashes using
- # echo "$something" | sed 's/\\/\\\\/g'
- #
- # So, first we look for a working echo in the user's PATH.
-
- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"
- for dir in $PATH /usr/ucb; do
- if test -f $dir/echo &&
- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
- test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
- echo="$dir/echo"
- break
- fi
- done
- IFS="$save_ifs"
-
- if test "X$echo" = Xecho; then
- # We didn't find a better echo, so look for alternatives.
- if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
- test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
- # This shell has a builtin print -r that does the trick.
- echo='print -r'
- elif test -f /bin/ksh && test "X$CONFIG_SHELL" != X/bin/ksh; then
- # If we have ksh, try running ltconfig again with it.
- ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}"
- export ORIGINAL_CONFIG_SHELL
- CONFIG_SHELL=/bin/ksh
- export CONFIG_SHELL
- exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"}
- else
- # Try using printf.
- echo='printf %s\n'
- if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
- test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
- # Cool, printf works
- :
- elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
- test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
- CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL"
- export CONFIG_SHELL
- SHELL="$CONFIG_SHELL"
- export SHELL
- echo="$CONFIG_SHELL $0 --fallback-echo"
- elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' &&
- test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then
- echo="$CONFIG_SHELL $0 --fallback-echo"
- else
- # maybe with a smaller string...
- prev=:
-
- for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
- if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then
- break
- fi
- prev="$cmd"
- done
-
- if test "$prev" != 'sed 50q "$0"'; then
- echo_test_string=`eval $prev`
- export echo_test_string
- exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"}
- else
- # Oops. We lost completely, so just stick with echo.
- echo=echo
- fi
- fi
- fi
- fi
-fi
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e s/^X//'
-sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
-
-# Same as above, but do not quote variable references.
-double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
-
-# The name of this program.
-progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'`
-
-# Constants:
-PROGRAM=ltconfig
-PACKAGE=libtool
-VERSION=1.2c
-ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.c 1>&5'
-ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.c $LIBS 1>&5'
-rm="rm -f"
-
-help="Try \`$progname --help' for more information."
-
-# Global variables:
-default_ofile=libtool
-can_build_shared=yes
-enable_shared=yes
-# All known linkers require a `.a' archive for static linking.
-enable_static=yes
-ltmain=
-silent=
-srcdir=
-ac_config_guess=
-ac_config_sub=
-host=
-nonopt=
-ofile="$default_ofile"
-verify_host=yes
-with_gcc=no
-with_gnu_ld=no
-need_locks=yes
-objext=o
-libext=a
-
-old_AR="$AR"
-old_CC="$CC"
-old_CFLAGS="$CFLAGS"
-old_CPPFLAGS="$CPPFLAGS"
-old_LD="$LD"
-old_LN_S="$LN_S"
-old_NM="$NM"
-old_RANLIB="$RANLIB"
-old_DLLTOOL="$DLLTOOL"
-old_AS="$AS"
-
-# Parse the command line options.
-args=
-prev=
-for option
-do
- case "$option" in
- -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
- *) optarg= ;;
- esac
-
- # If the previous option needs an argument, assign it.
- if test -n "$prev"; then
- eval "$prev=\$option"
- prev=
- continue
- fi
-
- case "$option" in
- --help) cat <<EOM
-Usage: $progname [OPTION]... [HOST [LTMAIN]]
-
-Generate a system-specific libtool script.
-
- --debug enable verbose shell tracing
- --disable-shared do not build shared libraries
- --disable-static do not build static libraries
- --help display this help and exit
- --no-verify do not verify that HOST is a valid host type
--o, --output=FILE specify the output file [default=$default_ofile]
- --quiet same as \`--silent'
- --silent do not print informational messages
- --srcdir=DIR find \`config.guess' in DIR
- --version output version information and exit
- --with-gcc assume that the GNU C compiler will be used
- --with-gnu-ld assume that the C compiler uses the GNU linker
- --disable-lock disable file locking
-
-LTMAIN is the \`ltmain.sh' shell script fragment or \`ltmain.c' program
-that provides basic libtool functionality.
-
-HOST is the canonical host system name [default=guessed].
-EOM
- exit 0
- ;;
-
- --debug)
- echo "$progname: enabling shell trace mode"
- set -x
- ;;
-
- --disable-shared) enable_shared=no ;;
-
- --disable-static) enable_static=no ;;
-
- --quiet | --silent) silent=yes ;;
-
- --srcdir) prev=srcdir ;;
- --srcdir=*) srcdir="$optarg" ;;
-
- --no-verify) verify_host=no ;;
-
- --output | -o) prev=ofile ;;
- --output=*) ofile="$optarg" ;;
-
- --version) echo "$PROGRAM (GNU $PACKAGE) $VERSION"; exit 0 ;;
-
- --with-gcc) with_gcc=yes ;;
- --with-gnu-ld) with_gnu_ld=yes ;;
-
- --disable-lock) need_locks=no ;;
-
- -*)
- echo "$progname: unrecognized option \`$option'" 1>&2
- echo "$help" 1>&2
- exit 1
- ;;
-
- *)
- if test -z "$ltmain"; then
- ltmain="$option"
- elif test -z "$host"; then
-# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1
-# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then
-# echo "$progname: warning \`$option' is not a valid host type" 1>&2
-# fi
- host="$option"
- else
- echo "$progname: too many arguments" 1>&2
- echo "$help" 1>&2
- exit 1
- fi ;;
- esac
-done
-
-if test -z "$ltmain"; then
- echo "$progname: you must specify a LTMAIN file" 1>&2
- echo "$help" 1>&2
- exit 1
-fi
-
-if test ! -f "$ltmain"; then
- echo "$progname: \`$ltmain' does not exist" 1>&2
- echo "$help" 1>&2
- exit 1
-fi
-
-# Quote any args containing shell metacharacters.
-ltconfig_args=
-for arg
-do
- case "$arg" in
- *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
- ltconfig_args="$ltconfig_args '$arg'" ;;
- *) ltconfig_args="$ltconfig_args $arg" ;;
- esac
-done
-
-# A relevant subset of AC_INIT.
-
-# File descriptor usage:
-# 0 standard input
-# 1 file creation
-# 2 errors and warnings
-# 3 some systems may open it to /dev/tty
-# 4 used on the Kubota Titan
-# 5 compiler messages saved in config.log
-# 6 checking for... messages and results
-if test "$silent" = yes; then
- exec 6>/dev/null
-else
- exec 6>&1
-fi
-exec 5>>./config.log
-
-# NLS nuisances.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
-if test "${LANG+set}" = set; then LANG=C; export LANG; fi
-
-if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
- # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
- if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
- ac_n= ac_c='
-' ac_t=' '
- else
- ac_n=-n ac_c= ac_t=
- fi
-else
- ac_n= ac_c='\c' ac_t=
-fi
-
-if test -z "$srcdir"; then
- # Assume the source directory is the same one as the path to LTMAIN.
- srcdir=`$echo "$ltmain" | $Xsed -e 's%/[^/]*$%%'`
- test "$srcdir" = "$ltmain" && srcdir=.
-fi
-
-trap "$rm conftest*; exit 1" 1 2 15
-if test "$verify_host" = yes; then
- # Check for config.guess and config.sub.
- ac_aux_dir=
- for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
- if test -f $ac_dir/config.guess; then
- ac_aux_dir=$ac_dir
- break
- fi
- done
- if test -z "$ac_aux_dir"; then
- echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2
- echo "$help" 1>&2
- exit 1
- fi
- ac_config_guess=$ac_aux_dir/config.guess
- ac_config_sub=$ac_aux_dir/config.sub
-
- # Make sure we can run config.sub.
- if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then :
- else
- echo "$progname: cannot run $ac_config_sub" 1>&2
- echo "$help" 1>&2
- exit 1
- fi
-
- echo $ac_n "checking host system type""... $ac_c" 1>&6
-
- host_alias=$host
- case "$host_alias" in
- "")
- if host_alias=`$SHELL $ac_config_guess`; then :
- else
- echo "$progname: cannot guess host type; you must specify one" 1>&2
- echo "$help" 1>&2
- exit 1
- fi ;;
- esac
- host=`$SHELL $ac_config_sub $host_alias`
- echo "$ac_t$host" 1>&6
-
- # Make sure the host verified.
- test -z "$host" && exit 1
-
-elif test -z "$host"; then
- echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2
- echo "$help" 1>&2
- exit 1
-else
- host_alias=$host
-fi
-
-# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
-case "$host_os" in
-linux-gnu*) ;;
-linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
-esac
-
-host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
-host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
-host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
-
-case "$host_os" in
-aix3*)
- # AIX sometimes has problems with the GCC collect2 program. For some
- # reason, if we set the COLLECT_NAMES environment variable, the problems
- # vanish in a puff of smoke.
- if test "${COLLECT_NAMES+set}" != set; then
- COLLECT_NAMES=
- export COLLECT_NAMES
- fi
- ;;
-esac
-
-# Determine commands to create old-style static archives.
-old_archive_cmds='$AR cru $oldlib$oldobjs'
-old_postinstall_cmds='chmod 644 $oldlib'
-old_postuninstall_cmds=
-
-# Set a sane default for `AR'.
-test -z "$AR" && AR=ar
-
-# If RANLIB is not set, then run the test.
-if test "${RANLIB+set}" != "set"; then
- result=no
-
- echo $ac_n "checking for ranlib... $ac_c" 1>&6
- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"
- for dir in $PATH; do
- test -z "$dir" && dir=.
- if test -f $dir/ranlib; then
- RANLIB="ranlib"
- result="ranlib"
- break
- fi
- done
- IFS="$save_ifs"
-
- echo "$ac_t$result" 1>&6
-fi
-
-if test -n "$RANLIB"; then
- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
- old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds"
-fi
-
-# Set sane defaults for `DLLTOOL' and `AS', used on cygwin32.
-test -z "$DLLTOOL" && DLLTOOL=dlltool
-test -z "$AS" && AS=as
-
-# Check to see if we are using GCC.
-if test "$with_gcc" != yes || test -z "$CC"; then
- # If CC is not set, then try to find GCC or a usable CC.
- if test -z "$CC"; then
- echo $ac_n "checking for gcc... $ac_c" 1>&6
- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"
- for dir in $PATH; do
- IFS="$save_ifs"
- test -z "$dir" && dir=.
- if test -f $dir/gcc; then
- CC="gcc"
- break
- fi
- done
- IFS="$save_ifs"
-
- if test -n "$CC"; then
- echo "$ac_t$CC" 1>&6
- else
- echo "$ac_t"no 1>&6
- fi
- fi
-
- # Not "gcc", so try "cc", rejecting "/usr/ucb/cc".
- if test -z "$CC"; then
- echo $ac_n "checking for cc... $ac_c" 1>&6
- IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"
- cc_rejected=no
- for dir in $PATH; do
- test -z "$dir" && dir=.
- if test -f $dir/cc; then
- if test "$dir/cc" = "/usr/ucb/cc"; then
- cc_rejected=yes
- continue
- fi
- CC="cc"
- break
- fi
- done
- IFS="$save_ifs"
- if test $cc_rejected = yes; then
- # We found a bogon in the path, so make sure we never use it.
- set dummy $CC
- shift
- if test $# -gt 0; then
- # We chose a different compiler from the bogus one.
- # However, it has the same name, so the bogon will be chosen
- # first if we set CC to just the name; use the full file name.
- shift
- set dummy "$dir/cc" "$@"
- shift
- CC="$@"
- fi
- fi
-
- if test -n "$CC"; then
- echo "$ac_t$CC" 1>&6
- else
- echo "$ac_t"no 1>&6
- fi
-
- if test -z "$CC"; then
- echo "$progname: error: no acceptable cc found in \$PATH" 1>&2
- exit 1
- fi
- fi
-
- # Now see if the compiler is really GCC.
- with_gcc=no
- echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6
- echo "$progname:530: checking whether we are using GNU C" >&5
-
- $rm conftest.c
- cat > conftest.c <<EOF
-#ifdef __GNUC__
- yes;
-#endif
-EOF
- if { ac_try='${CC-cc} -E conftest.c'; { (eval echo $progname:538: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
- with_gcc=yes
- fi
- $rm conftest.c
- echo "$ac_t$with_gcc" 1>&6
-fi
-
-# Allow CC to be a program name with arguments.
-set dummy $CC
-compiler="$2"
-
-echo $ac_n "checking for object suffix... $ac_c" 1>&6
-$rm conftest*
-echo 'int i = 1;' > conftest.c
-echo "$progname:552: checking for object suffix" >& 5
-if { (eval echo $progname:553: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then
- # Append any warnings to the config.log.
- cat conftest.err 1>&5
-
- for ac_file in conftest.*; do
- case $ac_file in
- *.c) ;;
- *) objext=`echo $ac_file | sed -e s/conftest.//` ;;
- esac
- done
-else
- cat conftest.err 1>&5
- echo "$progname: failed program was:" >&5
- cat conftest.c >&5
-fi
-$rm conftest*
-echo "$ac_t$objext" 1>&6
-
-echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6
-pic_flag=
-special_shlib_compile_flags=
-wl=
-link_static_flag=
-no_builtin_flag=
-
-if test "$with_gcc" = yes; then
- wl='-Wl,'
- link_static_flag='-static'
-
- case "$host_os" in
- aix3* | aix4* | irix5* | irix6* | osf3* | osf4*)
- # PIC is the default for these OSes.
- ;;
- cygwin32* | mingw32* | os2*)
- # We can build DLLs from non-PIC.
- ;;
- amigaos*)
- # FIXME: we need at least 68020 code to build shared libraries, but
- # adding the `-m68020' flag to GCC prevents building anything better,
- # like `-m68040'.
- pic_flag='-m68020 -resident32 -malways-restore-a4'
- ;;
- *)
- pic_flag='-fPIC'
- ;;
- esac
-else
- # PORTME Check for PIC flags for the system compiler.
- case "$host_os" in
- aix3* | aix4*)
- # All AIX code is PIC.
- link_static_flag='-bnso -bI:/lib/syscalls.exp'
- ;;
-
- hpux9* | hpux10* | hpux11*)
- # Is there a better link_static_flag that works with the bundled CC?
- wl='-Wl,'
- link_static_flag="${wl}-a ${wl}archive"
- pic_flag='+Z'
- ;;
-
- irix5* | irix6*)
- wl='-Wl,'
- link_static_flag='-non_shared'
- # PIC (with -KPIC) is the default.
- ;;
-
- cygwin32* | mingw32* | os2*)
- # We can build DLLs from non-PIC.
- ;;
-
- osf3* | osf4*)
- # All OSF/1 code is PIC.
- wl='-Wl,'
- link_static_flag='-non_shared'
- ;;
-
- sco3.2v5*)
- pic_flag='-Kpic'
- link_static_flag='-dn'
- special_shlib_compile_flags='-belf'
- ;;
-
- solaris*)
- pic_flag='-KPIC'
- link_static_flag='-Bstatic'
- wl='-Wl,'
- ;;
-
- sunos4*)
- pic_flag='-PIC'
- link_static_flag='-Bstatic'
- wl='-Qoption ld '
- ;;
-
- sysv4.2uw2*)
- pic_flag='-KPIC'
- link_static_flag='-Bstatic'
- wl='-Wl,'
- ;;
-
- uts4*)
- pic_flag='-pic'
- link_static_flag='-Bstatic'
- ;;
-
- *)
- can_build_shared=no
- ;;
- esac
-fi
-
-if test -n "$pic_flag"; then
- echo "$ac_t$pic_flag" 1>&6
-
- # Check to make sure the pic_flag actually works.
- echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6
- $rm conftest*
- echo "int some_variable = 0;" > conftest.c
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS $pic_flag -DPIC"
- echo "$progname:674: checking if $compiler PIC flag $pic_flag works" >&5
- if { (eval echo $progname:675: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then
- # Append any warnings to the config.log.
- cat conftest.err 1>&5
-
- # On HP-UX, both CC and GCC only warn that PIC is supported... then they
- # create non-PIC objects. So, if there were any warnings, we assume that
- # PIC is not supported.
- if test -s conftest.err; then
- echo "$ac_t"no 1>&6
- can_build_shared=no
- pic_flag=
- else
- echo "$ac_t"yes 1>&6
- pic_flag=" $pic_flag"
- fi
- else
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- can_build_shared=no
- pic_flag=
- echo "$ac_t"no 1>&6
- fi
- CFLAGS="$save_CFLAGS"
- $rm conftest*
-else
- echo "$ac_t"none 1>&6
-fi
-
-# Check to see if options -o and -c are simultaneously supported by compiler
-echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6
-$rm conftest*
-echo "int some_variable = 0;" > conftest.c
-save_CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS -c -o conftest2.o"
-echo "$progname:709: checking if $compiler supports -c -o file.o" >&5
-if { (eval echo $progname:710: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest2.o; then
-
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- echo "$ac_t"no 1>&6
- compiler_c_o=no
- else
- echo "$ac_t"yes 1>&6
- compiler_c_o=yes
- fi
-else
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- compiler_c_o=no
- echo "$ac_t"no 1>&6
-fi
-CFLAGS="$save_CFLAGS"
-$rm conftest*
-
-if test x"$compiler_c_o" = x"yes"; then
- # Check to see if we can write to a .lo
- echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6
- $rm conftest*
- echo "int some_variable = 0;" > conftest.c
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -c -o conftest.lo"
- echo "$progname:737: checking if $compiler supports -c -o file.lo" >&5
-if { (eval echo $progname:738: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then
-
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- echo "$ac_t"no 1>&6
- compiler_o_lo=no
- else
- echo "$ac_t"yes 1>&6
- compiler_o_lo=yes
- fi
- else
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- compiler_o_lo=no
- echo "$ac_t"no 1>&6
- fi
- CFLAGS="$save_CFLAGS"
- $rm conftest*
-else
- compiler_o_lo=no
-fi
-
-# Check to see if we can do hard links to lock some files if needed
-hard_links="nottested"
-if test "$compiler_c_o" = no && test "$need_locks" != no; then
- # do not overwrite the value of need_locks provided by the user
- echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6
- hard_links=yes
- $rm conftest*
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- touch conftest.a
- ln conftest.a conftest.b 2>&5 || hard_links=no
- ln conftest.a conftest.b 2>/dev/null && hard_links=no
- echo "$ac_t$hard_links" 1>&6
- $rm conftest*
- if test "$hard_links" = no; then
- echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2
- need_locks=warn
- fi
-else
- need_locks=no
-fi
-
-if test "$with_gcc" = yes; then
- # Check to see if options -fno-rtti -fno-exceptions are supported by compiler
- echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6
- $rm conftest*
- echo "int some_variable = 0;" > conftest.c
- save_CFLAGS="$CFLAGS"
- CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c"
- echo "$progname:789: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
- if { (eval echo $progname:790: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then
-
- # The compiler can only warn and ignore the option if not recognized
- # So say no if there are warnings
- if test -s conftest.err; then
- echo "$ac_t"no 1>&6
- compiler_rtti_exceptions=no
- else
- echo "$ac_t"yes 1>&6
- compiler_rtti_exceptions=yes
- fi
- else
- # Append any errors to the config.log.
- cat conftest.err 1>&5
- compiler_rtti_exceptions=no
- echo "$ac_t"no 1>&6
- fi
- CFLAGS="$save_CFLAGS"
- $rm conftest*
-
- if test "$compiler_rtti_exceptions" = "yes"; then
- no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions'
- else
- no_builtin_flag=' -fno-builtin'
- fi
-
-fi
-
-# Check for any special shared library compilation flags.
-if test -n "$special_shlib_compile_flags"; then
- echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2
- if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then :
- else
- echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2
- can_build_shared=no
- fi
-fi
-
-echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6
-$rm conftest*
-echo 'main(){return(0);}' > conftest.c
-save_LDFLAGS="$LDFLAGS"
-LDFLAGS="$LDFLAGS $link_static_flag"
-echo "$progname:833: checking if $compiler static flag $link_static_flag works" >&5
-if { (eval echo $progname:834: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
- echo "$ac_t$link_static_flag" 1>&6
-else
- echo "$ac_t"none 1>&6
- link_static_flag=
-fi
-LDFLAGS="$save_LDFLAGS"
-$rm conftest*
-
-if test -z "$LN_S"; then
- # Check to see if we can use ln -s, or we need hard links.
- echo $ac_n "checking whether ln -s works... $ac_c" 1>&6
- $rm conftestdata
- if ln -s X conftestdata 2>/dev/null; then
- $rm conftestdata
- LN_S="ln -s"
- else
- LN_S=ln
- fi
- if test "$LN_S" = "ln -s"; then
- echo "$ac_t"yes 1>&6
- else
- echo "$ac_t"no 1>&6
- fi
-fi
-
-# Make sure LD is an absolute path.
-if test -z "$LD"; then
- ac_prog=ld
- if test "$with_gcc" = yes; then
- # Check if gcc -print-prog-name=ld gives a path.
- echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6
- echo "$progname:866: checking for ld used by GCC" >&5
- ac_prog=`($CC -print-prog-name=ld) 2>&5`
- case "$ac_prog" in
- # Accept absolute paths.
- /* | [A-Za-z]:/*)
- re_direlt='/[^/][^/]*/\.\./'
- sub_uncdrive='s%^\([A-Za-z]\):/%//\1/%'
- # Canonicalize the path of ld
- while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
- done
- case "$host_os" in
- cygwin*)
- # Convert to a UNC path for cygwin
- test -z "$LD" && LD=`echo X$ac_prog | $Xsed -e "$sub_uncdrive"`
- ;;
- *)
- test -z "$LD" && LD="$ac_prog"
- ;;
- esac
- ;;
- ##
- ## FIXME: The code fails later on if we try to use an $LD with
- ## '\\' path separators.
- ##
- [A-Za-z]:[\\]*)
- re_direlt='\\[^\\][^\\]*\\\.\.\(\\\)'
- sub_uncdrive='s%^\([A-Za-z]\):\\%//\1/%'
- sub_uncdir='s%\\%/%g'
- # Canonicalize the path of ld
- while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
- ac_prog=`echo $ac_prog| sed "s%$re_direlt%\1%"`
- done
- case "$host_os" in
- cygwin*)
- # Convert to a UNC path for cygwin
- test -z "$LD" && LD=`echo X$ac_prog | $Xsed -e "$sub_uncdrive" -e "$sub_uncdir"`
- ;;
- *)
- test -z "$LD" && LD="$ac_prog"
- ;;
- esac
- ;;
- "")
- # If it fails, then pretend we are not using GCC.
- ac_prog=ld
- ;;
- *)
- # If it is relative, then search for the first ld in PATH.
- with_gnu_ld=unknown
- ;;
- esac
- elif test "$with_gnu_ld" = yes; then
- echo $ac_n "checking for GNU ld... $ac_c" 1>&6
- echo "$progname:920: checking for GNU ld" >&5
- else
- echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
- echo "$progname:923: checking for non-GNU ld" >&5
- fi
-
- if test -z "$LD"; then
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
- for ac_dir in $PATH; do
- test -z "$ac_dir" && ac_dir=.
- if test -f "$ac_dir/$ac_prog"; then
- LD="$ac_dir/$ac_prog"
- # Check to see if the program is GNU ld. I'd rather use --version,
- # but apparently some GNU ld's only accept -v.
- # Break only if it was the GNU/non-GNU ld that we prefer.
- if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
- test "$with_gnu_ld" != no && break
- else
- test "$with_gnu_ld" != yes && break
- fi
- fi
- done
- IFS="$ac_save_ifs"
- fi
-
- if test -n "$LD"; then
- echo "$ac_t$LD" 1>&6
- else
- echo "$ac_t"no 1>&6
- fi
-
- if test -z "$LD"; then
- echo "$progname: error: no acceptable ld found in \$PATH" 1>&2
- exit 1
- fi
-fi
-
-# Check to see if it really is or is not GNU ld.
-echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6
-# I'd rather use --version here, but apparently some GNU ld's only accept -v.
-if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
- with_gnu_ld=yes
-else
- with_gnu_ld=no
-fi
-echo "$ac_t$with_gnu_ld" 1>&6
-
-# See if the linker supports building shared libraries.
-echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6
-
-allow_undefined_flag=
-no_undefined_flag=
-archive_cmds=
-archive_sym_cmds=
-old_archive_from_new_cmds=
-export_dynamic_flag_spec=
-whole_archive_flag_spec=
-hardcode_libdir_flag_spec=
-hardcode_libdir_separator=
-hardcode_direct=no
-hardcode_minus_L=no
-hardcode_shlibpath_var=unsupported
-runpath_var=
-
-case "$host_os" in
-aix3* | aix4*)
- # On AIX, the GNU linker works like the native linker.
- with_gnu_ld=no
- ;;
-esac
-
-ld_shlibs=yes
-if test "$with_gnu_ld" = yes; then
-
- # See if GNU ld supports shared libraries.
- case "$host_os" in
- amigaos*)
- archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib$libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- ;;
-
- sunos4*)
- archive_cmds='$LD -assert pure-text -Bstatic -o $lib$libobjs$deplibs'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- cygwin32* | mingw32*)
- if test "$with_gcc" = yes; then
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec='-L$libdir'
- allow_undefined_flag=unsupported
- # Very, very bogus.
- echo '
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#undef WIN32_LEAN_AND_MEAN
-#include <stdio.h>
-
-BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-
-#include <cygwin/cygwin_dll.h>
-DECLARE_CYGWIN_DLL( DllMain );
-HINSTANCE __hDllInstance_base;
-
-BOOL APIENTRY
-DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-{
- __hDllInstance_base = hInst;
- return TRUE;
-}
-' > ltdll.c
- archive_cmds='$CC -c '"`pwd`"'/ltdll.c~echo EXPORTS > $lib.exp~
- $DLLTOOL --export-all --output-def $lib.exp~
- $CC -Wl,--base-file,$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 $libobs ltdll.$objext~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbol=_cygwin_dll_entry@12 --def $lib.exp --base-file $soname-base --output-exp $soname-exp~
- $CC -Wl,--base-file,$soname-base $soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $libobjs ltdll.$objext$deplibs~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbol=_cygwin_dll_entry@12 --def $lib.exp --base-file $soname-base --output-exp $soname-exp~
- $CC $soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $libobjs ltdll.$objext$deplibs~
- $rm ltdll.$objext $soname-base $soname-exp'
- archive_sym_cmds='$CC -c '"`pwd`"'/ltdll.c~echo EXPORTS > $lib.exp~
- cat "$export_symbols" > $lib.exp~
- $CC -Wl,--base-file,$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 $libobs ltdll.$objext~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbol=_cygwin_dll_entry@12 --def $lib.exp --base-file $soname-base --output-exp $soname-exp~
- $CC -Wl,--base-file,$soname-base $soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $libobjs ltdll.$objext$deplibs~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbol=_cygwin_dll_entry@12 --def $lib.exp --base-file $soname-base --output-exp $soname-exp~
- $CC $soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $libobjs ltdll.$objext$deplibs~
- $rm ltdll.$objext $soname-base $soname-exp'
- old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $lib.exp --output-lib $objdir/$libname.a~$rm $lib.exp'
- else
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- with_gnu_ld=no
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $lib$libobjs`echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- old_archive_from_new_cmds='true'
- # FIXME: Should let the user specify the lib program.
- old_archive_cmds='lib /OUT:$oldlib$oldobjs'
- fix_srcfile_path='`cygpath -w $srcfile`'
- fi
- ;;
-
- *)
- if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
- archive_cmds='$CC -shared ${wl}-soname $wl$soname -o $lib$libobjs$deplibs'
- archive_sym_cmds='$CC -shared ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib$libobjs$deplibs'
- else
- ld_shlibs=no
- fi
- ;;
- esac
-
- if test "$ld_shlibs" = yes && test "$with_gnu_ld" = yes; then
- runpath_var=LD_RUN_PATH
- hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
- export_dynamic_flag_spec='${wl}--export-dynamic'
- whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
- fi
-else
- # PORTME fill in a description of your system's linker (not GNU ld)
- case "$host_os" in
- aix3*)
- allow_undefined_flag=unsupported
- archive_cmds='$NM$libobjs | $global_symbol_pipe | sed '\''s/.* //'\' | sort | uniq' > $lib.exp~
- $LD -o $objdir/$soname$libobjs$deplibs -bE:$lib.exp -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname'
- archive_sym_cmds='cat $export_symbols > $lib.exp~
- $LD -o $objdir/$soname$libobjs$deplibs -bE:$lib.exp -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname~$rm $lib.exp'
- # Note: this linker hardcodes the directories in LIBPATH if there
- # are no directories specified by -L.
- hardcode_minus_L=yes
- if test "$with_gcc" = yes && test -z "$link_static_flag"; then
- # Neither direct hardcoding nor static linking is supported with a
- # broken collect2.
- hardcode_direct=unsupported
- fi
- ;;
-
- aix4*)
- allow_undefined_flag=unsupported
- archive_cmds='$NM$libobjs | $global_symbol_pipe | sed '\''s/.* //'\' | sort | uniq' > $lib.exp else cat $export_symbols > $lib.exp~
- $CC -o $objdir/$soname$libobjs$deplibs ${wl}-bE:$lib.exp ${wl}-bM:SRE ${wl}-bnoentry~$AR cru $lib $objdir/$soname'
- archive_sym_cmds='cat $export_symbols > $lib.exp~
- $CC -o $objdir/$soname$libobjs$deplibs ${wl}-bE:$lib.exp ${wl}-bM:SRE ${wl}-bnoentry~$AR cru $lib $objdir/$soname~$rm $lib.exp'
- hardcode_direct=yes
- hardcode_minus_L=yes
- ;;
-
- amigaos*)
- archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib$libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- ;;
-
- cygwin32* | mingw32*)
- if test "$with_gcc" = yes; then
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec='-L$libdir'
- allow_undefined_flag=unsupported
- # Very, very bogus.
- echo '
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#undef WIN32_LEAN_AND_MEAN
-#include <stdio.h>
-
-BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
-
-#include <cygwin/cygwin_dll.h>
-DECLARE_CYGWIN_DLL( DllMain );
-HINSTANCE __hDllInstance_base;
-
-BOOL APIENTRY
-DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
-{
- __hDllInstance_base = hInst;
- return TRUE;
-}
-' > ltdll.c
- archive_cmds='$CC -c '"`pwd`"'/ltdll.c~echo EXPORTS > $lib.exp~
- $DLLTOOL --export-all --output-def $lib.exp~
- $CC -Wl,--base-file,$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 $libobs ltdll.$objext~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbol=_cygwin_dll_entry@12 --def $lib.exp --base-file $soname-base --output-exp $soname-exp~
- $CC -Wl,--base-file,$soname-base $soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $libobjs ltdll.$objext$deplibs~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbol=_cygwin_dll_entry@12 --def $lib.exp --base-file $soname-base --output-exp $soname-exp~
- $CC $soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $libobjs ltdll.$objext$deplibs~
- $rm ltdll.$objext $soname-base $soname-exp'
- archive_sym_cmds='$CC -c '"`pwd`"'/ltdll.c~echo EXPORTS > $lib.exp~
- cat "$export_symbols" > $lib.exp~
- $CC -Wl,--base-file,$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 $libobs ltdll.$objext~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbol=_cygwin_dll_entry@12 --def $lib.exp --base-file $soname-base --output-exp $soname-exp~
- $CC -Wl,--base-file,$soname-base $soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $libobjs ltdll.$objext$deplibs~
- $DLLTOOL --as=$AS --dllname $soname --exclude-symbol=_cygwin_dll_entry@12 --def $lib.exp --base-file $soname-base --output-exp $soname-exp~
- $CC $soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $libobjs ltdll.$objext$deplibs~
- $rm ltdll.$objext $soname-base $soname-exp'
- old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $lib.exp --output-lib $objdir/$libname.a~$rm $lib.exp'
- else
- # When not using gcc, we currently assume that we are using
- # Microsoft Visual C++.
- # hardcode_libdir_flag_spec is actually meaningless, as there is
- # no search path for DLLs.
- hardcode_libdir_flag_spec=' '
- allow_undefined_flag=unsupported
- # Tell ltmain to make .lib files, not .a files.
- libext=lib
- # FIXME: Setting linknames here is a bad hack.
- archive_cmds='$CC -o $lib$libobjs`echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames='
- # The linker will automatically build a .lib file if we build a DLL.
- old_archive_from_new_cmds='true'
- # FIXME: Should let the user specify the lib program.
- old_archive_cmds='lib /OUT:$oldlib$oldobjs'
- fix_srcfile_path='`cygpath -w $srcfile`'
- fi
- ;;
-
- # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
- # support. Future versions do this automatically, but an explicit c++rt0.o
- # does not break anything, and helps significantly (at the cost of a little
- # extra space).
- freebsd2.2*)
- archive_cmds='$LD -Bshareable -o $lib$libobjs$deplibs /usr/lib/c++rt0.o'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- # Unfortunately, older versions of FreeBSD 2 do not have this feature.
- freebsd2*)
- archive_cmds='$LD -Bshareable -o $lib$libobjs$deplibs'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- # FreeBSD 3, at last, uses gcc -shared to do shared libraries.
- freebsd3*)
- archive_cmds='$CC -shared -o $lib$libobjs$deplibs'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_minus_L=no
- hardcode_shlibpath_var=no
- ;;
-
- hpux9*)
- archive_cmds='$rm $objdir/$soname~$LD -b +s +b $install_libdir -o $objdir/$soname$libobjs$deplibs~test $objdir/$soname = $lib || mv $objdir/$soname $lib'
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- export_dynamic_flag_spec='${wl}-E'
- ;;
-
- hpux10* | hpux11*)
- archive_cmds='$LD -b +h $soname +s +b $install_libdir -o $lib$libobjs$deplibs'
- hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- export_dynamic_flag_spec='${wl}-E'
- ;;
-
- irix5* | irix6*)
- if test "$with_gcc" = yes && test "$with_gnu_ld" = yes; then
- archive_cmds='$CC -shared -o $lib ${wl}-soname ${wl}$soname ${wl}-set_version ${wl}$verstring$libobjs$deplibs'
- else
- archive_cmds='$LD -shared -o $lib -soname $soname -set_version $verstring$libobjs$deplibs'
- fi
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- ;;
-
- netbsd*)
- # Tested with NetBSD 1.2 ld
- archive_cmds='$LD -Bshareable -o $lib$libobjs$deplibs'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- openbsd*)
- archive_cmds='$LD -Bshareable -o $lib$libobjs$deplibs'
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_direct=yes
- hardcode_shlibpath_var=no
- ;;
-
- os2*)
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_minus_L=yes
- allow_undefined_flag=unsupported
- archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp$libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib$libobjs$deplibs $objdir/$libname.def'
- old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def'
- ;;
-
- osf3* | osf4*)
- if test "$with_gcc" = yes && test "$with_gnu_ld" = yes; then
- allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
- archive_cmds='$CC -shared${allow_undefined_flag} -o $lib ${wl}-soname ${wl}$soname ${wl}-set_version ${wl}$verstring$libobjs$deplibs'
- else
- allow_undefined_flag=' -expect_unresolved \*'
- archive_cmds='$LD -shared${allow_undefined_flag} -o $lib -soname $soname -set_version $verstring$libobjs$deplibs'
- fi
- hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
- hardcode_libdir_separator=:
- ;;
-
- sco3.2v5*)
- archive_cmds='$LD -G -o $lib$libobjs$deplibs'
- hardcode_direct=yes
- ;;
-
- solaris*)
- no_undefined_flag=' -z text'
- if test "$with_gcc" = yes && test "$with_gnu_ld" = yes; then
- archive_cmds='$CC -shared ${wl}-h $wl$soname -o $lib$libobjs$deplibs'
- else
- archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib$libobjs$deplibs'
- archive_sym_cmds='$echo "{ global:" > $lib.exp~sed $export_symbols -e "s/.*/\1;/" >> $lib.exp~$echo "local: * }" > $lib.exp~
- $LD -G${allow_undefined_flag} -M $export_symbols -h $soname -o $lib$libobjs$deplibs~$rm $lib.exp'
- fi
- hardcode_libdir_flag_spec='-R$libdir'
- hardcode_shlibpath_var=no
-
- # Solaris 2 before 2.5 hardcodes -L paths.
- case "$host_os" in
- solaris2.[0-4]*)
- hardcode_minus_L=yes
- ;;
- esac
- ;;
-
- sunos4*)
- # Why do we need -Bstatic? To avoid inter-library dependencies, maybe...
- if test "$with_gcc" = yes && test "$with_gnu_ld" = yes; then
- archive_cmds='$CC -shared ${wl}-Bstatic -o $lib$libobjs$deplibs'
- else
- archive_cmds='$LD -assert pure-text -Bstatic -o $lib$libobjs$deplibs'
- fi
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_direct=yes
- hardcode_minus_L=yes
- hardcode_shlibpath_var=no
- ;;
-
- uts4*)
- archive_cmds='$LD -G -h $soname -o $lib$libobjs$deplibs'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_direct=no
- hardcode_minus_L=no
- hardcode_shlibpath_var=no
- ;;
-
- dgux*)
- archive_cmds='$LD -G -h $soname -o $lib$libobjs$deplibs'
- hardcode_libdir_flag_spec='-L$libdir'
- hardcode_direct=no
- hardcode_minus_L=no
- hardcode_shlibpath_var=no
- ;;
-
- *)
- ld_shlibs=no
- can_build_shared=no
- ;;
- esac
-fi
-echo "$ac_t$ld_shlibs" 1>&6
-
-if test -z "$NM"; then
- echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6
- case "$NM" in
- /* | [A-Za-z]:[/\\]*) ;; # Let the user override the test with a path.
- *)
- IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
- for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
- test -z "$ac_dir" && ac_dir=.
- if test -f $ac_dir/nm; then
- # Check to see if the nm accepts a BSD-compat flag.
- # Adding the `sed 1q' prevents false positives on HP-UX, which says:
- # nm: unknown option "B" ignored
- if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
- NM="$ac_dir/nm -B"
- elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
- NM="$ac_dir/nm -p"
- else
- NM="$ac_dir/nm"
- fi
- break
- fi
- done
- IFS="$ac_save_ifs"
- test -z "$NM" && NM=nm
- ;;
- esac
- echo "$ac_t$NM" 1>&6
-fi
-
-# Check for command to grab the raw symbol name followed by C symbol from nm.
-echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6
-
-# These are sane defaults that work on at least a few old systems.
-# [They come from Ultrix. What could be older than Ultrix?!! ;)]
-
-# Character class describing NM global symbol codes.
-symcode='[BCDEGRSTU]'
-
-# Regexp to match symbols that can be accessed directly from C.
-sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
-
-# Transform the above into a raw symbol and a C symbol.
-symxfrm='\1 \1'
-
-# Define system-specific variables.
-case "$host_os" in
-aix*)
- symcode='[BCDTU]'
- ;;
-sunos* | cygwin32* | mingw32*)
- sympat='_\([_A-Za-z][_A-Za-z0-9]*\)'
- symxfrm='_\1 \1'
- ;;
-irix*)
- # Cannot use undefined symbols on IRIX because inlined functions mess us up.
- symcode='[BCDEGRST]'
- ;;
-solaris*)
- symcode='[BDTU]'
- ;;
-esac
-
-# If we're using GNU nm, then use its standard symbol codes.
-if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
- symcode='[ABCDGISTUW]'
-fi
-
-case "$host_os" in
-cygwin32* | mingw32*)
- # We do not want undefined symbols on cygwin32. The user must
- # arrange to define them via -l arguments.
- symcode='[ABCDGISTW]'
- ;;
-esac
-
-# Write the raw and C identifiers.
-global_symbol_pipe="sed -n -e 's/^.* $symcode $sympat$/$symxfrm/p'"
-
-# Check to see that the pipe works correctly.
-pipe_works=no
-$rm conftest*
-cat > conftest.c <<EOF
-#ifdef __cplusplus
-extern "C" {
-#endif
-char nm_test_var;
-void nm_test_func(){}
-#ifdef __cplusplus
-}
-#endif
-main(){nm_test_var='a';nm_test_func();return(0);}
-EOF
-
-echo "$progname:1429: checking if global_symbol_pipe works" >&5
-if { (eval echo $progname:1430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then
- # Now try to grab the symbols.
- nlist=conftest.nm
- if { echo "$progname:1433: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
-
- # Try sorting and uniquifying the output.
- if sort "$nlist" | uniq > "$nlist"T; then
- mv -f "$nlist"T "$nlist"
- wcout=`wc "$nlist" 2>/dev/null`
- count=`$echo "X$wcout" | $Xsed -e 's/^[ ]*\([0-9][0-9]*\).*$/\1/'`
- (test "$count" -ge 0) 2>/dev/null || count=-1
- else
- rm -f "$nlist"T
- count=-1
- fi
-
- # Make sure that we snagged all the symbols we need.
- if egrep ' nm_test_var$' "$nlist" >/dev/null; then
- if egrep ' nm_test_func$' "$nlist" >/dev/null; then
- cat <<EOF > conftest.c
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-EOF
- # Now generate the symbol file.
- sed 's/^.* \(.*\)$/extern char \1;/' < "$nlist" >> conftest.c
-
- cat <<EOF >> conftest.c
-#if defined (__STDC__) && __STDC__
-# define __ptr_t void *
-#else
-# define __ptr_t char *
-#endif
-
-/* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
-int dld_preloaded_symbol_count = $count;
-
-/* The mapping between symbol names and symbols. */
-struct {
- char *name;
- __ptr_t address;
-}
-dld_preloaded_symbols[] =
-{
-EOF
- sed 's/^\(.*\) \(.*\)$/ {"\1", (__ptr_t) \&\2},/' < "$nlist" >> conftest.c
- cat <<\EOF >> conftest.c
- {0, (__ptr_t) 0}
-};
-
-#ifdef __cplusplus
-}
-#endif
-EOF
- # Now try linking the two files.
- mv conftest.$objext conftestm.$objext
- save_LIBS="$LIBS"
- save_CFLAGS="$CFLAGS"
- LIBS="conftestm.$objext"
- CFLAGS="$CFLAGS$no_builtin_flag"
- if { (eval echo $progname:1491: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
- pipe_works=yes
- else
- echo "$progname: failed program was:" >&5
- cat conftest.c >&5
- fi
- LIBS="$save_LIBS"
- else
- echo "cannot find nm_test_func in $nlist" >&5
- fi
- else
- echo "cannot find nm_test_var in $nlist" >&5
- fi
- else
- echo "cannot run $global_symbol_pipe" >&5
- fi
-else
- echo "$progname: failed program was:" >&5
- cat conftest.c >&5
-fi
-$rm conftest*
-
-# Do not use the global_symbol_pipe unless it works.
-echo "$ac_t$pipe_works" 1>&6
-test "$pipe_works" = yes || global_symbol_pipe=
-
-# Check hardcoding attributes.
-echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6
-hardcode_action=
-if test -n "$hardcode_libdir_flag_spec" || \
- test -n "$runpath_var"; then
-
- # We can hardcode non-existant directories.
- if test "$hardcode_direct" != no && \
- test "$hardcode_minus_L" != no && \
- test "$hardcode_shlibpath_var" != no; then
-
- # Linking always hardcodes the temporary library directory.
- hardcode_action=relink
- else
- # We can link without hardcoding, and we can hardcode nonexisting dirs.
- hardcode_action=immediate
- fi
-else
- # We cannot hardcode anything, or else we can only hardcode existing
- # directories.
- hardcode_action=unsupported
-fi
-echo "$ac_t$hardcode_action" 1>&6
-
-
-reload_flag=
-reload_cmds='$LD$reload_flag -o $output$reload_objs'
-echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6
-# PORTME Some linkers may need a different reload flag.
-reload_flag='-r'
-echo "$ac_t$reload_flag" 1>&6
-test -n "$reload_flag" && reload_flag=" $reload_flag"
-
-# PORTME Fill in your ld.so characteristics
-library_names_spec=
-libname_spec='lib$name'
-soname_spec=
-postinstall_cmds=
-postuninstall_cmds=
-finish_cmds=
-finish_eval=
-shlibpath_var=
-version_type=none
-dynamic_linker="$host_os ld.so"
-sys_lib_search_path="/lib /usr/lib /usr/local/lib"
-check_shared_deplibs_method='none'
-# Need to set the preceding variable on all platforms that support
-# interlibrary dependencies.
-# 'none' -- dependencies not supported.
-# 'pass_all' -- all dependencies passed with no checks.
-# 'test_compile' -- check by making test program.
-# 'file_regex' -- check by looking for filenames that look like the shared
-# library in the library path.
-# 'file_magic [regex]' -- check by looking for files in library path which
-# responds to the "file" command with a given regex. This is actually a
-# superset of the file_regex command. If you have file on your system, you'll
-# want to use this instead.
-# Notes: regexes are run through expr.
-
-echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6
-case "$host_os" in
-aix3* | aix4*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix $libname.a'
- shlibpath_var=LIBPATH
-
- # AIX has no versioning support, so we append a major version to the name.
- soname_spec='${libname}${release}.so$major'
- ;;
-
-amigaos*)
- library_names_spec='$libname.ixlibrary $libname.a'
- # Create ${libname}_ixlibrary.a entries in /sys/libs.
- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
- ;;
-
-bsdi4*)
- version_type=linux
- library_names_spec='${libname}.so.$major ${libname}.so'
- soname_spec='${libname}.so'
- finish_cmds='PATH="$PATH:/sbin" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-cygwin32* | mingw32*)
- version_type=windows
- if test "$with_gcc" = yes; then
- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a'
- else
- library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib'
- fi
- dynamic_linker='Win32 ld.exe'
- libname_spec='$name'
- shlibpath_var=PATH
- ;;
-
-freebsd2* | freebsd3*)
- objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout`
- version_type=freebsd-$objformat
- library_names_spec='${libname}${release}.so$versuffix $libname.so'
- finish_cmds='PATH="$PATH:/sbin" OBJFORMAT="$objformat" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-gnu*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-hpux9* | hpux10* | hpux11*)
- # Give a soname corresponding to the major version so that dld.sl refuses to
- # link against other versions.
- dynamic_linker="$host_os dld.sl"
- version_type=sunos
- shlibpath_var=SHLIB_PATH
- library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
- soname_spec='${libname}${release}.sl$major'
- # HP-UX runs *really* slowly unless shared libraries are mode 555.
- postinstall_cmds='chmod 555 $lib'
- ;;
-
-irix5*)
- version_type=osf
- soname_spec='${libname}${release}.so'
- library_names_spec='${libname}${release}.so$versuffix $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-irix6*)
- version_type=osf
- soname_spec='${libname}${release}.so'
- library_names_spec='${libname}${release}.so$versuffix $libname.so'
- shlibpath_var=LD_LIBRARYN32_PATH
- ;;
-
-# No shared lib support for Linux oldld, aout, or coff.
-linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
- dynamic_linker=no
- ;;
-
-# This must be Linux ELF.
-linux-gnu*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- check_shared_deplibs_method='file_magic ELF 32-bit LSB shared object'
- sys_lib_search_path="/lib /usr/lib /usr/local/lib `echo $LD_LIBRARY_PATH | sed -e 's/:/ /g'`"
-
- if test -f /lib/ld.so.1; then
- dynamic_linker='GNU ld.so'
- else
- # Only the GNU ld.so supports shared libraries on MkLinux.
- case "$host_cpu" in
- powerpc*) dynamic_linker=no ;;
- *) dynamic_linker='Linux ld.so' ;;
- esac
- fi
- ;;
-
-netbsd* | openbsd*)
- version_type=sunos
- library_names_spec='${libname}${release}.so$versuffix'
- finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-os2*)
- libname_spec='$name'
- library_names_spec='$libname.dll $libname.a'
- dynamic_linker='OS/2 ld.exe'
- shlibpath_var=LIBPATH
- ;;
-
-osf3* | osf4*)
- version_type=osf
- soname_spec='${libname}${release}.so'
- library_names_spec='${libname}${release}.so$versuffix $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- check_shared_deplibs_method='pass_all'
- ;;
-
-sco3.2v5*)
- version_type=osf
- soname_spec='${libname}${release}.so$major'
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-solaris*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- # ldd complains unless libraries are executable
- postinstall_cmds='chmod +x $lib'
- ;;
-
-sunos4*)
- version_type=sunos
- library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix'
- finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-sysv4.2uw2*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-uts4*)
- version_type=linux
- library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
- soname_spec='${libname}${release}.so.$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-dgux*)
- version_type=linux
- library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
- soname_spec='${libname}${release}.so$major'
- shlibpath_var=LD_LIBRARY_PATH
- ;;
-
-*)
- dynamic_linker=no
- ;;
-esac
-echo "$ac_t$dynamic_linker" 1>&6
-test "$dynamic_linker" = no && can_build_shared=no
-
-# Report the final consequences.
-echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6
-
-echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6
-test "$can_build_shared" = "no" && enable_shared=no
-
-# On AIX, shared libraries and static libraries use the same namespace, and
-# are all built from PIC.
-case "$host_os" in
-aix*)
- test "$enable_shared" = yes && enable_static=no
- if test -n "$RANLIB"; then
- archive_cmds="$archive_cmds~\$RANLIB \$lib"
- postinstall_cmds='$RANLIB $lib'
- fi
- ;;
-esac
-
-echo "$ac_t$enable_shared" 1>&6
-
-# Make sure either enable_shared or enable_static is yes.
-test "$enable_shared" = yes || enable_static=yes
-
-echo "checking whether to build static libraries... $enable_static" 1>&6
-
-echo $ac_n "checking for objdir... $ac_c" 1>&6
-rm -f .libs 2>/dev/null
-mkdir .libs 2>/dev/null
-if test -d .libs; then
- objdir=.libs
-else
- # MS-DOS does not allow filenames that begin with a dot.
- objdir=_libs
-fi
-rmdir .libs 2>/dev/null
-echo "$ac_t$objdir" 1>&6
-
-# Copy echo and quote the copy, instead of the original, because it is
-# used later.
-ltecho="$echo"
-if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then
- ltecho="$CONFIG_SHELL \$0 --fallback-echo"
-fi
-LTSHELL="$SHELL"
-
-# Only quote variables if we're using ltmain.sh.
-case "$ltmain" in
-*.sh)
- # Now quote all the things that may contain metacharacters.
- for var in ltecho old_CC old_CFLAGS old_CPPFLAGS old_LD old_NM old_RANLIB \
- old_LN_S old_DLLTOOL old_AS AR CC LD LN_S NM LTSHELL VERSION \
- reload_flag reload_cmds wl \
- pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \
- whole_archive_flag_spec libname_spec library_names_spec soname_spec \
- RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
- old_postuninstall_cmds archive_cmds archive_sym_cmds postinstall_cmds postuninstall_cmds \
- check_shared_deplibs_method allow_undefined_flag no_undefined_flag \
- finish_cmds finish_eval global_symbol_pipe \
- hardcode_libdir_flag_spec hardcode_libdir_separator sys_lib_search_path \
- compiler_c_o compiler_o_lo need_locks; do
-
- case "$var" in
- reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
- old_postinstall_cmds | old_postuninstall_cmds | \
- archive_cmds | archive_sym_cmds | \
- postinstall_cmds | postuninstall_cmds | \
- finish_cmds | sys_lib_search_path)
- # Double-quote double-evaled strings.
- eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\"\`\\\""
- ;;
- *)
- eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
- ;;
- esac
- done
-
- case "$ltecho" in
- *'\$0 --fallback-echo"')
- ltecho=`$echo "X$ltecho" |
- $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
- ;;
- esac
-
- trap "$rm \"$ofile\"; exit 1" 1 2 15
- echo "creating $ofile"
- $rm "$ofile"
- cat <<EOF > "$ofile"
-#! $SHELL
-
-# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION)
-# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh.
-#
-# Copyright (C) 1996-1998 Free Software Foundation, Inc.
-# Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Sed that helps us avoid accidentally triggering echo(1) options like -n.
-Xsed="sed -e s/^X//"
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test "\${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi
-
-### BEGIN LIBTOOL CONFIG
-EOF
- cfgfile="$ofile"
- ;;
-
-*)
- # Double-quote the variables that need it (for aesthetics).
- for var in old_CC old_CFLAGS old_CPPFLAGS old_LD old_NM old_RANLIB \
- old_LN_S old_DLLTOOL old_AS; do
- eval "$var=\\\"\$var\\\""
- done
-
- # Just create a config file.
- cfgfile="$ofile.cfg"
- trap "$rm \"$cfgfile\"; exit 1" 1 2 15
- echo "creating $cfgfile"
- $rm "$cfgfile"
- cat <<EOF > "$cfgfile"
-# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file.
-# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION)
-EOF
- ;;
-esac
-
-cat <<EOF >> "$cfgfile"
-# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-#
-# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\
-# LD=$old_LD NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\
-# DLLTOOL="$old_DLLTOOL" AS="$old_AS" \\
-# $0$ltconfig_args
-#
-# Compiler and other test output produced by $progname, useful for
-# debugging $progname, is in ./config.log if it exists.
-
-# The version of $progname that generated this script.
-LTCONFIG_VERSION=$VERSION
-
-# Shell to use when invoking shell scripts.
-SHELL=$LTSHELL
-
-# Whether or not to build shared libraries.
-build_libtool_libs=$enable_shared
-
-# Whether or not to build static libraries.
-build_old_libs=$enable_static
-
-# The host system.
-host_alias=$host_alias
-host=$host
-
-# An echo program that does not interpret backslashes.
-echo=$ltecho
-
-# The archiver.
-AR=$AR
-
-# The default C compiler.
-CC=$CC
-
-# The linker used to build libraries.
-LD=$LD
-
-# Whether we need hard or soft links.
-LN_S=$LN_S
-
-# A BSD-compatible nm program.
-NM=$NM
-
-# Used on cygwin32: DLL creation program.
-DLLTOOL="$DLLTOOL"
-
-# Used on cygwin32: assembler.
-AS="$AS"
-
-# The name of the directory that contains temporary libtool files.
-objdir=$objdir
-
-# How to create reloadable object files.
-reload_flag=$reload_flag
-reload_cmds=$reload_cmds
-
-# How to pass a linker flag through the compiler.
-wl=$wl
-
-# Object file suffix (normally "o").
-objext="$objext"
-
-# Old archive suffix (normally "a").
-libext="$libext"
-
-# Additional compiler flags for building library objects.
-pic_flag=$pic_flag
-
-# Does compiler simultaneously support -c and -o options
-compiler_c_o=$compiler_c_o
-
-# Can we write directly to a .lo ?
-compiler_o_lo=$compiler_o_lo
-
-# Must we lock files when doing compilation ?
-need_locks=$need_locks
-
-# Compiler flag to prevent dynamic linking.
-link_static_flag=$link_static_flag
-
-# Compiler flag to turn off builtin functions.
-no_builtin_flag=$no_builtin_flag
-
-# Compiler flag to allow reflexive dlopens.
-export_dynamic_flag_spec=$export_dynamic_flag_spec
-
-# Compiler flag to generate shared objects directly from archives.
-whole_archive_flag_spec=$whole_archive_flag_spec
-
-# Library versioning type.
-version_type=$version_type
-
-# Format of library name prefix.
-libname_spec=$libname_spec
-
-# List of archive names. First name is the real one, the rest are links.
-# The last name is the one that the linker finds with -lNAME.
-library_names_spec=$library_names_spec
-
-# The coded name of the library, if different from the real name.
-soname_spec=$soname_spec
-
-# Commands used to build and install an old-style archive.
-RANLIB=$RANLIB
-old_archive_cmds=$old_archive_cmds
-old_postinstall_cmds=$old_postinstall_cmds
-old_postuninstall_cmds=$old_postuninstall_cmds
-
-# Create an old-style archive from a shared archive.
-old_archive_from_new_cmds=$old_archive_from_new_cmds
-
-# Commands used to build and install a shared archive.
-archive_cmds=$archive_cmds
-archive_sym_cmds=$archive_sym_cmds
-postinstall_cmds=$postinstall_cmds
-postuninstall_cmds=$postuninstall_cmds
-
-# Method to check whether dependent libraries are shared objects.
-check_shared_deplibs_method=$check_shared_deplibs_method
-
-# Flag that allows shared libraries with undefined symbols to be built.
-allow_undefined_flag=$allow_undefined_flag
-
-# Flag that forces no undefined symbols.
-no_undefined_flag=$no_undefined_flag
-
-# Commands used to finish a libtool library installation in a directory.
-finish_cmds=$finish_cmds
-
-# Same as above, but a single script fragment to be evaled but not shown.
-finish_eval=$finish_eval
-
-# Take the output of nm and produce a listing of raw symbols and C names.
-global_symbol_pipe=$global_symbol_pipe
-
-# This is the shared library runtime path variable.
-runpath_var=$runpath_var
-
-# This is the shared library path variable.
-shlibpath_var=$shlibpath_var
-
-# How to hardcode a shared library path into an executable.
-hardcode_action=$hardcode_action
-
-# Flag to hardcode \$libdir into a binary during linking.
-# This must work even if \$libdir does not exist.
-hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec
-
-# Whether we need a single -rpath flag with a separated argument.
-hardcode_libdir_separator=$hardcode_libdir_separator
-
-# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
-# resulting binary.
-hardcode_direct=$hardcode_direct
-
-# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
-# resulting binary.
-hardcode_minus_L=$hardcode_minus_L
-
-# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
-# the resulting binary.
-hardcode_shlibpath_var=$hardcode_shlibpath_var
-
-# System search path for libraries
-sys_lib_search_path=$sys_lib_search_path
-
-# Fix the shell variable \$srcfile for the compiler.
-fix_srcfile_path="$fix_srcfile_path"
-EOF
-
-case "$ltmain" in
-*.sh)
- echo '### END LIBTOOL CONFIG' >> "$ofile"
- echo >> "$ofile"
- case "$host_os" in
- aix3*)
- cat <<\EOF >> "$ofile"
-
-# AIX sometimes has problems with the GCC collect2 program. For some
-# reason, if we set the COLLECT_NAMES environment variable, the problems
-# vanish in a puff of smoke.
-if test "${COLLECT_NAMES+set}" != set; then
- COLLECT_NAMES=
- export COLLECT_NAMES
-fi
-EOF
- ;;
- esac
-
- # Append the ltmain.sh script.
- cat "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1)
-
- chmod +x "$ofile"
- ;;
-
-*)
- # Compile the libtool program.
- echo "FIXME: would compile $ltmain"
- ;;
-esac
-exit 0
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
diff --git a/ltmain.sh b/ltmain.sh
deleted file mode 100755
index c8c38c2..0000000
--- a/ltmain.sh
+++ /dev/null
@@ -1,5064 +0,0 @@
-# ltmain.sh - Provide generalized library-building support services.
-# NOTE: Changing this file will not affect anything until you rerun configure.
-#
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
-# Free Software Foundation, Inc.
-# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Check that we have a working $echo.
-if test "X$1" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
-elif test "X$1" = X--fallback-echo; then
- # Avoid inline document here, it may be left over
- :
-elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
- # Yippee, $echo works!
- :
-else
- # Restart under the correct shell, and then maybe $echo will work.
- exec $SHELL "$0" --no-reexec ${1+"$@"}
-fi
-
-if test "X$1" = X--fallback-echo; then
- # used as fallback echo
- shift
- cat <<EOF
-$*
-EOF
- exit 0
-fi
-
-# The name of this program.
-progname=`$echo "$0" | sed 's%^.*/%%'`
-modename="$progname"
-
-# Constants.
-PROGRAM=ltmain.sh
-PACKAGE=libtool
-VERSION=1.4.2
-TIMESTAMP=" (1.922.2.54 2001/09/11 03:33:37)"
-
-default_mode=
-help="Try \`$progname --help' for more information."
-magic="%%%MAGIC variable%%%"
-mkdir="mkdir"
-mv="mv -f"
-rm="rm -f"
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
-SP2NL='tr \040 \012'
-NL2SP='tr \015\012 \040\040'
-
-# NLS nuisances.
-# Only set LANG and LC_ALL to C if already set.
-# These must not be set unconditionally because not all systems understand
-# e.g. LANG=C (notably SCO).
-# We save the old values to restore during execute mode.
-if test "${LC_ALL+set}" = set; then
- save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
-fi
-if test "${LANG+set}" = set; then
- save_LANG="$LANG"; LANG=C; export LANG
-fi
-
-# Make sure IFS has a sensible default
-: ${IFS=" "}
-
-if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
- echo "$modename: not configured to build any kind of library" 1>&2
- echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
- exit 1
-fi
-
-# Global variables.
-mode=$default_mode
-nonopt=
-prev=
-prevopt=
-run=
-show="$echo"
-show_help=
-execute_dlfiles=
-lo2o="s/\\.lo\$/.${objext}/"
-o2lo="s/\\.${objext}\$/.lo/"
-
-# Parse our command line options once, thoroughly.
-while test $# -gt 0
-do
- arg="$1"
- shift
-
- case $arg in
- -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
- *) optarg= ;;
- esac
-
- # If the previous option needs an argument, assign it.
- if test -n "$prev"; then
- case $prev in
- execute_dlfiles)
- execute_dlfiles="$execute_dlfiles $arg"
- ;;
- *)
- eval "$prev=\$arg"
- ;;
- esac
-
- prev=
- prevopt=
- continue
- fi
-
- # Have we seen a non-optional argument yet?
- case $arg in
- --help)
- show_help=yes
- ;;
-
- --version)
- echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
- exit 0
- ;;
-
- --config)
- sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0
- exit 0
- ;;
-
- --debug)
- echo "$progname: enabling shell trace mode"
- set -x
- ;;
-
- --dry-run | -n)
- run=:
- ;;
-
- --features)
- echo "host: $host"
- if test "$build_libtool_libs" = yes; then
- echo "enable shared libraries"
- else
- echo "disable shared libraries"
- fi
- if test "$build_old_libs" = yes; then
- echo "enable static libraries"
- else
- echo "disable static libraries"
- fi
- exit 0
- ;;
-
- --finish) mode="finish" ;;
-
- --mode) prevopt="--mode" prev=mode ;;
- --mode=*) mode="$optarg" ;;
-
- --preserve-dup-deps) duplicate_deps="yes" ;;
-
- --quiet | --silent)
- show=:
- ;;
-
- -dlopen)
- prevopt="-dlopen"
- prev=execute_dlfiles
- ;;
-
- -*)
- $echo "$modename: unrecognized option \`$arg'" 1>&2
- $echo "$help" 1>&2
- exit 1
- ;;
-
- *)
- nonopt="$arg"
- break
- ;;
- esac
-done
-
-if test -n "$prevopt"; then
- $echo "$modename: option \`$prevopt' requires an argument" 1>&2
- $echo "$help" 1>&2
- exit 1
-fi
-
-# If this variable is set in any of the actions, the command in it
-# will be execed at the end. This prevents here-documents from being
-# left over by shells.
-exec_cmd=
-
-if test -z "$show_help"; then
-
- # Infer the operation mode.
- if test -z "$mode"; then
- case $nonopt in
- *cc | *++ | gcc* | *-gcc*)
- mode=link
- for arg
- do
- case $arg in
- -c)
- mode=compile
- break
- ;;
- esac
- done
- ;;
- *db | *dbx | *strace | *truss)
- mode=execute
- ;;
- *install*|cp|mv)
- mode=install
- ;;
- *rm)
- mode=uninstall
- ;;
- *)
- # If we have no mode, but dlfiles were specified, then do execute mode.
- test -n "$execute_dlfiles" && mode=execute
-
- # Just use the default operation mode.
- if test -z "$mode"; then
- if test -n "$nonopt"; then
- $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
- else
- $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
- fi
- fi
- ;;
- esac
- fi
-
- # Only execute mode is allowed to have -dlopen flags.
- if test -n "$execute_dlfiles" && test "$mode" != execute; then
- $echo "$modename: unrecognized option \`-dlopen'" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- # Change the help message to a mode-specific one.
- generic_help="$help"
- help="Try \`$modename --help --mode=$mode' for more information."
-
- # These modes are in order of execution frequency so that they run quickly.
- case $mode in
- # libtool compile mode
- compile)
- modename="$modename: compile"
- # Get the compilation command and the source file.
- base_compile=
- prev=
- lastarg=
- srcfile="$nonopt"
- suppress_output=
-
- user_target=no
- for arg
- do
- case $prev in
- "") ;;
- xcompiler)
- # Aesthetically quote the previous argument.
- prev=
- lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
-
- case $arg in
- # Double-quote args containing other shell metacharacters.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- arg="\"$arg\""
- ;;
- esac
-
- # Add the previous argument to base_compile.
- if test -z "$base_compile"; then
- base_compile="$lastarg"
- else
- base_compile="$base_compile $lastarg"
- fi
- continue
- ;;
- esac
-
- # Accept any command-line options.
- case $arg in
- -o)
- if test "$user_target" != "no"; then
- $echo "$modename: you cannot specify \`-o' more than once" 1>&2
- exit 1
- fi
- user_target=next
- ;;
-
- -static)
- build_old_libs=yes
- continue
- ;;
-
- -prefer-pic)
- pic_mode=yes
- continue
- ;;
-
- -prefer-non-pic)
- pic_mode=no
- continue
- ;;
-
- -Xcompiler)
- prev=xcompiler
- continue
- ;;
-
- -Wc,*)
- args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
- lastarg=
- save_ifs="$IFS"; IFS=','
- for arg in $args; do
- IFS="$save_ifs"
-
- # Double-quote args containing other shell metacharacters.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- case $arg in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- arg="\"$arg\""
- ;;
- esac
- lastarg="$lastarg $arg"
- done
- IFS="$save_ifs"
- lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
-
- # Add the arguments to base_compile.
- if test -z "$base_compile"; then
- base_compile="$lastarg"
- else
- base_compile="$base_compile $lastarg"
- fi
- continue
- ;;
- esac
-
- case $user_target in
- next)
- # The next one is the -o target name
- user_target=yes
- continue
- ;;
- yes)
- # We got the output file
- user_target=set
- libobj="$arg"
- continue
- ;;
- esac
-
- # Accept the current argument as the source file.
- lastarg="$srcfile"
- srcfile="$arg"
-
- # Aesthetically quote the previous argument.
-
- # Backslashify any backslashes, double quotes, and dollar signs.
- # These are the only characters that are still specially
- # interpreted inside of double-quoted scrings.
- lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
-
- # Double-quote args containing other shell metacharacters.
- # Many Bourne shells cannot handle close brackets correctly
- # in scan sets, so we specify it separately.
- case $lastarg in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- lastarg="\"$lastarg\""
- ;;
- esac
-
- # Add the previous argument to base_compile.
- if test -z "$base_compile"; then
- base_compile="$lastarg"
- else
- base_compile="$base_compile $lastarg"
- fi
- done
-
- case $user_target in
- set)
- ;;
- no)
- # Get the name of the library object.
- libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
- ;;
- *)
- $echo "$modename: you must specify a target with \`-o'" 1>&2
- exit 1
- ;;
- esac
-
- # Recognize several different file suffixes.
- # If the user specifies -o file.o, it is replaced with file.lo
- xform='[cCFSfmso]'
- case $libobj in
- *.ada) xform=ada ;;
- *.adb) xform=adb ;;
- *.ads) xform=ads ;;
- *.asm) xform=asm ;;
- *.c++) xform=c++ ;;
- *.cc) xform=cc ;;
- *.cpp) xform=cpp ;;
- *.cxx) xform=cxx ;;
- *.f90) xform=f90 ;;
- *.for) xform=for ;;
- esac
-
- libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
-
- case $libobj in
- *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
- *)
- $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
- exit 1
- ;;
- esac
-
- if test -z "$base_compile"; then
- $echo "$modename: you must specify a compilation command" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- # Delete any leftover library objects.
- if test "$build_old_libs" = yes; then
- removelist="$obj $libobj"
- else
- removelist="$libobj"
- fi
-
- $run $rm $removelist
- trap "$run $rm $removelist; exit 1" 1 2 15
-
- # On Cygwin there's no "real" PIC flag so we must build both object types
- case $host_os in
- cygwin* | mingw* | pw32* | os2*)
- pic_mode=default
- ;;
- esac
- if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
- # non-PIC code in shared libraries is not supported
- pic_mode=default
- fi
-
- # Calculate the filename of the output object if compiler does
- # not support -o with -c
- if test "$compiler_c_o" = no; then
- output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
- lockfile="$output_obj.lock"
- removelist="$removelist $output_obj $lockfile"
- trap "$run $rm $removelist; exit 1" 1 2 15
- else
- need_locks=no
- lockfile=
- fi
-
- # Lock this critical section if it is needed
- # We use this script file to make the link, it avoids creating a new file
- if test "$need_locks" = yes; then
- until $run ln "$0" "$lockfile" 2>/dev/null; do
- $show "Waiting for $lockfile to be removed"
- sleep 2
- done
- elif test "$need_locks" = warn; then
- if test -f "$lockfile"; then
- echo "\
-*** ERROR, $lockfile exists and contains:
-`cat $lockfile 2>/dev/null`
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $run $rm $removelist
- exit 1
- fi
- echo $srcfile > "$lockfile"
- fi
-
- if test -n "$fix_srcfile_path"; then
- eval srcfile=\"$fix_srcfile_path\"
- fi
-
- # Only build a PIC object if we are building libtool libraries.
- if test "$build_libtool_libs" = yes; then
- # Without this assignment, base_compile gets emptied.
- fbsd_hideous_sh_bug=$base_compile
-
- if test "$pic_mode" != no; then
- # All platforms use -DPIC, to notify preprocessed assembler code.
- command="$base_compile $srcfile $pic_flag -DPIC"
- else
- # Don't build PIC code
- command="$base_compile $srcfile"
- fi
- if test "$build_old_libs" = yes; then
- lo_libobj="$libobj"
- dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$dir" = "X$libobj"; then
- dir="$objdir"
- else
- dir="$dir/$objdir"
- fi
- libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
-
- if test -d "$dir"; then
- $show "$rm $libobj"
- $run $rm $libobj
- else
- $show "$mkdir $dir"
- $run $mkdir $dir
- status=$?
- if test $status -ne 0 && test ! -d $dir; then
- exit $status
- fi
- fi
- fi
- if test "$compiler_o_lo" = yes; then
- output_obj="$libobj"
- command="$command -o $output_obj"
- elif test "$compiler_c_o" = yes; then
- output_obj="$obj"
- command="$command -o $output_obj"
- fi
-
- $run $rm "$output_obj"
- $show "$command"
- if $run eval "$command"; then :
- else
- test -n "$output_obj" && $run $rm $removelist
- exit 1
- fi
-
- if test "$need_locks" = warn &&
- test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
- echo "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $run $rm $removelist
- exit 1
- fi
-
- # Just move the object if needed, then go on to compile the next one
- if test x"$output_obj" != x"$libobj"; then
- $show "$mv $output_obj $libobj"
- if $run $mv $output_obj $libobj; then :
- else
- error=$?
- $run $rm $removelist
- exit $error
- fi
- fi
-
- # If we have no pic_flag, then copy the object into place and finish.
- if (test -z "$pic_flag" || test "$pic_mode" != default) &&
- test "$build_old_libs" = yes; then
- # Rename the .lo from within objdir to obj
- if test -f $obj; then
- $show $rm $obj
- $run $rm $obj
- fi
-
- $show "$mv $libobj $obj"
- if $run $mv $libobj $obj; then :
- else
- error=$?
- $run $rm $removelist
- exit $error
- fi
-
- xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$xdir" = "X$obj"; then
- xdir="."
- else
- xdir="$xdir"
- fi
- baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"`
- libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
- # Now arrange that obj and lo_libobj become the same file
- $show "(cd $xdir && $LN_S $baseobj $libobj)"
- if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
- # Unlock the critical section if it was locked
- if test "$need_locks" != no; then
- $run $rm "$lockfile"
- fi
- exit 0
- else
- error=$?
- $run $rm $removelist
- exit $error
- fi
- fi
-
- # Allow error messages only from the first compilation.
- suppress_output=' >/dev/null 2>&1'
- fi
-
- # Only build a position-dependent object if we build old libraries.
- if test "$build_old_libs" = yes; then
- if test "$pic_mode" != yes; then
- # Don't build PIC code
- command="$base_compile $srcfile"
- else
- # All platforms use -DPIC, to notify preprocessed assembler code.
- command="$base_compile $srcfile $pic_flag -DPIC"
- fi
- if test "$compiler_c_o" = yes; then
- command="$command -o $obj"
- output_obj="$obj"
- fi
-
- # Suppress compiler output if we already did a PIC compilation.
- command="$command$suppress_output"
- $run $rm "$output_obj"
- $show "$command"
- if $run eval "$command"; then :
- else
- $run $rm $removelist
- exit 1
- fi
-
- if test "$need_locks" = warn &&
- test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then
- echo "\
-*** ERROR, $lockfile contains:
-`cat $lockfile 2>/dev/null`
-
-but it should contain:
-$srcfile
-
-This indicates that another process is trying to use the same
-temporary object file, and libtool could not work around it because
-your compiler does not support \`-c' and \`-o' together. If you
-repeat this compilation, it may succeed, by chance, but you had better
-avoid parallel builds (make -j) in this platform, or get a better
-compiler."
-
- $run $rm $removelist
- exit 1
- fi
-
- # Just move the object if needed
- if test x"$output_obj" != x"$obj"; then
- $show "$mv $output_obj $obj"
- if $run $mv $output_obj $obj; then :
- else
- error=$?
- $run $rm $removelist
- exit $error
- fi
- fi
-
- # Create an invalid libtool object if no PIC, so that we do not
- # accidentally link it into a program.
- if test "$build_libtool_libs" != yes; then
- $show "echo timestamp > $libobj"
- $run eval "echo timestamp > \$libobj" || exit $?
- else
- # Move the .lo from within objdir
- $show "$mv $libobj $lo_libobj"
- if $run $mv $libobj $lo_libobj; then :
- else
- error=$?
- $run $rm $removelist
- exit $error
- fi
- fi
- fi
-
- # Unlock the critical section if it was locked
- if test "$need_locks" != no; then
- $run $rm "$lockfile"
- fi
-
- exit 0
- ;;
-
- # libtool link mode
- link | relink)
- modename="$modename: link"
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
- # It is impossible to link a dll without this setting, and
- # we shouldn't force the makefile maintainer to figure out
- # which system we are compiling for in order to pass an extra
- # flag for every libtool invokation.
- # allow_undefined=no
-
- # FIXME: Unfortunately, there are problems with the above when trying
- # to make a dll which has undefined symbols, in which case not
- # even a static library is built. For now, we need to specify
- # -no-undefined on the libtool link line when we can be certain
- # that all symbols are satisfied, otherwise we get a static library.
- allow_undefined=yes
- ;;
- *)
- allow_undefined=yes
- ;;
- esac
- libtool_args="$nonopt"
- compile_command="$nonopt"
- finalize_command="$nonopt"
-
- compile_rpath=
- finalize_rpath=
- compile_shlibpath=
- finalize_shlibpath=
- convenience=
- old_convenience=
- deplibs=
- old_deplibs=
- compiler_flags=
- linker_flags=
- dllsearchpath=
- lib_search_path=`pwd`
- inst_prefix_dir=
-
- avoid_version=no
- dlfiles=
- dlprefiles=
- dlself=no
- export_dynamic=no
- export_symbols=
- export_symbols_regex=
- generated=
- libobjs=
- ltlibs=
- module=no
- no_install=no
- objs=
- prefer_static_libs=no
- preload=no
- prev=
- prevarg=
- release=
- rpath=
- xrpath=
- perm_rpath=
- temp_rpath=
- thread_safe=no
- vinfo=
-
- # We need to know -static, to get the right output filenames.
- for arg
- do
- case $arg in
- -all-static | -static)
- if test "X$arg" = "X-all-static"; then
- if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
- $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
- fi
- if test -n "$link_static_flag"; then
- dlopen_self=$dlopen_self_static
- fi
- else
- if test -z "$pic_flag" && test -n "$link_static_flag"; then
- dlopen_self=$dlopen_self_static
- fi
- fi
- build_libtool_libs=no
- build_old_libs=yes
- prefer_static_libs=yes
- break
- ;;
- esac
- done
-
- # See if our shared archives depend on static archives.
- test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-
- # Go through the arguments, transforming them on the way.
- while test $# -gt 0; do
- arg="$1"
- shift
- case $arg in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
- ;;
- *) qarg=$arg ;;
- esac
- libtool_args="$libtool_args $qarg"
-
- # If the previous option needs an argument, assign it.
- if test -n "$prev"; then
- case $prev in
- output)
- compile_command="$compile_command @OUTPUT@"
- finalize_command="$finalize_command @OUTPUT@"
- ;;
- esac
-
- case $prev in
- dlfiles|dlprefiles)
- if test "$preload" = no; then
- # Add the symbol object into the linking commands.
- compile_command="$compile_command @SYMFILE@"
- finalize_command="$finalize_command @SYMFILE@"
- preload=yes
- fi
- case $arg in
- *.la | *.lo) ;; # We handle these cases below.
- force)
- if test "$dlself" = no; then
- dlself=needless
- export_dynamic=yes
- fi
- prev=
- continue
- ;;
- self)
- if test "$prev" = dlprefiles; then
- dlself=yes
- elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
- dlself=yes
- else
- dlself=needless
- export_dynamic=yes
- fi
- prev=
- continue
- ;;
- *)
- if test "$prev" = dlfiles; then
- dlfiles="$dlfiles $arg"
- else
- dlprefiles="$dlprefiles $arg"
- fi
- prev=
- continue
- ;;
- esac
- ;;
- expsyms)
- export_symbols="$arg"
- if test ! -f "$arg"; then
- $echo "$modename: symbol file \`$arg' does not exist"
- exit 1
- fi
- prev=
- continue
- ;;
- expsyms_regex)
- export_symbols_regex="$arg"
- prev=
- continue
- ;;
- inst_prefix)
- inst_prefix_dir="$arg"
- prev=
- continue
- ;;
- release)
- release="-$arg"
- prev=
- continue
- ;;
- rpath | xrpath)
- # We need an absolute path.
- case $arg in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- $echo "$modename: only absolute run-paths are allowed" 1>&2
- exit 1
- ;;
- esac
- if test "$prev" = rpath; then
- case "$rpath " in
- *" $arg "*) ;;
- *) rpath="$rpath $arg" ;;
- esac
- else
- case "$xrpath " in
- *" $arg "*) ;;
- *) xrpath="$xrpath $arg" ;;
- esac
- fi
- prev=
- continue
- ;;
- xcompiler)
- compiler_flags="$compiler_flags $qarg"
- prev=
- compile_command="$compile_command $qarg"
- finalize_command="$finalize_command $qarg"
- continue
- ;;
- xlinker)
- linker_flags="$linker_flags $qarg"
- compiler_flags="$compiler_flags $wl$qarg"
- prev=
- compile_command="$compile_command $wl$qarg"
- finalize_command="$finalize_command $wl$qarg"
- continue
- ;;
- *)
- eval "$prev=\"\$arg\""
- prev=
- continue
- ;;
- esac
- fi # test -n $prev
-
- prevarg="$arg"
-
- case $arg in
- -all-static)
- if test -n "$link_static_flag"; then
- compile_command="$compile_command $link_static_flag"
- finalize_command="$finalize_command $link_static_flag"
- fi
- continue
- ;;
-
- -allow-undefined)
- # FIXME: remove this flag sometime in the future.
- $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
- continue
- ;;
-
- -avoid-version)
- avoid_version=yes
- continue
- ;;
-
- -dlopen)
- prev=dlfiles
- continue
- ;;
-
- -dlpreopen)
- prev=dlprefiles
- continue
- ;;
-
- -export-dynamic)
- export_dynamic=yes
- continue
- ;;
-
- -export-symbols | -export-symbols-regex)
- if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
- $echo "$modename: more than one -exported-symbols argument is not allowed"
- exit 1
- fi
- if test "X$arg" = "X-export-symbols"; then
- prev=expsyms
- else
- prev=expsyms_regex
- fi
- continue
- ;;
-
- -inst-prefix-dir)
- prev=inst_prefix
- continue
- ;;
-
- # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
- # so, if we see these flags be careful not to treat them like -L
- -L[A-Z][A-Z]*:*)
- case $with_gcc/$host in
- no/*-*-irix*)
- compile_command="$compile_command $arg"
- finalize_command="$finalize_command $arg"
- ;;
- esac
- continue
- ;;
-
- -L*)
- dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
- # We need an absolute path.
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- absdir=`cd "$dir" && pwd`
- if test -z "$absdir"; then
- $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
- exit 1
- fi
- dir="$absdir"
- ;;
- esac
- case "$deplibs " in
- *" -L$dir "*) ;;
- *)
- deplibs="$deplibs -L$dir"
- lib_search_path="$lib_search_path $dir"
- ;;
- esac
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
- case :$dllsearchpath: in
- *":$dir:"*) ;;
- *) dllsearchpath="$dllsearchpath:$dir";;
- esac
- ;;
- esac
- continue
- ;;
-
- -l*)
- if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
- case $host in
- *-*-cygwin* | *-*-pw32* | *-*-beos*)
- # These systems don't actually have a C or math library (as such)
- continue
- ;;
- *-*-mingw* | *-*-os2*)
- # These systems don't actually have a C library (as such)
- test "X$arg" = "X-lc" && continue
- ;;
- *-*-openbsd*)
- # Do not include libc due to us having libc/libc_r.
- test "X$arg" = "X-lc" && continue
- ;;
- esac
- elif test "X$arg" = "X-lc_r"; then
- case $host in
- *-*-openbsd*)
- # Do not include libc_r directly, use -pthread flag.
- continue
- ;;
- esac
- fi
- deplibs="$deplibs $arg"
- continue
- ;;
-
- -module)
- module=yes
- continue
- ;;
-
- -no-fast-install)
- fast_install=no
- continue
- ;;
-
- -no-install)
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
- # The PATH hackery in wrapper scripts is required on Windows
- # in order for the loader to find any dlls it needs.
- $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
- $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
- fast_install=no
- ;;
- *) no_install=yes ;;
- esac
- continue
- ;;
-
- -no-undefined)
- allow_undefined=no
- continue
- ;;
-
- -o) prev=output ;;
-
- -release)
- prev=release
- continue
- ;;
-
- -rpath)
- prev=rpath
- continue
- ;;
-
- -R)
- prev=xrpath
- continue
- ;;
-
- -R*)
- dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
- # We need an absolute path.
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- $echo "$modename: only absolute run-paths are allowed" 1>&2
- exit 1
- ;;
- esac
- case "$xrpath " in
- *" $dir "*) ;;
- *) xrpath="$xrpath $dir" ;;
- esac
- continue
- ;;
-
- -static)
- # The effects of -static are defined in a previous loop.
- # We used to do the same as -all-static on platforms that
- # didn't have a PIC flag, but the assumption that the effects
- # would be equivalent was wrong. It would break on at least
- # Digital Unix and AIX.
- continue
- ;;
-
- -thread-safe)
- thread_safe=yes
- continue
- ;;
-
- -version-info)
- prev=vinfo
- continue
- ;;
-
- -Wc,*)
- args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
- arg=
- save_ifs="$IFS"; IFS=','
- for flag in $args; do
- IFS="$save_ifs"
- case $flag in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- flag="\"$flag\""
- ;;
- esac
- arg="$arg $wl$flag"
- compiler_flags="$compiler_flags $flag"
- done
- IFS="$save_ifs"
- arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
- ;;
-
- -Wl,*)
- args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
- arg=
- save_ifs="$IFS"; IFS=','
- for flag in $args; do
- IFS="$save_ifs"
- case $flag in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- flag="\"$flag\""
- ;;
- esac
- arg="$arg $wl$flag"
- compiler_flags="$compiler_flags $wl$flag"
- linker_flags="$linker_flags $flag"
- done
- IFS="$save_ifs"
- arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
- ;;
-
- -Xcompiler)
- prev=xcompiler
- continue
- ;;
-
- -Xlinker)
- prev=xlinker
- continue
- ;;
-
- # Some other compiler flag.
- -* | +*)
- # Unknown arguments in both finalize_command and compile_command need
- # to be aesthetically quoted because they are evaled later.
- arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
- case $arg in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- arg="\"$arg\""
- ;;
- esac
- ;;
-
- *.lo | *.$objext)
- # A library or standard object.
- if test "$prev" = dlfiles; then
- # This file was specified with -dlopen.
- if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
- dlfiles="$dlfiles $arg"
- prev=
- continue
- else
- # If libtool objects are unsupported, then we need to preload.
- prev=dlprefiles
- fi
- fi
-
- if test "$prev" = dlprefiles; then
- # Preload the old-style object.
- dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"`
- prev=
- else
- case $arg in
- *.lo) libobjs="$libobjs $arg" ;;
- *) objs="$objs $arg" ;;
- esac
- fi
- ;;
-
- *.$libext)
- # An archive.
- deplibs="$deplibs $arg"
- old_deplibs="$old_deplibs $arg"
- continue
- ;;
-
- *.la)
- # A libtool-controlled library.
-
- if test "$prev" = dlfiles; then
- # This library was specified with -dlopen.
- dlfiles="$dlfiles $arg"
- prev=
- elif test "$prev" = dlprefiles; then
- # The library was specified with -dlpreopen.
- dlprefiles="$dlprefiles $arg"
- prev=
- else
- deplibs="$deplibs $arg"
- fi
- continue
- ;;
-
- # Some other compiler argument.
- *)
- # Unknown arguments in both finalize_command and compile_command need
- # to be aesthetically quoted because they are evaled later.
- arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
- case $arg in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
- arg="\"$arg\""
- ;;
- esac
- ;;
- esac # arg
-
- # Now actually substitute the argument into the commands.
- if test -n "$arg"; then
- compile_command="$compile_command $arg"
- finalize_command="$finalize_command $arg"
- fi
- done # argument parsing loop
-
- if test -n "$prev"; then
- $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
- eval arg=\"$export_dynamic_flag_spec\"
- compile_command="$compile_command $arg"
- finalize_command="$finalize_command $arg"
- fi
-
- # calculate the name of the file, without its directory
- outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
- libobjs_save="$libobjs"
-
- if test -n "$shlibpath_var"; then
- # get the directories listed in $shlibpath_var
- eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\`
- else
- shlib_search_path=
- fi
- eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
- eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
-
- output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$output_objdir" = "X$output"; then
- output_objdir="$objdir"
- else
- output_objdir="$output_objdir/$objdir"
- fi
- # Create the object directory.
- if test ! -d "$output_objdir"; then
- $show "$mkdir $output_objdir"
- $run $mkdir $output_objdir
- status=$?
- if test "$status" -ne 0 && test ! -d "$output_objdir"; then
- exit $status
- fi
- fi
-
- # Determine the type of output
- case $output in
- "")
- $echo "$modename: you must specify an output file" 1>&2
- $echo "$help" 1>&2
- exit 1
- ;;
- *.$libext) linkmode=oldlib ;;
- *.lo | *.$objext) linkmode=obj ;;
- *.la) linkmode=lib ;;
- *) linkmode=prog ;; # Anything else should be a program.
- esac
-
- specialdeplibs=
- libs=
- # Find all interdependent deplibs by searching for libraries
- # that are linked more than once (e.g. -la -lb -la)
- for deplib in $deplibs; do
- if test "X$duplicate_deps" = "Xyes" ; then
- case "$libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
- esac
- fi
- libs="$libs $deplib"
- done
-
- if test "$linkmode" = lib; then
- libs="$predeps $libs $compiler_lib_search_path $postdeps"
-
- # Compute libraries that are listed more than once in $predeps
- # $postdeps and mark them as special (i.e., whose duplicates are
- # not to be eliminated).
- pre_post_deps=
- if test "X$duplicate_deps" = "Xyes" ; then
- for pre_post_dep in $predeps $postdeps; do
- case "$pre_post_deps " in
- *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
- esac
- pre_post_deps="$pre_post_deps $pre_post_dep"
- done
- fi
- pre_post_deps=
- fi
-
- deplibs=
- newdependency_libs=
- newlib_search_path=
- need_relink=no # whether we're linking any uninstalled libtool libraries
- notinst_deplibs= # not-installed libtool libraries
- notinst_path= # paths that contain not-installed libtool libraries
- case $linkmode in
- lib)
- passes="conv link"
- for file in $dlfiles $dlprefiles; do
- case $file in
- *.la) ;;
- *)
- $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
- exit 1
- ;;
- esac
- done
- ;;
- prog)
- compile_deplibs=
- finalize_deplibs=
- alldeplibs=no
- newdlfiles=
- newdlprefiles=
- passes="conv scan dlopen dlpreopen link"
- ;;
- *) passes="conv"
- ;;
- esac
- for pass in $passes; do
- if test "$linkmode" = prog; then
- # Determine which files to process
- case $pass in
- dlopen)
- libs="$dlfiles"
- save_deplibs="$deplibs" # Collect dlpreopened libraries
- deplibs=
- ;;
- dlpreopen) libs="$dlprefiles" ;;
- link) libs="$deplibs %DEPLIBS% $dependency_libs" ;;
- esac
- fi
- for deplib in $libs; do
- lib=
- found=no
- case $deplib in
- -l*)
- if test "$linkmode" = oldlib && test "$linkmode" = obj; then
- $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2
- continue
- fi
- if test "$pass" = conv; then
- deplibs="$deplib $deplibs"
- continue
- fi
- name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
- for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do
- # Search the libtool library
- lib="$searchdir/lib${name}.la"
- if test -f "$lib"; then
- found=yes
- break
- fi
- done
- if test "$found" != yes; then
- # deplib doesn't seem to be a libtool library
- if test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- deplibs="$deplib $deplibs"
- test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
- fi
- continue
- fi
- ;; # -l
- -L*)
- case $linkmode in
- lib)
- deplibs="$deplib $deplibs"
- test "$pass" = conv && continue
- newdependency_libs="$deplib $newdependency_libs"
- newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
- ;;
- prog)
- if test "$pass" = conv; then
- deplibs="$deplib $deplibs"
- continue
- fi
- if test "$pass" = scan; then
- deplibs="$deplib $deplibs"
- newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
- else
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- fi
- ;;
- *)
- $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2
- ;;
- esac # linkmode
- continue
- ;; # -L
- -R*)
- if test "$pass" = link; then
- dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
- # Make sure the xrpath contains only unique directories.
- case "$xrpath " in
- *" $dir "*) ;;
- *) xrpath="$xrpath $dir" ;;
- esac
- fi
- deplibs="$deplib $deplibs"
- continue
- ;;
- *.la) lib="$deplib" ;;
- *.$libext)
- if test "$pass" = conv; then
- deplibs="$deplib $deplibs"
- continue
- fi
- case $linkmode in
- lib)
- if test "$deplibs_check_method" != pass_all; then
- echo
- echo "*** Warning: This library needs some functionality provided by $deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- else
- echo
- echo "*** Warning: Linking the shared library $output against the"
- echo "*** static library $deplib is not portable!"
- deplibs="$deplib $deplibs"
- fi
- continue
- ;;
- prog)
- if test "$pass" != link; then
- deplibs="$deplib $deplibs"
- else
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- fi
- continue
- ;;
- esac # linkmode
- ;; # *.$libext
- *.lo | *.$objext)
- if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
- # If there is no dlopen support or we're linking statically,
- # we need to preload.
- newdlprefiles="$newdlprefiles $deplib"
- compile_deplibs="$deplib $compile_deplibs"
- finalize_deplibs="$deplib $finalize_deplibs"
- else
- newdlfiles="$newdlfiles $deplib"
- fi
- continue
- ;;
- %DEPLIBS%)
- alldeplibs=yes
- continue
- ;;
- esac # case $deplib
- if test "$found" = yes || test -f "$lib"; then :
- else
- $echo "$modename: cannot find the library \`$lib'" 1>&2
- exit 1
- fi
-
- # Check to see that this really is a libtool archive.
- if (sed -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
- else
- $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
- exit 1
- fi
-
- ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
- test "X$ladir" = "X$lib" && ladir="."
-
- dlname=
- dlopen=
- dlpreopen=
- libdir=
- library_names=
- old_library=
- # If the library was installed with an old release of libtool,
- # it will not redefine variable installed.
- installed=yes
-
- # Read the .la file
- case $lib in
- */* | *\\*) . $lib ;;
- *) . ./$lib ;;
- esac
-
- if test "$linkmode,$pass" = "lib,link" ||
- test "$linkmode,$pass" = "prog,scan" ||
- { test "$linkmode" = oldlib && test "$linkmode" = obj; }; then
- # Add dl[pre]opened files of deplib
- test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
- test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen"
- fi
-
- if test "$pass" = conv; then
- # Only check for convenience libraries
- deplibs="$lib $deplibs"
- if test -z "$libdir"; then
- if test -z "$old_library"; then
- $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
- exit 1
- fi
- # It is a libtool convenience library, so add in its objects.
- convenience="$convenience $ladir/$objdir/$old_library"
- old_convenience="$old_convenience $ladir/$objdir/$old_library"
- tmp_libs=
- for deplib in $dependency_libs; do
- deplibs="$deplib $deplibs"
- if test "X$duplicate_deps" = "Xyes" ; then
- case "$tmp_libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
- esac
- fi
- tmp_libs="$tmp_libs $deplib"
- done
- elif test "$linkmode" != prog && test "$linkmode" != lib; then
- $echo "$modename: \`$lib' is not a convenience library" 1>&2
- exit 1
- fi
- continue
- fi # $pass = conv
-
- # Get the name of the library we link against.
- linklib=
- for l in $old_library $library_names; do
- linklib="$l"
- done
- if test -z "$linklib"; then
- $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
- exit 1
- fi
-
- # This library was specified with -dlopen.
- if test "$pass" = dlopen; then
- if test -z "$libdir"; then
- $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
- exit 1
- fi
- if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
- # If there is no dlname, no dlopen support or we're linking
- # statically, we need to preload.
- dlprefiles="$dlprefiles $lib"
- else
- newdlfiles="$newdlfiles $lib"
- fi
- continue
- fi # $pass = dlopen
-
- # We need an absolute path.
- case $ladir in
- [\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
- *)
- abs_ladir=`cd "$ladir" && pwd`
- if test -z "$abs_ladir"; then
- $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
- $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
- abs_ladir="$ladir"
- fi
- ;;
- esac
- laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
-
- # Find the relevant object directory and library name.
- if test "X$installed" = Xyes; then
- if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
- $echo "$modename: warning: library \`$lib' was moved." 1>&2
- dir="$ladir"
- absdir="$abs_ladir"
- libdir="$abs_ladir"
- else
- dir="$libdir"
- absdir="$libdir"
- fi
- else
- dir="$ladir/$objdir"
- absdir="$abs_ladir/$objdir"
- # Remove this search path later
- notinst_path="$notinst_path $abs_ladir"
- fi # $installed = yes
- name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
-
- # This library was specified with -dlpreopen.
- if test "$pass" = dlpreopen; then
- if test -z "$libdir"; then
- $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
- exit 1
- fi
- # Prefer using a static library (so that no silly _DYNAMIC symbols
- # are required to link).
- if test -n "$old_library"; then
- newdlprefiles="$newdlprefiles $dir/$old_library"
- # Otherwise, use the dlname, so that lt_dlopen finds it.
- elif test -n "$dlname"; then
- newdlprefiles="$newdlprefiles $dir/$dlname"
- else
- newdlprefiles="$newdlprefiles $dir/$linklib"
- fi
- fi # $pass = dlpreopen
-
- if test -z "$libdir"; then
- # Link the convenience library
- if test "$linkmode" = lib; then
- deplibs="$dir/$old_library $deplibs"
- elif test "$linkmode,$pass" = "prog,link"; then
- compile_deplibs="$dir/$old_library $compile_deplibs"
- finalize_deplibs="$dir/$old_library $finalize_deplibs"
- else
- deplibs="$lib $deplibs"
- fi
- continue
- fi
-
- if test "$linkmode" = prog && test "$pass" != link; then
- newlib_search_path="$newlib_search_path $ladir"
- deplibs="$lib $deplibs"
-
- linkalldeplibs=no
- if test "$link_all_deplibs" != no || test -z "$library_names" ||
- test "$build_libtool_libs" = no; then
- linkalldeplibs=yes
- fi
-
- tmp_libs=
- for deplib in $dependency_libs; do
- case $deplib in
- -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
- esac
- # Need to link against all dependency_libs?
- if test "$linkalldeplibs" = yes; then
- deplibs="$deplib $deplibs"
- else
- # Need to hardcode shared library paths
- # or/and link against static libraries
- newdependency_libs="$deplib $newdependency_libs"
- fi
- if test "X$duplicate_deps" = "Xyes" ; then
- case "$tmp_libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
- esac
- fi
- tmp_libs="$tmp_libs $deplib"
- done # for deplib
- continue
- fi # $linkmode = prog...
-
- link_static=no # Whether the deplib will be linked statically
- if test -n "$library_names" &&
- { test "$prefer_static_libs" = no || test -z "$old_library"; }; then
- # Link against this shared library
-
- if test "$linkmode,$pass" = "prog,link" ||
- { test "$linkmode" = lib && test "$hardcode_into_libs" = yes; }; then
- # Hardcode the library path.
- # Skip directories that are in the system default run-time
- # search path.
- case " $sys_lib_dlsearch_path " in
- *" $absdir "*) ;;
- *)
- case "$compile_rpath " in
- *" $absdir "*) ;;
- *) compile_rpath="$compile_rpath $absdir"
- esac
- ;;
- esac
- case " $sys_lib_dlsearch_path " in
- *" $libdir "*) ;;
- *)
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) finalize_rpath="$finalize_rpath $libdir"
- esac
- ;;
- esac
- if test "$linkmode" = prog; then
- # We need to hardcode the library path
- if test -n "$shlibpath_var"; then
- # Make sure the rpath contains only unique directories.
- case "$temp_rpath " in
- *" $dir "*) ;;
- *" $absdir "*) ;;
- *) temp_rpath="$temp_rpath $dir" ;;
- esac
- fi
- fi
- fi # $linkmode,$pass = prog,link...
-
- if test "$alldeplibs" = yes &&
- { test "$deplibs_check_method" = pass_all ||
- { test "$build_libtool_libs" = yes &&
- test -n "$library_names"; }; }; then
- # We only need to search for static libraries
- continue
- fi
-
- if test "$installed" = no; then
- notinst_deplibs="$notinst_deplibs $lib"
- need_relink=yes
- fi
-
- if test -n "$old_archive_from_expsyms_cmds"; then
- # figure out the soname
- set dummy $library_names
- realname="$2"
- shift; shift
- libname=`eval \\$echo \"$libname_spec\"`
- # use dlname if we got it. it's perfectly good, no?
- if test -n "$dlname"; then
- soname="$dlname"
- elif test -n "$soname_spec"; then
- # bleh windows
- case $host in
- *cygwin*)
- major=`expr $current - $age`
- versuffix="-$major"
- ;;
- esac
- eval soname=\"$soname_spec\"
- else
- soname="$realname"
- fi
-
- # Make a new name for the extract_expsyms_cmds to use
- soroot="$soname"
- soname=`echo $soroot | sed -e 's/^.*\///'`
- newlib="libimp-`echo $soname | sed 's/^lib//;s/\.dll$//'`.a"
-
- # If the library has no export list, then create one now
- if test -f "$output_objdir/$soname-def"; then :
- else
- $show "extracting exported symbol list from \`$soname'"
- save_ifs="$IFS"; IFS='~'
- eval cmds=\"$extract_expsyms_cmds\"
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- fi
-
- # Create $newlib
- if test -f "$output_objdir/$newlib"; then :; else
- $show "generating import library for \`$soname'"
- save_ifs="$IFS"; IFS='~'
- eval cmds=\"$old_archive_from_expsyms_cmds\"
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- fi
- # make sure the library variables are pointing to the new library
- dir=$output_objdir
- linklib=$newlib
- fi # test -n "$old_archive_from_expsyms_cmds"
-
- if test "$linkmode" = prog || test "$mode" != relink; then
- add_shlibpath=
- add_dir=
- add=
- lib_linked=yes
- case $hardcode_action in
- immediate | unsupported)
- if test "$hardcode_direct" = no; then
- add="$dir/$linklib"
- elif test "$hardcode_minus_L" = no; then
- case $host in
- *-*-sunos*) add_shlibpath="$dir" ;;
- esac
- add_dir="-L$dir"
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = no; then
- add_shlibpath="$dir"
- add="-l$name"
- else
- lib_linked=no
- fi
- ;;
- relink)
- if test "$hardcode_direct" = yes; then
- add="$dir/$linklib"
- elif test "$hardcode_minus_L" = yes; then
- add_dir="-L$dir"
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = yes; then
- add_shlibpath="$dir"
- add="-l$name"
- else
- lib_linked=no
- fi
- ;;
- *) lib_linked=no ;;
- esac
-
- if test "$lib_linked" != yes; then
- $echo "$modename: configuration error: unsupported hardcode properties"
- exit 1
- fi
-
- if test -n "$add_shlibpath"; then
- case :$compile_shlibpath: in
- *":$add_shlibpath:"*) ;;
- *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;;
- esac
- fi
- if test "$linkmode" = prog; then
- test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
- test -n "$add" && compile_deplibs="$add $compile_deplibs"
- else
- test -n "$add_dir" && deplibs="$add_dir $deplibs"
- test -n "$add" && deplibs="$add $deplibs"
- if test "$hardcode_direct" != yes && \
- test "$hardcode_minus_L" != yes && \
- test "$hardcode_shlibpath_var" = yes; then
- case :$finalize_shlibpath: in
- *":$libdir:"*) ;;
- *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
- esac
- fi
- fi
- fi
-
- if test "$linkmode" = prog || test "$mode" = relink; then
- add_shlibpath=
- add_dir=
- add=
- # Finalize command for both is simple: just hardcode it.
- if test "$hardcode_direct" = yes; then
- add="$libdir/$linklib"
- elif test "$hardcode_minus_L" = yes; then
- # Try looking first in the location we're being installed to.
- add_dir=
- if test -n "$inst_prefix_dir"; then
- case "$libdir" in
- [\\/]*)
- add_dir="-L$inst_prefix_dir$libdir"
- ;;
- esac
- fi
- add_dir="$add_dir -L$libdir"
- add="-l$name"
- elif test "$hardcode_shlibpath_var" = yes; then
- case :$finalize_shlibpath: in
- *":$libdir:"*) ;;
- *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
- esac
- add="-l$name"
- else
- # We cannot seem to hardcode it, guess we'll fake it.
- # Try looking first in the location we're being installed to.
- add_dir=
- if test -n "$inst_prefix_dir"; then
- case "$libdir" in
- [\\/]*)
- add_dir="-L$inst_prefix_dir$libdir"
- ;;
- esac
- fi
- add_dir="$add_dir -L$libdir"
- add="-l$name"
- fi
-
- if test "$linkmode" = prog; then
- test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
- test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
- else
- test -n "$add_dir" && deplibs="$add_dir $deplibs"
- test -n "$add" && deplibs="$add $deplibs"
- fi
- fi
- elif test "$linkmode" = prog; then
- if test "$alldeplibs" = yes &&
- { test "$deplibs_check_method" = pass_all ||
- { test "$build_libtool_libs" = yes &&
- test -n "$library_names"; }; }; then
- # We only need to search for static libraries
- continue
- fi
-
- # Try to link the static library
- # Here we assume that one of hardcode_direct or hardcode_minus_L
- # is not unsupported. This is valid on all known static and
- # shared platforms.
- if test "$hardcode_direct" != unsupported; then
- test -n "$old_library" && linklib="$old_library"
- compile_deplibs="$dir/$linklib $compile_deplibs"
- finalize_deplibs="$dir/$linklib $finalize_deplibs"
- else
- compile_deplibs="-l$name -L$dir $compile_deplibs"
- finalize_deplibs="-l$name -L$dir $finalize_deplibs"
- fi
- elif test "$build_libtool_libs" = yes; then
- # Not a shared library
- if test "$deplibs_check_method" != pass_all; then
- # We're trying link a shared library against a static one
- # but the system doesn't support it.
-
- # Just print a warning and add the library to dependency_libs so
- # that the program can be linked against the static library.
- echo
- echo "*** Warning: This library needs some functionality provided by $lib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- if test "$module" = yes; then
- echo "*** Therefore, libtool will create a static module, that should work "
- echo "*** as long as the dlopening application is linked with the -dlopen flag."
- if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** \`nm' from GNU binutils and a full rebuild may help."
- fi
- if test "$build_old_libs" = no; then
- build_libtool_libs=module
- build_old_libs=yes
- else
- build_libtool_libs=no
- fi
- fi
- else
- convenience="$convenience $dir/$old_library"
- old_convenience="$old_convenience $dir/$old_library"
- deplibs="$dir/$old_library $deplibs"
- link_static=yes
- fi
- fi # link shared/static library?
-
- if test "$linkmode" = lib; then
- if test -n "$dependency_libs" &&
- { test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes ||
- test "$link_static" = yes; }; then
- # Extract -R from dependency_libs
- temp_deplibs=
- for libdir in $dependency_libs; do
- case $libdir in
- -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
- case " $xrpath " in
- *" $temp_xrpath "*) ;;
- *) xrpath="$xrpath $temp_xrpath";;
- esac;;
- *) temp_deplibs="$temp_deplibs $libdir";;
- esac
- done
- dependency_libs="$temp_deplibs"
- fi
-
- newlib_search_path="$newlib_search_path $absdir"
- # Link against this library
- test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
- # ... and its dependency_libs
- tmp_libs=
- for deplib in $dependency_libs; do
- newdependency_libs="$deplib $newdependency_libs"
- if test "X$duplicate_deps" = "Xyes" ; then
- case "$tmp_libs " in
- *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
- esac
- fi
- tmp_libs="$tmp_libs $deplib"
- done
-
- if test "$link_all_deplibs" != no; then
- # Add the search paths of all dependency libraries
- for deplib in $dependency_libs; do
- case $deplib in
- -L*) path="$deplib" ;;
- *.la)
- dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
- test "X$dir" = "X$deplib" && dir="."
- # We need an absolute path.
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
- *)
- absdir=`cd "$dir" && pwd`
- if test -z "$absdir"; then
- $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
- absdir="$dir"
- fi
- ;;
- esac
- if grep "^installed=no" $deplib > /dev/null; then
- path="-L$absdir/$objdir"
- else
- eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
- if test -z "$libdir"; then
- $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
- exit 1
- fi
- if test "$absdir" != "$libdir"; then
- $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
- fi
- path="-L$absdir"
- fi
- ;;
- *) continue ;;
- esac
- case " $deplibs " in
- *" $path "*) ;;
- *) deplibs="$deplibs $path" ;;
- esac
- done
- fi # link_all_deplibs != no
- fi # linkmode = lib
- done # for deplib in $libs
- if test "$pass" = dlpreopen; then
- # Link the dlpreopened libraries before other libraries
- for deplib in $save_deplibs; do
- deplibs="$deplib $deplibs"
- done
- fi
- if test "$pass" != dlopen; then
- test "$pass" != scan && dependency_libs="$newdependency_libs"
- if test "$pass" != conv; then
- # Make sure lib_search_path contains only unique directories.
- lib_search_path=
- for dir in $newlib_search_path; do
- case "$lib_search_path " in
- *" $dir "*) ;;
- *) lib_search_path="$lib_search_path $dir" ;;
- esac
- done
- newlib_search_path=
- fi
-
- if test "$linkmode,$pass" != "prog,link"; then
- vars="deplibs"
- else
- vars="compile_deplibs finalize_deplibs"
- fi
- for var in $vars dependency_libs; do
- # Add libraries to $var in reverse order
- eval tmp_libs=\"\$$var\"
- new_libs=
- for deplib in $tmp_libs; do
- case $deplib in
- -L*) new_libs="$deplib $new_libs" ;;
- *)
- case " $specialdeplibs " in
- *" $deplib "*) new_libs="$deplib $new_libs" ;;
- *)
- case " $new_libs " in
- *" $deplib "*) ;;
- *) new_libs="$deplib $new_libs" ;;
- esac
- ;;
- esac
- ;;
- esac
- done
- tmp_libs=
- for deplib in $new_libs; do
- case $deplib in
- -L*)
- case " $tmp_libs " in
- *" $deplib "*) ;;
- *) tmp_libs="$tmp_libs $deplib" ;;
- esac
- ;;
- *) tmp_libs="$tmp_libs $deplib" ;;
- esac
- done
- eval $var=\"$tmp_libs\"
- done # for var
- fi
- if test "$pass" = "conv" &&
- { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then
- libs="$deplibs" # reset libs
- deplibs=
- fi
- done # for pass
- if test "$linkmode" = prog; then
- dlfiles="$newdlfiles"
- dlprefiles="$newdlprefiles"
- fi
-
- case $linkmode in
- oldlib)
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
- fi
-
- if test -n "$rpath"; then
- $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
- fi
-
- if test -n "$xrpath"; then
- $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
- fi
-
- if test -n "$vinfo"; then
- $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2
- fi
-
- if test -n "$release"; then
- $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
- fi
-
- if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
- $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
- fi
-
- # Now set the variables for building old libraries.
- build_libtool_libs=no
- oldlibs="$output"
- objs="$objs$old_deplibs"
- ;;
-
- lib)
- # Make sure we only generate libraries of the form `libNAME.la'.
- case $outputname in
- lib*)
- name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
- eval libname=\"$libname_spec\"
- ;;
- *)
- if test "$module" = no; then
- $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
- if test "$need_lib_prefix" != no; then
- # Add the "lib" prefix for modules if required
- name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
- eval libname=\"$libname_spec\"
- else
- libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
- fi
- ;;
- esac
-
- if test -n "$objs"; then
- if test "$deplibs_check_method" != pass_all; then
- $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
- exit 1
- else
- echo
- echo "*** Warning: Linking the shared library $output against the non-libtool"
- echo "*** objects $objs is not portable!"
- libobjs="$libobjs $objs"
- fi
- fi
-
- if test "$dlself" != no; then
- $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
- fi
-
- set dummy $rpath
- if test "$#" -gt 2; then
- $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
- fi
- install_libdir="$2"
-
- oldlibs=
- if test -z "$rpath"; then
- if test "$build_libtool_libs" = yes; then
- # Building a libtool convenience library.
- libext=al
- oldlibs="$output_objdir/$libname.$libext $oldlibs"
- build_libtool_libs=convenience
- build_old_libs=yes
- fi
-
- if test -n "$vinfo"; then
- $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2
- fi
-
- if test -n "$release"; then
- $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
- fi
- else
-
- # Parse the version information argument.
- save_ifs="$IFS"; IFS=':'
- set dummy $vinfo 0 0 0
- IFS="$save_ifs"
-
- if test -n "$8"; then
- $echo "$modename: too many parameters to \`-version-info'" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- current="$2"
- revision="$3"
- age="$4"
-
- # Check that each of the things are valid numbers.
- case $current in
- [0-9]*) ;;
- *)
- $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
- $echo "$modename: \`$vinfo' is not valid version information" 1>&2
- exit 1
- ;;
- esac
-
- case $revision in
- [0-9]*) ;;
- *)
- $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
- $echo "$modename: \`$vinfo' is not valid version information" 1>&2
- exit 1
- ;;
- esac
-
- case $age in
- [0-9]*) ;;
- *)
- $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
- $echo "$modename: \`$vinfo' is not valid version information" 1>&2
- exit 1
- ;;
- esac
-
- if test "$age" -gt "$current"; then
- $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
- $echo "$modename: \`$vinfo' is not valid version information" 1>&2
- exit 1
- fi
-
- # Calculate the version variables.
- major=
- versuffix=
- verstring=
- case $version_type in
- none) ;;
-
- darwin)
- # Like Linux, but with the current version available in
- # verstring for coding it into the library header
- major=.`expr $current - $age`
- versuffix="$major.$age.$revision"
- # Darwin ld doesn't like 0 for these options...
- minor_current=`expr $current + 1`
- verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
- ;;
-
- freebsd-aout)
- major=".$current"
- versuffix=".$current.$revision";
- ;;
-
- freebsd-elf)
- major=".$current"
- versuffix=".$current";
- ;;
-
- irix)
- major=`expr $current - $age + 1`
- verstring="sgi$major.$revision"
-
- # Add in all the interfaces that we are compatible with.
- loop=$revision
- while test "$loop" -ne 0; do
- iface=`expr $revision - $loop`
- loop=`expr $loop - 1`
- verstring="sgi$major.$iface:$verstring"
- done
-
- # Before this point, $major must not contain `.'.
- major=.$major
- versuffix="$major.$revision"
- ;;
-
- linux)
- major=.`expr $current - $age`
- versuffix="$major.$age.$revision"
- ;;
-
- osf)
- major=`expr $current - $age`
- versuffix=".$current.$age.$revision"
- verstring="$current.$age.$revision"
-
- # Add in all the interfaces that we are compatible with.
- loop=$age
- while test "$loop" -ne 0; do
- iface=`expr $current - $loop`
- loop=`expr $loop - 1`
- verstring="$verstring:${iface}.0"
- done
-
- # Make executables depend on our current version.
- verstring="$verstring:${current}.0"
- ;;
-
- sunos)
- major=".$current"
- versuffix=".$current.$revision"
- ;;
-
- windows)
- # Use '-' rather than '.', since we only want one
- # extension on DOS 8.3 filesystems.
- major=`expr $current - $age`
- versuffix="-$major"
- ;;
-
- *)
- $echo "$modename: unknown library version type \`$version_type'" 1>&2
- echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
- exit 1
- ;;
- esac
-
- # Clear the version info if we defaulted, and they specified a release.
- if test -z "$vinfo" && test -n "$release"; then
- major=
- verstring="0.0"
- case $version_type in
- darwin)
- # we can't check for "0.0" in archive_cmds due to quoting
- # problems, so we reset it completely
- verstring=""
- ;;
- *)
- verstring="0.0"
- ;;
- esac
- if test "$need_version" = no; then
- versuffix=
- else
- versuffix=".0.0"
- fi
- fi
-
- # Remove version info from name if versioning should be avoided
- if test "$avoid_version" = yes && test "$need_version" = no; then
- major=
- versuffix=
- verstring=""
- fi
-
- # Check to see if the archive will have undefined symbols.
- if test "$allow_undefined" = yes; then
- if test "$allow_undefined_flag" = unsupported; then
- $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
- build_libtool_libs=no
- build_old_libs=yes
- fi
- else
- # Don't allow undefined symbols.
- allow_undefined_flag="$no_undefined_flag"
- fi
- fi
-
- if test "$mode" != relink; then
- # Remove our outputs.
- $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*"
- $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*
- fi
-
- # Now set the variables for building old libraries.
- if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
- oldlibs="$oldlibs $output_objdir/$libname.$libext"
-
- # Transform .lo files to .o files.
- oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
- fi
-
- # Eliminate all temporary directories.
- for path in $notinst_path; do
- lib_search_path=`echo "$lib_search_path " | sed -e 's% $path % %g'`
- deplibs=`echo "$deplibs " | sed -e 's% -L$path % %g'`
- dependency_libs=`echo "$dependency_libs " | sed -e 's% -L$path % %g'`
- done
-
- if test -n "$xrpath"; then
- # If the user specified any rpath flags, then add them.
- temp_xrpath=
- for libdir in $xrpath; do
- temp_xrpath="$temp_xrpath -R$libdir"
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) finalize_rpath="$finalize_rpath $libdir" ;;
- esac
- done
- if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
- dependency_libs="$temp_xrpath $dependency_libs"
- fi
- fi
-
- # Make sure dlfiles contains only unique files that won't be dlpreopened
- old_dlfiles="$dlfiles"
- dlfiles=
- for lib in $old_dlfiles; do
- case " $dlprefiles $dlfiles " in
- *" $lib "*) ;;
- *) dlfiles="$dlfiles $lib" ;;
- esac
- done
-
- # Make sure dlprefiles contains only unique files
- old_dlprefiles="$dlprefiles"
- dlprefiles=
- for lib in $old_dlprefiles; do
- case "$dlprefiles " in
- *" $lib "*) ;;
- *) dlprefiles="$dlprefiles $lib" ;;
- esac
- done
-
- if test "$build_libtool_libs" = yes; then
- if test -n "$rpath"; then
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
- # these systems don't actually have a c library (as such)!
- ;;
- *-*-rhapsody* | *-*-darwin1.[012])
- # Rhapsody C library is in the System framework
- deplibs="$deplibs -framework System"
- ;;
- *-*-netbsd*)
- # Don't link with libc until the a.out ld.so is fixed.
- ;;
- *-*-openbsd*)
- # Do not include libc due to us having libc/libc_r.
- ;;
- *)
- # Add libc to deplibs on all other systems if necessary.
- if test "$build_libtool_need_lc" = "yes"; then
- deplibs="$deplibs -lc"
- fi
- ;;
- esac
- fi
-
- # Transform deplibs into only deplibs that can be linked in shared.
- name_save=$name
- libname_save=$libname
- release_save=$release
- versuffix_save=$versuffix
- major_save=$major
- # I'm not sure if I'm treating the release correctly. I think
- # release should show up in the -l (ie -lgmp5) so we don't want to
- # add it in twice. Is that correct?
- release=""
- versuffix=""
- major=""
- newdeplibs=
- droppeddeps=no
- case $deplibs_check_method in
- pass_all)
- # Don't check for shared/static. Everything works.
- # This might be a little naive. We might want to check
- # whether the library exists or not. But this is on
- # osf3 & osf4 and I'm not really sure... Just
- # implementing what was already the behaviour.
- newdeplibs=$deplibs
- ;;
- test_compile)
- # This code stresses the "libraries are programs" paradigm to its
- # limits. Maybe even breaks it. We compile a program, linking it
- # against the deplibs as a proxy for the library. Then we can check
- # whether they linked in statically or dynamically with ldd.
- $rm conftest.c
- cat > conftest.c <<EOF
- int main() { return 0; }
-EOF
- $rm conftest
- $CC -o conftest conftest.c $deplibs
- if test "$?" -eq 0 ; then
- ldd_output=`ldd conftest`
- for i in $deplibs; do
- name="`expr $i : '-l\(.*\)'`"
- # If $name is empty we are operating on a -L argument.
- if test -n "$name" && test "$name" != "0"; then
- libname=`eval \\$echo \"$libname_spec\"`
- deplib_matches=`eval \\$echo \"$library_names_spec\"`
- set dummy $deplib_matches
- deplib_match=$2
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
- newdeplibs="$newdeplibs $i"
- else
- droppeddeps=yes
- echo
- echo "*** Warning: This library needs some functionality provided by $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- fi
- else
- newdeplibs="$newdeplibs $i"
- fi
- done
- else
- # Error occured in the first compile. Let's try to salvage the situation:
- # Compile a seperate program for each library.
- for i in $deplibs; do
- name="`expr $i : '-l\(.*\)'`"
- # If $name is empty we are operating on a -L argument.
- if test -n "$name" && test "$name" != "0"; then
- $rm conftest
- $CC -o conftest conftest.c $i
- # Did it work?
- if test "$?" -eq 0 ; then
- ldd_output=`ldd conftest`
- libname=`eval \\$echo \"$libname_spec\"`
- deplib_matches=`eval \\$echo \"$library_names_spec\"`
- set dummy $deplib_matches
- deplib_match=$2
- if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
- newdeplibs="$newdeplibs $i"
- else
- droppeddeps=yes
- echo
- echo "*** Warning: This library needs some functionality provided by $i."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- fi
- else
- droppeddeps=yes
- echo
- echo "*** Warning! Library $i is needed by this library but I was not able to"
- echo "*** make it link in! You will probably need to install it or some"
- echo "*** library that it depends on before this library will be fully"
- echo "*** functional. Installing it before continuing would be even better."
- fi
- else
- newdeplibs="$newdeplibs $i"
- fi
- done
- fi
- ;;
- file_magic*)
- set dummy $deplibs_check_method
- file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
- for a_deplib in $deplibs; do
- name="`expr $a_deplib : '-l\(.*\)'`"
- # If $name is empty we are operating on a -L argument.
- if test -n "$name" && test "$name" != "0"; then
- libname=`eval \\$echo \"$libname_spec\"`
- for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
- potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
- for potent_lib in $potential_libs; do
- # Follow soft links.
- if ls -lLd "$potent_lib" 2>/dev/null \
- | grep " -> " >/dev/null; then
- continue
- fi
- # The statement above tries to avoid entering an
- # endless loop below, in case of cyclic links.
- # We might still enter an endless loop, since a link
- # loop can be closed while we follow links,
- # but so what?
- potlib="$potent_lib"
- while test -h "$potlib" 2>/dev/null; do
- potliblink=`ls -ld $potlib | sed 's/.* -> //'`
- case $potliblink in
- [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
- *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
- esac
- done
- if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
- | sed 10q \
- | egrep "$file_magic_regex" > /dev/null; then
- newdeplibs="$newdeplibs $a_deplib"
- a_deplib=""
- break 2
- fi
- done
- done
- if test -n "$a_deplib" ; then
- droppeddeps=yes
- echo
- echo "*** Warning: This library needs some functionality provided by $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- fi
- else
- # Add a -L argument.
- newdeplibs="$newdeplibs $a_deplib"
- fi
- done # Gone through all deplibs.
- ;;
- match_pattern*)
- set dummy $deplibs_check_method
- match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
- for a_deplib in $deplibs; do
- name="`expr $a_deplib : '-l\(.*\)'`"
- # If $name is empty we are operating on a -L argument.
- if test -n "$name" && test "$name" != "0"; then
- libname=`eval \\$echo \"$libname_spec\"`
- for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
- potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
- for potent_lib in $potential_libs; do
- if eval echo \"$potent_lib\" 2>/dev/null \
- | sed 10q \
- | egrep "$match_pattern_regex" > /dev/null; then
- newdeplibs="$newdeplibs $a_deplib"
- a_deplib=""
- break 2
- fi
- done
- done
- if test -n "$a_deplib" ; then
- droppeddeps=yes
- echo
- echo "*** Warning: This library needs some functionality provided by $a_deplib."
- echo "*** I have the capability to make that library automatically link in when"
- echo "*** you link to this library. But I can only do this if you have a"
- echo "*** shared version of the library, which you do not appear to have."
- fi
- else
- # Add a -L argument.
- newdeplibs="$newdeplibs $a_deplib"
- fi
- done # Gone through all deplibs.
- ;;
- none | unknown | *)
- newdeplibs=""
- if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
- -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' |
- grep . >/dev/null; then
- echo
- if test "X$deplibs_check_method" = "Xnone"; then
- echo "*** Warning: inter-library dependencies are not supported in this platform."
- else
- echo "*** Warning: inter-library dependencies are not known to be supported."
- fi
- echo "*** All declared inter-library dependencies are being dropped."
- droppeddeps=yes
- fi
- ;;
- esac
- versuffix=$versuffix_save
- major=$major_save
- release=$release_save
- libname=$libname_save
- name=$name_save
-
- case $host in
- *-*-rhapsody* | *-*-darwin1.[012])
- # On Rhapsody replace the C library is the System framework
- newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
- ;;
- esac
-
- if test "$droppeddeps" = yes; then
- if test "$module" = yes; then
- echo
- echo "*** Warning: libtool could not satisfy all declared inter-library"
- echo "*** dependencies of module $libname. Therefore, libtool will create"
- echo "*** a static module, that should work as long as the dlopening"
- echo "*** application is linked with the -dlopen flag."
- if test -z "$global_symbol_pipe"; then
- echo
- echo "*** However, this would only work if libtool was able to extract symbol"
- echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
- echo "*** not find such a program. So, this module is probably useless."
- echo "*** \`nm' from GNU binutils and a full rebuild may help."
- fi
- if test "$build_old_libs" = no; then
- oldlibs="$output_objdir/$libname.$libext"
- build_libtool_libs=module
- build_old_libs=yes
- else
- build_libtool_libs=no
- fi
- else
- echo "*** The inter-library dependencies that have been dropped here will be"
- echo "*** automatically added whenever a program is linked with this library"
- echo "*** or is declared to -dlopen it."
-
- if test "$allow_undefined" = no; then
- echo
- echo "*** Since this library must not contain undefined symbols,"
- echo "*** because either the platform does not support them or"
- echo "*** it was explicitly requested with -no-undefined,"
- echo "*** libtool will only create a static version of it."
- if test "$build_old_libs" = no; then
- oldlibs="$output_objdir/$libname.$libext"
- build_libtool_libs=module
- build_old_libs=yes
- else
- build_libtool_libs=no
- fi
- fi
- fi
- fi
- # Done checking deplibs!
- deplibs=$newdeplibs
- fi
-
- # All the library-specific variables (install_libdir is set above).
- library_names=
- old_library=
- dlname=
-
- # Test again, we may have decided not to build it any more
- if test "$build_libtool_libs" = yes; then
- if test "$hardcode_into_libs" = yes; then
- # Hardcode the library paths
- hardcode_libdirs=
- dep_rpath=
- rpath="$finalize_rpath"
- test "$mode" != relink && rpath="$compile_rpath$rpath"
- for libdir in $rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- dep_rpath="$dep_rpath $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$perm_rpath " in
- *" $libdir "*) ;;
- *) perm_rpath="$perm_rpath $libdir" ;;
- esac
- fi
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval dep_rpath=\"$hardcode_libdir_flag_spec\"
- fi
- if test -n "$runpath_var" && test -n "$perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $perm_rpath; do
- rpath="$rpath$dir:"
- done
- eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
- fi
- test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
- fi
-
- shlibpath="$finalize_shlibpath"
- test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
- if test -n "$shlibpath"; then
- eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
- fi
-
- # Get the real and link names of the library.
- eval library_names=\"$library_names_spec\"
- set dummy $library_names
- realname="$2"
- shift; shift
-
- if test -n "$soname_spec"; then
- eval soname=\"$soname_spec\"
- else
- soname="$realname"
- fi
- test -z "$dlname" && dlname=$soname
-
- lib="$output_objdir/$realname"
- for link
- do
- linknames="$linknames $link"
- done
-
- # Ensure that we have .o objects for linkers which dislike .lo
- # (e.g. aix) in case we are running --disable-static
- for obj in $libobjs; do
- xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$xdir" = "X$obj"; then
- xdir="."
- else
- xdir="$xdir"
- fi
- baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
- oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
- if test ! -f $xdir/$oldobj; then
- $show "(cd $xdir && ${LN_S} $baseobj $oldobj)"
- $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $?
- fi
- done
-
- # Use standard objects if they are pic
- test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
-
- # Prepare the list of exported symbols
- if test -z "$export_symbols"; then
- if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
- $show "generating symbol list for \`$libname.la'"
- export_symbols="$output_objdir/$libname.exp"
- $run $rm $export_symbols
- eval cmds=\"$export_symbols_cmds\"
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- if test -n "$export_symbols_regex"; then
- $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
- $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
- $show "$mv \"${export_symbols}T\" \"$export_symbols\""
- $run eval '$mv "${export_symbols}T" "$export_symbols"'
- fi
- fi
- fi
-
- if test -n "$export_symbols" && test -n "$include_expsyms"; then
- $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
- fi
-
- if test -n "$convenience"; then
- if test -n "$whole_archive_flag_spec"; then
- eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
- else
- gentop="$output_objdir/${outputname}x"
- $show "${rm}r $gentop"
- $run ${rm}r "$gentop"
- $show "mkdir $gentop"
- $run mkdir "$gentop"
- status=$?
- if test "$status" -ne 0 && test ! -d "$gentop"; then
- exit $status
- fi
- generated="$generated $gentop"
-
- for xlib in $convenience; do
- # Extract the objects.
- case $xlib in
- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
- *) xabs=`pwd`"/$xlib" ;;
- esac
- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
- xdir="$gentop/$xlib"
-
- $show "${rm}r $xdir"
- $run ${rm}r "$xdir"
- $show "mkdir $xdir"
- $run mkdir "$xdir"
- status=$?
- if test "$status" -ne 0 && test ! -d "$xdir"; then
- exit $status
- fi
- $show "(cd $xdir && $AR x $xabs)"
- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
-
- libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
- done
- fi
- fi
-
- if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
- eval flag=\"$thread_safe_flag_spec\"
- linker_flags="$linker_flags $flag"
- fi
-
- # Make a backup of the uninstalled library when relinking
- if test "$mode" = relink; then
- $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $?
- fi
-
- # Do each of the archive commands.
- if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
- eval cmds=\"$archive_expsym_cmds\"
- else
- eval cmds=\"$archive_cmds\"
- fi
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
-
- # Restore the uninstalled library and exit
- if test "$mode" = relink; then
- $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $?
- exit 0
- fi
-
- # Create links to the real library.
- for linkname in $linknames; do
- if test "$realname" != "$linkname"; then
- $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
- $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $?
- fi
- done
-
- # If -module or -export-dynamic was specified, set the dlname.
- if test "$module" = yes || test "$export_dynamic" = yes; then
- # On all known operating systems, these are identical.
- dlname="$soname"
- fi
- fi
- ;;
-
- obj)
- if test -n "$deplibs"; then
- $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
- fi
-
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
- fi
-
- if test -n "$rpath"; then
- $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
- fi
-
- if test -n "$xrpath"; then
- $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
- fi
-
- if test -n "$vinfo"; then
- $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
- fi
-
- if test -n "$release"; then
- $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
- fi
-
- case $output in
- *.lo)
- if test -n "$objs$old_deplibs"; then
- $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
- exit 1
- fi
- libobj="$output"
- obj=`$echo "X$output" | $Xsed -e "$lo2o"`
- ;;
- *)
- libobj=
- obj="$output"
- ;;
- esac
-
- # Delete the old objects.
- $run $rm $obj $libobj
-
- # Objects from convenience libraries. This assumes
- # single-version convenience libraries. Whenever we create
- # different ones for PIC/non-PIC, this we'll have to duplicate
- # the extraction.
- reload_conv_objs=
- gentop=
- # reload_cmds runs $LD directly, so let us get rid of
- # -Wl from whole_archive_flag_spec
- wl=
-
- if test -n "$convenience"; then
- if test -n "$whole_archive_flag_spec"; then
- eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
- else
- gentop="$output_objdir/${obj}x"
- $show "${rm}r $gentop"
- $run ${rm}r "$gentop"
- $show "mkdir $gentop"
- $run mkdir "$gentop"
- status=$?
- if test "$status" -ne 0 && test ! -d "$gentop"; then
- exit $status
- fi
- generated="$generated $gentop"
-
- for xlib in $convenience; do
- # Extract the objects.
- case $xlib in
- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
- *) xabs=`pwd`"/$xlib" ;;
- esac
- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
- xdir="$gentop/$xlib"
-
- $show "${rm}r $xdir"
- $run ${rm}r "$xdir"
- $show "mkdir $xdir"
- $run mkdir "$xdir"
- status=$?
- if test "$status" -ne 0 && test ! -d "$xdir"; then
- exit $status
- fi
- $show "(cd $xdir && $AR x $xabs)"
- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
-
- reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP`
- done
- fi
- fi
-
- # Create the old-style object.
- reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
-
- output="$obj"
- eval cmds=\"$reload_cmds\"
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
-
- # Exit if we aren't doing a library object file.
- if test -z "$libobj"; then
- if test -n "$gentop"; then
- $show "${rm}r $gentop"
- $run ${rm}r $gentop
- fi
-
- exit 0
- fi
-
- if test "$build_libtool_libs" != yes; then
- if test -n "$gentop"; then
- $show "${rm}r $gentop"
- $run ${rm}r $gentop
- fi
-
- # Create an invalid libtool object if no PIC, so that we don't
- # accidentally link it into a program.
- $show "echo timestamp > $libobj"
- $run eval "echo timestamp > $libobj" || exit $?
- exit 0
- fi
-
- if test -n "$pic_flag" || test "$pic_mode" != default; then
- # Only do commands if we really have different PIC objects.
- reload_objs="$libobjs $reload_conv_objs"
- output="$libobj"
- eval cmds=\"$reload_cmds\"
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- else
- # Just create a symlink.
- $show $rm $libobj
- $run $rm $libobj
- xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$xdir" = "X$libobj"; then
- xdir="."
- else
- xdir="$xdir"
- fi
- baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'`
- oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"`
- $show "(cd $xdir && $LN_S $oldobj $baseobj)"
- $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $?
- fi
-
- if test -n "$gentop"; then
- $show "${rm}r $gentop"
- $run ${rm}r $gentop
- fi
-
- exit 0
- ;;
-
- prog)
- case $host in
- *cygwin*) output=`echo $output | sed -e 's,.exe$,,;s,$,.exe,'` ;;
- esac
- if test -n "$vinfo"; then
- $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
- fi
-
- if test -n "$release"; then
- $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
- fi
-
- if test "$preload" = yes; then
- if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
- test "$dlopen_self_static" = unknown; then
- $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
- fi
- fi
-
- case $host in
- *-*-rhapsody* | *-*-darwin1.[012])
- # On Rhapsody replace the C library is the System framework
- compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
- finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
- ;;
- esac
-
- compile_command="$compile_command $compile_deplibs"
- finalize_command="$finalize_command $finalize_deplibs"
-
- if test -n "$rpath$xrpath"; then
- # If the user specified any rpath flags, then add them.
- for libdir in $rpath $xrpath; do
- # This is the magic to use -rpath.
- case "$finalize_rpath " in
- *" $libdir "*) ;;
- *) finalize_rpath="$finalize_rpath $libdir" ;;
- esac
- done
- fi
-
- # Now hardcode the library paths
- rpath=
- hardcode_libdirs=
- for libdir in $compile_rpath $finalize_rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- rpath="$rpath $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$perm_rpath " in
- *" $libdir "*) ;;
- *) perm_rpath="$perm_rpath $libdir" ;;
- esac
- fi
- case $host in
- *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
- case :$dllsearchpath: in
- *":$libdir:"*) ;;
- *) dllsearchpath="$dllsearchpath:$libdir";;
- esac
- ;;
- esac
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval rpath=\" $hardcode_libdir_flag_spec\"
- fi
- compile_rpath="$rpath"
-
- rpath=
- hardcode_libdirs=
- for libdir in $finalize_rpath; do
- if test -n "$hardcode_libdir_flag_spec"; then
- if test -n "$hardcode_libdir_separator"; then
- if test -z "$hardcode_libdirs"; then
- hardcode_libdirs="$libdir"
- else
- # Just accumulate the unique libdirs.
- case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
- *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
- ;;
- *)
- hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
- ;;
- esac
- fi
- else
- eval flag=\"$hardcode_libdir_flag_spec\"
- rpath="$rpath $flag"
- fi
- elif test -n "$runpath_var"; then
- case "$finalize_perm_rpath " in
- *" $libdir "*) ;;
- *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;;
- esac
- fi
- done
- # Substitute the hardcoded libdirs into the rpath.
- if test -n "$hardcode_libdir_separator" &&
- test -n "$hardcode_libdirs"; then
- libdir="$hardcode_libdirs"
- eval rpath=\" $hardcode_libdir_flag_spec\"
- fi
- finalize_rpath="$rpath"
-
- if test -n "$libobjs" && test "$build_old_libs" = yes; then
- # Transform all the library objects into standard objects.
- compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
- finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
- fi
-
- dlsyms=
- if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
- if test -n "$NM" && test -n "$global_symbol_pipe"; then
- dlsyms="${outputname}S.c"
- else
- $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
- fi
- fi
-
- if test -n "$dlsyms"; then
- case $dlsyms in
- "") ;;
- *.c)
- # Discover the nlist of each of the dlfiles.
- nlist="$output_objdir/${outputname}.nm"
-
- $show "$rm $nlist ${nlist}S ${nlist}T"
- $run $rm "$nlist" "${nlist}S" "${nlist}T"
-
- # Parse the name list into a source file.
- $show "creating $output_objdir/$dlsyms"
-
- test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
-/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
-/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
-
-#ifdef __cplusplus
-extern \"C\" {
-#endif
-
-/* Prevent the only kind of declaration conflicts we can make. */
-#define lt_preloaded_symbols some_other_symbol
-
-/* External symbol declarations for the compiler. */\
-"
-
- if test "$dlself" = yes; then
- $show "generating symbol list for \`$output'"
-
- test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
-
- # Add our own program objects to the symbol list.
- progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
- for arg in $progfiles; do
- $show "extracting global C symbols from \`$arg'"
- $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
- done
-
- if test -n "$exclude_expsyms"; then
- $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
- $run eval '$mv "$nlist"T "$nlist"'
- fi
-
- if test -n "$export_symbols_regex"; then
- $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T'
- $run eval '$mv "$nlist"T "$nlist"'
- fi
-
- # Prepare the list of exported symbols
- if test -z "$export_symbols"; then
- export_symbols="$output_objdir/$output.exp"
- $run $rm $export_symbols
- $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
- else
- $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"'
- $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T'
- $run eval 'mv "$nlist"T "$nlist"'
- fi
- fi
-
- for arg in $dlprefiles; do
- $show "extracting global C symbols from \`$arg'"
- name=`echo "$arg" | sed -e 's%^.*/%%'`
- $run eval 'echo ": $name " >> "$nlist"'
- $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
- done
-
- if test -z "$run"; then
- # Make sure we have at least an empty file.
- test -f "$nlist" || : > "$nlist"
-
- if test -n "$exclude_expsyms"; then
- egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
- $mv "$nlist"T "$nlist"
- fi
-
- # Try sorting and uniquifying the output.
- if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then
- :
- else
- grep -v "^: " < "$nlist" > "$nlist"S
- fi
-
- if test -f "$nlist"S; then
- eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"'
- else
- echo '/* NONE */' >> "$output_objdir/$dlsyms"
- fi
-
- $echo >> "$output_objdir/$dlsyms" "\
-
-#undef lt_preloaded_symbols
-
-#if defined (__STDC__) && __STDC__
-# define lt_ptr void *
-#else
-# define lt_ptr char *
-# define const
-#endif
-
-/* The mapping between symbol names and symbols. */
-const struct {
- const char *name;
- lt_ptr address;
-}
-lt_preloaded_symbols[] =
-{\
-"
-
- eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
-
- $echo >> "$output_objdir/$dlsyms" "\
- {0, (lt_ptr) 0}
-};
-
-/* This works around a problem in FreeBSD linker */
-#ifdef FREEBSD_WORKAROUND
-static const void *lt_preloaded_setup() {
- return lt_preloaded_symbols;
-}
-#endif
-
-#ifdef __cplusplus
-}
-#endif\
-"
- fi
-
- pic_flag_for_symtable=
- case $host in
- # compiling the symbol table file with pic_flag works around
- # a FreeBSD bug that causes programs to crash when -lm is
- # linked before any other PIC object. But we must not use
- # pic_flag when linking with -static. The problem exists in
- # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
- *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
- case "$compile_command " in
- *" -static "*) ;;
- *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";;
- esac;;
- *-*-hpux*)
- case "$compile_command " in
- *" -static "*) ;;
- *) pic_flag_for_symtable=" $pic_flag -DPIC";;
- esac
- esac
-
- # Now compile the dynamic symbol file.
- $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
- $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
-
- # Clean up the generated files.
- $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
- $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
-
- # Transform the symbol file into the correct name.
- compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
- finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
- ;;
- *)
- $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
- exit 1
- ;;
- esac
- else
- # We keep going just in case the user didn't refer to
- # lt_preloaded_symbols. The linker will fail if global_symbol_pipe
- # really was required.
-
- # Nullify the symbol file.
- compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
- finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
- fi
-
- if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
- # Replace the output file specification.
- compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
- link_command="$compile_command$compile_rpath"
-
- # We have no uninstalled library dependencies, so finalize right now.
- $show "$link_command"
- $run eval "$link_command"
- status=$?
-
- # Delete the generated files.
- if test -n "$dlsyms"; then
- $show "$rm $output_objdir/${outputname}S.${objext}"
- $run $rm "$output_objdir/${outputname}S.${objext}"
- fi
-
- exit $status
- fi
-
- if test -n "$shlibpath_var"; then
- # We should set the shlibpath_var
- rpath=
- for dir in $temp_rpath; do
- case $dir in
- [\\/]* | [A-Za-z]:[\\/]*)
- # Absolute path.
- rpath="$rpath$dir:"
- ;;
- *)
- # Relative path: add a thisdir entry.
- rpath="$rpath\$thisdir/$dir:"
- ;;
- esac
- done
- temp_rpath="$rpath"
- fi
-
- if test -n "$compile_shlibpath$finalize_shlibpath"; then
- compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
- fi
- if test -n "$finalize_shlibpath"; then
- finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
- fi
-
- compile_var=
- finalize_var=
- if test -n "$runpath_var"; then
- if test -n "$perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $perm_rpath; do
- rpath="$rpath$dir:"
- done
- compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
- fi
- if test -n "$finalize_perm_rpath"; then
- # We should set the runpath_var.
- rpath=
- for dir in $finalize_perm_rpath; do
- rpath="$rpath$dir:"
- done
- finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
- fi
- fi
-
- if test "$no_install" = yes; then
- # We don't need to create a wrapper script.
- link_command="$compile_var$compile_command$compile_rpath"
- # Replace the output file specification.
- link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
- # Delete the old output file.
- $run $rm $output
- # Link the executable and exit
- $show "$link_command"
- $run eval "$link_command" || exit $?
- exit 0
- fi
-
- if test "$hardcode_action" = relink; then
- # Fast installation is not supported
- link_command="$compile_var$compile_command$compile_rpath"
- relink_command="$finalize_var$finalize_command$finalize_rpath"
-
- $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
- $echo "$modename: \`$output' will be relinked during installation" 1>&2
- else
- if test "$fast_install" != no; then
- link_command="$finalize_var$compile_command$finalize_rpath"
- if test "$fast_install" = yes; then
- relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'`
- else
- # fast_install is set to needless
- relink_command=
- fi
- else
- link_command="$compile_var$compile_command$compile_rpath"
- relink_command="$finalize_var$finalize_command$finalize_rpath"
- fi
- fi
-
- # Replace the output file specification.
- link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
-
- # Delete the old output files.
- $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
-
- $show "$link_command"
- $run eval "$link_command" || exit $?
-
- # Now create the wrapper script.
- $show "creating $output"
-
- # Quote the relink command for shipping.
- if test -n "$relink_command"; then
- # Preserve any variables that may affect compiler behavior
- for var in $variables_saved_for_relink; do
- if eval test -z \"\${$var+set}\"; then
- relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
- elif eval var_value=\$$var; test -z "$var_value"; then
- relink_command="$var=; export $var; $relink_command"
- else
- var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
- relink_command="$var=\"$var_value\"; export $var; $relink_command"
- fi
- done
- relink_command="(cd `pwd`; $relink_command)"
- relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
- fi
-
- # Quote $echo for shipping.
- if test "X$echo" = "X$SHELL $0 --fallback-echo"; then
- case $0 in
- [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";;
- *) qecho="$SHELL `pwd`/$0 --fallback-echo";;
- esac
- qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
- else
- qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
- fi
-
- # Only actually do things if our run command is non-null.
- if test -z "$run"; then
- # win32 will think the script is a binary if it has
- # a .exe suffix, so we strip it off here.
- case $output in
- *.exe) output=`echo $output|sed 's,.exe$,,'` ;;
- esac
- # test for cygwin because mv fails w/o .exe extensions
- case $host in
- *cygwin*) exeext=.exe ;;
- *) exeext= ;;
- esac
- $rm $output
- trap "$rm $output; exit 1" 1 2 15
-
- $echo > $output "\
-#! $SHELL
-
-# $output - temporary wrapper script for $objdir/$outputname
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# The $output program cannot be directly executed until all the libtool
-# libraries that it depends on are installed.
-#
-# This wrapper script should never be moved out of the build directory.
-# If it is, it will not operate correctly.
-
-# Sed substitution that helps us do robust quoting. It backslashifies
-# metacharacters that are still active within double-quoted strings.
-Xsed='sed -e 1s/^X//'
-sed_quote_subst='$sed_quote_subst'
-
-# The HP-UX ksh and POSIX shell print the target directory to stdout
-# if CDPATH is set.
-if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi
-
-relink_command=\"$relink_command\"
-
-# This environment variable determines our operation mode.
-if test \"\$libtool_install_magic\" = \"$magic\"; then
- # install mode needs the following variable:
- notinst_deplibs='$notinst_deplibs'
-else
- # When we are sourced in execute mode, \$file and \$echo are already set.
- if test \"\$libtool_execute_magic\" != \"$magic\"; then
- echo=\"$qecho\"
- file=\"\$0\"
- # Make sure echo works.
- if test \"X\$1\" = X--no-reexec; then
- # Discard the --no-reexec flag, and continue.
- shift
- elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
- # Yippee, \$echo works!
- :
- else
- # Restart under the correct shell, and then maybe \$echo will work.
- exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
- fi
- fi\
-"
- $echo >> $output "\
-
- # Find the directory that this script lives in.
- thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
- test \"x\$thisdir\" = \"x\$file\" && thisdir=.
-
- # Follow symbolic links until we get to the real thisdir.
- file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\`
- while test -n \"\$file\"; do
- destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
-
- # If there was a directory component, then change thisdir.
- if test \"x\$destdir\" != \"x\$file\"; then
- case \"\$destdir\" in
- [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
- *) thisdir=\"\$thisdir/\$destdir\" ;;
- esac
- fi
-
- file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
- file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\`
- done
-
- # Try to get the absolute directory name.
- absdir=\`cd \"\$thisdir\" && pwd\`
- test -n \"\$absdir\" && thisdir=\"\$absdir\"
-"
-
- if test "$fast_install" = yes; then
- echo >> $output "\
- program=lt-'$outputname'$exeext
- progdir=\"\$thisdir/$objdir\"
-
- if test ! -f \"\$progdir/\$program\" || \\
- { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | sed 1q\`; \\
- test \"X\$file\" != \"X\$progdir/\$program\"; }; then
-
- file=\"\$\$-\$program\"
-
- if test ! -d \"\$progdir\"; then
- $mkdir \"\$progdir\"
- else
- $rm \"\$progdir/\$file\"
- fi"
-
- echo >> $output "\
-
- # relink executable if necessary
- if test -n \"\$relink_command\"; then
- if relink_command_output=\`eval \$relink_command 2>&1\`; then :
- else
- $echo \"\$relink_command_output\" >&2
- $rm \"\$progdir/\$file\"
- exit 1
- fi
- fi
-
- $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
- { $rm \"\$progdir/\$program\";
- $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
- $rm \"\$progdir/\$file\"
- fi"
- else
- echo >> $output "\
- program='$outputname'
- progdir=\"\$thisdir/$objdir\"
-"
- fi
-
- echo >> $output "\
-
- if test -f \"\$progdir/\$program\"; then"
-
- # Export our shlibpath_var if we have one.
- if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
- $echo >> $output "\
- # Add our own library path to $shlibpath_var
- $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
-
- # Some systems cannot cope with colon-terminated $shlibpath_var
- # The second colon is a workaround for a bug in BeOS R4 sed
- $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
-
- export $shlibpath_var
-"
- fi
-
- # fixup the dll searchpath if we need to.
- if test -n "$dllsearchpath"; then
- $echo >> $output "\
- # Add the dll search path components to the executable PATH
- PATH=$dllsearchpath:\$PATH
-"
- fi
-
- $echo >> $output "\
- if test \"\$libtool_execute_magic\" != \"$magic\"; then
- # Run the actual program with our arguments.
-"
- case $host in
- # win32 systems need to use the prog path for dll
- # lookup to work
- *-*-cygwin* | *-*-pw32*)
- $echo >> $output "\
- exec \$progdir/\$program \${1+\"\$@\"}
-"
- ;;
-
- # Backslashes separate directories on plain windows
- *-*-mingw | *-*-os2*)
- $echo >> $output "\
- exec \$progdir\\\\\$program \${1+\"\$@\"}
-"
- ;;
-
- *)
- $echo >> $output "\
- # Export the path to the program.
- PATH=\"\$progdir:\$PATH\"
- export PATH
-
- exec \$program \${1+\"\$@\"}
-"
- ;;
- esac
- $echo >> $output "\
- \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
- exit 1
- fi
- else
- # The program doesn't exist.
- \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
- \$echo \"This script is just a wrapper for \$program.\" 1>&2
- echo \"See the $PACKAGE documentation for more information.\" 1>&2
- exit 1
- fi
-fi\
-"
- chmod +x $output
- fi
- exit 0
- ;;
- esac
-
- # See if we need to build an old-fashioned archive.
- for oldlib in $oldlibs; do
-
- if test "$build_libtool_libs" = convenience; then
- oldobjs="$libobjs_save"
- addlibs="$convenience"
- build_libtool_libs=no
- else
- if test "$build_libtool_libs" = module; then
- oldobjs="$libobjs_save"
- build_libtool_libs=no
- else
- oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`
- fi
- addlibs="$old_convenience"
- fi
-
- if test -n "$addlibs"; then
- gentop="$output_objdir/${outputname}x"
- $show "${rm}r $gentop"
- $run ${rm}r "$gentop"
- $show "mkdir $gentop"
- $run mkdir "$gentop"
- status=$?
- if test "$status" -ne 0 && test ! -d "$gentop"; then
- exit $status
- fi
- generated="$generated $gentop"
-
- # Add in members from convenience archives.
- for xlib in $addlibs; do
- # Extract the objects.
- case $xlib in
- [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;;
- *) xabs=`pwd`"/$xlib" ;;
- esac
- xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'`
- xdir="$gentop/$xlib"
-
- $show "${rm}r $xdir"
- $run ${rm}r "$xdir"
- $show "mkdir $xdir"
- $run mkdir "$xdir"
- status=$?
- if test "$status" -ne 0 && test ! -d "$xdir"; then
- exit $status
- fi
- $show "(cd $xdir && $AR x $xabs)"
- $run eval "(cd \$xdir && $AR x \$xabs)" || exit $?
-
- oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP`
- done
- fi
-
- # Do each command in the archive commands.
- if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
- eval cmds=\"$old_archive_from_new_cmds\"
- else
- # Ensure that we have .o objects in place in case we decided
- # not to build a shared library, and have fallen back to building
- # static libs even though --disable-static was passed!
- for oldobj in $oldobjs; do
- if test ! -f $oldobj; then
- xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$xdir" = "X$oldobj"; then
- xdir="."
- else
- xdir="$xdir"
- fi
- baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'`
- obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"`
- $show "(cd $xdir && ${LN_S} $obj $baseobj)"
- $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $?
- fi
- done
-
- eval cmds=\"$old_archive_cmds\"
- fi
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- done
-
- if test -n "$generated"; then
- $show "${rm}r$generated"
- $run ${rm}r$generated
- fi
-
- # Now create the libtool archive.
- case $output in
- *.la)
- old_library=
- test "$build_old_libs" = yes && old_library="$libname.$libext"
- $show "creating $output"
-
- # Preserve any variables that may affect compiler behavior
- for var in $variables_saved_for_relink; do
- if eval test -z \"\${$var+set}\"; then
- relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command"
- elif eval var_value=\$$var; test -z "$var_value"; then
- relink_command="$var=; export $var; $relink_command"
- else
- var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
- relink_command="$var=\"$var_value\"; export $var; $relink_command"
- fi
- done
- # Quote the link command for shipping.
- relink_command="(cd `pwd`; $SHELL $0 --mode=relink $libtool_args @inst_prefix_dir@)"
- relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
-
- # Only create the output if not a dry run.
- if test -z "$run"; then
- for installed in no yes; do
- if test "$installed" = yes; then
- if test -z "$install_libdir"; then
- break
- fi
- output="$output_objdir/$outputname"i
- # Replace all uninstalled libtool libraries with the installed ones
- newdependency_libs=
- for deplib in $dependency_libs; do
- case $deplib in
- *.la)
- name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
- eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
- if test -z "$libdir"; then
- $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
- exit 1
- fi
- newdependency_libs="$newdependency_libs $libdir/$name"
- ;;
- *) newdependency_libs="$newdependency_libs $deplib" ;;
- esac
- done
- dependency_libs="$newdependency_libs"
- newdlfiles=
- for lib in $dlfiles; do
- name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
- eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
- if test -z "$libdir"; then
- $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
- exit 1
- fi
- newdlfiles="$newdlfiles $libdir/$name"
- done
- dlfiles="$newdlfiles"
- newdlprefiles=
- for lib in $dlprefiles; do
- name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
- eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
- if test -z "$libdir"; then
- $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
- exit 1
- fi
- newdlprefiles="$newdlprefiles $libdir/$name"
- done
- dlprefiles="$newdlprefiles"
- fi
- $rm $output
- # place dlname in correct position for cygwin
- tdlname=$dlname
- case $host,$output,$installed,$module,$dlname in
- *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
- esac
- $echo > $output "\
-# $outputname - a libtool library file
-# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
-#
-# Please DO NOT delete this file!
-# It is necessary for linking the library.
-
-# The name that we can dlopen(3).
-dlname='$tdlname'
-
-# Names of this library.
-library_names='$library_names'
-
-# The name of the static archive.
-old_library='$old_library'
-
-# Libraries that this one depends upon.
-dependency_libs='$dependency_libs'
-
-# Version information for $libname.
-current=$current
-age=$age
-revision=$revision
-
-# Is this an already installed library?
-installed=$installed
-
-# Files to dlopen/dlpreopen
-dlopen='$dlfiles'
-dlpreopen='$dlprefiles'
-
-# Directory that this library needs to be installed in:
-libdir='$install_libdir'"
- if test "$installed" = no && test "$need_relink" = yes; then
- $echo >> $output "\
-relink_command=\"$relink_command\""
- fi
- done
- fi
-
- # Do a symbolic link so that the libtool archive can be found in
- # LD_LIBRARY_PATH before the program is installed.
- $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
- $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
- ;;
- esac
- exit 0
- ;;
-
- # libtool install mode
- install)
- modename="$modename: install"
-
- # There may be an optional sh(1) argument at the beginning of
- # install_prog (especially on Windows NT).
- if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
- # Allow the use of GNU shtool's install command.
- $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then
- # Aesthetically quote it.
- arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
- case $arg in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
- arg="\"$arg\""
- ;;
- esac
- install_prog="$arg "
- arg="$1"
- shift
- else
- install_prog=
- arg="$nonopt"
- fi
-
- # The real first argument should be the name of the installation program.
- # Aesthetically quote it.
- arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
- case $arg in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
- arg="\"$arg\""
- ;;
- esac
- install_prog="$install_prog$arg"
-
- # We need to accept at least all the BSD install flags.
- dest=
- files=
- opts=
- prev=
- install_type=
- isdir=no
- stripme=
- for arg
- do
- if test -n "$dest"; then
- files="$files $dest"
- dest="$arg"
- continue
- fi
-
- case $arg in
- -d) isdir=yes ;;
- -f) prev="-f" ;;
- -g) prev="-g" ;;
- -m) prev="-m" ;;
- -o) prev="-o" ;;
- -s)
- stripme=" -s"
- continue
- ;;
- -*) ;;
-
- *)
- # If the previous option needed an argument, then skip it.
- if test -n "$prev"; then
- prev=
- else
- dest="$arg"
- continue
- fi
- ;;
- esac
-
- # Aesthetically quote the argument.
- arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
- case $arg in
- *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
- arg="\"$arg\""
- ;;
- esac
- install_prog="$install_prog $arg"
- done
-
- if test -z "$install_prog"; then
- $echo "$modename: you must specify an install program" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- if test -n "$prev"; then
- $echo "$modename: the \`$prev' option requires an argument" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- if test -z "$files"; then
- if test -z "$dest"; then
- $echo "$modename: no file or destination specified" 1>&2
- else
- $echo "$modename: you must specify a destination" 1>&2
- fi
- $echo "$help" 1>&2
- exit 1
- fi
-
- # Strip any trailing slash from the destination.
- dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
-
- # Check to see that the destination is a directory.
- test -d "$dest" && isdir=yes
- if test "$isdir" = yes; then
- destdir="$dest"
- destname=
- else
- destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
- test "X$destdir" = "X$dest" && destdir=.
- destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
-
- # Not a directory, so check to see that there is only one file specified.
- set dummy $files
- if test "$#" -gt 2; then
- $echo "$modename: \`$dest' is not a directory" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
- fi
- case $destdir in
- [\\/]* | [A-Za-z]:[\\/]*) ;;
- *)
- for file in $files; do
- case $file in
- *.lo) ;;
- *)
- $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
- $echo "$help" 1>&2
- exit 1
- ;;
- esac
- done
- ;;
- esac
-
- # This variable tells wrapper scripts just to set variables rather
- # than running their programs.
- libtool_install_magic="$magic"
-
- staticlibs=
- future_libdirs=
- current_libdirs=
- for file in $files; do
-
- # Do each installation.
- case $file in
- *.$libext)
- # Do the static libraries later.
- staticlibs="$staticlibs $file"
- ;;
-
- *.la)
- # Check to see that this really is a libtool archive.
- if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
- else
- $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- library_names=
- old_library=
- relink_command=
- # If there is no directory component, then add one.
- case $file in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
- esac
-
- # Add the libdir to current_libdirs if it is the destination.
- if test "X$destdir" = "X$libdir"; then
- case "$current_libdirs " in
- *" $libdir "*) ;;
- *) current_libdirs="$current_libdirs $libdir" ;;
- esac
- else
- # Note the libdir as a future libdir.
- case "$future_libdirs " in
- *" $libdir "*) ;;
- *) future_libdirs="$future_libdirs $libdir" ;;
- esac
- fi
-
- dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
- test "X$dir" = "X$file/" && dir=
- dir="$dir$objdir"
-
- if test -n "$relink_command"; then
- # Determine the prefix the user has applied to our future dir.
- inst_prefix_dir=`$echo "$destdir" | sed "s%$libdir\$%%"`
-
- # Don't allow the user to place us outside of our expected
- # location b/c this prevents finding dependent libraries that
- # are installed to the same prefix.
- if test "$inst_prefix_dir" = "$destdir"; then
- $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
- exit 1
- fi
-
- if test -n "$inst_prefix_dir"; then
- # Stick the inst_prefix_dir data into the link command.
- relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
- else
- relink_command=`$echo "$relink_command" | sed "s%@inst_prefix_dir@%%"`
- fi
-
- $echo "$modename: warning: relinking \`$file'" 1>&2
- $show "$relink_command"
- if $run eval "$relink_command"; then :
- else
- $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
- exit 1
- fi
- fi
-
- # See the names of the shared library.
- set dummy $library_names
- if test -n "$2"; then
- realname="$2"
- shift
- shift
-
- srcname="$realname"
- test -n "$relink_command" && srcname="$realname"T
-
- # Install the shared library and build the symlinks.
- $show "$install_prog $dir/$srcname $destdir/$realname"
- $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
- if test -n "$stripme" && test -n "$striplib"; then
- $show "$striplib $destdir/$realname"
- $run eval "$striplib $destdir/$realname" || exit $?
- fi
-
- if test "$#" -gt 0; then
- # Delete the old symlinks, and create new ones.
- for linkname
- do
- if test "$linkname" != "$realname"; then
- $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
- $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)"
- fi
- done
- fi
-
- # Do each command in the postinstall commands.
- lib="$destdir/$realname"
- eval cmds=\"$postinstall_cmds\"
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- fi
-
- # Install the pseudo-library for information purposes.
- name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
- instname="$dir/$name"i
- $show "$install_prog $instname $destdir/$name"
- $run eval "$install_prog $instname $destdir/$name" || exit $?
-
- # Maybe install the static library, too.
- test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
- ;;
-
- *.lo)
- # Install (i.e. copy) a libtool object.
-
- # Figure out destination file name, if it wasn't already specified.
- if test -n "$destname"; then
- destfile="$destdir/$destname"
- else
- destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
- destfile="$destdir/$destfile"
- fi
-
- # Deduce the name of the destination old-style object file.
- case $destfile in
- *.lo)
- staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
- ;;
- *.$objext)
- staticdest="$destfile"
- destfile=
- ;;
- *)
- $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
- $echo "$help" 1>&2
- exit 1
- ;;
- esac
-
- # Install the libtool object if requested.
- if test -n "$destfile"; then
- $show "$install_prog $file $destfile"
- $run eval "$install_prog $file $destfile" || exit $?
- fi
-
- # Install the old object if enabled.
- if test "$build_old_libs" = yes; then
- # Deduce the name of the old-style object file.
- staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
-
- $show "$install_prog $staticobj $staticdest"
- $run eval "$install_prog \$staticobj \$staticdest" || exit $?
- fi
- exit 0
- ;;
-
- *)
- # Figure out destination file name, if it wasn't already specified.
- if test -n "$destname"; then
- destfile="$destdir/$destname"
- else
- destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
- destfile="$destdir/$destfile"
- fi
-
- # Do a test to see if this is really a libtool program.
- if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
- notinst_deplibs=
- relink_command=
-
- # If there is no directory component, then add one.
- case $file in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
- esac
-
- # Check the variables that should have been set.
- if test -z "$notinst_deplibs"; then
- $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2
- exit 1
- fi
-
- finalize=yes
- for lib in $notinst_deplibs; do
- # Check to see that each library is installed.
- libdir=
- if test -f "$lib"; then
- # If there is no directory component, then add one.
- case $lib in
- */* | *\\*) . $lib ;;
- *) . ./$lib ;;
- esac
- fi
- libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
- if test -n "$libdir" && test ! -f "$libfile"; then
- $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
- finalize=no
- fi
- done
-
- relink_command=
- # If there is no directory component, then add one.
- case $file in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
- esac
-
- outputname=
- if test "$fast_install" = no && test -n "$relink_command"; then
- if test "$finalize" = yes && test -z "$run"; then
- tmpdir="/tmp"
- test -n "$TMPDIR" && tmpdir="$TMPDIR"
- tmpdir=`mktemp -d $tmpdir/libtool-XXXXXX 2> /dev/null`
- if test $? = 0 ; then :
- else
- tmpdir="$tmpdir/libtool-$$"
- fi
- if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then :
- else
- $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2
- continue
- fi
- file=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
- outputname="$tmpdir/$file"
- # Replace the output file specification.
- relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
-
- $show "$relink_command"
- if $run eval "$relink_command"; then :
- else
- $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
- ${rm}r "$tmpdir"
- continue
- fi
- file="$outputname"
- else
- $echo "$modename: warning: cannot relink \`$file'" 1>&2
- fi
- else
- # Install the binary that we compiled earlier.
- file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
- fi
- fi
-
- # remove .exe since cygwin /usr/bin/install will append another
- # one anyways
- case $install_prog,$host in
- /usr/bin/install*,*cygwin*)
- case $file:$destfile in
- *.exe:*.exe)
- # this is ok
- ;;
- *.exe:*)
- destfile=$destfile.exe
- ;;
- *:*.exe)
- destfile=`echo $destfile | sed -e 's,.exe$,,'`
- ;;
- esac
- ;;
- esac
- $show "$install_prog$stripme $file $destfile"
- $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
- test -n "$outputname" && ${rm}r "$tmpdir"
- ;;
- esac
- done
-
- for file in $staticlibs; do
- name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-
- # Set up the ranlib parameters.
- oldlib="$destdir/$name"
-
- $show "$install_prog $file $oldlib"
- $run eval "$install_prog \$file \$oldlib" || exit $?
-
- if test -n "$stripme" && test -n "$striplib"; then
- $show "$old_striplib $oldlib"
- $run eval "$old_striplib $oldlib" || exit $?
- fi
-
- # Do each command in the postinstall commands.
- eval cmds=\"$old_postinstall_cmds\"
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || exit $?
- done
- IFS="$save_ifs"
- done
-
- if test -n "$future_libdirs"; then
- $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
- fi
-
- if test -n "$current_libdirs"; then
- # Maybe just do a dry run.
- test -n "$run" && current_libdirs=" -n$current_libdirs"
- exec_cmd='$SHELL $0 --finish$current_libdirs'
- else
- exit 0
- fi
- ;;
-
- # libtool finish mode
- finish)
- modename="$modename: finish"
- libdirs="$nonopt"
- admincmds=
-
- if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
- for dir
- do
- libdirs="$libdirs $dir"
- done
-
- for libdir in $libdirs; do
- if test -n "$finish_cmds"; then
- # Do each command in the finish commands.
- eval cmds=\"$finish_cmds\"
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd" || admincmds="$admincmds
- $cmd"
- done
- IFS="$save_ifs"
- fi
- if test -n "$finish_eval"; then
- # Do the single finish_eval.
- eval cmds=\"$finish_eval\"
- $run eval "$cmds" || admincmds="$admincmds
- $cmds"
- fi
- done
- fi
-
- # Exit here if they wanted silent mode.
- test "$show" = : && exit 0
-
- echo "----------------------------------------------------------------------"
- echo "Libraries have been installed in:"
- for libdir in $libdirs; do
- echo " $libdir"
- done
- echo
- echo "If you ever happen to want to link against installed libraries"
- echo "in a given directory, LIBDIR, you must either use libtool, and"
- echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
- echo "flag during linking and do at least one of the following:"
- if test -n "$shlibpath_var"; then
- echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
- echo " during execution"
- fi
- if test -n "$runpath_var"; then
- echo " - add LIBDIR to the \`$runpath_var' environment variable"
- echo " during linking"
- fi
- if test -n "$hardcode_libdir_flag_spec"; then
- libdir=LIBDIR
- eval flag=\"$hardcode_libdir_flag_spec\"
-
- echo " - use the \`$flag' linker flag"
- fi
- if test -n "$admincmds"; then
- echo " - have your system administrator run these commands:$admincmds"
- fi
- if test -f /etc/ld.so.conf; then
- echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
- fi
- echo
- echo "See any operating system documentation about shared libraries for"
- echo "more information, such as the ld(1) and ld.so(8) manual pages."
- echo "----------------------------------------------------------------------"
- exit 0
- ;;
-
- # libtool execute mode
- execute)
- modename="$modename: execute"
-
- # The first argument is the command name.
- cmd="$nonopt"
- if test -z "$cmd"; then
- $echo "$modename: you must specify a COMMAND" 1>&2
- $echo "$help"
- exit 1
- fi
-
- # Handle -dlopen flags immediately.
- for file in $execute_dlfiles; do
- if test ! -f "$file"; then
- $echo "$modename: \`$file' is not a file" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- dir=
- case $file in
- *.la)
- # Check to see that this really is a libtool archive.
- if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
- else
- $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- # Read the libtool library.
- dlname=
- library_names=
-
- # If there is no directory component, then add one.
- case $file in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
- esac
-
- # Skip this library if it cannot be dlopened.
- if test -z "$dlname"; then
- # Warn if it was a shared library.
- test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
- continue
- fi
-
- dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
- test "X$dir" = "X$file" && dir=.
-
- if test -f "$dir/$objdir/$dlname"; then
- dir="$dir/$objdir"
- else
- $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
- exit 1
- fi
- ;;
-
- *.lo)
- # Just add the directory containing the .lo file.
- dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
- test "X$dir" = "X$file" && dir=.
- ;;
-
- *)
- $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
- continue
- ;;
- esac
-
- # Get the absolute pathname.
- absdir=`cd "$dir" && pwd`
- test -n "$absdir" && dir="$absdir"
-
- # Now add the directory to shlibpath_var.
- if eval "test -z \"\$$shlibpath_var\""; then
- eval "$shlibpath_var=\"\$dir\""
- else
- eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
- fi
- done
-
- # This variable tells wrapper scripts just to set shlibpath_var
- # rather than running their programs.
- libtool_execute_magic="$magic"
-
- # Check if any of the arguments is a wrapper script.
- args=
- for file
- do
- case $file in
- -*) ;;
- *)
- # Do a test to see if this is really a libtool program.
- if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
- # If there is no directory component, then add one.
- case $file in
- */* | *\\*) . $file ;;
- *) . ./$file ;;
- esac
-
- # Transform arg to wrapped name.
- file="$progdir/$program"
- fi
- ;;
- esac
- # Quote arguments (to preserve shell metacharacters).
- file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
- args="$args \"$file\""
- done
-
- if test -z "$run"; then
- if test -n "$shlibpath_var"; then
- # Export the shlibpath_var.
- eval "export $shlibpath_var"
- fi
-
- # Restore saved enviroment variables
- if test "${save_LC_ALL+set}" = set; then
- LC_ALL="$save_LC_ALL"; export LC_ALL
- fi
- if test "${save_LANG+set}" = set; then
- LANG="$save_LANG"; export LANG
- fi
-
- # Now prepare to actually exec the command.
- exec_cmd="\$cmd$args"
- else
- # Display what would be done.
- if test -n "$shlibpath_var"; then
- eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
- $echo "export $shlibpath_var"
- fi
- $echo "$cmd$args"
- exit 0
- fi
- ;;
-
- # libtool clean and uninstall mode
- clean | uninstall)
- modename="$modename: $mode"
- rm="$nonopt"
- files=
- rmforce=
- exit_status=0
-
- # This variable tells wrapper scripts just to set variables rather
- # than running their programs.
- libtool_install_magic="$magic"
-
- for arg
- do
- case $arg in
- -f) rm="$rm $arg"; rmforce=yes ;;
- -*) rm="$rm $arg" ;;
- *) files="$files $arg" ;;
- esac
- done
-
- if test -z "$rm"; then
- $echo "$modename: you must specify an RM program" 1>&2
- $echo "$help" 1>&2
- exit 1
- fi
-
- rmdirs=
-
- for file in $files; do
- dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
- if test "X$dir" = "X$file"; then
- dir=.
- objdir="$objdir"
- else
- objdir="$dir/$objdir"
- fi
- name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
- test "$mode" = uninstall && objdir="$dir"
-
- # Remember objdir for removal later, being careful to avoid duplicates
- if test "$mode" = clean; then
- case " $rmdirs " in
- *" $objdir "*) ;;
- *) rmdirs="$rmdirs $objdir" ;;
- esac
- fi
-
- # Don't error if the file doesn't exist and rm -f was used.
- if (test -L "$file") >/dev/null 2>&1 \
- || (test -h "$file") >/dev/null 2>&1 \
- || test -f "$file"; then
- :
- elif test -d "$file"; then
- exit_status=1
- continue
- elif test "$rmforce" = yes; then
- continue
- fi
-
- rmfiles="$file"
-
- case $name in
- *.la)
- # Possibly a libtool archive, so verify it.
- if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
- . $dir/$name
-
- # Delete the libtool libraries and symlinks.
- for n in $library_names; do
- rmfiles="$rmfiles $objdir/$n"
- done
- test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
- test "$mode" = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
-
- if test "$mode" = uninstall; then
- if test -n "$library_names"; then
- # Do each command in the postuninstall commands.
- eval cmds=\"$postuninstall_cmds\"
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd"
- if test "$?" -ne 0 && test "$rmforce" != yes; then
- exit_status=1
- fi
- done
- IFS="$save_ifs"
- fi
-
- if test -n "$old_library"; then
- # Do each command in the old_postuninstall commands.
- eval cmds=\"$old_postuninstall_cmds\"
- save_ifs="$IFS"; IFS='~'
- for cmd in $cmds; do
- IFS="$save_ifs"
- $show "$cmd"
- $run eval "$cmd"
- if test "$?" -ne 0 && test "$rmforce" != yes; then
- exit_status=1
- fi
- done
- IFS="$save_ifs"
- fi
- # FIXME: should reinstall the best remaining shared library.
- fi
- fi
- ;;
-
- *.lo)
- if test "$build_old_libs" = yes; then
- oldobj=`$echo "X$name" | $Xsed -e "$lo2o"`
- rmfiles="$rmfiles $dir/$oldobj"
- fi
- ;;
-
- *)
- # Do a test to see if this is a libtool program.
- if test "$mode" = clean &&
- (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
- relink_command=
- . $dir/$file
-
- rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
- if test "$fast_install" = yes && test -n "$relink_command"; then
- rmfiles="$rmfiles $objdir/lt-$name"
- fi
- fi
- ;;
- esac
- $show "$rm $rmfiles"
- $run $rm $rmfiles || exit_status=1
- done
-
- # Try to remove the ${objdir}s in the directories where we deleted files
- for dir in $rmdirs; do
- if test -d "$dir"; then
- $show "rmdir $dir"
- $run rmdir $dir >/dev/null 2>&1
- fi
- done
-
- exit $exit_status
- ;;
-
- "")
- $echo "$modename: you must specify a MODE" 1>&2
- $echo "$generic_help" 1>&2
- exit 1
- ;;
- esac
-
- if test -z "$exec_cmd"; then
- $echo "$modename: invalid operation mode \`$mode'" 1>&2
- $echo "$generic_help" 1>&2
- exit 1
- fi
-fi # test -z "$show_help"
-
-if test -n "$exec_cmd"; then
- eval exec $exec_cmd
- exit 1
-fi
-
-# We need to display help for each of the modes.
-case $mode in
-"") $echo \
-"Usage: $modename [OPTION]... [MODE-ARG]...
-
-Provide generalized library-building support services.
-
- --config show all configuration variables
- --debug enable verbose shell tracing
--n, --dry-run display commands without modifying any files
- --features display basic configuration information and exit
- --finish same as \`--mode=finish'
- --help display this help message and exit
- --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
- --quiet same as \`--silent'
- --silent don't print informational messages
- --version print version information
-
-MODE must be one of the following:
-
- clean remove files from the build directory
- compile compile a source file into a libtool object
- execute automatically set library path, then run a program
- finish complete the installation of libtool libraries
- install install libraries or executables
- link create a library or an executable
- uninstall remove libraries from an installed directory
-
-MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for
-a more detailed description of MODE."
- exit 0
- ;;
-
-clean)
- $echo \
-"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
-
-Remove files from the build directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, object or program, all the files associated
-with it are deleted. Otherwise, only FILE itself is deleted using RM."
- ;;
-
-compile)
- $echo \
-"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
-
-Compile a source file into a libtool library object.
-
-This mode accepts the following additional options:
-
- -o OUTPUT-FILE set the output file name to OUTPUT-FILE
- -prefer-pic try to building PIC objects only
- -prefer-non-pic try to building non-PIC objects only
- -static always build a \`.o' file suitable for static linking
-
-COMPILE-COMMAND is a command to be used in creating a \`standard' object file
-from the given SOURCEFILE.
-
-The output file name is determined by removing the directory component from
-SOURCEFILE, then substituting the C source code suffix \`.c' with the
-library object suffix, \`.lo'."
- ;;
-
-execute)
- $echo \
-"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
-
-Automatically set library path, then run a program.
-
-This mode accepts the following additional options:
-
- -dlopen FILE add the directory containing FILE to the library path
-
-This mode sets the library path environment variable according to \`-dlopen'
-flags.
-
-If any of the ARGS are libtool executable wrappers, then they are translated
-into their corresponding uninstalled binary, and any of their required library
-directories are added to the library path.
-
-Then, COMMAND is executed, with ARGS as arguments."
- ;;
-
-finish)
- $echo \
-"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
-
-Complete the installation of libtool libraries.
-
-Each LIBDIR is a directory that contains libtool libraries.
-
-The commands that this mode executes may require superuser privileges. Use
-the \`--dry-run' option if you just want to see what would be executed."
- ;;
-
-install)
- $echo \
-"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
-
-Install executables or libraries.
-
-INSTALL-COMMAND is the installation command. The first component should be
-either the \`install' or \`cp' program.
-
-The rest of the components are interpreted as arguments to that command (only
-BSD-compatible install options are recognized)."
- ;;
-
-link)
- $echo \
-"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
-
-Link object files or libraries together to form another library, or to
-create an executable program.
-
-LINK-COMMAND is a command using the C compiler that you would use to create
-a program from several object files.
-
-The following components of LINK-COMMAND are treated specially:
-
- -all-static do not do any dynamic linking at all
- -avoid-version do not add a version suffix if possible
- -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
- -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols
- -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
- -export-symbols SYMFILE
- try to export only the symbols listed in SYMFILE
- -export-symbols-regex REGEX
- try to export only the symbols matching REGEX
- -LLIBDIR search LIBDIR for required installed libraries
- -lNAME OUTPUT-FILE requires the installed library libNAME
- -module build a library that can dlopened
- -no-fast-install disable the fast-install mode
- -no-install link a not-installable executable
- -no-undefined declare that a library does not refer to external symbols
- -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
- -release RELEASE specify package release information
- -rpath LIBDIR the created library will eventually be installed in LIBDIR
- -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries
- -static do not do any dynamic linking of libtool libraries
- -version-info CURRENT[:REVISION[:AGE]]
- specify library version info [each variable defaults to 0]
-
-All other options (arguments beginning with \`-') are ignored.
-
-Every other argument is treated as a filename. Files ending in \`.la' are
-treated as uninstalled libtool libraries, other files are standard or library
-object files.
-
-If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
-only library objects (\`.lo' files) may be specified, and \`-rpath' is
-required, except when creating a convenience library.
-
-If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
-using \`ar' and \`ranlib', or on Windows using \`lib'.
-
-If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
-is created, otherwise an executable program is created."
- ;;
-
-uninstall)
- $echo \
-"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
-
-Remove libraries from an installation directory.
-
-RM is the name of the program to use to delete files associated with each FILE
-(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
-to RM.
-
-If FILE is a libtool library, all the files associated with it are deleted.
-Otherwise, only FILE itself is deleted using RM."
- ;;
-
-*)
- $echo "$modename: invalid operation mode \`$mode'" 1>&2
- $echo "$help" 1>&2
- exit 1
- ;;
-esac
-
-echo
-$echo "Try \`$modename --help' for more information about other modes."
-
-exit 0
-
-# Local Variables:
-# mode:shell-script
-# sh-indentation:2
-# End:
diff --git a/missing b/missing
deleted file mode 100755
index 6a37006..0000000
--- a/missing
+++ /dev/null
@@ -1,336 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-# Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
- echo 1>&2 "Try \`$0 --help' for more information"
- exit 1
-fi
-
-run=:
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
- configure_ac=configure.ac
-else
- configure_ac=configure.in
-fi
-
-case "$1" in
---run)
- # Try to run requested program, and just exit if it succeeds.
- run=
- shift
- "$@" && exit 0
- ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case "$1" in
-
- -h|--h|--he|--hel|--help)
- echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
- -h, --help display this help and exit
- -v, --version output version information and exit
- --run try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
- aclocal touch file \`aclocal.m4'
- autoconf touch file \`configure'
- autoheader touch file \`config.h.in'
- automake touch all \`Makefile.in' files
- bison create \`y.tab.[ch]', if possible, from existing .[ch]
- flex create \`lex.yy.c', if possible, from existing .c
- help2man touch the output file
- lex create \`lex.yy.c', if possible, from existing .c
- makeinfo touch the output file
- tar try tar, gnutar, gtar, then tar without non-portable flags
- yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
- ;;
-
- -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
- echo "missing 0.4 - GNU automake"
- ;;
-
- -*)
- echo 1>&2 "$0: Unknown \`$1' option"
- echo 1>&2 "Try \`$0 --help' for more information"
- exit 1
- ;;
-
- aclocal*)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- fi
-
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified \`acinclude.m4' or \`${configure_ac}'. You might want
- to install the \`Automake' and \`Perl' packages. Grab them from
- any GNU archive site."
- touch aclocal.m4
- ;;
-
- autoconf)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- fi
-
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified \`${configure_ac}'. You might want to install the
- \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
- archive site."
- touch configure
- ;;
-
- autoheader)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- fi
-
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified \`acconfig.h' or \`${configure_ac}'. You might want
- to install the \`Autoconf' and \`GNU m4' packages. Grab them
- from any GNU archive site."
- files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
- test -z "$files" && files="config.h"
- touch_files=
- for f in $files; do
- case "$f" in
- *:*) touch_files="$touch_files "`echo "$f" |
- sed -e 's/^[^:]*://' -e 's/:.*//'`;;
- *) touch_files="$touch_files $f.in";;
- esac
- done
- touch $touch_files
- ;;
-
- automake*)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- fi
-
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
- You might want to install the \`Automake' and \`Perl' packages.
- Grab them from any GNU archive site."
- find . -type f -name Makefile.am -print |
- sed 's/\.am$/.in/' |
- while read f; do touch "$f"; done
- ;;
-
- autom4te)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- fi
-
- echo 1>&2 "\
-WARNING: \`$1' is needed, and you do not seem to have it handy on your
- system. You might have modified some files without having the
- proper tools for further handling them.
- You can get \`$1Help2man' as part of \`Autoconf' from any GNU
- archive site."
-
- file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
- test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
- if test -f "$file"; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo "#! /bin/sh"
- echo "# Created by GNU Automake missing as a replacement of"
- echo "# $ $@"
- echo "exit 0"
- chmod +x $file
- exit 1
- fi
- ;;
-
- bison|yacc)
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified a \`.y' file. You may need the \`Bison' package
- in order for those modifications to take effect. You can get
- \`Bison' from any GNU archive site."
- rm -f y.tab.c y.tab.h
- if [ $# -ne 1 ]; then
- eval LASTARG="\${$#}"
- case "$LASTARG" in
- *.y)
- SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
- if [ -f "$SRCFILE" ]; then
- cp "$SRCFILE" y.tab.c
- fi
- SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
- if [ -f "$SRCFILE" ]; then
- cp "$SRCFILE" y.tab.h
- fi
- ;;
- esac
- fi
- if [ ! -f y.tab.h ]; then
- echo >y.tab.h
- fi
- if [ ! -f y.tab.c ]; then
- echo 'main() { return 0; }' >y.tab.c
- fi
- ;;
-
- lex|flex)
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified a \`.l' file. You may need the \`Flex' package
- in order for those modifications to take effect. You can get
- \`Flex' from any GNU archive site."
- rm -f lex.yy.c
- if [ $# -ne 1 ]; then
- eval LASTARG="\${$#}"
- case "$LASTARG" in
- *.l)
- SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
- if [ -f "$SRCFILE" ]; then
- cp "$SRCFILE" lex.yy.c
- fi
- ;;
- esac
- fi
- if [ ! -f lex.yy.c ]; then
- echo 'main() { return 0; }' >lex.yy.c
- fi
- ;;
-
- help2man)
- if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
- # We have it, but it failed.
- exit 1
- fi
-
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified a dependency of a manual page. You may need the
- \`Help2man' package in order for those modifications to take
- effect. You can get \`Help2man' from any GNU archive site."
-
- file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
- if test -z "$file"; then
- file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
- fi
- if [ -f "$file" ]; then
- touch $file
- else
- test -z "$file" || exec >$file
- echo ".ab help2man is required to generate this page"
- exit 1
- fi
- ;;
-
- makeinfo)
- if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
- # We have makeinfo, but it failed.
- exit 1
- fi
-
- echo 1>&2 "\
-WARNING: \`$1' is missing on your system. You should only need it if
- you modified a \`.texi' or \`.texinfo' file, or any other file
- indirectly affecting the aspect of the manual. The spurious
- call might also be the consequence of using a buggy \`make' (AIX,
- DU, IRIX). You might want to install the \`Texinfo' package or
- the \`GNU make' package. Grab either from any GNU archive site."
- file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
- if test -z "$file"; then
- file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
- file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
- fi
- touch $file
- ;;
-
- tar)
- shift
- if test -n "$run"; then
- echo 1>&2 "ERROR: \`tar' requires --run"
- exit 1
- fi
-
- # We have already tried tar in the generic part.
- # Look for gnutar/gtar before invocation to avoid ugly error
- # messages.
- if (gnutar --version > /dev/null 2>&1); then
- gnutar "$@" && exit 0
- fi
- if (gtar --version > /dev/null 2>&1); then
- gtar "$@" && exit 0
- fi
- firstarg="$1"
- if shift; then
- case "$firstarg" in
- *o*)
- firstarg=`echo "$firstarg" | sed s/o//`
- tar "$firstarg" "$@" && exit 0
- ;;
- esac
- case "$firstarg" in
- *h*)
- firstarg=`echo "$firstarg" | sed s/h//`
- tar "$firstarg" "$@" && exit 0
- ;;
- esac
- fi
-
- echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
- You may want to install GNU tar or Free paxutils, or check the
- command line arguments."
- exit 1
- ;;
-
- *)
- echo 1>&2 "\
-WARNING: \`$1' is needed, and you do not seem to have it handy on your
- system. You might have modified some files without having the
- proper tools for further handling them. Check the \`README' file,
- it often tells you about the needed prerequirements for installing
- this package. You may also peek at any GNU archive site, in case
- some other package would contain this missing \`$1' program."
- exit 1
- ;;
-esac
-
-exit 0
diff --git a/mkinstalldirs b/mkinstalldirs
deleted file mode 100755
index 8ab885e..0000000
--- a/mkinstalldirs
+++ /dev/null
@@ -1,99 +0,0 @@
-#! /bin/sh
-# mkinstalldirs --- make directory hierarchy
-# Author: Noah Friedman <friedman@prep.ai.mit.edu>
-# Created: 1993-05-16
-# Public domain
-
-errstatus=0
-dirmode=""
-
-usage="\
-Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
-
-# process command line arguments
-while test $# -gt 0 ; do
- case "${1}" in
- -h | --help | --h* ) # -h for help
- echo "${usage}" 1>&2; exit 0 ;;
- -m ) # -m PERM arg
- shift
- test $# -eq 0 && { echo "${usage}" 1>&2; exit 1; }
- dirmode="${1}"
- shift ;;
- -- ) shift; break ;; # stop option processing
- -* ) echo "${usage}" 1>&2; exit 1 ;; # unknown option
- * ) break ;; # first non-opt arg
- esac
-done
-
-for file
-do
- if test -d "$file"; then
- shift
- else
- break
- fi
-done
-
-case $# in
-0) exit 0 ;;
-esac
-
-case $dirmode in
-'')
- if mkdir -p -- . 2>/dev/null; then
- echo "mkdir -p -- $*"
- exec mkdir -p -- "$@"
- fi ;;
-*)
- if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
- echo "mkdir -m $dirmode -p -- $*"
- exec mkdir -m "$dirmode" -p -- "$@"
- fi ;;
-esac
-
-for file
-do
- set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
- shift
-
- pathcomp=
- for d
- do
- pathcomp="$pathcomp$d"
- case "$pathcomp" in
- -* ) pathcomp=./$pathcomp ;;
- esac
-
- if test ! -d "$pathcomp"; then
- echo "mkdir $pathcomp"
-
- mkdir "$pathcomp" || lasterr=$?
-
- if test ! -d "$pathcomp"; then
- errstatus=$lasterr
- else
- if test ! -z "$dirmode"; then
- echo "chmod $dirmode $pathcomp"
-
- lasterr=""
- chmod "$dirmode" "$pathcomp" || lasterr=$?
-
- if test ! -z "$lasterr"; then
- errstatus=$lasterr
- fi
- fi
- fi
- fi
-
- pathcomp="$pathcomp/"
- done
-done
-
-exit $errstatus
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 3
-# End:
-# mkinstalldirs ends here
diff --git a/readme b/readme
deleted file mode 100755
index 5b596db..0000000
--- a/readme
+++ /dev/null
@@ -1,108 +0,0 @@
- Xbase64 Version 3.1.0
-
-
-
-WHAT IS IT?
------------
-
-Xbase64 is an xbase (i.e. dBase, FoxPro, etc.) compatible C++ class library
-originally by Gary Kunkel and others (see the AUTHORS file).
-
-Xbase64 is useful for accessing data in legacy dBase 3 and 4 database files as
-well as a general light-weight database engine. It includes support for
-DBF (dBase version 3 and 4) data files, NDX and NTX indexes, and DBT
-(dBase version 3 and 4). It supports file and record locking under *nix
-and Windows.
-
-
-DIRECTORY LAYOUT
-----------------
-
- /bin contains various utility programs
- /examples contains various test programs
- /html contains the original xBase documentation in html format
- /xbase64 Xbase64 source and header files
-
-
-BUILDING THE LIBRARY ON UNIX/LINUX
-----------------------------------
-
-XBase64 uses autoconf and libtool to manage the build process.
-
-To configure the library for your specific system, run the "configure"
-shell script as follows:
-
- ./configure
-
-The configure script accepts the following options in addition to the
-normal default options:
-
- --enable-debug creates debugging code [default=no]
- --enable-shared build shared libraries [default=yes]
- --enable-static build static libraries [default=no]
- --with-gnu-ld assume the C compiler uses GNU ld [default=no]
- --without-index-ndx turn off .ndx index support
- --without-index-ntx turn off .ntx index support
- --without-memo-fields turn off memo fields support
- --without-expressions turn off expressions support
- --without-xbase-locking turn off XBase file locking
- --without-realdelete turn off XBase record deletion
- --without-xbase-debug turn off XBase specific debug
- --without-largefile-support turn off XBase largefile support
-
-Once configured, execute make as follows to build the library:
-
- make
-
-Once compiled (and assuming no errors occurred), use make to install the
-library, header files, and utilities as follows:
-
- make install
-
-The default install directory is /usr/local.
-
-
-BUILDING THE LIBRARY ON WINDOWS
--------------------------------
-
-The MINGW32 and CYGWIN compiler support didn't make the first cut to
-Xbase64. They will be migrated forward in a future release of xbase64.
-Any volunteers?
-
-If using the MINGW32 GCC compiler package, use the makefile.g95 make files.
-Edit bin/makefile.g95 xbase/makefile.g95 to change installation directories.
-
-If using the CYGWIN environment, use the makefile.cyg make files (or fix
-the autoconf/automake stuff to work correclty). However, for some reason
-(as yet undetermined) it seems to run very slowly when compiled with the
-cygwin compiler (perhaps the file handing in the cygwin dll is just dog slow?).
-
-
-BUILDING THE LIRARY WITH BORLAND 5.5
-------------------------------------
-
-There are batch files MAKEBCC.BAT which build the xbase libs for
-Borland C++ 5.5.
-
-
-
-DOCUMENTATION
--------------
-
-The documentation at this point consists of the original xBase documentation
-(in the html directory). It is still very useful as little has changed
-from the original library except bugfixes and a few enhancements.
-
-We are working on incorporating comments into the source to allow
-generation of reference documentation using the Doxygen document generator.
-A small amount has been done already, but we hope to complete this effort
-before the next release.
-
-
-CONTACT
--------
-
-Please email comments, bug reports, and patches to Gary Kunkel
-xdb-dev@lists.sourceforge.net
-
-
diff --git a/sql/del.sql b/sql/del.sql
new file mode 100755
index 0000000..d8699cc
--- /dev/null
+++ b/sql/del.sql
@@ -0,0 +1,9 @@
+# HELP;
+
+USE /opt/1Tdata/xbase/xbase.30/data;
+
+DROP TABLE IF EXISTS TestSqlM.DBF;
+
+
+
+
diff --git a/sql/oneNdxTag.sql b/sql/oneNdxTag.sql
new file mode 100755
index 0000000..71ff217
--- /dev/null
+++ b/sql/oneNdxTag.sql
@@ -0,0 +1,18 @@
+# HELP;
+
+# where the tables live
+USE /mnt/1Tdata/xbase/xbase.35/data;
+
+
+DROP TABLE IF EXISTS OneNdxTg.DBF;
+
+CREATE TABLE OneNdxTg.DBF( CHRFLD CHAR(50), DTFLD DATE, INTFLD INTEGER, SMINTFLD SMALLINT, NUMFLD NUMERIC(9,4), DECFLD DECIMAL(9,4), FLTFLD FLOAT(9,4) LGFLD LOGICAL );
+
+CREATE INDEX OneNdxTg.NDX ON OneNdxTg.DBF( CHRFLD ) ASSOCIATE;
+
+INSERT INTO OneNdxTg.DBF ( CHRFLD ) Values ('AAA' );
+INSERT INTO OneNdxTg.DBF ( CHRFLD ) Values ('BBB' );
+INSERT INTO OneNdxTg.DBF ( CHRFLD ) Values ('CCC' );
+INSERT INTO OneNdxTg.DBF ( CHRFLD ) Values ('aaa' );
+INSERT INTO OneNdxTg.DBF ( CHRFLD ) Values ('bbb' );
+INSERT INTO OneNdxTg.DBF ( CHRFLD ) Values ('ccc' ); \ No newline at end of file
diff --git a/sql/testc.sql b/sql/testc.sql
new file mode 100755
index 0000000..85d9f18
--- /dev/null
+++ b/sql/testc.sql
@@ -0,0 +1,13 @@
+# HELP;
+
+USE /opt/1Tdata/xbase/xbase.30/data;
+
+# INSERT INTO TestSQL.DBF (CITY, STATE, ZIPCODE, NOTES, LASTUPDATE, ACTIVE ) VALUES ( 'San Diego', 'CA', 92007, 'San Diego is a cool place', '1989-02-09', 'Y');
+
+DROP TABLE IF EXISTS TestSql.DBF;
+CREATE TABLE TestSql.DBF( CHRFLD CHAR(6), DTFLD DATE, INTFLD INTEGER, SMINTFLD SMALLINT, NUMFLD NUMERIC(9,4), DECFLD DECIMAL(9,4), FLTFLD FLOAT(9,4) VCHARFLD VARCHAR, LGFLD LOGICAL);
+CREATE UNIQUE INDEX TestSql1.NDX ON TestSql.DBF( CHRFLD ) ASSOCIATE;
+
+# DROP INDEX IF EXISTS TestSql1.NDX ON TestSql.DBF;
+
+
diff --git a/sql/testd.sql b/sql/testd.sql
new file mode 100755
index 0000000..3bac01c
--- /dev/null
+++ b/sql/testd.sql
@@ -0,0 +1,12 @@
+# HELP;
+
+USE /opt/1Tdata/xbase/xbase.30/data;
+
+# INSERT INTO TestSQL.DBF (CITY, STATE, ZIPCODE, NOTES, LASTUPDATE, ACTIVE ) VALUES ( 'San Diego', 'CA', 92007, 'San Diego is a cool place', '1989-02-09', 'Y');
+
+# CREATE TABLE TestSql.DBF( CHRFLD CHAR(6), DTFLD DATE, INTFLD INTEGER, SMINTFLD SMALLINT, NUMFLD NUMERIC(9,4), DECFLD DECIMAL(9,4), FLTFLD FLOAT(9,4) VCHARFLD VARCHAR, LGFLD LOGICAL );
+# CREATE UNIQUE INDEX TestSql1.NDX ON TestSql.DBF( CHRFLD ) ASSOCIATE;
+
+DROP INDEX IF EXISTS TestSql1.NDX ON TestSql.DBF;
+
+
diff --git a/sql/testdd.sql b/sql/testdd.sql
new file mode 100755
index 0000000..85c8000
--- /dev/null
+++ b/sql/testdd.sql
@@ -0,0 +1,14 @@
+HELP;
+
+USE /opt/1Tdata/xbase/xbase.30/data;
+
+# INSERT INTO TestSQL.DBF (CITY, STATE, ZIPCODE, NOTES, LASTUPDATE, ACTIVE ) VALUES ( 'San Diego', 'CA', 92007, 'San Diego is a cool place', '1989-02-09', 'Y');
+
+# CREATE TABLE TestSql.DBF( CHRFLD CHAR(6), DTFLD DATE, INTFLD INTEGER, SMINTFLD SMALLINT, NUMFLD NUMERIC(9,4), DECFLD DECIMAL(9,4), FLTFLD FLOAT(9,4) VCHARFLD VARCHAR, LGFLD LOGICAL );
+# CREATE UNIQUE INDEX TestSql1.NDX ON TestSql.DBF( CHRFLD ) ASSOCIATE;
+
+#DROP INDEX IF EXISTS TestSql1.NDX ON TestSql.DBF;
+
+DROP TABLE IF EXISTS TestSql.DBF;
+
+
diff --git a/sql/testflg.sql b/sql/testflg.sql
new file mode 100755
index 0000000..2d00290
--- /dev/null
+++ b/sql/testflg.sql
@@ -0,0 +1,12 @@
+# HELP;
+
+USE /opt/1Tdata/xbase/xbase.30/data;
+
+DROP TABLE IF EXISTS TestFlag.DBF;
+
+CREATE TABLE TestFlag.DBF( C1 CHAR(1), C2 CHAR(2), C3 CHAR(3), D1 DATE, D2 DATE, D3 DATE, I1 INTEGER, I2 INTEGER, I3 INTEGER, N1 NUMERIC(9,1), N2 NUMERIC(9,2), N3 NUMERIC(9,3));
+
+# CREATE INDEX TestSql2 ON TestSql2.DBF( CHRFLD );
+
+
+
diff --git a/sql/testmdx.sql b/sql/testmdx.sql
new file mode 100755
index 0000000..859334b
--- /dev/null
+++ b/sql/testmdx.sql
@@ -0,0 +1,12 @@
+# HELP;
+
+USE /opt/1Tdata/xbase/xbase.30/data;
+
+DROP TABLE IF EXISTS TestSqlM.DBF;
+
+CREATE TABLE TestSqlM.DBF( CHRFLD CHAR(6), DTFLD DATE, INTFLD INTEGER, SMINTFLD SMALLINT, NUMFLD NUMERIC(9,4), DECFLD DECIMAL(9,4), FLTFLD FLOAT(9,4) LGFLD LOGICAL );
+
+# CREATE INDEX TestSqlM ON TestSqlM.DBF( CHRFLD );
+
+
+
diff --git a/sql/testmdx2.sql b/sql/testmdx2.sql
new file mode 100755
index 0000000..040dddd
--- /dev/null
+++ b/sql/testmdx2.sql
@@ -0,0 +1,12 @@
+# HELP;
+
+USE /opt/1Tdata/xbase/xbase.30/data;
+
+DROP TABLE IF EXISTS TestSql2.DBF;
+
+CREATE TABLE TestSql2.DBF( CHRFLD CHAR(100), DTFLD DATE, INTFLD INTEGER, SMINTFLD SMALLINT, NUMFLD NUMERIC(9,4), DECFLD DECIMAL(9,4), FLTFLD FLOAT(9,4) LGFLD LOGICAL );
+
+CREATE INDEX Ctag1 ON TestSql2.DBF( CHRFLD );
+
+
+
diff --git a/sql/twotags.sql b/sql/twotags.sql
new file mode 100755
index 0000000..6840709
--- /dev/null
+++ b/sql/twotags.sql
@@ -0,0 +1,10 @@
+# HELP;
+
+USE /opt/1Tdata/xbase/xbase.30/data;
+
+DROP TABLE IF EXISTS TwoTags.DBF;
+
+CREATE TABLE TwoTags.DBF( CHRFLD1 CHAR(100), CHRFLD2 CHAR(100), DTFLD DATE, INTFLD INTEGER, SMINTFLD SMALLINT, NUMFLD NUMERIC(9,4), DECFLD DECIMAL(9,4), FLTFLD FLOAT(9,4) LGFLD LOGICAL );
+
+
+
diff --git a/src/core/xbbcd.cpp b/src/core/xbbcd.cpp
new file mode 100755
index 0000000..4855e80
--- /dev/null
+++ b/src/core/xbbcd.cpp
@@ -0,0 +1,333 @@
+/* xbbcd.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+ BCD class
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_INDEX_SUPPORT
+///@cond DOXYOFF
+namespace xb{
+
+
+
+xbBool bcdBitSet( unsigned char c, xbInt16 iBitNo ){
+ return c & 1 << iBitNo;
+}
+void bcdBitDump( unsigned char c ){
+ for( int i = 7; i >= 0; i-- )
+ std::cout << (bcdBitSet( c, i ) ? 1 : 0);
+}
+void bcdBitDump( char c ){
+ bcdBitDump( (unsigned char) c );
+}
+
+
+/***********************************************************************/
+void xbBcd::ctor(){
+ memset( &bcd, 0x00, sizeof( xbBcdStruct ));
+}
+/***********************************************************************/
+xbBcd::xbBcd( xbDouble d ) {
+ Set( d );
+}
+/***********************************************************************/
+xbBcd::xbBcd( const xbString &sNumIn ) {
+ Set( sNumIn );
+}
+/***********************************************************************/
+xbBcd::xbBcd( const void *vBcdIn ) {
+ memcpy( &bcd, vBcdIn, sizeof( xbBcdStruct ));
+}
+/***********************************************************************/
+void xbBcd::Set( xbDouble d ) {
+ ctor();
+ xbString s( d );
+ StringToBcd( s );
+}
+/***********************************************************************/
+void xbBcd::Set( const xbString &sNumIn ) {
+ ctor();
+ StringToBcd( sNumIn );
+}
+/***********************************************************************/
+void xbBcd::Set( const void *vBcdIn ) {
+ memcpy( &bcd, vBcdIn, sizeof( xbBcdStruct ));
+}
+/***********************************************************************/
+void xbBcd::StringToBcd( const xbString &sIn )
+{
+
+ unsigned char cEdc = 0; // encoded digit count
+ xbUInt32 iPos; // current position in source string
+ xbBool bDecHit = xbFalse; // decimal position hit?
+ unsigned char *p = bcd.cData; // pointer to cData
+ xbInt16 iBytePos = 0; // next load position in xbs structure
+ xbInt16 iBcdDataPos = 0; // current position in output structure
+ xbByteSplit xbs; // combiner
+
+
+ ctor();
+ xbString sNum( sIn );
+ xbBool bSign = xbFalse;
+
+ sNum.Trim();
+ if( sNum[1] == '-' ){
+ bSign = 1;
+ sNum.ZapLeadingChar( '-' );
+ }
+ sNum.ZapLeadingChar( '0' );
+
+ xbInt16 iDecPos = sNum.Pos( '.' );
+ if( iDecPos > 0 ){
+ sNum.ZapTrailingChar( '0' );
+ cEdc = (unsigned char) (sNum.Len() - 1);
+ } else {
+ cEdc = (unsigned char) (sNum.Len());
+ }
+ if( cEdc > 31 ) cEdc = 31; // max 5 bit number
+
+
+ if( sNum[1] == '.' ){
+ iPos = 2;
+ bDecHit = xbTrue;
+ while( sNum[iPos] == '0' && iPos <= sNum.Len()){
+ bcd.cSigDigits--;
+ iPos++;
+ }
+ } else {
+ iPos = 1;
+ }
+
+ while( iPos <= sNum.Len() ){
+ if( sNum[iPos] == '.' )
+ bDecHit = true;
+ else{
+ if( !bDecHit ){
+ bcd.cSigDigits++;
+ }
+ if( iBytePos++ == 0 ){
+ xbs.c2 = (unsigned) sNum[iPos] - 0x30;
+ } else {
+ xbs.c1 = (unsigned) sNum[iPos] - 0x30;
+ iBytePos = 0;
+ if( iBcdDataPos++ < 10 ){
+ memcpy( p++, &xbs, 1 );
+ xbs.c1 = 0x00;
+ }
+ }
+ }
+ iPos++;
+ }
+
+ if( iBytePos == 1 && iBcdDataPos < 10 ){
+ memcpy( p, &xbs, 1 );
+ }
+
+ bcd.cSigDigits += 52;
+ bcd.cEncDigits = cEdc << 2;
+ bcd.cEncDigits = bcd.cEncDigits | 0x01;
+ if( bSign )
+ bcd.cEncDigits = bcd.cEncDigits | 0x80;
+
+
+/*
+ std::cout << "num in = " << sIn.Str() << "\n";
+ unsigned char bW[12];
+ memcpy( bW, &bcd, 12 );
+ std::cout << "bx ";
+ for( int i = 0; i < 12; i++ ){
+ bcdBitDump( bW[i] );
+ std::cout << " ";
+ }
+ std::cout << "\n";
+
+ unsigned char cSign = bcd.cEncDigits >> 7;
+ std::cout << "bs ";
+ bcdBitDump( cSign );
+ std::cout << "\n";
+
+ std::cout << "test = ";
+ bcdBitDump( cEdc );
+ std::cout << " ";
+ bcdBitDump( GetEncDigitsNoSign() );
+ std::cout << "\n";
+ bcdBitDump( bcd.cEncDigits );
+
+ unsigned char c = bcd.cEncDigits;
+ c = c << 1;
+ c = c >> 3;
+ std::cout << " ";
+ bcdBitDump( c );
+ std::cout << "\n";
+*/
+}
+/***********************************************************************/
+void xbBcd::ToChar( char * cOut ){
+
+ memcpy( cOut, &bcd, sizeof( xbBcdStruct ));
+}
+/***********************************************************************/
+void xbBcd::ToDouble( xbDouble &d ){
+ xbString s;
+ ToString( s );
+ d = atof( s.Str());
+}
+/***********************************************************************/
+void xbBcd::ToString( xbString &sStringOut ){
+
+// printf( "\n\n\nToString " );
+// printf( "Sig digits [%d] EncodedDigits [%d] sign [%d] sizeof struct [%d]\n",
+// bcd.cSigDigits - 52 , bcd.EncDigits, bcd.Sign, sizeof( xbBcdStruct ));
+
+// this routine converts a bcd numeric key value to a base 10 number in a string
+
+
+ xbBool bHasDot = false;
+ xbInt16 iSig = bcd.cSigDigits - 52;
+ xbByteSplit xbs;
+ unsigned char *p = bcd.cData;
+ unsigned char c;
+
+// xbInt16 iEnc = bcd.cEncDigits;
+ xbInt16 iEnc = GetEncDigitsNoSign();
+
+ // set the sign
+ // if( bcd.Sign )
+ if( bcd.cEncDigits >> 7 )
+ sStringOut = "-";
+ else
+ sStringOut = "";
+
+ // do add any needed zeroes after the decimal
+ if( iSig <= 0 ){
+ if( iEnc > 0 ){
+ sStringOut.Append( "." );
+ bHasDot = true;
+ }
+ for( xbInt16 i = iSig; i < 0; i++ )
+ sStringOut.Append( "0" );
+ }
+
+ // do the encoded digits
+ while( iEnc > 0 ){
+ if( iSig == 0 && !bHasDot )
+ sStringOut.Append( "." );
+ c = *p++;
+ memcpy( &xbs, &c, 1 );
+ c = xbs.c2 + 0x30;
+ sStringOut.Append((char) c );
+ iSig--;
+ iEnc--;
+ if( iEnc > 0 ){
+ if( iSig == 0 && !bHasDot )
+ sStringOut.Append( "." );
+ c = xbs.c1 + 0x30;
+ sStringOut.Append((char) c );
+ iSig--;
+ iEnc--;
+ }
+ }
+ // do the trailing zeroes
+ while( iSig-- > 0 )
+ sStringOut.Append( "0" );
+ if( sStringOut == "" )
+ sStringOut = "0";
+
+}
+
+/***********************************************************************/
+xbInt16 xbBcd::Compare( xbDouble d ){
+ xbBcd bcdIn( d );
+
+ xbString s;
+ bcdIn.ToString( s );
+ return Compare( bcdIn );
+}
+
+/***********************************************************************/
+xbInt16 xbBcd::Compare( const xbBcd &bcdIn ){
+ // if this == bcdIn return 0
+ // if this < bcdIn return -1
+ // if this > bcdIn return 1
+
+
+ xbInt16 iRc = 0;
+// if( bcd.Sign != bcdIn.GetSign() ){
+// bcd.Sign > 0 ? iRc = -1 : iRc = 1;
+
+ if( (bcd.cEncDigits >> 7 ) != bcdIn.GetSign() ){
+ (bcd.cEncDigits >> 7 ) > 0 ? iRc = -1 : iRc = 1;
+ return iRc;
+ }
+
+ if( bcd.cSigDigits != bcdIn.GetSigDigits()){
+ // if( !bcd.Sign ){ // positive numbers
+ if( !(bcd.cEncDigits >> 7 )){ // positive numbers
+ if( bcd.cSigDigits > bcdIn.GetSigDigits())
+ return 1;
+ else
+ return -1;
+ } else { // negative numbers
+ if( bcd.cSigDigits > bcdIn.GetSigDigits())
+ return -1;
+ else
+ return 1;
+ }
+ }
+
+// iRc = xbXBase::xbMemcmp( bcd.cData, bcdIn.GetData(), (size_t)((bcd.cEncDigits + 1) / 2) );
+ iRc = xbXBase::xbMemcmp( bcd.cData, bcdIn.GetData(), (size_t)((GetEncDigitsNoSign() + 1) / 2) );
+ if( iRc == 0 )
+ return 0;
+ // else if((!bcd.Sign && iRc > 0) || (bcd.Sign && iRc < 0 ))
+ else if((!(bcd.cEncDigits >> 7) && iRc > 0) || ((bcd.cEncDigits >> 7) && iRc < 0 ))
+ return 1;
+ else
+ return -1;
+}
+
+
+/***********************************************************************/
+unsigned char xbBcd::GetEncDigitsNoSign() const {
+ unsigned char c = bcd.cEncDigits << 1;
+ return c >> 3;
+}
+/***********************************************************************/
+unsigned xbBcd::GetSign() const {
+ //return bcd.Sign;
+ return bcd.cEncDigits >> 7;
+}
+/***********************************************************************/
+unsigned xbBcd::GetSigDigits() const {
+ return bcd.cSigDigits;
+}
+/***********************************************************************/
+unsigned xbBcd::GetActualSigDigits() const {
+ return bcd.cSigDigits - (xbUInt32) 52;
+}
+/***********************************************************************/
+const unsigned char * xbBcd::GetData() const {
+ const unsigned char *p = bcd.cData;
+ return p;
+}
+/***********************************************************************/
+const void * xbBcd::GetBcd() const {
+ return &bcd;
+}
+} /* namespace */
+///@endcond DOXYOFF
+#endif /* XB_INDEX_SUPPORT */
+
diff --git a/src/core/xbdate.cpp b/src/core/xbdate.cpp
new file mode 100755
index 0000000..ba0fdf1
--- /dev/null
+++ b/src/core/xbdate.cpp
@@ -0,0 +1,802 @@
+/* xbdate.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+#include <time.h>
+
+namespace xb{
+
+int xbDate::iDaysInMonths[2][13];
+int xbDate::iAggregatedDaysInMonths[2][13];
+
+/*************************************************************************/
+//! @brief Constructor.
+
+xbDate::xbDate() {
+ Sysdate();
+ SetDateTables();
+}
+
+/*************************************************************************/
+//! @brief Constructor.
+/*!
+ \param sDate8In - Input date.
+*/
+
+xbDate::xbDate( const xbString & sDate8In ) {
+ if( DateIsValid( sDate8In ))
+ sDate8.Set( sDate8In );
+ else
+ Sysdate();
+ SetDateTables();
+}
+
+/*************************************************************************/
+//! @brief Constructor.
+/*!
+ \param sDate8In - Input date.
+*/
+xbDate::xbDate( const char * sDate8In ) {
+
+ if( DateIsValid( sDate8In ))
+ sDate8.Set( sDate8In );
+ else
+ Sysdate();
+ SetDateTables();
+}
+
+/*************************************************************************/
+//! @brief Constructor.
+/*!
+ \param lJulDate - Input julian date.
+*/
+xbDate::xbDate( xbInt32 lJulDate ) {
+ SetDateTables();
+ JulToDate8( lJulDate );
+}
+
+/*************************************************************************/
+//! @brief Destructor.
+xbDate::~xbDate(){}
+/*************************************************************************/
+//! @brief Set operator=
+/*!
+ \param dt - Date value for set operation.
+*/
+void xbDate::operator=( const xbDate & dt ){
+ sDate8.Set( dt.Str());
+}
+/*************************************************************************/
+//! @brief operator +=
+/*!
+ This routine adds lDays to the date
+ \param lDays - Number of days to add to the date.
+*/
+void xbDate::operator+=( xbInt32 lDays ){
+ JulToDate8( JulianDays() + lDays );
+}
+/*************************************************************************/
+//! @brief operator -=
+/*!
+ This routine subtracts lDays from the date.
+ \param lDays - Number of days to subtract from the date.
+*/
+void xbDate::operator-=( xbInt32 lDays ){
+ JulToDate8( JulianDays() - lDays );
+}
+/*************************************************************************/
+//! @brief operator ++
+/*!
+ This routine adds one day to the date field.
+*/
+void xbDate::operator++(xbInt32){
+ *this+=1;
+}
+/*************************************************************************/
+//! @brief operator --
+/*!
+ This routine subtracts one day from the date field.
+*/
+void xbDate::operator--(xbInt32){
+ *this-=1;
+ return;
+}
+/*************************************************************************/
+//! @brief operator -
+/*!
+ This routine subtracts one date from another date returning the difference.
+ \param dt - Date to subtract.
+ \returns Number of days
+*/
+xbInt32 xbDate::operator-( const xbDate &dt ) const{
+ return JulianDays() - dt.JulianDays();
+}
+/*************************************************************************/
+//! @brief operator +
+/*!
+ This routine adds additional days to a date field.
+ \param lCount - Number of days to add.
+ \returns New date in CCYYMMDD format.
+*/
+const char *xbDate::operator+( xbInt32 lCount ){
+ JulToDate8( JulianDays() + lCount );
+ return sDate8.Str();
+}
+/*************************************************************************/
+//! @brief operator -
+/*!
+ This routine subtracts days from a date field.
+ \param lCount - Number of days to subtract.
+ \returns New date in CCYYMMDD format.
+*/
+const char *xbDate::operator-( xbInt32 lCount ){
+ JulToDate8( JulianDays() - lCount );
+ return sDate8;
+}
+/*************************************************************************/
+//! @brief operator ==
+/*!
+ This routine compares two dates for equality.
+ \param dt - Date to compare.
+ \returns xbTrue - Dates match.<br>xbFalse - Dates don't match.
+*/
+xbBool xbDate::operator==( const xbDate &dt ) const{
+ if( JulianDays() == dt.JulianDays() )
+ return xbTrue;
+ else
+ return xbFalse;
+}
+/*************************************************************************/
+//! @brief operator !=
+/*!
+ This routine compares two dates for inequality.
+ \param dt - Date to compare.
+ \returns xbTrue - Dates don't match.<br>xbFalse - Dates match.
+*/
+xbBool xbDate::operator!=( const xbDate &dt ) const{
+ if( JulianDays() != dt.JulianDays() )
+ return xbTrue;
+ else
+ return xbFalse;
+}
+/*************************************************************************/
+//! @brief operator <
+/*!
+ This routine compares two dates
+ \param dt - Date to compare.
+ \returns xbTrue - Left date is less than right date.<br>
+ xbFalse - Left date is not less than right date.
+*/
+xbBool xbDate::operator<( const xbDate &dt ) const {
+ if( JulianDays() < dt.JulianDays() )
+ return xbTrue;
+ else
+ return xbFalse;
+}
+/*************************************************************************/
+//! @brief >
+/*!
+ This routine compares two dates
+ \param dt - Date to compare.
+ \returns xbTrue - Left date is greater than right date.<br>
+ xbFalse - Left date is not greater than right date.
+*/
+xbBool xbDate::operator>( const xbDate &dt ) const {
+ if( JulianDays() > dt.JulianDays() )
+ return xbTrue;
+ else
+ return xbFalse;
+}
+/*************************************************************************/
+//! @brief operator <=
+/*!
+ This routine compares two dates
+ \param dt - Date to compare.
+ \returns xbTrue - Left date is less than or equal to right date.<br>
+ xbFalse - Left date is not less than or equal to right date.
+*/
+xbBool xbDate::operator<=( const xbDate &dt ) const {
+ if( JulianDays() <= dt.JulianDays() )
+ return xbTrue;
+ else
+ return xbFalse;
+}
+/*************************************************************************/
+//! @brief operator >=
+/*!
+ This routine compares two dates
+ \param dt - Date to compare.
+ \returns xbTrue - Left date is greater than or equal to right date.<br>
+ xbFalse - Left date is not greater than or equal to right date.
+*/
+xbBool xbDate::operator>=( const xbDate &dt ) const {
+ if( JulianDays() >= dt.JulianDays() )
+ return xbTrue;
+ else
+ return xbFalse;
+}
+/*************************************************************************/
+//! @brief Calculate century for a given year.
+/*!
+ This routine calculates a century for a given year. It uses an 80/20
+ rolling date window to calculate the century.
+
+ \param iCalcYear - Two digit year to calculate a century for.
+ \returns Century calculated for the two digit year.
+*/
+xbInt16 xbDate::CalcRollingCenturyForYear( xbInt16 iCalcYear ) const {
+
+ xbDate d;
+ xbInt16 iThisYear = d.YearOf();
+ xbInt16 iThisCentury = d.CenturyOf();
+ iThisYear -= (iThisCentury * 100);
+ if( iThisYear < 80 && iCalcYear < (iThisYear+20) )
+ return iThisCentury;
+ else if( iThisYear >= 80 &&
+ iCalcYear < iThisYear &&
+ iCalcYear >= (iThisYear-80))
+ return iThisCentury;
+ else
+ return iThisCentury - 1;
+}
+/*************************************************************************/
+//! @brief Get century for date.
+/*!
+ \returns This routine returns the century from the date.
+*/
+xbInt16 xbDate::CenturyOf() const {
+ char Century[3];
+ Century[0] = sDate8[1];
+ Century[1] = sDate8[2];
+ Century[2] = 0x00;
+ return( atoi( Century ));
+}
+/*************************************************************************/
+//! @brief Get the day of the week.
+/*!
+ \param sOutCharDay - Output character day of week (Sun-Sat).
+ \returns XB_INVALID_DATE<br>XB_NO_ERROR
+*/
+xbInt16 xbDate::CharDayOf( xbString &sOutCharDay ) {
+
+ struct tm tblock;
+ char buf[25];
+
+ tblock.tm_year = YearOf() - 1900;
+ tblock.tm_mon = MonthOf() - 1;
+ tblock.tm_mday = DayOf( XB_FMT_MONTH );
+ tblock.tm_hour = 0;
+ tblock.tm_min = 0;
+ tblock.tm_sec = 1;
+ tblock.tm_isdst = -1;
+ if( mktime( &tblock ) == -1 ){
+ sOutCharDay = "" ;
+ return XB_INVALID_DATE;
+ } else {
+ strftime( buf, 25, "%A", &tblock );
+ sOutCharDay = buf;
+ }
+ return XB_NO_ERROR;;
+}
+/*************************************************************************/
+//! @brief Get the month from the date.
+/*!
+ \param sOutCharMonth - Output character month.
+ \returns XB_INVALID_DATE<br>XB_NO_ERROR
+*/
+xbInt16 xbDate::CharMonthOf( xbString &sOutCharMonth ) {
+ struct tm tblock;
+ char buf[25];
+ tblock.tm_year = YearOf() - 1900;
+ tblock.tm_mon = MonthOf() - 1;
+ tblock.tm_mday = DayOf( XB_FMT_MONTH );
+ tblock.tm_hour = 0;
+ tblock.tm_min = 0;
+ tblock.tm_sec = 1;
+ tblock.tm_isdst = -1;
+ if( mktime( &tblock ) == -1 ){
+ sOutCharMonth = "";
+ return XB_INVALID_DATE;
+ } else {
+ strftime( buf, 25, "%B", &tblock );
+ sOutCharMonth = buf;
+ }
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Check a date for valid data.
+/*!
+ \param sDateIn - Date to check for valid formaat of CCYYMMDD.
+ \returns xbTrue - Valid date.<br>xbFalse - Not a valid date.
+*/
+xbBool xbDate::DateIsValid( const xbString &sDateIn ) const {
+
+ xbInt16 iYear, iMonth, iDay;
+ char sYear[5];
+ char sMonth[3];
+ char sDay[3];
+
+ if( sDateIn.Len() != 8 )
+ return xbFalse;
+
+ if(!isdigit( sDateIn[1] ) || !isdigit( sDateIn[2] ) || !isdigit( sDateIn[3] ) ||
+ !isdigit( sDateIn[4] ) || !isdigit( sDateIn[5] ) || !isdigit( sDateIn[6] ) ||
+ !isdigit( sDateIn[7] ) || !isdigit( sDateIn[8] ) )
+ return xbFalse;
+
+ sDay[0] = sDateIn[7];
+ sDay[1] = sDateIn[8];
+ sDay[2] = 0x00;
+ iDay = atoi( sDay );
+
+ sMonth[0] = sDateIn[5];
+ sMonth[1] = sDateIn[6];
+ sMonth[2] = 0x00;
+ iMonth = atoi( sMonth );
+
+ sYear[0] = sDateIn[1];
+ sYear[1] = sDateIn[2];
+ sYear[2] = sDateIn[3];
+ sYear[3] = sDateIn[4];
+ sYear[4] = 0x00;
+ iYear = atoi( sYear );
+
+ // valid years are 0001 thru 9999
+ if( iYear < 1 || iYear > 9999 || iMonth < 1 || iMonth > 12 || iDay < 1 || iDay > 31 )
+ return xbFalse;
+
+ // April, June, September and November have 30 days
+ if(( iMonth==4 || iMonth==6 || iMonth==9 || iMonth==11 )&& iDay > 30 )
+ return xbFalse;
+
+ // check for February with leap year
+ if( iMonth == 2 ){
+ if(( iYear % 4 == 0 && iYear % 100 != 0 ) || iYear % 400 == 0 ){
+ if( iDay > 29 ){
+ return xbFalse;
+ }
+ } else if( iDay > 28 ){
+ return xbFalse;
+ }
+ }
+ return xbTrue;
+}
+
+/*************************************************************************/
+//! @brief
+/*!
+ This routine returns the numeric day.
+ \param iFormat
+ XB_FMT_WEEK Number of day in WEEK 0-6 ( Sat - Fri )<br>
+ XB_FMT_MONTH Number of day in MONTH 1-31<br>
+ XB_FMT_YEAR Number of day in YEAR 1-366
+ \returns XB_INVALID_OPTION<br>XB_NO_ERROR
+*/
+
+xbInt16 xbDate::DayOf( xbInt16 iFormat ) const {
+
+ xbInt16 iOutDay = 0;
+ char sDay[3];
+ xbInt16 iDay, iMonth, iYear, iDay2;
+
+ // check for valid format switch
+ if( iFormat!=XB_FMT_WEEK && iFormat!=XB_FMT_MONTH && iFormat!=XB_FMT_YEAR )
+ return XB_INVALID_OPTION;
+
+ if( iFormat == XB_FMT_WEEK ){
+ //DayOf( XB_FMT_MONTH, iDay );
+ iDay = DayOf( XB_FMT_MONTH );
+ iMonth = MonthOf();
+ iYear = YearOf();
+
+ // The following formula uses Zeller's Congruence to determine the day of the week
+ if( iMonth > 2 ) // init to February
+ iMonth -= 2;
+ else {
+ iMonth += 10;
+ iYear--;
+ }
+ iDay2 = ((13 * iMonth - 1) / 5) + iDay + ( iYear % 100 ) +
+ (( iYear % 100 ) / 4) + ((iYear /100 ) / 4 ) - 2 *
+ ( iYear / 100 ) + 77 ;
+
+ iOutDay = iDay2 - 7 * ( iDay2 / 7 );
+ iOutDay == 6 ? iOutDay = 0 : iOutDay++;
+ }
+ else if( iFormat == XB_FMT_MONTH ){
+ sDay[0] = sDate8[7];
+ sDay[1] = sDate8[8];
+ sDay[2] = 0x00;
+ iOutDay = atoi( sDay );
+ } else {
+ iOutDay = iAggregatedDaysInMonths[IsLeapYear()][MonthOf()-1] + DayOf( XB_FMT_MONTH );
+ }
+ return iOutDay;
+}
+
+/*************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+//! @brief Dump date information to stdout.
+/*!
+ \param sTitle - Title for output.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+void xbDate::Dump( const char *sTitle ){
+ fprintf( stdout, "%s\n sDate = [%s]\n", sTitle, sDate8.Str() );
+}
+
+/*************************************************************************/
+//! @brief Dump the date tables.
+/*!
+ This dumps the internal date structures to stdout.
+ \returns void
+*/
+
+void xbDate::DumpDateTables(){
+ fprintf( stdout, "Date Tables\n" );
+ fprintf( stdout, "Month *-Aggragated Days-* *--Days In Month--*\n" );
+ fprintf( stdout, " *-NonLeap Leap-* *--NonLeap Leap--*\n" );
+ for( int i = 1; i < 13; i++ )
+ fprintf( stdout, " %2d %3d %3d %3d %3d\n", i,
+ iAggregatedDaysInMonths[0][i],iAggregatedDaysInMonths[1][i],
+ iDaysInMonths[0][i], iDaysInMonths[1][i]);
+}
+#endif
+
+/*************************************************************************/
+//! @brief Format MM/DD/YY date
+/*!
+ This routine takes an MM/DD/YY format date as input and populates a
+ date class with the appropriate YYYYMMDD data.
+
+ \param sCtodInDate - MM/DD/YY formatted date as input.
+ \returns XB_INVALID_OPTION<br>XB_NO_ERROR
+*/
+xbInt16 xbDate::CTOD( const xbString &sCtodInDate ){
+
+
+ if( sCtodInDate[1] != ' ' && ( sCtodInDate[3] == '\\' || sCtodInDate[3] == '/') ){
+ char yy[3];
+ yy[0] = sCtodInDate[7];
+ yy[1] = sCtodInDate[8];
+ yy[2] = 0x00;
+ sDate8.Sprintf( "%02d%c%c%c%c%c%c", CalcRollingCenturyForYear( atoi( yy )),
+ sCtodInDate[7], sCtodInDate[8], sCtodInDate[1], sCtodInDate[2], sCtodInDate[4], sCtodInDate[5] );
+ return XB_NO_ERROR;
+ }
+ else{
+ return XB_INVALID_DATE;
+ }
+}
+/*************************************************************************/
+//! @brief
+/*!
+ This routine will reformat a date based on the format specifiers entered
+ in sFmtIn. If no input format is specified, the routine will use the
+ system default date format.
+
+ \param sFmtIn - A format specifier with the following paramaters:<br>
+
+ 1) YYDDD - A julian date format
+ 2) YY or YYYY will print a 2 or 4 digit year
+ 3) M,MM,MMM or MMMM
+ M - one digit month if no leading zero
+ MM - two digit month, contains leading zero
+ MMM - Jan through Dec
+ MMMM - January through December
+ 4) D,DD,DDD or DDDD
+ D - one digit dayif no leading zero
+ DD - two digit day, contains leading zero
+ DDD - Sun through Sat (or julian if YYDDD)
+ DDDD - Sunday through Saturday
+
+ \param sOutFmtDate - Reformatted output date.
+ \returns XB_NO_ERROR
+ <br><br>
+ Format Examples:<br>
+ MM/DD/YY<br>
+ YYYY-MM-DD<br>
+ DDDDDDDDDDD MMMMMMMMMMM DD,YYYY
+*/
+xbInt16 xbDate::FormatDate( const xbString &sFmtIn, xbString &sOutFmtDate ){
+ xbUInt32 FmtCtr;
+ char type;
+ xbUInt32 iTypeCtr;
+ xbString ws;
+ xbString sWrkFmt;
+ sOutFmtDate = "";
+
+ /* use format for this specific string if available, else use default format */
+ if( strlen( sFmtIn ) > 0 )
+ sWrkFmt = sFmtIn;
+ else
+ sWrkFmt = GetDefaultDateFormat();
+
+ if( strstr( sWrkFmt.Str(), "YYDDD" )){
+ sOutFmtDate.Sprintf( "%c%c%03d", sDate8[3], sDate8[4], DayOf( XB_FMT_YEAR ));
+ } else {
+ FmtCtr = 1;
+ while( FmtCtr <= sWrkFmt.Len() ){
+ if( sWrkFmt[FmtCtr] != 'D' && sWrkFmt[FmtCtr] != 'M' && sWrkFmt[FmtCtr] != 'Y' ){
+ sOutFmtDate += sWrkFmt[FmtCtr];
+ FmtCtr++;
+ iTypeCtr = 0;
+ } else {
+ type = sWrkFmt[FmtCtr];
+ iTypeCtr = 0;
+ while( sWrkFmt[FmtCtr] == type ) {
+ iTypeCtr++;
+ FmtCtr++;
+ }
+ switch( type ){
+ case 'D':
+
+ if( iTypeCtr == 1 ){
+ sOutFmtDate += ws.Sprintf( "%d", DayOf( XB_FMT_MONTH ));
+ }
+ else if( iTypeCtr == 2 ){
+ sOutFmtDate += ws.Sprintf( "%c%c", sDate8[7], sDate8[8] );
+ } else {
+ xbString sCDO;
+ CharDayOf( sCDO );
+ ws.Assign( sCDO, 1, iTypeCtr );
+ sOutFmtDate += ws.Str();
+ }
+ break;
+
+ case 'M':
+ if( iTypeCtr == 1 ){
+ sOutFmtDate += ws.Sprintf( "%d", MonthOf());
+ }
+ else if( iTypeCtr == 2 ){
+ sOutFmtDate += ws.Sprintf( "%c%c", sDate8[5], sDate8[6] );
+ } else {
+ xbString sCMO;
+ CharMonthOf( sCMO );
+ ws.Assign( sCMO, 1, iTypeCtr );
+ sOutFmtDate += ws.Str();
+ }
+ break;
+
+ case 'Y':
+ if( iTypeCtr == 2 ){
+ sOutFmtDate += ws.Sprintf( "%c%c", sDate8[3], sDate8[4] );
+ }
+ else if( iTypeCtr == 4 ){
+ sOutFmtDate += ws.Sprintf( "%c%c%c%c", sDate8[1], sDate8[2], sDate8[3], sDate8[4] );
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Return the date value.
+/*!
+ \returns char ptr to date value.
+*/
+const char * xbDate::Str() const{
+ return sDate8.Str();
+};
+/*************************************************************************/
+//! @brief Determine if date is a leap year.
+/*!
+ \returns xbTrue - Is leapyear.<br> xbFalse - Not a leap year.
+*/
+xbBool xbDate::IsLeapYear() const {
+ xbInt16 iYear = YearOf();
+ if(( iYear % 4 == 0 && iYear % 100 != 0 ) || iYear % 400 == 0 )
+ return xbTrue;
+ else
+ return xbFalse;
+}
+/*************************************************************************/
+//! @brief Determine if date is a leap year.
+/*!
+ \param iYear - Year to check for leap year status.
+ \returns xbTrue - Is leapyear.<br> xbFalse - Not a leap year.
+*/
+xbBool xbDate::IsLeapYear( xbInt16 iYear ) const {
+ if(( iYear % 4 == 0 && iYear % 100 != 0 ) || iYear % 400 == 0 )
+ return xbTrue;
+ else
+ return xbFalse;
+}
+/*************************************************************************/
+//! @brief Calculate julian days for a given date.
+/*!
+ \returns The number of days since 01/01/0001 + JUL_OFFSET.
+*/
+xbInt32 xbDate::JulianDays() const{
+ xbInt32 ly = YearOf() - 1;
+ xbInt32 lDays = ly * 365L + ly / 4L - ly / 100L + ly / 400L;
+ lDays += DayOf( XB_FMT_YEAR );
+ return lDays + JUL_OFFSET;
+}
+/*************************************************************************/
+//! @brief Convert the number of julian days to gregorian date.
+/*!
+ \param lJulDays - Julian days.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbDate::JulToDate8( xbInt32 lJulDays )
+{
+ lJulDays -= JUL_OFFSET;
+ // calculate the year
+ xbInt16 iYear = (xbInt16)(lJulDays / 365.24 );
+ lJulDays -= (iYear * 365L) + (iYear / 4L) - (iYear / 100L) + (iYear / 400L);
+ iYear++;
+ while( lJulDays <= 0 ){
+ iYear--;
+ lJulDays += (365L + IsLeapYear( iYear ));
+ }
+ // this for loop calculates the month by comparing the number of days remaining to one of the tables
+ xbInt16 iIsLeap = IsLeapYear(iYear);
+ xbInt16 iMonth = 1;
+ while( ((xbInt16) lJulDays > iAggregatedDaysInMonths[iIsLeap][iMonth]) && (iMonth < 12) )
+ iMonth++;
+
+ lJulDays -= iAggregatedDaysInMonths[iIsLeap][iMonth-1];
+ sDate8.Sprintf( "%04d%02d%02ld", iYear, iMonth, lJulDays );
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Set the date to the last day of month for a given date.
+/*!
+ This routine sets the last date of the month.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbDate::LastDayOfMonth(){
+ sDate8.Sprintf( "%4.4d%2.2d%2.2d", YearOf(), MonthOf(), iDaysInMonths[IsLeapYear()][MonthOf()]);
+ return XB_NO_ERROR;
+};
+/*************************************************************************/
+//! @brief Return the month for the date.
+/*!
+ \returns The month of the date.
+*/
+xbInt16 xbDate::MonthOf() const {
+ xbInt16 iOutMonth;
+ char month[3];
+ month[0] = sDate8[5];
+ month[1] = sDate8[6];
+ month[2] = 0x00;
+ iOutMonth = atoi( month );
+ return iOutMonth;
+}
+
+/*************************************************************************/
+//! @brief Set the date.
+/*!
+ \param sDateIn - Input date.
+ \returns XB_NO_ERROR<br>XB_INVALID_DATE
+*/
+xbInt16 xbDate::Set( const xbString & sDateIn ){
+ if( DateIsValid( sDateIn )){
+ sDate8 = sDateIn;
+ return XB_NO_ERROR;
+ }
+ return XB_INVALID_DATE;
+}
+/*************************************************************************/
+//! @brief This routine sets up static data tables on startup.
+/*!
+ \returns void
+*/
+void xbDate::SetDateTables() {
+ if( iAggregatedDaysInMonths[1][12] != 366 ){ /* first time called ? */
+
+ iAggregatedDaysInMonths[0][0] = 0;
+ iAggregatedDaysInMonths[0][1] = 31;
+ iAggregatedDaysInMonths[0][2] = 59;
+ iAggregatedDaysInMonths[0][3] = 90;
+ iAggregatedDaysInMonths[0][4] = 120;
+ iAggregatedDaysInMonths[0][5] = 151;
+ iAggregatedDaysInMonths[0][6] = 181;
+ iAggregatedDaysInMonths[0][7] = 212;
+ iAggregatedDaysInMonths[0][8] = 243;
+ iAggregatedDaysInMonths[0][9] = 273;
+ iAggregatedDaysInMonths[0][10] = 304;
+ iAggregatedDaysInMonths[0][11] = 334;
+ iAggregatedDaysInMonths[0][12] = 365;
+ iAggregatedDaysInMonths[1][0] = 0;
+ iAggregatedDaysInMonths[1][1] = 31;
+ iAggregatedDaysInMonths[1][2] = 60;
+ iAggregatedDaysInMonths[1][3] = 91;
+ iAggregatedDaysInMonths[1][4] = 121;
+ iAggregatedDaysInMonths[1][5] = 152;
+ iAggregatedDaysInMonths[1][6] = 182;
+ iAggregatedDaysInMonths[1][7] = 213;
+ iAggregatedDaysInMonths[1][8] = 244;
+ iAggregatedDaysInMonths[1][9] = 274;
+ iAggregatedDaysInMonths[1][10] = 305;
+ iAggregatedDaysInMonths[1][11] = 335;
+ iAggregatedDaysInMonths[1][12] = 366;
+
+ iDaysInMonths[0][0] = 0;
+ iDaysInMonths[0][1] = 31;
+ iDaysInMonths[0][2] = 28;
+ iDaysInMonths[0][3] = 31;
+ iDaysInMonths[0][4] = 30;
+ iDaysInMonths[0][5] = 31;
+ iDaysInMonths[0][6] = 30;
+ iDaysInMonths[0][7] = 31;
+ iDaysInMonths[0][8] = 31;
+ iDaysInMonths[0][9] = 30;
+ iDaysInMonths[0][10] = 31;
+ iDaysInMonths[0][11] = 30;
+ iDaysInMonths[0][12] = 31;
+ iDaysInMonths[1][0] = 0;
+ iDaysInMonths[1][1] = 31;
+ iDaysInMonths[1][2] = 29;
+ iDaysInMonths[1][3] = 31;
+ iDaysInMonths[1][4] = 30;
+ iDaysInMonths[1][5] = 31;
+ iDaysInMonths[1][6] = 30;
+ iDaysInMonths[1][7] = 31;
+ iDaysInMonths[1][8] = 31;
+ iDaysInMonths[1][9] = 30;
+ iDaysInMonths[1][10] = 31;
+ iDaysInMonths[1][11] = 30;
+ iDaysInMonths[1][12] = 31;
+ }
+}
+/*************************************************************************/
+//! @brief Set the date equal to the system date.
+/*!
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbDate::Sysdate(){
+
+ #ifdef HAVE__LOCALTIME64_S_F
+ __time64_t timer;
+ _time64( &timer );
+ struct tm tblock;
+ _localtime64_s( &tblock, &timer );
+ tblock.tm_year += 1900;
+ tblock.tm_mon++;
+ sDate8.Sprintf( "%4d%02d%02d", tblock.tm_year, tblock.tm_mon, tblock.tm_mday );
+ #else
+ time_t timer;
+ timer = time( &timer );
+ struct tm *tblock;
+ tblock = localtime( &timer );
+ tblock->tm_year += 1900;
+ tblock->tm_mon++;
+ sDate8.Sprintf( "%4d%02d%02d",tblock->tm_year,tblock->tm_mon,tblock->tm_mday );
+ #endif
+
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Returns the year of the date.
+/*!
+ \returns The year of the date.
+*/
+xbInt16 xbDate::YearOf() const {
+ char year[5];
+ year[0] = sDate8[1];
+ year[1] = sDate8[2];
+ year[2] = sDate8[3];
+ year[3] = sDate8[4];
+ year[4] = 0x00;
+ xbInt16 iOutYear = atoi( year );
+ return iOutYear;
+};
+} /* namespace */ \ No newline at end of file
diff --git a/src/core/xbdbf.cpp b/src/core/xbdbf.cpp
new file mode 100755
index 0000000..8e020fb
--- /dev/null
+++ b/src/core/xbdbf.cpp
@@ -0,0 +1,4220 @@
+/* xbdbf.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+
+namespace xb{
+
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param x Pointer to xbXbase
+*/
+xbDbf::xbDbf( xbXBase * x ) : xbFile( x ){
+ xbase = x;
+ SchemaPtr = NULL;
+ RecBuf = NULL;
+ RecBuf2 = NULL;
+ InitVars();
+}
+/************************************************************************/
+void xbDbf::InitVars()
+{
+ iNoOfFields = 0;
+ iDbfStatus = XB_CLOSED;
+ ulCurRec = 0L;
+ cVersion = 0x00;
+ cUpdateYY = 0x00;
+ cUpdateMM = 0x00;
+ cUpdateDD = 0x00;
+ ulNoOfRecs = 0L;
+ uiHeaderLen = 0x00;
+ uiRecordLen = 0x00;
+ cTransactionFlag = 0x00;
+ cEncryptionFlag = 0x00;
+ cIndexFlag = 0x00;
+ cLangDriver = 0x00;
+ iFileVersion = 0; /* Xbase64 file version */
+ iAutoCommit = -1;
+
+ SetFileName ( "" );
+ sAlias.Set ( "" );
+ SetDirectory ( GetDataDirectory());
+
+ #ifdef XB_LOCKING_SUPPORT
+ iLockFlavor = -1;
+ bTableLocked = xbFalse;
+ bHeaderLocked = xbFalse;
+ ulAppendLocked = 0;
+ SetAutoLock( -1 );
+ lloRecLocks.SetDupKeys( xbFalse );
+ #endif
+
+ #ifdef XB_INDEX_SUPPORT
+ ixList = NULL;
+ pCurIx = NULL;
+ vpCurIxTag = NULL;
+ sCurIxType = "";
+ ClearTagList();
+ #endif
+ #ifdef XB_NDXINF_SUPPORT
+ llNdxInfData.Clear();
+ #endif
+}
+
+/************************************************************************/
+//! @brief Destructor
+xbDbf::~xbDbf(){
+
+ // is there is an uncommited update, discard it.
+ // as we don't know if it is an append or an update
+ if( iDbfStatus == XB_UPDATED )
+ Abort();
+
+ if( iDbfStatus != XB_CLOSED )
+ Close();
+
+ if( SchemaPtr ){
+ free( SchemaPtr );
+ SchemaPtr = NULL;
+ }
+ if( RecBuf ){
+ free( RecBuf );
+ RecBuf = NULL;
+ }
+ if( RecBuf2){
+ free( RecBuf2 );
+ RecBuf2 = NULL;
+ }
+ Close();
+}
+/************************************************************************/
+//! @brief Abort any uncommited changes for the current record buffer.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::Abort(){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ if( iDbfStatus == XB_UPDATED ){
+ #ifdef XB_MEMO_SUPPORT
+ if( MemoFieldsExist()){
+ if(( iRc = Memo->Abort()) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+ #endif
+ memcpy( RecBuf, RecBuf2, uiRecordLen );
+ iDbfStatus = XB_OPEN;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::Abort() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+//! @brief Add an index to the internal list of indices for this table.
+/*!
+ The index list is used during any table update process to update any open
+ index file. Index files can contain one or more tags.
+
+ \param ixIn Pointer to index object for a given index file.
+ \param sFmt NDX or MDX.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+
+xbInt16 xbDbf::AddIndex( xbIx * ixIn, const xbString &sFmt ){
+
+ xbIxList *ixt; // this
+ if(( ixt = (xbIxList *) malloc( sizeof( xbIxList ))) == NULL )
+ return XB_NO_ERROR;
+
+ ixt->ix = ixIn;
+ ixt->next = NULL;
+ ixt->sFmt = new xbString( sFmt );
+ ixt->sFmt->ToUpperCase();
+
+ if( ixList ){
+ xbIxList *ixn = ixList; // next
+ while( ixn->next ){
+ ixn = ixn->next;
+ }
+ ixn->next = ixt;
+ } else {
+ ixList = ixt;
+ }
+ return XB_NO_ERROR;
+}
+#endif // XB_INDEX_SUPPORT
+
+
+/************************************************************************/
+//! @brief Append the current record to the data file.
+/*!
+ This method attempts to append the contents of the current record buffer
+ to the end of the DBF file, updates the file date, number of records in the file
+ and updates any open indices associated with this data file.<br>
+
+ To add a record, an application would typically blank the record buffer,
+ update various fields in the record buffer, then append the record.<br>
+
+ The append method performs the following tasks:<br>
+ 1) Create new index key values<br>
+ 2) Lock the table<br>
+ 3) Lock append bytes<br>
+ 4) Lock indices<br>
+ 5) Read the dbf header<br>
+ 6) Check for dup keys<br>
+ 7) Calc last update date, no of recs<br>
+ 8) Add keys<br>
+ 9) Unlock indices<br>
+ 10) Update file header<br>
+ 11) Unlock file header<br>
+ 12) Append record<br>
+ 13) Unlock append bytes<br>
+
+Note: Locking memo files is not needed as the memo file updates are handled outside of the append method.<br>
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::AppendRecord(){
+ xbInt16 iErrorStop = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbUInt32 ulSaveCurRec = 0;
+
+ try{
+ #ifdef XB_INDEX_SUPPORT
+ xbIxList *ixList = GetIxList();
+ // do this step first before anything is locked, reduce lock time as much as possible
+ while( ixList ){
+
+ // std::cout << "xbDbf::CreateKeys(x)\n";
+ if(( iRc = ixList->ix->CreateKeys( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ ixList = ixList->next;
+ }
+ #endif // XB_INDEX_SUPPORT
+
+ // lock everything up for an update
+ #ifdef XB_LOCKING_SUPPORT
+ // xbInt16 iAutoLock = GetAutoLock();
+ if( iAutoLock ){
+
+ if(( iRc = LockHeader( XB_LOCK )) != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED ) {
+ return iRc;
+ } else {
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ if(( iRc = LockAppend( XB_LOCK )) != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED ){
+ LockHeader( XB_UNLOCK );
+ return iRc;
+ } else {
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+
+ #ifdef XB_INDEX_SUPPORT
+ if(( iRc = LockIndices( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ #endif // XB_INDEX_SUPPORT
+
+ }
+ #endif // XB_LOCKING_SUPPORT
+ if(( iRc = ReadHeader( 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ #ifdef XB_INDEX_SUPPORT
+ ixList = GetIxList();
+
+ while( ixList ){
+ if(( iRc = ixList->ix->CheckForDupKeys()) != 0 ){
+ if( iRc < 0 ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ return XB_KEY_NOT_UNIQUE;
+ }
+ ixList = ixList->next;
+ }
+
+ #endif // XB_INDEX_SUPPORT
+
+ // calculate the latest header information
+ xbDate d;
+ cUpdateYY = (char) d.YearOf() - 1900;
+ cUpdateMM = (char) d.MonthOf();
+ cUpdateDD = (char) d.DayOf( XB_FMT_MONTH );
+ ulSaveCurRec = ulCurRec;
+ ulNoOfRecs++;
+ ulCurRec = ulNoOfRecs;
+
+ #ifdef XB_INDEX_SUPPORT
+
+
+ ixList = GetIxList();
+ while( ixList ){
+ if(( iRc = ixList->ix->AddKeys( ulCurRec )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ ixList = ixList->next;
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ if(( iRc = LockIndices( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ }
+ #endif // XB_LOCKING_SUPPORT
+ #endif // XB_INDEX_SUPPORT
+
+ // rewrite the header record
+ if(( iRc = WriteHeader( 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ if(( iRc = LockHeader( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ }
+ #endif
+
+ // write the last record
+ if(( iRc = xbFseek( (uiHeaderLen+((xbInt64)(ulNoOfRecs-1)*uiRecordLen)), 0 )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw iRc;
+ }
+
+ if(( iRc = xbFwrite( RecBuf, uiRecordLen, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 90;
+ throw iRc;
+ }
+
+ // write the end of file marker
+ if(( iRc = xbFputc( XB_CHAREOF )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ if(( iRc = LockAppend( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw( iRc );
+ }
+ }
+ #endif // XB_LOCKING_SUPPORT
+
+ }
+ catch (xbInt16 iRc ){
+ if( ulSaveCurRec != 0 ){
+ ulCurRec = ulSaveCurRec;
+ ulNoOfRecs--;
+ }
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ #ifdef XB_INDEX_SUPPORT
+ LockIndices( XB_UNLOCK );
+ #endif // XB_INDEX_SUPPORT
+ LockAppend( XB_UNLOCK );
+ LockHeader( XB_UNLOCK );
+ }
+ #endif // XB_LOCKING_SUPPORT
+
+ if( iRc != XB_LOCK_FAILED && iRc != XB_KEY_NOT_UNIQUE ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::Append() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+
+ if( iRc == XB_NO_ERROR )
+ iDbfStatus = XB_OPEN;
+ return iRc;
+}
+
+/************************************************************************/
+#ifdef XB_NDXINF_SUPPORT
+//! @brief Asscoiate a non production index to a DBF file.
+/*!
+
+ The original Dbase (TM) software supported non production indices (NDX) and production indices (MDX).
+ The production indices are opened automatically when the DBF file is opened but the non-production
+ indices are not. This method is specific to the Xbas64 library and providex a means to link non production
+ NDX index files to the DBF file so they will be opened automatically when the DBF file is opened.<br>
+
+ This routine requires NDXINF support be enabled when building the library.<br>
+ This routine creates a file with the same name as the DBF file, but with an extension of INF.<br>
+
+
+ \param sIxType Currently only NDX. Future versions will support additional non prod index types.
+ \param sIxName The index name.
+ \param iOpt 0 - Add index to .INF if not already there<br>
+ 1 - Remove index from .INF if there
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+
+xbInt16 xbDbf::AssociateIndex( const xbString &sIxType, const xbString &sIxName, xbInt16 iOpt ){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ xbString sIxTypeIn = sIxType;
+ sIxTypeIn.Trim();
+ xbString sIxNameIn = sIxName;
+ sIxNameIn.Trim();
+
+ if( sIxTypeIn != "NDX" || sIxName == "" )
+ return XB_INVALID_INDEX;
+
+ if(( iRc = LoadNdxInfData()) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ // check if entry exists
+ xbLinkListNode<xbString> * llN = llNdxInfData.GetHeadNode();
+ xbBool bFound = xbFalse;
+ xbString s;
+
+ while( llN && !bFound ){
+ s = llN->GetKey();
+ if( s.Len() > 0 ){
+ if( sIxNameIn == s )
+ bFound = xbTrue;
+ }
+ llN = llN->GetNextNode();
+ }
+
+ xbBool bUpdated = xbFalse;
+ if( iOpt == 0 && !bFound ){
+ s.Sprintf( "%s%c%c", sIxName.Str(), 0x0d, 0x0a );
+ llNdxInfData.InsertAtEnd( s );
+ bUpdated = xbTrue;
+
+ } else if( iOpt == 1 && bFound ){
+ llNdxInfData.RemoveByVal( s );
+ bUpdated = xbTrue;
+ }
+
+ if( bUpdated ){
+ if(( iRc = SaveNdxInfData()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+
+ } catch( xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::AssociateIndex() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+#endif // XB_NDXINF_SUPPORT
+
+/************************************************************************/
+//! @brief Blank the record buffer.
+/*!
+
+ This method would typically be called to initialize the record buffer before
+ updates are applied to append a new record.
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::BlankRecord()
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ if( iDbfStatus == XB_CLOSED ){
+ iErrorStop = 10;
+ iRc = XB_NOT_OPEN;
+ throw iRc;
+ }
+
+ if( iDbfStatus == XB_UPDATED ){
+ if( GetAutoCommit() == 1 ){
+ if(( iRc = Commit()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ } else {
+ if(( iRc = Abort()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+ }
+ ulCurRec = 0;
+ memset( RecBuf, 0x20, uiRecordLen );
+ memset( RecBuf2, 0x20, uiRecordLen );
+ }
+
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::BlankRecord() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ return iRc;
+}
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+
+#ifdef XB_DEBUG_SUPPORT
+
+/*!
+ This method is used to check an index tag's intgerity.
+
+ \param iTagOpt 0 - Check current tag<br>
+ 1 - Check all tag<br>
+
+ \param iOutputOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::CheckTagIntegrity( xbInt16 iTagOpt, xbInt16 iOutputOpt ){
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+// std::cout << "CheckTagIntegrity()\n";
+
+ if( iTagOpt == 0 ){
+ if( pCurIx )
+ return pCurIx->CheckTagIntegrity( vpCurIxTag, iOutputOpt );
+ else
+ return XB_INVALID_TAG;
+
+ } else {
+
+ xbLinkListNode<xbTag *> *llN = GetTagList();
+ xbTag *pTag;
+
+ while( llN ){
+ pTag = llN->GetKey();
+ if(( iRc = pTag->GetIx()->CheckTagIntegrity( pTag->GetVpTag(), iOutputOpt )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ llN = llN->GetNextNode();
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::CheckTagIntegrity() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ return iRc;
+}
+
+#endif // XB_DEBUG_SUPPORT
+
+/************************************************************************/
+/*!
+ This method is used to reindex / rebuild index tag.
+
+ \param iTagOpt 0 - Reindex current tag<br>
+ 1 - Reindex all tags<br>
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::Reindex( xbInt16 iTagOpt ){
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ void *vp;
+
+ try{
+ if( iTagOpt == 0 ){
+ if( pCurIx ){
+
+ //
+ // xbString = save current tag name
+ //
+
+ iRc = pCurIx->Reindex( &vpCurIxTag );
+ if( iRc != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ //
+ // restore current tag name
+ //
+ return iRc;
+
+ } else {
+
+ return XB_INVALID_TAG;
+
+ }
+
+ } else {
+
+ xbLinkListNode<xbTag *> *llN = GetTagList();
+ xbTag *pTag;
+
+ while( llN ){
+ pTag = llN->GetKey();
+ vp = pTag->GetVpTag();
+ if(( iRc = pTag->GetIx()->Reindex( &vp )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ llN = llN->GetNextNode();
+ }
+
+
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::Reindex() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ return iRc;
+}
+
+/************************************************************************/
+// @brief Clear the index tag list.
+/*
+ Protected method. Clears the list inf index tags.
+ \returns void.
+*/
+void xbDbf::ClearTagList(){
+
+ xbTag *pTag;
+ xbBool bDone = xbFalse;
+ while( llTags.GetNodeCnt() > 0 && !bDone ){
+ if( llTags.RemoveFromFront( pTag ) != XB_NO_ERROR ){
+ bDone = xbTrue;
+ } else {
+ if( pTag )
+ delete pTag;
+ }
+ }
+}
+#endif // XB_INDEX_SUPPORT
+
+/************************************************************************/
+//! @brief Close DBF file/table.
+/*!
+ This routine flushes any remaining updates to disk, closes the DBF file and
+ any associated memo and index files.
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::Close(){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ if(iDbfStatus == XB_CLOSED)
+ return XB_NO_ERROR;
+
+ else if( iDbfStatus == XB_UPDATED ){
+
+ if( GetAutoCommit() == 1 ){
+ if(( iRc = Commit()) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ } else {
+ if(( iRc = Abort()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ }
+
+ if(SchemaPtr){
+ free( SchemaPtr );
+ SchemaPtr = NULL;
+ }
+ if(RecBuf){
+ free( RecBuf );
+ RecBuf = NULL;
+ }
+ if(RecBuf2){
+ free( RecBuf2 );
+ RecBuf2 = NULL;
+ }
+
+
+ #ifdef XB_MEMO_SUPPORT
+ if( iMemoFieldCnt > 0 ){
+ Memo->CloseMemoFile();
+ delete Memo;
+ Memo = NULL;
+ }
+ #endif
+
+ // close any open index files, remove from the ix list
+ #ifdef XB_INDEX_SUPPORT
+ while( ixList ){
+ ixList->ix->Close();
+ RemoveIndex( ixList->ix );
+ }
+ #endif
+
+ #ifdef XB_LOCKING_ON
+ if( xblfh ){
+ fclose( xblfh );
+ xblfh = NULL;
+ }
+ #endif
+
+ if(( iRc = xbase->RemoveTblFromTblList( this )) != XB_NO_ERROR ){
+ xbString sMsg;
+ sMsg.Sprintf( "Alias = [%s]", sAlias.Str());
+ xbase->WriteLogMessage( sMsg.Str() );
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ xbFclose();
+ InitVars();
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::Close() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+//! @brief Close an open index file
+/*!
+ All index files are automatically closed when the DBF file is closed.
+ Under normal conditions, it is not necessary to explicitly close an index file
+ with this routine. Any updates posted to a DBF file while an index is closed
+ will not be reflected in the closed index file.
+
+ \param pIx Pointer to index object to close.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::CloseIndexFile( xbIx *pIx ){
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+
+ try{
+
+ // verify index is open and in the list
+ xbBool bFound = xbFalse;
+ xbIxList *p = GetIxList();
+ while( p && !bFound ){
+ if( pIx == p->ix )
+ bFound = xbTrue;
+ p = p->next;
+ }
+ if( !bFound ){
+ iErrorStop = 10;
+ iRc = XB_NOT_OPEN;
+ throw iRc;
+ }
+
+ // close it
+ if(( iRc = pIx->Close()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+
+ // remove it from the list
+ if(( iRc = RemoveIndex( pIx )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ // refresh the tag list
+ if(( iRc = UpdateTagList()) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ if( pIx == pCurIx ){
+ pCurIx = NULL;
+ vpCurIxTag = NULL;
+ sCurIxType = "";
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::CloseIndexFile() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+#endif // XB_INDEX_SUPPORT
+
+/************************************************************************/
+//! @brief Commit updates to disk
+/*!
+
+ This routine commits any pending updates to disk.
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::Commit(){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( iDbfStatus == XB_UPDATED ){
+ if( ulCurRec == 0 ){
+ if(( iRc = AppendRecord()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ } else {
+ if(( iRc = PutRecord( ulCurRec )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::Commit() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ return iRc;
+}
+
+
+/************************************************************************/
+//! @brief Copy table (dbf) file structure.
+/*!
+
+ This routine will copy the structure of a dbf file and if successful
+ return a pointer to the new table in an open state.
+
+ \param dNewTable Reference to new table object.
+ \param sNewTableName New table (dbf) name.
+ \param sNewTableAlias Alias name of new table.
+ \param iOverlay xbTrue - Overlay existing file.<br>
+ xbFalse - Don't overlay existing file.
+ \param iShareMode XB_SINGLE_USER<br>
+ XB_MULTI_USER
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+//! Copy DBF structure
+/*!
+*/
+xbInt16 xbDbf::CopyDbfStructure( xbDbf * dNewTable, const xbString &sNewTableName,
+ const xbString & sNewTableAlias, xbInt16 iOverlay, xbInt16 iShareMode ) {
+
+// If successful, the table is returned in an open state after executing this method
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbSchema *newTableSchema = NULL;
+
+ try{
+
+ if( iDbfStatus == XB_CLOSED ){
+ iErrorStop = 10;
+ iRc = XB_DBF_FILE_NOT_OPEN;
+ throw iRc;
+ }
+
+ if( !dNewTable ){
+ iErrorStop = 20;
+ iRc = XB_INVALID_OBJECT;
+ throw iRc;
+ }
+
+ // Get the number of schema entries for this table
+ xbInt32 lSchemaRecCnt = GetFieldCnt() + 1;
+
+ // Allocate a Schema = No Of Fields + 1
+ if((newTableSchema=(xbSchema *)malloc( (size_t) lSchemaRecCnt * sizeof(xbSchema)))==NULL){
+ iErrorStop = 30;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ // Populate the Schema
+ xbInt32 l;
+ for( l = 0; l < lSchemaRecCnt-1; l++ ){
+ memset( newTableSchema[l].cFieldName, 0x00, 11 );
+ for( int x = 0; x < 10 && SchemaPtr[l].cFieldName[x]; x++ )
+ newTableSchema[l].cFieldName[x] = SchemaPtr[l].cFieldName[x];
+ newTableSchema[l].cType = SchemaPtr[l].cType;
+ newTableSchema[l].iFieldLen = SchemaPtr[l].cFieldLen;
+ newTableSchema[l].iNoOfDecs = SchemaPtr[l].cNoOfDecs;
+ }
+
+ // set the last one to zeroes
+ memset( newTableSchema[l].cFieldName, 0x00, 11 );
+ newTableSchema[l].cType = 0;
+ newTableSchema[l].iFieldLen = 0;
+ newTableSchema[l].iNoOfDecs = 0;
+
+ dNewTable->SetVersion();
+ #ifdef XB_MEMO_SUPPORT
+ if( MemoFieldsExist())
+ dNewTable->SetCreateMemoBlockSize( Memo->GetBlockSize() );
+ #endif
+
+ // Call the create a table function
+ if(( iRc = dNewTable->CreateTable( sNewTableName, sNewTableAlias, newTableSchema, iOverlay, iShareMode )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ }
+
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbDbf::CopyDbfStructure() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ if( newTableSchema )
+ free( newTableSchema );
+
+ return iRc;
+}
+
+
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+//! @brief Create a new tag (index) for this dbf file (table).
+/*!
+ This routine creates a new tag (index) on a dbf file. The library currently supports NDX and MDX
+ indices. If you don't have a specific need for an NDX file, use MDX.
+
+ \param sIxType "MDX" or "NDX".
+ \param sName Index or tag name.
+ \param sKey Index key expression,
+ \param sFilter Filter expression. Not applicable for NDX indices.
+ \param iDescending xbTrue for descending. Not available for NDX indices.<br>
+ xbFalse - ascending
+ \param iUnique xbTrue - Unique index<br>xbFalse - Not unique index.
+ \param iOverLay xbTrue - Overlay if exists<br>
+ xbFalse - Don't overlay if it exists.
+ \param pIxOut Pointer to pointer of output index object.
+ \param vpTagOut Pointer to pointer of newly created tag,
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::CreateTag( const xbString &sIxType, const xbString &sName, const xbString &sKey, const xbString &sFilter,
+ xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverLay, xbIx **pIxOut, void **vpTagOut ){
+
+ // this routine is used to open indices and link to files
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbBool bLocked = xbFalse;
+
+ try{
+ xbString sType = sIxType;
+ sType.ToUpperCase();
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( !bTableLocked ){
+ if(( iRc = LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw( iRc );
+ }
+ bLocked = xbTrue;
+ }
+ #endif // XB_LOCKING_SUPPORT
+
+ if( sIxType == "" ){
+ iErrorStop = 100;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+
+ #ifdef XB_NDX_SUPPORT
+ } else if( sIxType == "NDX" ){
+ xbIxNdx *ixNdx = new xbIxNdx( this );
+
+ if(( iRc = ixNdx->CreateTag( sName, sKey, sFilter, iDescending, iUnique, iOverLay, vpTagOut )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ if(( iRc = AddIndex( ixNdx, sIxType )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ *pIxOut = ixNdx;
+
+ // Set the current tag if one not already set
+ if( sCurIxType == "" ){
+ sCurIxType = "NDX";
+ pCurIx = ixNdx;
+ vpCurIxTag = ixNdx->GetTag(0);
+ }
+
+ #endif
+
+ #ifdef XB_MDX_SUPPORT
+ } else if( sIxType == "MDX" ){
+
+ if( GetVersion() == 3 ){ // MDX indexes were version 4 and higher
+ iErrorStop = 200;
+ iRc = XB_INVALID_INDEX;
+ throw iRc;
+ }
+
+ xbIxMdx *ixMdx;
+ xbString s;
+ // look through the index list and see if there is an mdx pointer we can grab
+ xbBool bMdxFound = xbFalse;
+ xbIxList *ixList = GetIxList();
+ while( ixList && !bMdxFound ){
+ s = ixList->sFmt->Str();
+ if( s == "MDX" ){
+ ixMdx = (xbIxMdx *) ixList->ix;
+ bMdxFound = xbTrue;
+ }
+ }
+
+ if( !bMdxFound )
+ ixMdx = new xbIxMdx( this );
+
+ if(( iRc = ixMdx->CreateTag( sName, sKey, sFilter, iDescending, iUnique, iOverLay, vpTagOut )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+
+ if( !bMdxFound ){
+ if(( iRc = AddIndex( ixMdx, "MDX" )) != XB_NO_ERROR ){
+ iErrorStop = 220;
+ throw iRc;
+ }
+
+ cIndexFlag = 0x01;
+ if(( iRc = WriteHeader( 1, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 230;
+ throw iRc;
+ }
+ }
+ *pIxOut = ixMdx;
+
+ // set the current tag if one not already set
+ if( sCurIxType == "" ){
+ sCurIxType = "MDX";
+ pCurIx = ixMdx;
+ vpCurIxTag = ixMdx->GetTag(0);
+ }
+
+ #endif
+
+ } else {
+ iErrorStop = 200;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+
+ if(( iRc = UpdateTagList()) != XB_NO_ERROR ){
+ iErrorStop = 300;
+ throw iRc;
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::CreateTag() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( bLocked )
+ LockTable( XB_UNLOCK );
+ #endif // XB_LOCKING_SUPPORT
+
+
+ return iRc;
+}
+#endif // XB_INDEX_SUPPORT
+
+/************************************************************************/
+//! @brief Delete or undelete all records in a dbf file (table).
+/*!
+ This routine deletes or un-deletes all records. The xbase file format contains
+ a leading one byte character used for flagging a record as deleted. When a record
+ is deleted, it's not physically removed from the file, the first byte is flagged as deleted.
+
+ \param iOption 0 - Delete all records.<br>
+ 1 - Un-delete all deleted records.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::DeleteAll( xbInt16 iOption )
+{
+ xbInt16 iErrorStop = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbUInt32 ulRecCnt;
+
+ try{
+ if(( iRc = GetRecordCnt( ulRecCnt )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ if( ulRecCnt == 0 )
+ return XB_NO_ERROR;
+ for( xbUInt32 ul = 0; ul < ulRecCnt; ul++ ){
+ if(( iRc = GetRecord( ul+1 )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ if( iOption == 0 ){ /* delete all option */
+ if( !RecordDeleted()){
+ if(( iRc = DeleteRecord()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+ } else { /* undelete all option */
+ if( RecordDeleted()){
+ if(( iRc = UndeleteRecord()) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ }
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbDbf::DeleteAll() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ return iRc;
+}
+
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+//! @brief
+/*!
+ This routine deletes all indices associated with the dbf file.
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::DeleteAllIndexFiles(){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbBool bLocked = xbFalse;
+
+ #ifdef XB_NDXINF_SUPPORT
+ xbString sIxName;
+ #endif // XB_NDXINF_SUPPORT
+
+ try{
+ #ifdef XB_LOCKING_SUPPORT
+ if( !bTableLocked ){
+ if(( iRc = LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw( iRc );
+ }
+ bLocked = xbTrue;
+ }
+ #endif // XB_LOCKING_SUPPORT
+
+ // close any open index files, delete it, remove from the ix list
+ while( ixList ){
+ ixList->ix->Close();
+ ixList->ix->xbRemove();
+ #ifdef XB_NDXINF_SUPPORT
+ // if XB_NDXINF_SUPPORT is enabled, all open non prod indices should be in here
+ if( *ixList->sFmt != "MDX" ){ // production indices not stored in .INF dataset
+ if(( iRc = ixList->ix->GetFileNamePart( sIxName )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ if(( iRc = AssociateIndex( *ixList->sFmt, sIxName, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+ #endif
+ RemoveIndex( ixList->ix );
+ }
+ } catch( xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::DeleteAllIndexFiles() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ #ifdef XB_LOCKING_SUPPORT
+ if( bLocked )
+ LockTable( XB_UNLOCK );
+ #endif // XB_LOCKING_SUPPORT
+ return iRc;
+}
+#endif // XB_INDEX_SUPPORT
+
+/************************************************************************/
+//! @brief Delete all records.
+/*!
+ This routine deletes all the records in a table / dbf file.
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::DeleteAllRecords(){
+ return DeleteAll( 0 );
+}
+
+/************************************************************************/
+#ifdef XB_NDXINF_SUPPORT
+//! @brief Delete .INF File
+/*!
+ The original Dbase (TM) software supported non production indices (NDX) and production indices (MDX).
+ The production indices are opened automatically when the DBF file is opened but the non-production
+ indices are not. This method is specific to the Xbas64 library and providex a means to link non production
+ NDX index files to the DBF file so they will be opened automatically when the DBF file is opened.<br>
+
+ This routine requires NDXINF support be enabled when building the library.<br>
+ This routine deletes the .INF file.<br>
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::DeleteNdxInfData(){
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ xbString sNdxInfFileName;
+ if(( iRc = GetNdxInfFileName( sNdxInfFileName )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ xbFile f( xbase );
+ f.SetFileName( sNdxInfFileName );
+ if( f.FileExists()){
+ if(( iRc = f.xbRemove()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ } catch( xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::DeleteNdxInfData() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+#endif // XB_NDXINF_SUPPORT
+
+/************************************************************************/
+//! @brief Delete the current record.
+/*!
+ This routine flags the current record for deletion if it's not already flagged.
+
+
+ \returns XB_NO_ERROR<br>
+ XB_INVALID_RECORD
+*/
+
+xbInt16 xbDbf::DeleteRecord(){
+ if( RecBuf && ulCurRec > 0 ){
+ if( RecBuf[0] != 0x2a){
+ if( iDbfStatus != XB_UPDATED ){
+ iDbfStatus = XB_UPDATED;
+ memcpy( RecBuf2, RecBuf, uiRecordLen ); // save off original before making any updates
+ }
+ RecBuf[0] = 0x2a;
+ }
+ return XB_NO_ERROR;
+ }
+ else
+ return XB_INVALID_RECORD;
+}
+/************************************************************************/
+//! @brief Delete a table.
+/*!
+ This routine deletes a given table, associated index files if any, the
+ memo file if any and the .INF file if any.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::DeleteTable(){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ #ifdef XB_LOCKING_SUPPORT
+ if(( iRc = LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ #endif // XB_LOCKING_SUPPORT
+
+ #ifdef XB_INDEX_SUPPORT
+ if(( iRc = DeleteAllIndexFiles()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+
+ #ifdef XB_NDXINF_SUPPORT
+ if(( iRc = DeleteNdxInfData()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ #endif // XB_NDXINF_SUPPORT
+ #endif // XB_INDEX_SUPPORT
+
+ #ifdef XB_MEMO_SUPPORT
+ xbInt16 iMemoFldCnt = GetMemoFieldCnt();
+ xbString sMemoFileName;
+ if(iMemoFldCnt > 0 ){
+ sMemoFileName = Memo->GetFqFileName();
+ }
+ #endif // XB_MEMO_SUPPORT
+
+ if(( iRc = Close()) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ if(( iRc = xbRemove()) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+
+ #ifdef XB_MEMO_SUPPORT
+ if( iMemoFieldCnt > 0 ){
+ xbFile f( xbase );
+ if(( iRc = f.xbRemove( sMemoFileName )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ }
+ #endif // XB_MEMO_SUPPORT
+
+ } catch( xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::DeleteTable() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ #ifdef XB_LOCKING_SUPPORT
+ LockTable( XB_UNLOCK );
+ #endif // XB_LOCKING_SUPPORT
+ return iRc;
+}
+
+/************************************************************************/
+//! @brief Delete an index tag.
+
+/*!
+ This routine deletes an index tag
+ \param sIxType Either "NDX" or "MDX".<br>
+ \param sName Tag name to delete.<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::DeleteTag( const xbString &sIxType, const xbString &sName ){
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbIx *pIx = NULL;
+
+ try{
+
+ #ifdef XB_LOCKING_SUPPORT
+ // xbInt16 iAutoLock = GetAutoLock();
+ if( iAutoLock && !GetTableLocked() ){
+ if(( iRc = LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+ #endif
+
+ if( sIxType == "" ){
+ iErrorStop = 110;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+
+ #ifdef XB_NDX_SUPPORT
+ } else if( sIxType == "NDX" ){
+
+ xbIxList *ixl = ixList;
+ xbBool bDone = xbFalse;
+ while( ixl && !bDone ){
+
+ if( ixl->ix->GetTagName( NULL ) == sName ){
+ bDone = xbTrue;
+
+ // remove from .INF if it's there
+ #ifdef XB_NDXINF_SUPPORT
+ if(( iRc = AssociateIndex( "NDX", sName, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ #endif // XB_NDXINF_SUPPORT
+
+ if(( iRc = ixl->ix->DeleteTag( ixl->ix->GetTag( 0 ))) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+
+ if(( iRc = RemoveIndex( ixl->ix )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+
+ if( ixl->ix == pCurIx )
+ SetCurTag( "", NULL, NULL );
+
+ }
+ ixl = ixl->next;
+ }
+ #endif
+
+ #ifdef XB_MDX_SUPPORT
+ } else if( sIxType == "MDX" ){
+ xbIxList *ixl = ixList;
+ xbIxList *ixlNext;
+ xbIxList *ixlPrev = NULL;
+ xbBool bDone = xbFalse;
+ xbIxMdx *pMdx;
+ xbMdxTag *pMdxTag;
+ xbInt16 iTagCnt = 0;
+
+ while( ixl && !bDone ){
+ ixlNext = ixl->next;
+ pMdx = (xbIxMdx *) ixl->ix;
+ iTagCnt = pMdx->GetTagCount();
+ for( xbInt16 i = 0; i < iTagCnt && !bDone; i++ ){
+ pMdxTag = (xbMdxTag *) pMdx->GetTag( i );
+ if( pMdx->GetTagName( pMdxTag ) == sName ){
+ bDone = xbTrue;
+ iRc = pMdx->DeleteTag( pMdxTag );
+ if( iRc > 0 ){
+ // Successful delete of only tag in production mdx file - need to remove it from the list, update the dbf header
+ cIndexFlag = 0x00;
+ if(( iRc = WriteHeader( 1, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ if(( iRc = RemoveIndex( ixl->ix )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+ if( ixlPrev == NULL ){
+ // std::cout << "setting ixList to null or should be\n";
+ ixList = ixlNext;
+ } else {
+ ixlPrev = ixlNext;
+ }
+ } else if( iRc < 0 ){
+ iErrorStop = 170;
+ throw iRc;
+ }
+ if( ixl->ix == pCurIx )
+ SetCurTag( "", NULL, NULL );
+ }
+ }
+ ixlPrev = ixl;
+ ixl = ixlNext;
+ }
+
+ if( !bDone )
+ return XB_INVALID_TAG;
+
+ #endif
+
+ } else {
+ iErrorStop = 180;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+
+ if(( iRc = UpdateTagList()) != XB_NO_ERROR ){
+ iErrorStop = 190;
+ throw iRc;
+ }
+
+ // unlock as necessary
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && GetTableLocked() ){
+ if(( iRc = LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ }
+ #endif
+
+ }
+ catch (xbInt16 iRc ){
+ if( pIx ) delete pIx;
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::DeleteTag() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && GetTableLocked() ){
+ LockTable( XB_UNLOCK );
+ }
+ #endif
+
+ }
+ return iRc;
+}
+
+/************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+//! @brief Dump dbf file header.
+/*!
+ This routine dumps dbf header information to the console.
+
+ \param iOption 1 = Print header only<br>
+ 2 = Field data only<br>
+ 3 = Header and Field data<br>
+ 4 = Header, Field and Memo header data if applicable
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::DumpHeader( xbInt16 iOption ) const {
+ int i;
+ int iMemoCtr = 0;
+
+ if( iOption < 1 || iOption > 4 )
+ return XB_INVALID_OPTION;
+
+ if( iDbfStatus == XB_CLOSED )
+ return XB_NOT_OPEN;
+
+ std::cout << "\nDatabase file " << GetFqFileName() << std::endl << std::endl;
+
+ if( iOption != 2 ){
+ std::cout << "File header data:" << std::endl;
+
+ xbInt16 sVer = DetermineXbaseTableVersion( cVersion );
+
+ if( sVer == 3 )
+ std::cout << "Dbase III file" << std::endl;
+ else if ( sVer == 4 )
+ std::cout << "Dbase IV file" << std::endl << std::endl;
+ else if ( sVer == 5 )
+ std::cout << "Dbase V file" << std::endl << std::endl;
+ else if ( sVer == 7 )
+ std::cout << "Dbase VII file" << std::endl << std::endl;
+ else
+ std::cout << "Unknown Version" << std::endl;
+
+ /* display the bit stream */
+ unsigned char c, tfv, displayMask = 1 << 7;
+ tfv = cVersion;
+ std::cout << "File descriptor bits = ";
+ for( c = 1; c<= 8; c++ ){
+ std::cout << (tfv & displayMask ? '1' : '0');
+ tfv <<= 1;
+ }
+ std::cout << std::endl;
+
+ std::cout << "Descriptor bits legend:" << std::endl;
+ std::cout << " 0-2 = version number" << std::endl;
+ std::cout << " 3 = presence of dBASE IV memo" << std::endl;
+ std::cout << " 4-6 = SQL table presence" << std::endl;
+ std::cout << " 7 = Presence of any memo file (dBASE III PLUS or dBASE IV)" << std::endl << std::endl;
+
+ std::cout << "Last update date = "
+ << (int) cUpdateMM << "/" << (int) cUpdateDD << "/" << (int) cUpdateYY % 100 << std::endl;
+
+ std::cout << "Header length = " << uiHeaderLen << std::endl;
+ std::cout << "Record length = " << uiRecordLen << std::endl;
+ std::cout << "Records in file = " << ulNoOfRecs << std::endl << std::endl << std::endl;
+
+ std::cout << "Transaction Flag = ";
+ xbase->BitDump( cTransactionFlag );
+ std::cout << std::endl;
+
+ std::cout << "Encryption Flag = ";
+ xbase->BitDump( cEncryptionFlag );
+ std::cout << std::endl;
+
+ std::cout << "Index Flag = ";
+ xbase->BitDump( cIndexFlag );
+ std::cout << std::endl;
+
+ std::cout << "Lang Driver = " << (int) cIndexFlag << " - ";
+ xbase->BitDump( cIndexFlag );
+ std::cout << std::endl;
+
+ std::cout << "Open Index Files = " << GetPhysicalIxCnt() << std::endl;
+ }
+
+ if( iOption != 1 ){
+ char c;
+ std::cout << "Field Name Type Length Decimals IxFlag" << std::endl;
+ std::cout << "---------- ---- ------ -------- ------" << std::endl;
+ for( i = 0; i < iNoOfFields; i++ ){
+
+ SchemaPtr[i].cIxFlag ? c = 'Y' : c = ' ';
+
+ if( SchemaPtr[i].cType == 'C' && SchemaPtr[i].cNoOfDecs > 0 )
+ printf( "%10s %1c %4d %4d %c\n", SchemaPtr[i].cFieldName,
+ SchemaPtr[i].cType, SchemaPtr[i].cFieldLen, 0, c );
+ else
+ printf( "%10s %1c %4d %4d %c\n", SchemaPtr[i].cFieldName,
+ SchemaPtr[i].cType, SchemaPtr[i].cFieldLen, SchemaPtr[i].cNoOfDecs, c );
+
+ if( SchemaPtr[i].cType == 'M' )
+ iMemoCtr++;
+ }
+ }
+ std::cout << std::endl;
+
+#ifdef XB_MEMO_SUPPORT
+ if( iOption > 3 && iMemoCtr > 0 )
+ Memo->DumpMemoHeader();
+#endif
+
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! Dump record
+/*!
+ Dump the contents of the specified record
+
+
+ \param ulRecNo Record number of record to be dumped.
+ \param iOutputDest 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+
+ \param iOutputFmt 0 = with field names<br>
+ 1 = 1 line per rec, no field names<br>
+ 2 = 1 line per rec, first line is a list of field names.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::DumpRecord( xbUInt32 ulRecNo, xbInt16 iOutputDest, xbInt16 iOutputFmt ) {
+ int i, iRc = XB_NO_ERROR;
+
+ xbString sTemp;
+ xbString s2;
+ if( ulRecNo == 0 || ulRecNo > ulNoOfRecs )
+ return XB_INVALID_RECORD;
+
+ if( ulCurRec != ulRecNo ){
+ iRc = GetRecord( ulRecNo );
+ if( iRc != XB_NO_ERROR )
+ return iRc;
+ }
+
+ if( iOutputFmt >= 1 ){
+ if( iOutputFmt == 2 ){
+ sTemp = "RecNo";
+ for( i = 0; i < iNoOfFields; i++ ){
+ s2 = SchemaPtr[i].cFieldName;
+ s2.Trim();
+ sTemp += ",";
+ sTemp += s2;
+ }
+ xbase->WriteLogMessage( sTemp.Str(), iOutputDest );
+ }
+
+ if( RecordDeleted() )
+ s2.Sprintf( "%ld Deleted", ulRecNo );
+
+ else{
+ s2.Sprintf( "%ld ", ulRecNo );
+ //xbString s3;
+ for( i = 0; i < iNoOfFields; i++ ){
+ GetField( i, sTemp );
+ sTemp.Trim();
+ s2.Sprintf( "%s,'%s'", s2.Str(), sTemp.Str());
+ }
+ xbase->WriteLogMessage( s2.Str(),iOutputDest );
+ }
+
+ return XB_NO_ERROR;
+ }
+
+ sTemp.Sprintf( "\nRec Number: %ld", ulRecNo );
+ xbase->WriteLogMessage( sTemp.Str(),iOutputDest);
+
+ if( RecordDeleted())
+ xbase->WriteLogMessage( "Record flagged as deleted", iOutputDest );
+
+
+ #ifdef XB_MEMO_SUPPORT
+ xbString sMemo;
+ #endif
+
+ for( i = 0; i < iNoOfFields; i++ ){
+
+ #ifdef XB_MEMO_SUPPORT
+ GetField( i, sTemp );
+ sTemp.Trim();
+
+ if(SchemaPtr[i].cType == 'M'){
+ GetMemoField( i, sMemo );
+ if( sMemo.Len() > 70 )
+ sMemo.Resize( 70 );
+ s2.Sprintf ( "%c %s = '%s'", SchemaPtr[i].cType, SchemaPtr[i].cFieldName, sMemo.Str());
+ xbase->WriteLogMessage( s2.Str(), iOutputDest);
+
+ /*
+ xbUInt32 ulMlen;
+ if( MemoFieldExists( i )){
+ Memo->GetMemoFieldLen( i, ulMlen );
+ s2.Sprintf( " Len = %d", ulMlen );
+ }
+ xbase->WriteLogMessage( s2.Str(), iOutputDest);
+ */
+
+ }
+ else{
+ s2.Sprintf ( "%c %s = '%s'", SchemaPtr[i].cType, SchemaPtr[i].cFieldName, sTemp.Str());
+ xbase->WriteLogMessage( s2.Str(), iOutputDest);
+ }
+ #else
+ GetField( i, sTemp );
+ sTemp.Trim();
+ s2.Sprintf( "%s = '%s'", SchemaPtr[i].cFieldName, sTemp.Str());
+ xbase->WriteLogMessage( s2.Str(), iOutputDest);
+ #endif
+
+ }
+ return XB_NO_ERROR;
+}
+
+
+/************************************************************************/
+#ifdef XB_LOCKING_SUPPORT
+//! @brief Dump the table lock status
+/*!
+ Debugging routine. Dumps the table lock status to the console.
+ \returns void
+*/
+
+void xbDbf::DumpTableLockStatus() const {
+
+ std::cout << "File Lock Retry Count = [" << GetLockRetryCount() << "]" << std::endl;
+ std::cout << "File Lock Flavor = [";
+ switch (GetLockFlavor()){
+ case 1:
+ std::cout << "Dbase]" << std::endl;
+ break;
+ case 2:
+ std::cout << "Clipper]" << std::endl;
+ break;
+ case 3:
+ std::cout << "Fox]" << std::endl;
+ break;
+ case 9:
+ std::cout << "Xbase64]" << std::endl;
+ break;
+ default:
+ std::cout << "Unknown]" << std::endl;
+ break;
+ }
+ std::cout << "File Auto Lock = [";
+
+ if( GetAutoLock())
+ std::cout << "ON]" << std::endl;
+ else
+ std::cout << "OFF]" << std::endl;
+ if( GetHeaderLocked())
+ std::cout << "Header Locked = [TRUE]\n";
+ else
+ std::cout << "Header Locked = [FALSE]\n";
+
+ if( GetTableLocked())
+ std::cout << "Table Locked = [TRUE]\n";
+ else
+ std::cout << "Table Locked = [FALSE]\n";
+
+ if( GetAppendLocked() > 0 )
+ std::cout << "Append Locked = [" << GetAppendLocked() << "]\n";
+ else
+ std::cout << "Append Locked = [FALSE]\n";
+
+ #ifdef XB_MEMO_SUPPORT
+ if( GetMemoLocked())
+ std::cout << "Memo Locked = [TRUE]\n";
+ else
+ std::cout << "Memo Locked = [FALSE]\n";
+ #endif // XB_MEMO_SUPPORT
+
+ xbLinkListNode<xbUInt32> * llN = GetFirstRecLock();
+ if( llN ){
+ while( llN ){
+ std::cout << "Record Locked = [" << llN->GetKey() << "]\n";
+ llN = llN->GetNextNode();
+ }
+ } else {
+ std::cout << "Record Locked = [None]\n";
+ }
+}
+#endif // XB_LOCKING_SUPPORT
+#endif // XB_DEBUG_SUPPORT
+
+/************************************************************************/
+#ifdef XB_LOCKING_SUPPORT
+//! @brief Get the append locked bytes status
+/*!
+ \returns The record number of the new record for the append lock operation.
+*/
+
+xbUInt32 xbDbf::GetAppendLocked() const {
+ return this->ulAppendLocked;
+}
+
+#endif // XB_LOCKING_SUPPORT
+
+/************************************************************************/
+//! @brief Get auto commit setting.
+/*!
+
+ This routine returns the table setting if set, otherwise returns the system
+ level setting.
+
+ \returns Not 0 - Auto commit on for this table.<br>
+ 0 - Auto commit off for this table.
+*/
+
+xbInt16 xbDbf::GetAutoCommit() const {
+ return GetAutoCommit( 1 );
+}
+
+/************************************************************************/
+//! @brief Get auto commit setting.
+/*!
+
+ \param iOption 0 - Specific setting for this table<br>
+ 1 - If this table should be auto updated (takes DBMS setting into account)
+ \returns Not 0 - Auto commit on for this table.<br>
+ 0 - Auto commit off for this table.
+*/
+
+xbInt16 xbDbf::GetAutoCommit( xbInt16 iOption ) const {
+ if( iOption == 1 && iAutoCommit == -1 )
+ return xbase->GetDefaultAutoCommit();
+ else
+ return iAutoCommit;
+}
+
+
+/************************************************************************/
+//! @brief Get Auto Lock setting.
+/*!
+ \returns Auto lock setting.
+*/
+#ifdef XB_LOCKING_SUPPORT
+xbInt16 xbDbf::GetAutoLock() const{
+ return iAutoLock;
+}
+#endif // XB_LOCKING_SUPPORT
+
+/************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+//! @brief Get the memo file block size used when creating a memo file.
+/*!
+ \returns Memo block size.
+*/
+xbUInt32 xbDbf::GetCreateMemoBlockSize() const {
+ return ulCreateMemoBlockSize;
+}
+#endif
+
+/************************************************************************/
+//! @brief Get a pointer to the current index object.
+/*!
+ \returns Pointer to current index.
+*/
+#ifdef XB_INDEX_SUPPORT
+xbIx *xbDbf::GetCurIx() const {
+ return pCurIx;
+}
+/************************************************************************/
+//! @brief Get pointer to current tag for the current index.
+/*!
+ An index file can have one or more tags. An NDX index has one tag.
+ An MDX file can have up to 47 tags.
+
+ \returns Pointer to current tag.
+*/
+void *xbDbf::GetCurTag() const {
+ return vpCurIxTag;
+}
+/************************************************************************/
+//! @brief Get the current index type.
+/*!
+ \returns NDX for single tag index.<br>
+ MDX for production multi tag index.
+*/
+const xbString &xbDbf::GetCurIxType() const {
+ return sCurIxType;
+}
+
+/************************************************************************/
+//! @brief Get the current tag name.
+/*!
+ \returns Current Tag Name.<br>
+*/
+
+const xbString &xbDbf::GetCurTagName() const {
+
+ if( pCurIx )
+ return pCurIx->GetTagName( vpCurIxTag );
+ else
+ return sNullString;
+}
+
+/************************************************************************/
+//! @brief GetFirstKey for tag.
+/*!
+
+ Position to the first key for the current tag
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbDbf::GetFirstKey(){
+ if( pCurIx )
+ return pCurIx->GetFirstKey( vpCurIxTag, 1 );
+ else
+ return XB_INVALID_TAG;
+}
+
+/************************************************************************/
+//! @brief GetLastKey for tag.
+/*!
+
+ Position to the last key for the current tag
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbDbf::GetLastKey(){
+ if( pCurIx )
+ return pCurIx->GetLastKey( vpCurIxTag, 1 );
+ else
+ return XB_INVALID_TAG;
+}
+
+/************************************************************************/
+//! @brief GetNextKey for tag.
+/*!
+
+ Position to the next key for the current tag
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbDbf::GetNextKey(){
+ if( pCurIx )
+ return pCurIx->GetNextKey( vpCurIxTag, 1 );
+ else
+ return XB_INVALID_TAG;
+}
+
+/************************************************************************/
+//! @brief GetPrevKey for tag.
+/*!
+
+ Position to the previous key for the current tag
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbDbf::GetPrevKey(){
+ if( pCurIx )
+ return pCurIx->GetPrevKey( vpCurIxTag, 1 );
+ else
+ return XB_INVALID_TAG;
+}
+
+/************************************************************************/
+//! @brief Find record for key.
+/*!
+
+ Find a key and position to record if key found
+
+ \param sKey String key to find
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbDbf::Find( xbString &sKey ){
+ if( pCurIx )
+ return pCurIx->FindKey( vpCurIxTag, sKey.Str(), (xbInt32) sKey.Len(), 1 );
+ else
+ return XB_INVALID_TAG;
+}
+
+/************************************************************************/
+//! @brief Find record for key.
+/*!
+
+ Find a key and position to record if key found
+
+ \param dtKey Date key to find
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbDbf::Find( xbDate &dtKey ){
+
+ if( pCurIx )
+ return pCurIx->FindKey( vpCurIxTag, dtKey, 1 );
+ else
+ return XB_INVALID_TAG;
+
+}
+/************************************************************************/
+//! @brief Find record for key.
+/*!
+
+ Find a key and position to record if key found
+
+ \param dtKey Date key to find
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbDbf::Find( xbDouble &dKey ){
+
+ if( pCurIx )
+ return pCurIx->FindKey( vpCurIxTag, dKey, 1 );
+ else
+ return XB_INVALID_TAG;
+
+}
+
+
+#endif // XB_INDEX_SUPPORT
+
+/************************************************************************/
+//! @brief Return the current record number.
+/*!
+ \returns Returns the current record number.
+*/
+xbUInt32 xbDbf::GetCurRecNo() const {
+ return ulCurRec;
+}
+
+/************************************************************************/
+//! @brief Return the current dbf status.
+/*!
+ \returns 0 = closed<br>
+ 1 = open<br>
+ 2 = updates pending<br>
+*/
+xbInt16 xbDbf::GetDbfStatus() const {
+ return iDbfStatus;
+}
+/************************************************************************/
+//! @brief Return the number of fields in the table.
+/*!
+ \returns The number of fields in the table.
+*/
+xbInt32 xbDbf::GetFieldCnt() const {
+ return iNoOfFields;
+}
+
+/************************************************************************/
+#ifdef XB_LOCKING_SUPPORT
+//! @brief Get the first first record lock.
+/*!
+ Get the first record lock from a linked list of record locks.
+
+ \returns First record lock.
+*/
+xbLinkListNode<xbUInt32> * xbDbf::GetFirstRecLock() const {
+ return lloRecLocks.GetHeadNode();
+}
+#endif // XB_LOCKING_SUPPORT
+/************************************************************************/
+//! @brief Get the first record.
+/*!
+ Get the first not deleted record. This routines skips over any deleted records.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::GetFirstRecord()
+{
+ return GetFirstRecord( XB_ACTIVE_RECS );
+}
+
+/************************************************************************/
+//! @brief Get the first record.
+/*!
+
+ \param iOption XB_ALL_RECS - Get the first record, deleted or not.<br>
+ XB_ACTIVE_RECS - Get the first active record.<br>
+ XB_DELETED_RECS - Get the first deleted record.<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::GetFirstRecord( xbInt16 iOption )
+{
+ if( ulNoOfRecs == 0 )
+ return XB_EMPTY;
+
+ xbInt16 iRc = GetRecord( 1L );
+ while( iRc == XB_NO_ERROR &&
+ ((RecordDeleted() && iOption == XB_ACTIVE_RECS) ||
+ (!RecordDeleted() && iOption == XB_DELETED_RECS)))
+ if( ulCurRec < ulNoOfRecs )
+ iRc = GetRecord( ulCurRec + 1 );
+ else
+ return XB_EOF;
+
+ return iRc;
+}
+
+/************************************************************************/
+#ifdef XB_LOCKING_SUPPORT
+//! @brief Return lock status of the table header
+/*! \returns DBF header lock status
+*/
+
+xbBool xbDbf::GetHeaderLocked() const {
+ return this->bHeaderLocked;
+}
+#endif
+
+#ifdef XB_INDEX_SUPPORT
+//! @brief Return pointer to list of index files for the table.
+/*!
+ \returns Returns an xbIxList * pointer to list of open index files.
+*/
+
+xbIxList *xbDbf::GetIxList() const{
+ return ixList;
+}
+#endif // XB_INDEX_SUPPORT
+
+
+/************************************************************************/
+//! @brief Get the last record.
+/*!
+ Get the last not deleted record. This routines skips over any deleted records.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::GetLastRecord()
+{
+ return GetLastRecord( XB_ACTIVE_RECS );
+}
+/************************************************************************/
+//! @brief Get the last record.
+/*!
+
+ \param iOption XB_ALL_RECS - Get the last record, deleted or not.<br>
+ XB_ACTIVE_RECS - Get the last active record.<br>
+ XB_DELETED_RECS - Get the last deleted record.<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::GetLastRecord( xbInt16 iOption )
+{
+ if( ulNoOfRecs == 0 )
+ return XB_EMPTY;
+
+ xbInt16 iRc = GetRecord( ulNoOfRecs );
+ while( iRc == XB_NO_ERROR &&
+ ((RecordDeleted() && iOption == XB_ACTIVE_RECS) ||
+ (!RecordDeleted() && iOption == XB_DELETED_RECS)))
+ if( ulCurRec > 1 )
+ iRc = GetRecord( ulCurRec - 1 );
+ else
+ return XB_EOF;
+
+ return iRc;
+}
+
+
+/************************************************************************/
+//! @brief Get lock flavor.
+/*!
+ This routine is currently in place to provide structure for future locking
+ schemes that may differ from the legacy DBase (TM) locking scheme.
+ \returns Always 1.
+*/
+
+xbInt16 xbDbf::GetLockFlavor() const{
+ if( iLockFlavor == -1 )
+ return xbase->GetDefaultLockFlavor();
+ else
+ return iLockFlavor;
+}
+
+/************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+/************************************************************************/
+//! @brief Get the lock status of the memo file.
+/*!
+ \returns Lock status of memo file.
+*/
+xbBool xbDbf::GetMemoLocked() const {
+ if( MemoFieldsExist())
+ return Memo->GetMemoLocked();
+ else
+ return xbFalse;
+}
+/************************************************************************/
+//! @brief Get pointer to Memo object.
+/*!
+ \returns This routine returns the pointer to the memo object.
+*/
+
+xbMemo * xbDbf::GetMemoPtr(){
+ return Memo;
+}
+#endif
+
+
+/************************************************************************/
+#ifdef XB_NDXINF_SUPPORT
+//! @brief Return the .INF file name
+/*!
+ If NDXIDX support is enabled in the library, and a non production (ndx)
+ has been associated with the dbf file, the .INF file name can be retrieved
+ with this routine.
+
+ \param sNdxInfFileName Output string containing .INF file name.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::GetNdxInfFileName( xbString &sNdxInfFileName ){
+
+ sNdxInfFileName = GetFqFileName();
+ xbUInt32 lLen = sNdxInfFileName.Len();
+ if( lLen < 5 )
+ return XB_FILE_NOT_FOUND;
+ sNdxInfFileName.PutAt(lLen-2, 'I');
+ sNdxInfFileName.PutAt(lLen-1, 'N');
+ sNdxInfFileName.PutAt(lLen, 'F');
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Return first node of linked list of .INF items.
+/*!
+ \returns List of .INF entries.
+*/
+
+xbLinkListNode<xbString> * xbDbf::GetNdxInfList() const{
+ return llNdxInfData.GetHeadNode();
+}
+#endif // XB_NDXINF_SUPPORT
+
+
+/************************************************************************/
+//! @brief Get the next record.
+/*!
+ Get the next not deleted record. This routines skips over any deleted records.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::GetNextRecord(){
+ return GetNextRecord( XB_ACTIVE_RECS );
+}
+
+/************************************************************************/
+//! @brief Get the next record.
+/*!
+ \param iOption XB_ALL_RECS - Get the next record, deleted or not.<br>
+ XB_ACTIVE_RECS - Get the next active record.<br>
+ XB_DELETED_RECS - Get the next deleted record.<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::GetNextRecord( xbInt16 iOption ){
+ if( ulNoOfRecs == 0 )
+ return XB_EMPTY;
+ else if( ulCurRec >= ulNoOfRecs )
+ return XB_EOF;
+ xbInt16 iRc = GetRecord( ulCurRec + 1 );
+ while( iRc == XB_NO_ERROR &&
+ ((RecordDeleted() && iOption == XB_ACTIVE_RECS) ||
+ (!RecordDeleted() && iOption == XB_DELETED_RECS)))
+ if( ulCurRec < ulNoOfRecs )
+ iRc = GetRecord( ulCurRec + 1 );
+ else
+ return XB_EOF;
+ return iRc;
+}
+/************************************************************************/
+//! @brief Get the next record.
+/*!
+
+ \param iOption XB_ALL_RECS - Get the next record, deleted or not.<br>
+ XB_ACTIVE_RECS - Get the next active record.<br>
+ XB_DELETED_RECS - Get the next deleted record.<br>
+ \param ulStartRec Get next record, starting from ulStartRec.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::GetNextRecord( xbInt16 iOption , xbUInt32 ulStartRec ){
+
+ if( iOption == 0 )
+ return GetNextRecord();
+ else if( iOption == 1 ){
+ if( ulStartRec > 0 )
+ ulCurRec = ulStartRec;
+ xbInt16 iRc = GetNextRecord();
+ while( iRc == XB_NO_ERROR && RecordDeleted())
+ iRc = GetNextRecord();
+ return iRc;
+ }
+ else
+ return XB_INVALID_OPTION;
+}
+
+
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+//! @brief Physical count of open index files.
+/*!
+
+ Returns a physical count of open index files for the dbf file. An index file
+ can contain one or more tags.
+ \returns Count of open index files.
+*/
+
+xbInt32 xbDbf::GetPhysicalIxCnt() const {
+
+ xbInt32 lCnt = 0;
+ #ifdef XB_INDEX_SUPPORT
+ xbIxList *p = ixList;
+ while( p ){
+ lCnt++;
+ p = p->next;
+ }
+ #endif
+ return lCnt;
+}
+#endif
+
+
+/************************************************************************/
+//! @brief Get the previous record.
+/*!
+ Get the previous not deleted record. This routine skips over any deleted records.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::GetPrevRecord()
+{
+ return GetPrevRecord( XB_ACTIVE_RECS );
+}
+
+/************************************************************************/
+//! @brief Get the previous record.
+/*!
+
+ \param iOption XB_ALL_RECS - Get the previous record, deleted or not.<br>
+ XB_ACTIVE_RECS - Get the previous active record.<br>
+ XB_DELETED_RECS - Get the previous deleted record.<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::GetPrevRecord( xbInt16 iOption ){
+ if( ulNoOfRecs == 0 )
+ return XB_EMPTY;
+ else if( ulCurRec <= 1L )
+ return XB_BOF;
+ xbInt16 iRc = GetRecord( ulCurRec - 1 );
+ while( iRc == XB_NO_ERROR &&
+ ((RecordDeleted() && iOption == XB_ACTIVE_RECS) ||
+ (!RecordDeleted() && iOption == XB_DELETED_RECS)))
+ if( ulCurRec > 1 )
+ iRc = GetRecord( ulCurRec - 1 );
+ else
+ return XB_BOF;
+
+ return iRc;
+}
+
+
+/************************************************************************/
+//! @brief Get record for specified record number.
+/*!
+ Retrieve a record from disk and load it into the record buffer. If auto commit
+ is enabled and there are pending updates, this routine will flush the updates
+ to disk before proceeding to ulRecNo.
+
+ \param ulRecNo - Record number to retrieve.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::GetRecord( xbUInt32 ulRecNo ){
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ /* verify the file is open */
+ if( iDbfStatus == XB_CLOSED ){
+ iErrorStop = 10;
+ iRc = XB_NOT_OPEN;
+ throw iRc;
+ }
+ if( iDbfStatus == XB_UPDATED ){
+ if( GetAutoCommit() == 1 ){
+ if(( iRc = Commit()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ } else {
+ if(( iRc = Abort()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+ }
+
+ if( ulRecNo > ulNoOfRecs || ulRecNo == 0L ){
+ iErrorStop = 40;
+ iRc = XB_INVALID_RECORD;
+ throw iRc;
+ }
+
+ if(( xbFseek( (uiHeaderLen+(( (xbInt64) ulRecNo-1L ) * uiRecordLen )), SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ iRc = XB_SEEK_ERROR;
+ throw iRc;
+ }
+
+ if( xbFread( RecBuf, uiRecordLen, 1 ) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ iRc = XB_READ_ERROR;
+ throw iRc;
+ }
+ ulCurRec = ulRecNo;
+ }
+
+ catch (xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbDbf::GetRecord() Exception Caught. Error Stop = [%d] iRc = [%d] record = [%d]", iErrorStop, iRc, ulRecNo );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ return iRc;
+}
+/************************************************************************/
+//! @brief Get pointer to record buffer
+/*!
+ \param iOpt 0 for RecBuf (current) or 1 for RecBuf2 (original contents)
+
+ \returns Pointer to record buffer.
+*/
+char * xbDbf::GetRecordBuf( xbInt16 iOpt ) const {
+ if( iOpt )
+ return RecBuf2;
+ else
+ return RecBuf;
+}
+
+/************************************************************************/
+//! @brief Get the current number of records in the dbf data file.
+/*!
+ \param ulRecCnt Output number of records in file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::GetRecordCnt( xbUInt32 & ulRecCnt )
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbBool bIlocked = xbFalse;
+ try{
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && !bTableLocked ){
+ if(( iRc = LockHeader( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ } else
+ bIlocked = xbTrue;
+ }
+
+ if((iRc = ReadHeader(1,1)) != XB_NO_ERROR){
+ LockHeader( XB_UNLOCK );
+ iErrorStop = 20;
+ throw iRc;
+ }
+
+ if( iAutoLock && bIlocked ){
+ if(( iRc = LockHeader( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+ #endif
+ }
+ catch( xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbDbf::GetRecordCnt() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ ulRecCnt = ulNoOfRecs;
+ return iRc;
+}
+/************************************************************************/
+//! @brief Get the dbf record length.
+/*!
+ \returns Record length.
+*/
+xbUInt16 xbDbf::GetRecordLen() const {
+ return uiRecordLen;
+}
+/************************************************************************/
+//! @brief Get table locked status
+/*!
+ \returns Table lock status.
+*/
+
+xbBool xbDbf::GetTableLocked() const {
+ return this->bTableLocked;
+}
+/************************************************************************/
+//! @brief Get tag list for dbf file.
+/*!
+ This routine returns a list of tags for the file.<br>
+
+ The library is structured to support one or more files of the same or differing
+ index types (NDX/MDX), with each file supporting one or more index tags.<br>
+
+ \returns Tag list for the file/table.
+*/
+xbLinkListNode<xbTag *> *xbDbf::GetTagList() const {
+ return llTags.GetHeadNode();
+}
+/************************************************************************/
+//! @brief Get the table alias.
+/*!
+ This routine returns the table alias.
+ \returns Table alias
+*/
+const xbString & xbDbf::GetTblAlias() const {
+ return this->sAlias;
+}
+
+/************************************************************************/
+//! @brief Get the pointer to the xbXbase structure,
+/*!
+ \returns Pointer to xbXbase structure.
+*/
+xbXBase * xbDbf::GetXbasePtr() const {
+ return xbase;
+}
+/************************************************************************/
+#ifdef XB_NDXINF_SUPPORT
+//! @brief Load .INF data file,
+/*!
+ Protected method. This routine loads the ndx inf file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::LoadNdxInfData(){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ // create file name
+ xbString sNdxInfFileName;
+ if(( iRc = GetNdxInfFileName( sNdxInfFileName )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ // if file does not exist, return no error
+ xbFile fMd( xbase );
+ if( !fMd.FileExists( sNdxInfFileName ))
+ return XB_NO_ERROR;
+
+ // open file file in read only mode
+ if(( iRc = fMd.xbFopen( "r", sNdxInfFileName, GetShareMode())) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ // clear the linked list
+ llNdxInfData.Clear();
+
+ // for each entry in the file, add a linked list item
+ xbString sRec;
+ xbString sLeft3;
+ xbString sFn;
+
+ while( iRc == XB_NO_ERROR ){
+ sRec = "";
+ if(( iRc = fMd.xbFgets( 132, sRec )) == XB_NO_ERROR ){
+ sLeft3 = sRec;
+ sLeft3.Left( 3 );
+ sLeft3.ToUpperCase();
+ if( sLeft3 == "NDX"){
+ sFn.ExtractElement(sRec.Str(), '=', 2 );
+ sFn.ZapChar( 0x0d );
+ sFn.ZapChar( 0x0a );
+ llNdxInfData.InsertAtEnd( sFn );
+ }
+ }
+ }
+ // close the file
+ if(( iRc = fMd.xbFclose()) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ } catch( xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::LoadNdxInfData() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+#endif // XB_NDXINF_SUPPORT
+
+/************************************************************************/
+#ifdef XB_LOCKING_SUPPORT
+//! @brief Lock append bytes.
+/*!
+ This routine locks the append bytes and is used by the AppendRecord function.
+
+ \param iLockFunction XB_LOCK<br>XB_UNLOCK
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::LockAppend( xbInt16 iLockFunction )
+{
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulAppendRec;
+
+ try{
+ if( iLockFunction == XB_LOCK ){
+ iErrorStop = 100;
+ if( ulAppendLocked > 0 ) /* already have an append lock */
+ return XB_NO_ERROR;
+
+ ulAppendRec = ulNoOfRecs + 1; /* record number needing to be locked */
+ if( GetLockFlavor() == LK_DBASE ){
+ iRc = xbLock( XB_LOCK, LK4026531839, 1 );
+ if( iRc != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED )
+ return iRc;
+ else{
+ iErrorStop = 120;
+ throw iRc;
+ }
+ }
+
+ xbInt64 llAppendRecLockByte = (xbInt64) LK4026531838 - ulAppendRec;
+ iRc = xbLock( XB_LOCK, llAppendRecLockByte, 1 );
+ if( iRc != XB_NO_ERROR ){
+ xbLock( XB_UNLOCK, LK4026531839, 1 );
+ if( iRc == XB_LOCK_FAILED ){
+ return iRc;
+ } else {
+ iErrorStop = 130;
+ throw iRc;
+ }
+ }
+ ulAppendLocked = ulAppendRec; /* set the append lock switch */
+
+
+ // } else { - other lock-table flavor options go here Clipper, Fox, etc - }
+
+ } else {
+ iErrorStop = 190;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+
+ } else if( iLockFunction == XB_UNLOCK ){
+
+ iErrorStop = 200;
+
+ if( ulAppendLocked == 0 ) /* verify we have an active append lock */
+ return XB_NO_ERROR;
+
+ if( GetLockFlavor() == LK_DBASE ){
+ xbInt64 llAppendRecLockByte =(xbInt64) LK4026531838 - ulAppendLocked;
+ iRc = xbLock( XB_UNLOCK, llAppendRecLockByte, 1 );
+ if( iRc != XB_NO_ERROR ){
+ xbLock( XB_UNLOCK, LK4026531839, 1 );
+ iErrorStop = 220;
+ throw iRc;
+ }
+ iRc = xbLock( XB_UNLOCK, LK4026531839, 1 );
+ if( iRc != XB_NO_ERROR ){
+ iErrorStop = 230;
+ throw iRc;
+ }
+
+ ulAppendLocked = 0; /* release the append lock switch */
+
+ // } else { - other unlock-table flavor options go here Clipper, Fox, etc - }
+
+ } else {
+ iErrorStop = 290;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+ } else {
+ iErrorStop = 300;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+ } catch( xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::LockAppendBytes() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+
+ return iRc;
+}
+
+
+/************************************************************************/
+//! @brief Lock Header
+/*!
+ This routine locks the file header.
+ \param iLockFunction XB_LOCK<br>XB_UNLOCK
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::LockHeader( xbInt16 iLockFunction )
+{
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( iLockFunction == XB_LOCK ){
+ iErrorStop = 100;
+ if( GetHeaderLocked())
+ return XB_NO_ERROR;
+
+ iErrorStop = 110;
+ if( GetLockFlavor() == LK_DBASE ){
+
+ iRc = xbLock( XB_LOCK, LK4026531838, 1 );
+
+ if( iRc != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED )
+ return iRc;
+ else{
+ iErrorStop = 120;
+ throw iRc;
+ }
+ }
+
+ } else {
+ iErrorStop = 190;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+
+ SetHeaderLocked( xbTrue );
+
+ } else if( iLockFunction == XB_UNLOCK ){
+
+ iErrorStop = 200;
+ if( !GetHeaderLocked())
+ return XB_NO_ERROR;
+
+ iErrorStop = 210;
+ if( GetLockFlavor() == LK_DBASE ){
+ iRc = xbLock( XB_UNLOCK, LK4026531838, 1 );
+ if( iRc != XB_NO_ERROR ){
+ iErrorStop = 220;
+ throw iRc;
+ }
+ } else {
+ iErrorStop = 290;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+ SetHeaderLocked( xbFalse );
+ } else {
+ iErrorStop = 300;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+
+ } catch (xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::LockHeader() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ return iRc;
+}
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+//! @brief Lock Index files.
+/*!
+ This routine locks all the index files.
+ \param iLockFunction XB_LOCK<br>XB_UNLOCK
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::LockIndices( xbInt16 iLockFunction )
+{
+ // this function doesn't take into account any Lack Flavors other than DBASE,
+ // would need updated to supprot other lock flavors - Clipper, FoxPro etc
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ xbIxList *ixLI = GetIxList(); // index list item
+
+ while( ixLI ){
+ if( iLockFunction == XB_LOCK ){
+
+ #ifdef XB_NDX_SUPPORT
+ if( *ixLI->sFmt == "NDX" ){
+ if( !ixLI->ix->GetLocked()){
+ if(( iRc = ixLI->ix->xbLock( XB_LOCK, LK4026531838, 1 )) != XB_NO_ERROR ){
+ ixLI->ix->xbLock( XB_UNLOCK, LK4026531838, 1 );
+ iErrorStop = 100;
+ throw iRc;
+ }
+ ixLI->ix->SetLocked( xbTrue );
+ }
+ }
+ #endif
+
+ } else if( iLockFunction == XB_UNLOCK ){
+
+ #ifdef XB_NDX_SUPPORT
+ if( *ixLI->sFmt == "NDX" ){
+ if( ixLI->ix->GetLocked()){
+ if(( iRc = ixLI->ix->xbLock( XB_UNLOCK, LK4026531838, 1 )) != XB_NO_ERROR ){
+ ixLI->ix->xbLock( XB_UNLOCK, LK4026531838, 1 );
+ iErrorStop = 100;
+ throw iRc;
+ }
+ ixLI->ix->SetLocked( xbFalse );
+ }
+ }
+ #endif
+ }
+ ixLI = ixLI->next;
+ }
+
+ } catch( xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::LockIndices() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ return iRc;
+}
+#endif // XB_INDEX_SUPPORT
+/************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+//! @brief Lock Memo file.
+/*!
+ This routine locks the memo file for updates.
+ \param iLockFunction XB_LOCK<br>XB_UNLOCK
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::LockMemo( xbInt16 iLockFunction ){
+ if( MemoFieldsExist())
+ return Memo->LockMemo( iLockFunction );
+ else
+ return XB_NO_ERROR;
+}
+#endif // XB_MEMO_SUPPORT
+
+
+
+/************************************************************************/
+//! @brief Loc Record
+/*!
+ This routine locks a record for update.
+ \param iLockFunction XB_LOCK<br>XB_UNLOCK
+ \param ulRecNo Record number to lock
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::LockRecord( xbInt16 iLockFunction, xbUInt32 ulRecNo )
+{
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ if( ulRecNo > ulNoOfRecs )
+ return XB_INVALID_RECORD;
+
+ if( iLockFunction == XB_LOCK ){
+ iErrorStop = 100;
+
+ if( lloRecLocks.KeyExists( ulRecNo ))
+ return XB_NO_ERROR;
+
+ if( GetLockFlavor() == LK_DBASE ){
+
+ iRc = xbLock( XB_LOCK, LK4026531838 - ulRecNo, 1 );
+ if( iRc != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED ){
+ return iRc;
+ } else {
+ iErrorStop = 130;
+ throw iRc;
+ }
+ }
+ // other lock-table flavor options go here Clipper, Fox, etc
+
+ } else {
+ iErrorStop = 190;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+
+ // add the record lock info to the linked list chain of record locks
+ iRc = lloRecLocks.InsertKey( ulRecNo );
+ if( iRc != XB_NO_ERROR ){
+ xbLock( XB_UNLOCK, LK4026531838 - ulRecNo, 1 );
+ iErrorStop = 140;
+ throw iRc;
+ }
+
+ } else if( iLockFunction == XB_UNLOCK ){
+
+ iErrorStop = 200;
+
+ if( !lloRecLocks.KeyExists( ulRecNo ) )
+ return XB_NO_ERROR;
+
+ if( GetLockFlavor() == LK_DBASE ){
+ iRc = xbLock( XB_UNLOCK, LK4026531838 - ulRecNo, 1 );
+ if( iRc != XB_NO_ERROR ){
+ iErrorStop = 220;
+ throw iRc;
+ }
+ } else {
+ iErrorStop = 290;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+
+ // remove the record lock info to the linked list chain of record locks
+ // next line is crashing
+ iRc = lloRecLocks.RemoveKey( ulRecNo );
+ if( iRc != XB_NO_ERROR ){
+ iErrorStop = 230;
+ throw iRc;
+ }
+
+ } else {
+ iErrorStop = 300;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+
+ } catch( xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::LockRecord() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+
+ return iRc;
+}
+
+
+/************************************************************************/
+//! @brief Lock table.
+/*!
+ This routine locks the table for updates.
+
+ \param iLockFunction XB_LOCK<br>XB_UNLOCK
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::LockTable( xbInt16 iLockFunction )
+{
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ if( iLockFunction == XB_LOCK ){
+ iErrorStop = 100;
+ if( GetTableLocked())
+ return XB_NO_ERROR; // table already locked
+
+ iErrorStop = 110;
+ if( GetLockFlavor() == LK_DBASE ){
+
+ // lOffset = LK4026531838;
+ // iLen = 2;
+ iRc = xbLock( XB_LOCK, LK4026531838, 2 );
+ if( iRc != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED )
+ return iRc;
+ else{
+ iErrorStop = 120;
+ throw iRc;
+ }
+ }
+
+ // lOffset = LK3026531838;
+ // iLen = LK1000000000;
+ iRc = xbLock( XB_LOCK, LK3026531838, LK1000000000);
+ if( iRc != XB_NO_ERROR ){
+
+ // lOffset = LK4026531838;
+ // iLen = 2;
+ xbLock( XB_UNLOCK, LK4026531838, 2 );
+ if( iRc == XB_LOCK_FAILED ){
+ return iRc;
+ } else {
+ iErrorStop = 130;
+ throw iRc;
+ }
+ }
+
+ // iRc = xbLock( XB_UNLOCK, lOffset, iLen );
+ iRc = xbLock( XB_UNLOCK, LK3026531838, LK1000000000);
+ if( iRc != XB_NO_ERROR ){
+ // lOffset = LK4026531838;
+ // iLen = 2;
+ xbLock( XB_UNLOCK, LK4026531838, 2 );
+ iErrorStop = 140;
+ throw iRc;
+ }
+
+ // other lock-table flavor options go here Clipper, Fox, etc
+
+ } else {
+ iErrorStop = 190;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+ SetTableLocked( xbTrue );
+
+ } else if( iLockFunction == XB_UNLOCK ){
+
+ iErrorStop = 200;
+ if( !GetTableLocked())
+ return XB_NO_ERROR; // table already unlocked
+
+ iErrorStop = 210;
+ if( GetLockFlavor() == LK_DBASE ){
+
+ // lOffset = LK4026531838;
+ // iLen = 2;
+ iRc = xbLock( XB_UNLOCK, LK4026531838, 2 );
+ if( iRc != XB_NO_ERROR ){
+ iErrorStop = 220;
+ throw iRc;
+ }
+ } else {
+ iErrorStop = 290;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+ SetTableLocked( xbFalse );
+
+ } else {
+ iErrorStop = 300;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+
+ } catch (xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::LockFile() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ return iRc;
+
+}
+
+
+/************************************************************************/
+//! @brief Check for existence of any memo fields.
+/*!
+ \returns xbTrue - Memo fields exist.<br>xbFalse - Memo fields don't exist.
+*/
+xbBool xbDbf::MemoFieldsExist() const {
+#ifdef XB_MEMO_SUPPORT
+ if( iMemoFieldCnt > 0 )
+ return xbTrue;
+#endif
+ return xbFalse;
+}
+
+/************************************************************************/
+//! @brief Open a table/dbf file.
+/*!
+ This routine sets the alias name to the same as the table name.
+
+ \param sTableName Table name to open, Include the .dbf or .DBF extension.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::Open( const xbString & sTableName ) {
+ return Open( sTableName, sTableName );
+}
+
+/************************************************************************/
+//! @brief Open a table/dbf file.
+/*!
+ \param sTableName Table name to open, Include the .dbf or .DBF extension.
+ \param sAlias Alias name to assign to this entry.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::Open( const xbString & sTableName, const xbString & sAlias ){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+
+ try{
+
+ if(( iRc = Open( sTableName, sAlias, XB_READ_WRITE, XB_MULTI_USER )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ // do any .INF data things on the file, like open indices
+ #ifdef XB_NDXINF_SUPPORT
+ if(( iRc = LoadNdxInfData()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ xbUInt32 llNodeCnt = llNdxInfData.GetNodeCnt();
+ if( llNodeCnt > 0 ){
+ xbString s2;
+ xbLinkListNode<xbString> * llN = llNdxInfData.GetHeadNode();
+ for( xbUInt32 i = 0; i < llNodeCnt; i++ ){
+ s2 = llN->GetKey();
+ if(( iRc = OpenIndex( "NDX", s2 )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc ;
+ }
+ llN = llN->GetNextNode();
+ }
+ }
+ #endif // XB_NDXINF_SUPPORT
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::Open() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+#endif // XB_LOCKING_SUPPORT
+
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+//! @brief Open an index.
+/*!
+ Open an index file for the dbf file.
+
+ \param sIxType - "NDX" or "MDX"
+ \param sFileName - File name of index,
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::OpenIndex( const xbString &sIxType, const xbString &sFileName ){
+
+ // this routine is used to open indices and set up linkages
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbIx *pIx = NULL;
+
+ try{
+ xbString sType = sIxType;
+ sType.ToUpperCase();
+
+ if( sType == "" ){
+ iErrorStop = 10;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+
+ #ifdef XB_NDX_SUPPORT
+ } else if( sType == "NDX" ){
+ pIx = new xbIxNdx( this );
+ if(( iRc = pIx->Open( sFileName )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ #endif
+
+ #ifdef XB_MDX_SUPPORT
+ } else if( sType == "MDX" ){
+
+ pIx = new xbIxMdx( this );
+ if(( iRc = pIx->Open( sFileName )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ #endif
+
+ } else {
+ iErrorStop = 40;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+
+ if(( iRc = AddIndex( pIx, sIxType )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ if(( iRc = UpdateTagList()) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ pCurIx = pIx;
+ sCurIxType = sIxType;
+ vpCurIxTag = pIx->GetTag( 0 );
+ }
+ catch (xbInt16 iRc ){
+ if( pIx ) delete pIx;
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::OpenIndex() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+#endif // XB_INDEX_SUPPORT
+
+
+
+/************************************************************************/
+//! @brief Pack dbf file.
+/*!
+ This routine eliminates all deleted records from the file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::Pack()
+{
+ xbUInt32 ulDeletedRecCnt;
+ return Pack( ulDeletedRecCnt );
+}
+
+
+/************************************************************************/
+//! @brief Pack dbf file.
+/*!
+ This routine eliminates all deleted records from the file and clears
+ out any unused blocks in the memo file if one exists.
+ \param ulDeletedRecCnt - Output - number of recrods removed from the file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::Pack( xbUInt32 &ulDeletedRecCnt )
+{
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulLastMovedRec = 0;
+ xbUInt32 ulStartPos = 0;
+ xbUInt32 ulLastPackedRec = 0;
+ xbUInt32 ulMoveRec = 0;
+ xbUInt32 ulRecCnt = 0;
+ ulDeletedRecCnt = 0;
+
+ try{
+ if( !FileIsOpen() ){
+ iErrorStop = 10;
+ iRc = XB_DBF_FILE_NOT_OPEN;
+ throw iRc;
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ if(( iRc = LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ #endif
+
+ if(( iRc = GetRecordCnt( ulRecCnt )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ xbBool bDone = xbFalse;
+ for( xbUInt32 ulI = 1; ulI <= ulRecCnt && !bDone; ulI++ ){
+
+
+ if(( iRc = GetRecord( ulI )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ if( RecordDeleted()){
+
+ ulDeletedRecCnt++;
+ if( ulI > ulLastMovedRec )
+ ulStartPos = ulI;
+ else
+ ulStartPos = ulLastMovedRec;
+
+ iRc = GetNextRecord( 1, ulStartPos );
+
+ if( iRc == XB_NO_ERROR ){
+ ulMoveRec = ulCurRec;
+ }
+ else if( iRc == XB_EOF ){
+ ulMoveRec = 0;
+ bDone = xbTrue;
+ }
+ else{
+ iErrorStop = 50;
+ throw iRc;
+ }
+ if( ulMoveRec > 0 ){
+ if(( iRc = DeleteRecord()) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ if(( iRc = PutRecord( ulMoveRec )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ if(( iRc = UndeleteRecord()) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw iRc;
+ }
+ if(( iRc = PutRecord( ulI )) != XB_NO_ERROR ){
+ iErrorStop = 90;
+ throw iRc;
+ }
+ ulLastPackedRec = ulI;
+ }
+
+ } else {
+ ulLastPackedRec = ulI;
+ }
+ }
+
+ if( ulLastPackedRec < ulRecCnt ){
+ // update header record count
+
+ xbDate d;
+ cUpdateYY = (char) d.YearOf() - 1900;
+ cUpdateMM = (char) d.MonthOf();
+ cUpdateDD = (char) d.DayOf( XB_FMT_MONTH );
+ ulNoOfRecs = ulLastPackedRec;
+
+ // rewrite the header record
+ if(( iRc = WriteHeader( 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+
+ // truncate the file to the new size
+ if(( iRc = xbTruncate( uiHeaderLen + uiRecordLen * ulLastPackedRec )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+ }
+
+ if( ulNoOfRecs > 0 ){
+ if(( iRc = GetRecord( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 220;
+ throw iRc;
+ }
+ } else {
+ BlankRecord();
+ ulCurRec = 0;
+ }
+
+ #ifdef XB_MEMO_SUPPORT
+ if( iMemoFieldCnt > 0 ){
+ if(( iRc = Memo->PackMemo( 0 )) != XB_NO_ERROR ){
+ iErrorStop = 230;
+ throw iRc;
+ }
+ }
+ #endif // XB_MEMO_SUPPORT
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ if(( iRc = LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 240;
+ throw iRc;
+ }
+ }
+
+ #endif
+ }
+ catch (xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::Pack() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ return iRc;
+}
+
+/************************************************************************/
+//! @brief Write the current record to disk.
+/*!
+ This routine is used to write any updates to the current record buffer to disk.
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::PutRecord() {
+ return PutRecord(ulCurRec);
+}
+
+/************************************************************************/
+//! @brief Write record to disk.
+/*!
+ This routine is used to write a copy of the current record buffer to disk
+ for a given record number.
+
+ \param ulRecNo Record number to update.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::PutRecord(xbUInt32 ulRecNo)
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( ulRecNo < 1 ){
+ iErrorStop = 100;
+ throw XB_INVALID_RECORD;
+ }
+
+ xbUInt32 ulRecCnt;
+ if(( iRc = GetRecordCnt( ulRecCnt )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ if( ulRecNo > ulRecCnt ){
+ iErrorStop = 120;
+ throw XB_INVALID_RECORD;
+ }
+
+ if( iDbfStatus == XB_CLOSED ){
+ iErrorStop = 130;
+ iRc = XB_NOT_OPEN;
+ throw iRc;
+ }
+ /* lock the database */
+ #ifdef XB_LOCKING_SUPPORT
+ // xbInt16 iAutoLock = GetAutoLock();
+ if( iAutoLock && !bTableLocked ){
+ if(( iRc = LockHeader( XB_LOCK )) != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED )
+ return iRc;
+ else{
+ iErrorStop = 140;
+ throw iRc;
+ }
+ }
+
+ if(( iRc = ReadHeader( 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ LockHeader( XB_UNLOCK );
+ throw iRc;
+ }
+ }
+ #endif
+
+ // verify valid record number request
+ if( ulRecNo > ulNoOfRecs || ulRecNo == 0L ){
+ iErrorStop = 160;
+ iRc = XB_INVALID_RECORD;
+ throw iRc;
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ if( !bTableLocked ){
+ if(( iRc = LockRecord( XB_LOCK, ulRecNo )) != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED )
+ return iRc;
+ else{
+ iErrorStop = 170;
+ throw iRc;
+ }
+ }
+ }
+
+ #ifdef XB_INDEX_SUPPORT
+ if(( iRc = LockIndices( XB_LOCK )) != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED )
+ return iRc;
+ else{
+ iErrorStop = 180;
+ throw iRc;
+ }
+ }
+ #endif
+ }
+ #endif
+
+ // build keys, check for duplicate keys, add keys
+ #ifdef XB_INDEX_SUPPORT
+ xbIxList *ixList = GetIxList();
+
+ while( ixList ){
+ if(( iRc = ixList->ix->CreateKeys( 2 )) != XB_NO_ERROR ){
+ iErrorStop = 190;
+ throw iRc;
+ }
+ iRc = ixList->ix->CheckForDupKeys();
+ if( iRc != 0 ){
+ if( iRc < 0 ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ return XB_KEY_NOT_UNIQUE;
+ }
+ ixList = ixList->next;
+ }
+
+ ixList = GetIxList();
+ while( ixList ){
+
+ if(( iRc = ixList->ix->AddKeys( ulCurRec )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+ ixList = ixList->next;
+ }
+
+ ixList = GetIxList();
+ while( ixList ){
+
+// if(( iRc = ixList->ix->DeleteKeys( ulCurRec )) != XB_NO_ERROR ){
+
+ if(( iRc = ixList->ix->DeleteKeys()) != XB_NO_ERROR ){
+ iErrorStop = 220;
+ throw iRc;
+ }
+ ixList = ixList->next;
+ }
+ #endif // XB_INDEX_SUPPORT
+
+ // update latest header date if changed
+ xbDate d;
+ if( (cUpdateYY != (char)(d.YearOf() - 1900)) || (cUpdateMM != (char) d.MonthOf()) || (cUpdateDD != (char)d.DayOf( XB_FMT_MONTH))){
+ cUpdateYY = (char) d.YearOf() - 1900;
+ cUpdateMM = (char) d.MonthOf();
+ cUpdateDD = (char) d.DayOf( XB_FMT_MONTH );
+ // rewrite the header record - first 8 bytes
+ if(( iRc = WriteHeader( 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && !bTableLocked ){
+ if(( iRc = LockHeader( XB_UNLOCK )) != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED )
+ return iRc;
+ else{
+ iErrorStop = 230;
+ throw iRc;
+ }
+ }
+ }
+ #endif
+
+ // update record
+ iRc = xbFseek( (uiHeaderLen+(( (xbInt64) ulRecNo-1L ) * uiRecordLen )),0 );
+ if( iRc != XB_NO_ERROR ){
+ iErrorStop = 240;
+ throw iRc;
+ }
+
+ if( xbFwrite( RecBuf, uiRecordLen, 1 ) != XB_NO_ERROR ){
+ iErrorStop = 250;
+ iRc = XB_WRITE_ERROR;
+ throw iRc;
+ }
+
+ #ifdef XB_MEMO_SUPPORT
+ if( MemoFieldsExist() ){
+ if(( iRc = Memo->Commit()) != XB_NO_ERROR ){
+ iErrorStop = 260;
+ throw iRc;
+ }
+ }
+ #endif
+
+ // unlock record
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ #ifdef XB_INDEX_SUPPORT
+ LockIndices( XB_UNLOCK );
+ #endif // XB_INDEX_SUPPORT
+ if( !bTableLocked ){
+ if(( iRc = LockRecord( XB_UNLOCK, ulRecNo )) != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED )
+ return iRc;
+ else{
+ iErrorStop = 270;
+ throw iRc;
+ }
+ }
+ }
+ }
+
+ #endif
+ ulCurRec = ulRecNo;
+ iDbfStatus = XB_OPEN;
+ }
+
+ catch (xbInt16 iRc ){
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ LockHeader( XB_UNLOCK );
+ LockAppend( XB_UNLOCK );
+ LockRecord( XB_UNLOCK, ulRecNo );
+ LockIndices( XB_UNLOCK );
+ }
+ #endif // XB_LOCKING_SUPPORT
+
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::PutRecord() Exception Caught. Error Stop = [%d] iRc = [%d] record = [%d]", iErrorStop, iRc, ulRecNo );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ return iRc;
+}
+
+/************************************************************************/
+//! @brief Read dbf file header information.
+/*!
+ This method assumes the header has been locked appropriately
+ in a multi user environment
+
+
+ \param iPositionOption 0 - Don't fseek to beginning of file before read.<br>
+ 1 - Start from beginning of file.
+
+ \param iReadOption 0 - Read entire 32 byte header<br>
+ 1 - Read first eight bytes which includes the last update date and number of records.
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::ReadHeader( xbInt16 iPositionOption, xbInt16 iReadOption ){
+
+ char buf[32];
+ size_t iReadSize;
+
+ if(iPositionOption)
+ xbRewind();
+ if( iReadOption == 1 )
+ iReadSize = 8;
+ else
+ iReadSize = 32;
+
+ if(xbFread(buf, iReadSize, 1) != XB_NO_ERROR)
+ return XB_READ_ERROR;
+ memcpy(&cVersion, buf, 4);
+ ulNoOfRecs = eGetUInt32(&buf[4]);
+ if( iReadOption == 1 )
+ return XB_NO_ERROR;
+
+ uiHeaderLen = eGetUInt16(&buf[8]);
+ uiRecordLen = eGetUInt16(&buf[10]);
+ cTransactionFlag = buf[14];
+ cEncryptionFlag = buf[15];
+ cIndexFlag = buf[28];
+ cLangDriver = buf[29];
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Return record deletion status.
+/*!
+ This routine returns the record deletion status.
+ \param iOpt 0 = Current record buffer, 1 = Original record buffer
+ \returns xbTrue - Record deleted.<br>xbFalse - Record not deleted.
+*/
+xbInt16 xbDbf::RecordDeleted( xbInt16 iOpt ) const {
+ if( !iOpt && RecBuf && RecBuf[0] == 0x2a )
+ return xbTrue;
+ else if( iOpt && RecBuf2 && RecBuf2[0] == 0x2a )
+ return xbTrue;
+ else
+ return xbFalse;
+}
+
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+//! @brief Remove an index from the internal list of indices for this table
+/*
+ The index list is used during any table update process to update any open
+ index file. Index files can contain one or more tags.
+
+ \param ixIn Pointer to index object for a given index file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::RemoveIndex( xbIx * ixIn ){
+
+ xbIxList *p = ixList;
+ // if index is the first entry in the list
+ if( ixList->ix == ixIn ){
+ ixList = ixList->next;
+ delete p->sFmt;
+ delete p->ix;
+ free( p );
+ return XB_NO_ERROR;
+ }
+
+ // spin down to the correct ix
+ xbIxList *p2 = NULL;
+ while( p && p->ix != ixIn ){
+ p2 = p;
+ p = p->next;
+ }
+ if( p ){
+ p2->next = p->next;
+ delete p->sFmt;
+ delete p->ix;
+ free( p );
+ }
+ return XB_NO_ERROR;
+}
+#endif // XB_INDEX_SUPPORT
+
+/************************************************************************/
+// @brief Reset number of records.
+/*
+ Protected method. Resets number of records to 0.
+ \returns void
+*/
+void xbDbf::ResetNoOfRecords() {
+ ulNoOfRecs = 0UL;
+}
+
+/************************************************************************/
+#ifdef XB_NDXINF_SUPPORT
+// @brief Update .INF data file.
+/*
+ Protected method.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf::SaveNdxInfData(){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbFile fMd( xbase );
+
+ try{
+
+ xbUInt32 llNodeCnt = llNdxInfData.GetNodeCnt();
+
+ xbString sNdxInfFileName;
+ if(( iRc = GetNdxInfFileName( sNdxInfFileName )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ // open the file
+ if(( iRc = fMd.xbFopen( "w", sNdxInfFileName, GetShareMode())) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+
+ xbString s1;
+ xbString s2;
+ s2.Sprintf( "[dbase]%c%c", 0x0d, 0x0a );
+ if(( iRc = fMd.xbFputs( s2 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+
+ // for each entry in the linked list, write a line
+ xbLinkListNode<xbString> * llN = llNdxInfData.GetHeadNode();
+ for( xbUInt32 i = 0; i < llNodeCnt; i++ ){
+ s2 = llN->GetKey();
+ if( i > 0 )
+ s1.Sprintf( "NDX%d=%s%c%c", i, s2.Str(), 0x0d, 0x0a );
+ else
+ s1.Sprintf( "NDX=%s%c%c", s2.Str(), 0x0d, 0x0a );
+
+ if(( iRc = fMd.xbFputs( s1 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ llN = llN->GetNextNode();
+ }
+
+ // close the file
+ if(( iRc = fMd.xbFclose()) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+
+ } catch( xbInt16 iRc ){
+ if( fMd.FileIsOpen())
+ fMd.xbFclose();
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::SaveNdxInfData() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+#endif // XB_NDXINF_SUPPORT
+/************************************************************************/
+//! @brief Set auto commit.
+/*!
+ This routine sets the auto commit setting for this table.
+ \returns XB_NO_ERROR;
+*/
+xbInt16 xbDbf::SetAutoCommit( xbBool iAutoCommit ) {
+ this->iAutoCommit = iAutoCommit;
+ return XB_NO_ERROR;
+}
+
+
+/************************************************************************/
+//! @brief Set auto lock.
+/*!
+ This routine sets the auto lock setting for this table.
+ There is an overall system level auto lock default setting and each table
+ can have it's own autolock setting. This method controls the table level
+ auto lock setting.
+
+ \param iAutoLock 1 - Use auto lock for this table.<br>
+ 0 - Don't use auto lock for this table.<br>
+ -1 - (minus one) Use system default.<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+void xbDbf::SetAutoLock( xbInt16 iAutoLock ){
+ if( iAutoLock == -1 )
+ this->iAutoLock = xbase->GetDefaultAutoLock();
+ else
+ this->iAutoLock = iAutoLock;
+}
+
+
+
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+//! @brief Set the current tag for the dbf file.
+/*!
+ \param sTagName - Tag Name
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::SetCurTag( const xbString &sTagName ){
+
+ if( sTagName == "" ){
+ SetCurTag( "", 0, 0 );
+ return XB_NO_ERROR;
+
+ } else {
+ xbLinkListNode<xbTag *> *llN = GetTagList();
+ xbTag *pTag;
+ while( llN ){
+ pTag = llN->GetKey();
+ if( pTag->GetTagName() == sTagName ){
+ SetCurTag( pTag->GetType(), pTag->GetIx(), pTag->GetVpTag());
+ return XB_NO_ERROR;
+ }
+ llN = llN->GetNextNode();
+ }
+ }
+
+ return XB_INVALID_TAG;
+}
+
+/************************************************************************/
+//! @brief Set the current tag for the dbf file.
+/*!
+
+ \param sIxType - One of "NDX" or MDX",
+ \param pIx - Pointer to index object.
+ \param vpTag - Pointer to tag object.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+void xbDbf::SetCurTag( const xbString &sIxType, xbIx *pIx, void *vpTag ){
+ pCurIx = pIx;
+ vpCurIxTag = vpTag;
+ sCurIxType.Set( sIxType );
+}
+#endif // XB_INDEX_SUPPORT
+
+/************************************************************************/
+//! @brief Set the header locked status.
+/*!
+ \param bHeaderLocked xbTrue - Locked<br>xbFalse - Not locked.
+ \returns void
+*/
+void xbDbf::SetHeaderLocked( xbBool bHeaderLocked ){
+ this->bHeaderLocked = bHeaderLocked;
+}
+
+/************************************************************************/
+//! @brief Set lock flavor.
+/*!
+ This routine is for future expansion.
+ \param iLockFlavor 1 - Use Dbase (tm) style locking.
+ \returns void
+*/
+
+void xbDbf::SetLockFlavor( xbInt16 iLockFlavor ){
+ this->iLockFlavor = iLockFlavor;
+}
+
+/************************************************************************/
+//! @brief Set table locked status.
+/*!
+ \param bTableLocked - xbTrue Table locked.<br>xbFalse Table unlocked.
+ \returns void
+*/
+
+void xbDbf::SetTableLocked( xbBool bTableLocked ){
+ this->bTableLocked = bTableLocked;
+}
+/************************************************************************/
+//! @brief Undelete all records.
+/*!
+ This routine will remove the deletion flag on any deleted records in the table.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::UndeleteAllRecords(){
+ return DeleteAll( 1 );
+}
+
+/************************************************************************/
+//! @brief Undelete one record.
+/*!
+ This routine will undelete the current record, if it is deleted.
+ \returns XB_NO_ERROR<br>XB_INVALID_RECORD
+*/
+xbInt16 xbDbf::UndeleteRecord()
+{
+ if( RecBuf && ulCurRec > 0 ){
+ if( RecBuf[0] != 0x20 ){
+ if( iDbfStatus != XB_UPDATED ){
+ iDbfStatus = XB_UPDATED;
+ memcpy( RecBuf2, RecBuf, uiRecordLen ); // save off original before making updates
+ }
+ RecBuf[0] = 0x20;
+ }
+ return XB_NO_ERROR;
+ }
+ else
+ return XB_INVALID_RECORD;
+}
+
+/************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+//! @brief Update memo field
+/*!
+ This routine updates a memo field.
+ \param iFieldNo - Memo field number to update.
+ \param sMemoData - Memo data for update.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::UpdateMemoField( xbInt16 iFieldNo, const xbString &sMemoData ){
+ return Memo->UpdateMemoField( iFieldNo, sMemoData );
+}
+/************************************************************************/
+//! @brief Update memo field
+/*!
+ This routine updates a memo field.
+ \param sFieldName - Memo field name to update.
+ \param sMemoData - Memo data for update.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::UpdateMemoField( const xbString & sFieldName, const xbString & sMemoData ){
+ return Memo->UpdateMemoField( GetFieldNo( sFieldName ), sMemoData );
+}
+#endif
+
+
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+//! @brief Update SchemaIxFlag
+/*!
+ This routine can be called from the DeleteTag routine if a tag has been deleted and the flag needs reset
+ \param iFldNo - Which field the index flag needs changed on
+ \param cVal - Value to change it to
+*/
+
+void xbDbf::UpdateSchemaIxFlag( xbInt16 iFldNo, unsigned char cVal ){
+ if( cVal != 0x00 || cVal != 0x01 )
+ SchemaPtr[iFldNo].cIxFlag = cVal;
+}
+
+#endif // XB_INDEX_SUPPORT
+/************************************************************************/
+//! @brief Update tag list.
+/*!
+ This routine updates the internal tag list of open index tags.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::UpdateTagList(){
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt32 lTagCnt;
+
+ try{
+ ClearTagList();
+
+ // For each active index
+ xbIxList *p = GetIxList();
+ xbIx *ixp;
+ while( p ){
+ ixp = p->ix;
+ // for each tag within the file
+ lTagCnt = ixp->GetTagCount();
+ for( xbInt32 l = 0; l < lTagCnt; l++ ){
+ xbTag *pTag = new xbTag( ixp, ixp->GetTag( l ), *p->sFmt, ixp->GetTagName( ixp->GetTag( l )),
+ ixp->GetKeyExpression( ixp->GetTag( l )), ixp->GetKeyFilter( ixp->GetTag( l )),
+ ixp->GetUnique( ixp->GetTag( l )), ixp->GetSortOrder( ixp->GetTag( l )));
+
+ // append it to the llTags list
+ llTags.InsertAtEnd( pTag );
+ }
+ p = p->next;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::UpdateTagList() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/************************************************************************/
+// @brief Write Header
+/*
+ Protected method.
+
+ \param iPositionOption 0 - Don't fseek to beginning of file before read.<br>
+ 1 - Go to beginning of file before read.
+ \param iWriteOption 0 - Write entire 32 byte header.<br>
+ 1 - Write first eight bytes needed for table updates - last update date and number of records.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::WriteHeader( xbInt16 iPositionOption, xbInt16 iWriteOption )
+{
+ char buf[32];
+ xbInt32 lWriteLen;
+
+ if(iPositionOption)
+ xbRewind();
+
+ memset(buf, 0, 32);
+ if( iWriteOption == 1 )
+ lWriteLen = 8;
+ else{
+ lWriteLen = 32;
+ ePutUInt16( &buf[8], uiHeaderLen );
+ ePutUInt16( &buf[10], uiRecordLen );
+ buf[14] = cTransactionFlag;
+ buf[15] = cEncryptionFlag;
+ buf[28] = cIndexFlag;
+ buf[29] = cLangDriver;
+ }
+ memcpy(&buf[0], &cVersion, 4);
+ ePutUInt32( &buf[4], ulNoOfRecs);
+ if(xbFwrite(buf, (size_t) lWriteLen, 1) != XB_NO_ERROR)
+ return XB_WRITE_ERROR;
+
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Zap (remove) everything from the file,
+/*!
+ This routine eliminates everything from the dbf file and dbt memo file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbDbf::Zap(){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ if( iDbfStatus != XB_OPEN ){
+ iErrorStop = 10;
+ iRc = XB_DBF_FILE_NOT_OPEN;
+ throw iRc;
+ }
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ if(( iRc = LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ #endif
+
+ xbDate d;
+ cUpdateYY = (char) d.YearOf() - 1900;
+ cUpdateMM = (char) d.MonthOf();
+ cUpdateDD = (char) d.DayOf( XB_FMT_MONTH );
+ ulNoOfRecs = 0;
+
+ // rewrite the header record
+ if(( iRc = WriteHeader( 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ // truncate the file to the new size
+ if(( iRc = xbTruncate( uiHeaderLen )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ BlankRecord();
+ ulCurRec = 0;
+
+ #ifdef XB_MEMO_SUPPORT
+ if( iMemoFieldCnt ){
+ if(( iRc = Memo->Zap()) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ }
+ #endif
+ #ifdef XB_INDEX_SUPPORT
+ xbLinkListNode<xbTag *> *llN = GetTagList();
+ xbTag *pTag;
+ xbIx *pIx;
+ void *vpTag;
+ while( llN ){
+ pTag = llN->GetKey();
+ pIx = pTag->GetIx();
+ vpTag = pTag->GetVpTag();
+ if(( iRc = pIx->Reindex( &vpTag )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ llN = llN->GetNextNode();
+ }
+
+ #endif // XB_INDEX_SUPPORT
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock ){
+ if(( iRc = LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ }
+ #endif // XB_LOCKING_SUPPORT
+ }
+ catch (xbInt16 iRc ){
+ if( iRc != XB_LOCK_FAILED ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf::Zap() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ return iRc;
+}
+/************************************************************************/
+} /* namespace */ \ No newline at end of file
diff --git a/src/core/xbdbf3.cpp b/src/core/xbdbf3.cpp
new file mode 100755
index 0000000..cbbff1f
--- /dev/null
+++ b/src/core/xbdbf3.cpp
@@ -0,0 +1,577 @@
+/* xbdbf3.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+
+#ifdef XB_DBF3_SUPPORT
+
+namespace xb{
+
+
+/************************************************************************/
+//! @brief Constructor.
+
+xbDbf3::xbDbf3(xbXBase * x) : xbDbf( x ) {
+ #ifdef XB_MEMO_SUPPORT
+ ulCreateMemoBlockSize = 512;
+ #endif
+ iFileVersion = 3;
+};
+
+/************************************************************************/
+//! @brief Destructor.
+
+xbDbf3::~xbDbf3() {};
+
+/************************************************************************/
+//! @brief Create Version 3 table.
+/*!
+ This routine creates a Dbase III Plus (tm) DBF file.
+
+ \param sTableName DBF table name.
+ \param sAlias Table alias
+ \param pSchema Pointer to schema structure with field definitions.
+ \param iOverlay xbTrue - Overlay.<br> xbFalse - Don't overlay.
+ \param iShareMode XB_SINGLE_USER<br>XB_MULTI_USER
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbDbf3::CreateTable( const xbString & sTableName, const xbString & sAlias, xbSchema *pSchema, xbInt16 iOverlay, xbInt16 iShareMode ){
+
+ xbInt16 i, k, k2;
+ xbInt16 rc = 0;
+ xbInt16 iErrorStop = 0;
+ iDbfStatus = XB_CLOSED;
+
+ xbString sNfn;
+ try{
+ sNfn = sTableName;
+ xbase->GetLogStatus();
+
+ rc = NameSuffixMissing( sNfn, 1 );
+ if( rc > 0 )
+ sNfn += ".DBF";
+
+ SetFileName( sNfn );
+ this->sAlias = sAlias;
+
+ /* check if the file already exists */
+ if( FileExists( 0 )){
+ if( !iOverlay ){
+ iErrorStop = 10;
+ rc = XB_FILE_EXISTS;
+ throw rc;
+ }
+ #ifdef XB_NDXINF_SUPPORT
+ // remove the metadata file if there is one
+ xbString sMname = sNfn;
+ xbUInt32 iMnameLen = sMname.Len();
+ sMname.PutAt( iMnameLen-2, 'X' );
+ sMname.PutAt( iMnameLen-1, 'B' );
+ sMname.PutAt( iMnameLen, 'M' );
+ xbFile fTemp( xbase );
+ fTemp.SetFileName( sMname );
+ if( fTemp.FileExists() )
+ fTemp.xbRemove();
+ #endif // XB_NDXINF_SUPPORT
+ }
+
+ /* check if we already have a file with this alias */
+ if(( rc = xbase->AddTblToTblList( this, GetFqFileName(), sAlias )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+
+ rc = ValidateSchema( pSchema );
+ if( rc < 0 ){
+ iErrorStop = 30;
+ throw rc;
+ } else
+ iNoOfFields = rc;
+
+ #ifdef XB_MEMO_SUPPORT
+ // if we have memo fields
+ iMemoFieldCnt = 0;
+ i = 0;
+ while( pSchema[i].cType != 0){
+ if( pSchema[i].cType == 'M' )
+ iMemoFieldCnt++; /* number of memo fields in the incoming definition */
+ i++;
+ }
+
+ if( iMemoFieldCnt > 0 ){
+ xbString sMfn = sNfn; /* memo file name, same as filename except ends with a "t", not an "f" */
+ xbUInt32 iMfnLen = sMfn.Len();
+ sMfn.PutAt( iMfnLen, 'T' );
+
+ // dont overlay the memo file if it exists, and Overlay switch is off
+ xbFile fTemp( xbase );
+ fTemp.SetFileName( sMfn );
+ if( fTemp.FileExists() && !iOverlay ){
+ iErrorStop = 40;
+ rc = XB_FILE_EXISTS;
+ throw rc;
+ }
+
+ Memo = new xbMemoDbt3( this, fTemp.GetFqFileName());
+
+ if(( rc = Memo->CreateMemoFile()) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw rc;
+ }
+ }
+ #endif
+
+ /* this is the dBase III version of the class */
+ cVersion = 0x03; // 0x03 for Dbase level 5
+ #ifdef XB_MEMO_SUPPORT
+ if( iMemoFieldCnt > 0 ){
+// cVersion = cVersion |= 0x80; // Version III memo, compiler complaints
+ cVersion |= 0x80; // Version III memo
+ }
+ #endif
+
+ if(( rc = xbFopen( "w+b", iShareMode )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw rc;
+ }
+ uiRecordLen++; /* add one byte for 0x0D */
+
+ if(( RecBuf = (char *) malloc( uiRecordLen )) == NULL ){
+ iErrorStop = 70;
+ throw rc;
+ }
+
+ if(( RecBuf2 = (char *) malloc( uiRecordLen )) == NULL ){
+ iErrorStop = 80;
+ rc = XB_NO_MEMORY;
+ throw rc;
+ }
+
+ /* BlankRecord(); */
+ memset( RecBuf, 0x20, uiRecordLen );
+ memset( RecBuf2, 0x20, uiRecordLen );
+ ulCurRec = 0L;
+ uiHeaderLen = 33 + iNoOfFields * 32;
+ xbDate d;
+ cUpdateYY = (char) (d.YearOf() - 1900);
+ cUpdateMM = (char) d.MonthOf();
+ cUpdateDD = (char) d.DayOf( XB_FMT_MONTH );
+
+ /* write the header prolog */
+ if(( rc = WriteHeader( 0, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 90;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+ if((SchemaPtr = (xbSchemaRec *) malloc( (size_t) iNoOfFields * sizeof( xbSchemaRec ))) == NULL){
+ iErrorStop = 100;
+ rc = XB_NO_MEMORY;
+ throw rc;
+ }
+
+ /* write the field information into the header */
+ for( i = 0, k = 1; i < iNoOfFields; i++ ){
+
+ memset( SchemaPtr[i].cFieldName, 0x00, 11 );
+ for( int x = 0; x < 10 && pSchema[i].cFieldName[x]; x++ )
+ SchemaPtr[i].cFieldName[x] = pSchema[i].cFieldName[x];
+
+ SchemaPtr[i].cType = pSchema[i].cType;
+ SchemaPtr[i].cFieldLen = (unsigned char) pSchema[i].iFieldLen;
+ SchemaPtr[i].cNoOfDecs = (unsigned char) pSchema[i].iNoOfDecs;
+
+ if( SchemaPtr[i].cNoOfDecs > SchemaPtr[i].cFieldLen ){
+ iErrorStop = 110;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+
+ k2 = k;
+ k += SchemaPtr[i].cFieldLen;
+
+ if(( xbFwrite( &SchemaPtr[i].cFieldName, 1, 11 )) != XB_NO_ERROR ) {
+ iErrorStop = 110;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+
+ if(( xbFwrite( &SchemaPtr[i].cType, 1, 1 )) != XB_NO_ERROR ) {
+ iErrorStop = 120;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+
+ for( int j = 0; j < 4; j++ )
+ xbFputc( 0x00 );
+
+ if(( xbFwrite( &SchemaPtr[i].cFieldLen, 1, 1 )) != XB_NO_ERROR ) {
+ iErrorStop = 130;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+
+ if(( xbFwrite( &SchemaPtr[i].cNoOfDecs, 1, 1 )) != XB_NO_ERROR ) {
+ iErrorStop = 140;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+
+ /* 14 bytes reserved */
+ for( int j = 0; j < 14; j++ )
+ xbFputc( 0x00 );
+
+ SchemaPtr[i].pAddress = RecBuf + k2;
+ SchemaPtr[i].pAddress2 = RecBuf2 + k2;
+ }
+
+ /* write the header terminator */
+ if(( xbFputc( XB_CHARHDR )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+ }
+ catch( xbInt16 rc )
+ {
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf3::CreateTable() Exception Caught Error Stop = %d rc = %d", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+
+ sMsg.Sprintf( "Table Name = [%s]", GetFqFileName().Str());
+ xbase->WriteLogMessage( sMsg );
+ sMsg.Sprintf( "Alias Name = [%s]", sAlias.Str());
+ xbase->WriteLogMessage( sMsg );
+
+ xbFclose();
+ if( RecBuf ){
+ free( RecBuf );
+ RecBuf = NULL;
+ }
+ if( RecBuf2 ){
+ free( RecBuf2 );
+ RecBuf2 = NULL;
+ }
+ if( SchemaPtr ){
+ free( SchemaPtr );
+ SchemaPtr = NULL;
+ }
+
+ InitVars();
+ if( rc != XB_FILE_EXISTS )
+ xbase->RemoveTblFromTblList( sAlias );
+ }
+
+ if( rc == XB_NO_ERROR )
+ iDbfStatus = XB_OPEN;
+
+ return rc;
+}
+
+/************************************************************************/
+//! @brief Get version.
+/*!
+ The version info can be retrieved to determine
+ which class is being used for a given dbf instance.
+ \returns 3
+*/
+
+xbInt16 xbDbf3::GetVersion() const {
+ return 3;
+}
+
+
+
+/************************************************************************/
+//! @brief Open dbf file/table.
+/*!
+ \param sTableName DBF table name.
+ \param sAlias Table alias
+ \param iOpenMode XB_READ<br>XB_READ_WRITE
+ \param iShareMode XB_SINGLE_USER<br>XB_MULTI_USER
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf3::Open( const xbString & sTableName, const xbString & sAlias,
+ xbInt16 iOpenMode, xbInt16 iShareMode ){
+ xbInt16 i, j, iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char buf[33];
+ char *p;
+
+ #ifdef XB_MEMO_SUPPORT
+ iMemoFieldCnt = 0;
+ #endif
+
+ try{
+
+ /* verify the file is not already open */
+ if( iDbfStatus != XB_CLOSED ){
+ iErrorStop = 10;
+ iRc = XB_ALREADY_OPEN;
+ throw iRc;
+ }
+ /* copy the file name to the class variable */
+ SetFileName( sTableName );
+ this->sAlias = sAlias;
+
+ if( !FileExists()){
+ iErrorStop = 20;
+ iRc = XB_FILE_NOT_FOUND;
+ throw iRc;
+ }
+
+ if(( iRc = xbase->AddTblToTblList( this, GetFqFileName(), sAlias )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ /* open the file */
+ if(( iRc = xbFopen( iOpenMode, iShareMode )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ /* copy the header into memory */
+ if(( iRc = ReadHeader( 1, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+
+ /* check the version */
+ if(( cVersion & 0x07 ) != 3 ){
+ // if( xFileVersion != 3 && xFileVersion != 4 ){
+ iErrorStop = 60;
+ iRc = XB_FILE_TYPE_NOT_SUPPORTED;
+ throw iRc;
+ }
+ iFileVersion = 3;
+
+ /* calculate the number of fields */
+ if( cVersion == (char)0x30 ) {
+ iNoOfFields = ( uiHeaderLen - 296 ) / 32 ;
+ } else {
+ iNoOfFields = ( uiHeaderLen - 33 ) / 32;
+ }
+
+ if(( RecBuf = (char *) malloc( (size_t) uiRecordLen )) == NULL ){
+ iErrorStop = 70;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ if(( RecBuf2 = (char *) malloc( uiRecordLen )) == NULL ) {
+ iErrorStop = 80;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ if((SchemaPtr=(xbSchemaRec *)malloc( (size_t) iNoOfFields * sizeof( xbSchemaRec ))) == NULL){
+ iErrorStop = 90;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ memset( SchemaPtr, 0x00, ( (size_t) iNoOfFields * sizeof(xbSchemaRec) ));
+ /* copy field info into memory */
+ for( i = 0, j = 1; i < iNoOfFields; i++ ){
+ xbFseek( ((xbInt64)i*32+32), SEEK_SET );
+ xbFread( &buf, 1, 32 );
+ p = buf;
+ for( int x = 0; x < 10 && buf[x]; x++ ){
+ SchemaPtr[i].cFieldName[x] = buf[x];
+ }
+ p = buf + 11;
+ SchemaPtr[i].cType = *p++;
+ SchemaPtr[i].pAddress = RecBuf + j;
+ SchemaPtr[i].pAddress2 = RecBuf2 + j;
+ SchemaPtr[i].cFieldLen = (unsigned char) *( p + 4 );
+ SchemaPtr[i].cNoOfDecs = (unsigned char) *( p + 5 );
+ j += SchemaPtr[i].cFieldLen;
+ #ifdef XB_MEMO_SUPPORT
+ if( (SchemaPtr[i].cType == 'M' || SchemaPtr[i].cType == 'B' || SchemaPtr[i].cType == 'O' ))
+ iMemoFieldCnt++;
+ #endif
+ }
+ ulCurRec = 0L;
+ iDbfStatus = XB_OPEN;
+ if(( iRc = BlankRecord()) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ #ifdef XB_MEMO_SUPPORT
+ if( iMemoFieldCnt > 0 ){ /* does this table have memo fields ? */
+
+ // build the file name
+ xbString sMfn = GetFqFileName(); /* memo file name, same as filename except ends with a "t", not an "f" */
+ xbUInt32 ulMfnLen = sMfn.Len();
+ if( sMfn[ulMfnLen] == 'F' )
+ sMfn.PutAt( ulMfnLen, 'T' );
+ else
+ sMfn.PutAt( ulMfnLen, 't' );
+ xbFile fTemp( xbase );
+ fTemp.SetFileName( sMfn );;
+
+ Memo = new xbMemoDbt3( this, fTemp.GetFqFileName());
+
+ if(( iRc = Memo->OpenMemoFile()) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ }
+ #endif
+
+ }
+ catch ( xbInt16 iRc )
+ {
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf3::Open() Exception Caught Error Stop = %d iRc = %d ShareMode = %d OpenMode = %d", iErrorStop, iRc, iShareMode, iOpenMode );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ xbFclose();
+ if( RecBuf ){
+ free( RecBuf );
+ RecBuf = NULL;
+ }
+ if( RecBuf2 ){
+ free( RecBuf2 );
+ RecBuf2 = NULL;
+ }
+ if( SchemaPtr ){
+ free( SchemaPtr );
+ SchemaPtr = NULL;
+ }
+ InitVars();
+
+#ifdef XB_MEMO_SUPPORT
+ if( Memo ){
+ Memo->CloseMemoFile();
+ delete Memo;
+ Memo = NULL;
+ }
+#endif
+ }
+
+ if( iRc == XB_NO_ERROR )
+ iDbfStatus = XB_OPEN;
+
+ return iRc;
+}
+
+/************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+//! @brief Create memo block size.
+/*!
+ This routine sets the memo file block size. This value is used when
+ the memo file is created so you if you want to change it, this must be
+ called before creating the table.
+
+ DBF III Plus uses a block size of 512.
+
+ \param ulBlockSize - Block size, must be evenly divisible by 512.
+ \returns XB_INVALID_BLOCK_SIZE<br>XB_NO_ERROR
+*/
+
+xbInt16 xbDbf3::SetCreateMemoBlockSize( xbUInt32 ulBlockSize ){
+
+ if( ulBlockSize != 512 )
+ return XB_INVALID_BLOCK_SIZE;
+ else
+ ulCreateMemoBlockSize = 512;
+
+ return XB_NO_ERROR;
+}
+#endif
+
+/************************************************************************/
+//! @brief Set version.
+/*!
+ Sets the version to 3. The version info can be retrieved to determine
+ which class is being used for a given dbf instance.
+ \returns 3
+*/
+
+xbInt16 xbDbf3::SetVersion() {
+ iFileVersion = 3;
+ return iFileVersion;
+}
+
+
+/************************************************************************/
+//! @brief Validate schema
+/*!
+ This routine verifies the field types are valid for Dbase III Plus (tm).
+
+ \param s Pointer to schema structure with field definitions.
+
+ \returns Number of fields or XB_INVALID_FIELD_TYPE.
+*/
+
+xbInt16 xbDbf3::ValidateSchema( xbSchema * s ){
+
+// This routine validates an input schema
+// Negative return value is an error
+// Positive return value is the number of fields
+// On success, the class variable uiRecordLen will be updated with the record length of the combined total of the fields
+
+ xbInt16 iFieldCnt = 0;
+ uiRecordLen = 0;
+
+ /* count the number of fields and check paramaters */
+ xbInt16 i = 0;
+ while( s[i].cType != 0 ){
+ iFieldCnt++;
+ // Version 3 field types
+ if( s[i].cType != 'C' &&
+ s[i].cType != 'N' &&
+ s[i].cType != 'D' &&
+#ifdef XB_MEMO_SUPPORT
+ s[i].cType != 'M' &&
+#endif /* XB_MEMO_SUPPORT */
+ s[i].cType != 'L' ){
+ return XB_INVALID_FIELD_TYPE;
+ }
+
+ if(s[i].cType == 'D'){
+ s[i].iFieldLen = 8;
+ s[i].iNoOfDecs = 0;
+ }
+
+ else if(s[i].cType == 'C')
+ s[i].iNoOfDecs = 0;
+
+ // check for numeric fields which are too long
+ else if( s[i].cType == 'N' && s[i].iFieldLen > 19 ){
+ return XB_INVALID_FIELD_LEN;
+ }
+
+#ifdef XB_MEMO_SUPPORT
+ else if(s[i].cType == 'M'){
+ s[i].iFieldLen = 10;
+ s[i].iNoOfDecs = 0;
+ }
+#endif /* XB_MEMO_SUPPORT */
+
+ uiRecordLen += s[i].iFieldLen;
+ i++;
+ }
+ return iFieldCnt;
+}
+
+} /* namespace */
+#endif /* XB_DBF3_SUPPORT */ \ No newline at end of file
diff --git a/src/core/xbdbf4.cpp b/src/core/xbdbf4.cpp
new file mode 100755
index 0000000..c421add
--- /dev/null
+++ b/src/core/xbdbf4.cpp
@@ -0,0 +1,590 @@
+/* xbdbf4.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+
+#ifdef XB_DBF4_SUPPORT
+
+namespace xb{
+
+
+/************************************************************************/
+//! @brief Constructor.
+xbDbf4::xbDbf4(xbXBase * x) : xbDbf( x ) {
+
+ iFileVersion = 4;
+ #ifdef XB_MEMO_SUPPORT
+ ulCreateMemoBlockSize = 1024;
+ #endif
+};
+
+/************************************************************************/
+//! @brief Destructor.
+xbDbf4::~xbDbf4() {};
+
+/************************************************************************/
+//! @brief Create Version 4 table.
+/*!
+ This routine creates a Dbase IV (tm) DBF file.
+
+ \param sTableName DBF table name.
+ \param sAlias Table alias
+ \param pSchema Pointer to schema structure with field definitions.
+ \param iOverlay xbTrue - Overlay.<br> xbFalse - Don't overlay.
+ \param iShareMode XB_SINGLE_USER<br>XB_MULTI_USER
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf4::CreateTable( const xbString &sTableName, const xbString &sAlias, xbSchema * pSchema, xbInt16 iOverlay, xbInt16 iShareMode ){
+
+ xbInt16 i, k, k2;
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ iDbfStatus = XB_CLOSED;
+
+ xbString sNfn;
+
+ try{
+ sNfn = sTableName;
+ xbase->GetLogStatus();
+
+ rc = NameSuffixMissing( sNfn, 1 );
+ if( rc > 0 )
+ sNfn += ".DBF";
+
+ SetFileName( sNfn );
+ this->sAlias = sAlias;
+
+ /* check if the file already exists */
+ if( FileExists( 0 )){
+ if( !iOverlay ){
+ iErrorStop = 10;
+ rc = XB_FILE_EXISTS;
+ throw rc;
+ }
+ #ifdef XB_NDXINF_SUPPORT
+ // remove the metadata file if there is one
+ xbString sMname = sNfn;
+ xbUInt32 iMnameLen = sMname.Len();
+ sMname.PutAt( iMnameLen-2, 'X' );
+ sMname.PutAt( iMnameLen-1, 'B' );
+ sMname.PutAt( iMnameLen, 'M' );
+ xbFile fTemp( xbase );
+ fTemp.SetFileName( sMname );
+ if( fTemp.FileExists() )
+ fTemp.xbRemove();
+ #endif // XB_NDXINF_SUPPORT
+ }
+
+ /* check if we already have a file with this alias */
+ if(( rc = xbase->AddTblToTblList( this, GetFqFileName(), sAlias )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+
+ rc = ValidateSchema( pSchema );
+ if( rc < 0 ){
+ iErrorStop = 30;
+ throw rc;
+ } else
+ iNoOfFields = rc;
+
+ #ifdef XB_MEMO_SUPPORT
+ // if we have memo fields
+ iMemoFieldCnt = 0;
+ i = 0;
+ while( pSchema[i].cType != 0){
+ if( pSchema[i].cType == 'M' )
+ iMemoFieldCnt++; /* number of memo fields in the incoming definition */
+ i++;
+ }
+
+ if( iMemoFieldCnt > 0 ){
+ xbString sMfn = sNfn; /* memo file name, same as filename except ends with a "t", not an "f" */
+ xbUInt32 ulMfnLen = sMfn.Len();
+ sMfn.PutAt( ulMfnLen, 'T' );
+
+ // dont overlay the memo file if it exists, and Overlay switch is off
+ xbFile fTemp( xbase );
+ fTemp.SetFileName( sMfn );
+ if( fTemp.FileExists() && !iOverlay ){
+ iErrorStop = 40;
+ rc = XB_FILE_EXISTS;
+ throw rc;
+ }
+
+ Memo = new xbMemoDbt4( this, fTemp.GetFqFileName());
+
+ if(( rc = Memo->CreateMemoFile()) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw rc;
+ }
+ }
+ #endif
+
+ /* this is the dBase IV version of the class */
+ cVersion = 0x03; // 0x03 for Dbase level 5
+ #ifdef XB_MEMO_SUPPORT
+ if( iMemoFieldCnt > 0 ){
+// cVersion = cVersion |= 0x88; // version IV memos, compiler complains about this
+ cVersion |= 0x88; // version IV memos
+ }
+ #endif
+
+ if(( rc = xbFopen( "w+b", iShareMode )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw rc;
+ }
+ uiRecordLen++; /* add one byte for 0x0D */
+
+ if(( RecBuf = (char *) malloc( uiRecordLen )) == NULL ){
+ iErrorStop = 70;
+ throw rc;
+ }
+
+ if(( RecBuf2 = (char *) malloc( uiRecordLen )) == NULL ){
+ iErrorStop = 80;
+ rc = XB_NO_MEMORY;
+ throw rc;
+ }
+
+ /* BlankRecord(); */
+ memset( RecBuf, 0x20, uiRecordLen );
+ memset( RecBuf2, 0x20, uiRecordLen );
+ ulCurRec = 0L;
+ uiHeaderLen = 33 + iNoOfFields * 32;
+ xbDate d;
+ cUpdateYY = (char) (d.YearOf() - 1900);
+ cUpdateMM = (char) d.MonthOf();
+ cUpdateDD = (char) d.DayOf( XB_FMT_MONTH );
+
+ // Default language driver to 0x1b
+ cLangDriver = 0x1b;
+
+ /* write the header prolog */
+ if(( rc = WriteHeader( 0, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 90;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+ if((SchemaPtr=(xbSchemaRec *)malloc( (size_t) iNoOfFields * sizeof( xbSchemaRec ))) == NULL){
+ iErrorStop = 100;
+ rc = XB_NO_MEMORY;
+ throw rc;
+ }
+
+ /* write the field information into the header */
+ for( i = 0, k = 1; i < iNoOfFields; i++ ){
+
+ memset( SchemaPtr[i].cFieldName, 0x00, 11 );
+ for( int x = 0; x < 10 && pSchema[i].cFieldName[x]; x++ )
+ SchemaPtr[i].cFieldName[x] = pSchema[i].cFieldName[x];
+
+ SchemaPtr[i].cType = pSchema[i].cType;
+ SchemaPtr[i].cFieldLen = (unsigned char) pSchema[i].iFieldLen;
+ SchemaPtr[i].cNoOfDecs = (unsigned char) pSchema[i].iNoOfDecs;
+
+ if( SchemaPtr[i].cNoOfDecs > SchemaPtr[i].cFieldLen ){
+ iErrorStop = 110;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+
+ k2 = k;
+ k += SchemaPtr[i].cFieldLen;
+
+ if(( xbFwrite( &SchemaPtr[i].cFieldName, 1, 11 )) != XB_NO_ERROR ) {
+ iErrorStop = 120;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+
+ if(( xbFwrite( &SchemaPtr[i].cType, 1, 1 )) != XB_NO_ERROR ) {
+ iErrorStop = 130;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+
+ for( int j = 0; j < 4; j++ )
+ xbFputc( 0x00 );
+
+ if(( xbFwrite( &SchemaPtr[i].cFieldLen, 1, 1 )) != XB_NO_ERROR ) {
+ iErrorStop = 140;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+
+ if(( xbFwrite( &SchemaPtr[i].cNoOfDecs, 1, 1 )) != XB_NO_ERROR ) {
+ iErrorStop = 150;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+
+ /* 14 bytes reserved */
+ for( int j = 0; j < 14; j++ )
+ xbFputc( 0x00 );
+
+ SchemaPtr[i].pAddress = RecBuf + k2;
+ SchemaPtr[i].pAddress2 = RecBuf2 + k2;
+ }
+
+ /* write the header terminator */
+ if(( xbFputc( XB_CHARHDR )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ rc = XB_WRITE_ERROR;
+ throw rc;
+ }
+ }
+ catch( xbInt16 rc )
+ {
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf4::CreateTable() Exception Caught Error Stop = %d rc = %d", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+
+ sMsg.Sprintf( "Table Name = [%s]", GetFqFileName().Str());
+ xbase->WriteLogMessage( sMsg );
+ sMsg.Sprintf( "Alias Name = [%s]", sAlias.Str());
+ xbase->WriteLogMessage( sMsg );
+
+ xbFclose();
+ if( RecBuf ){
+ free( RecBuf );
+ RecBuf = NULL;
+ }
+ if( RecBuf2 ){
+ free( RecBuf2 );
+ RecBuf2 = NULL;
+ }
+ if( SchemaPtr ){
+ free( SchemaPtr );
+ SchemaPtr = NULL;
+ }
+
+ InitVars();
+ if( rc != XB_FILE_EXISTS )
+ xbase->RemoveTblFromTblList( sAlias );
+ }
+
+ if( rc == XB_NO_ERROR )
+ iDbfStatus = XB_OPEN;
+
+ return rc;
+}
+
+/************************************************************************/
+//! @brief Get version.
+/*!
+ The version info can be retrieved to determine
+ which class is being used for a given dbf instance.
+ \returns 4
+*/
+
+xbInt16 xbDbf4::GetVersion() const {
+ return 4;
+}
+
+/************************************************************************/
+//! @brief Open dbf file/table.
+/*!
+ \param sTableName DBF table name.
+ \param sAlias Table alias
+ \param iOpenMode XB_READ<br>XB_READ_WRITE
+ \param iShareMode XB_SINGLE_USER<br>XB_MULTI_USER
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbDbf4::Open( const xbString & sTableName, const xbString & sAlias,
+ xbInt16 iOpenMode, xbInt16 iShareMode ){
+ xbInt16 i, j, iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char buf[33];
+ char *p;
+
+ #ifdef XB_MEMO_SUPPORT
+ iMemoFieldCnt = 0;
+ #endif
+
+ try{
+ /* verify the file is not already open */
+ if( iDbfStatus != XB_CLOSED ){
+ iErrorStop = 10;
+ iRc = XB_ALREADY_OPEN;
+ throw iRc;
+ }
+ /* copy the file name to the class variable */
+ SetFileName( sTableName );
+ this->sAlias = sAlias;
+
+ if( !FileExists()){
+ iErrorStop = 20;
+ iRc = XB_FILE_NOT_FOUND;
+ throw iRc;
+ }
+
+ if(( iRc = xbase->AddTblToTblList( this, GetFqFileName(), sAlias )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ /* open the file */
+ if(( iRc = xbFopen( iOpenMode, iShareMode )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ /* copy the header into memory */
+ if(( iRc = ReadHeader( 1, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+
+ /* check the version */
+ //if(( xFileVersion = DetermineXbaseTableVersion( cVersion )) != 4 ){
+ if(( cVersion & 0x07 ) != 3 ){
+ iErrorStop = 60;
+ iRc = XB_FILE_TYPE_NOT_SUPPORTED;
+ throw iRc;
+ }
+ iFileVersion = 4;
+
+ /* calculate the number of fields */
+ if( cVersion == (char)0x30 ) {
+ iNoOfFields = ( uiHeaderLen - 296 ) / 32 ;
+ } else {
+ iNoOfFields = ( uiHeaderLen - 33 ) / 32;
+ }
+
+ if(( RecBuf = (char *) malloc( uiRecordLen )) == NULL ){
+ iErrorStop = 70;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ if(( RecBuf2 = (char *) malloc( uiRecordLen )) == NULL ) {
+ iErrorStop = 80;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ if((SchemaPtr=(xbSchemaRec *)malloc((size_t) iNoOfFields * sizeof( xbSchemaRec ))) == NULL){
+ iErrorStop = 90;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ memset( SchemaPtr, 0x00, (size_t) iNoOfFields * (size_t) sizeof( xbSchemaRec ));
+ /* copy field info into memory */
+ for( i = 0, j = 1; i < iNoOfFields; i++ ){
+ xbFseek( ((xbInt64)i*32+32), SEEK_SET );
+ xbFread( &buf, 1, 32 );
+ p = buf;
+ for( int x = 0; x < 10 && buf[x]; x++ ){
+ SchemaPtr[i].cFieldName[x] = buf[x];
+ }
+ p = buf + 11;
+ SchemaPtr[i].cType = *p++;
+ SchemaPtr[i].pAddress = RecBuf + j;
+ SchemaPtr[i].pAddress2 = RecBuf2 + j;
+ SchemaPtr[i].cFieldLen = (unsigned char) *( p + 4 );
+ SchemaPtr[i].cNoOfDecs = (unsigned char) *( p + 5 );
+ SchemaPtr[i].cIxFlag = (unsigned char) *( p + 19 );
+ j += SchemaPtr[i].cFieldLen;
+ #ifdef XB_MEMO_SUPPORT
+ if( (SchemaPtr[i].cType == 'M' || SchemaPtr[i].cType == 'B' || SchemaPtr[i].cType == 'O' ))
+ iMemoFieldCnt++;
+ #endif
+ }
+ ulCurRec = 0L;
+ iDbfStatus = XB_OPEN;
+ if(( iRc = BlankRecord()) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+
+ #ifdef XB_MEMO_SUPPORT
+ if( iMemoFieldCnt > 0 ){ /* does this table have memo fields ? */
+
+ // build the file name
+ xbString sMfn = GetFqFileName(); /* memo file name, same as filename except ends with a "t", not an "f" */
+ xbUInt32 ulMfnLen = sMfn.Len();
+ if( sMfn[ulMfnLen] == 'F' )
+ sMfn.PutAt( ulMfnLen, 'T' );
+ else
+ sMfn.PutAt( ulMfnLen, 't' );
+ xbFile fTemp( xbase );
+ fTemp.SetFileName( sMfn );
+
+ Memo = new xbMemoDbt4( this, fTemp.GetFqFileName());
+
+ if(( iRc = Memo->OpenMemoFile()) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ }
+ #endif
+
+ #ifdef XB_MDX_SUPPORT
+ if( cIndexFlag ){
+ // create the file name
+ xbString sIxFileName = GetFqFileName();
+ sIxFileName.Trim();
+ xbUInt32 lLen = sIxFileName.Len();
+ sIxFileName.PutAt( lLen-2, 'M' );
+ sIxFileName.PutAt( lLen-1, 'D' );
+ sIxFileName.PutAt( lLen, 'X' );
+ if(( iRc = OpenIndex( "MDX", sIxFileName )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ }
+ #endif
+
+ }
+ catch ( xbInt16 iRc )
+ {
+ xbString sMsg;
+ sMsg.Sprintf( "xbdbf4::Open() Exception Caught Error Stop = %d iRc = %d ShareMode = %d OpenMode = %d", iErrorStop, iRc, iShareMode, iOpenMode );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ xbFclose();
+ if( RecBuf ){
+ free( RecBuf );
+ RecBuf = NULL;
+ }
+ if( RecBuf2 ){
+ free( RecBuf2 );
+ RecBuf2 = NULL;
+ }
+ if( SchemaPtr ){
+ free( SchemaPtr );
+ SchemaPtr = NULL;
+ }
+ InitVars();
+
+#ifdef XB_MEMO_SUPPORT
+ if( Memo ){
+ Memo->CloseMemoFile();
+ delete Memo;
+ Memo = NULL;
+ }
+#endif
+ }
+
+ if( iRc == XB_NO_ERROR )
+ iDbfStatus = XB_OPEN;
+
+ return iRc;
+}
+
+
+/************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+
+//! @brief Create memo block size.
+/*!
+ This routine sets the memo file block size. This value is used when
+ the memo file is created so you if you want to change it, this must be
+ called before creating the table.
+
+ The default size for version 4 is 1024.
+
+ \param ulBlockSize - Block size, must be evenly divisible by 512.
+ \returns XB_INVALID_BLOCK_SIZE<br>XB_NO_ERROR
+*/
+
+xbInt16 xbDbf4::SetCreateMemoBlockSize( xbUInt32 ulBlockSize ){
+
+ if( ulBlockSize % 512 )
+ return XB_INVALID_BLOCK_SIZE;
+ else
+ ulCreateMemoBlockSize = ulBlockSize;
+
+ return XB_NO_ERROR;
+}
+#endif // XB_MEMO_SUPPORT
+/************************************************************************/
+//! @brief Set version.
+/*!
+ Sets the version to 4. The version info can be retrieved to determine
+ which class is being used for a given dbf instance.
+ \returns 4
+*/
+xbInt16 xbDbf4::SetVersion() {
+ iFileVersion = 4;
+ return iFileVersion;
+}
+/************************************************************************/
+//! @brief Validate schema
+/*!
+ This routine verifies the field types are valid for Dbase IV (tm).
+
+ \param s Pointer to schema structure with field definitions.
+
+ \returns Number of fields or XB_INVALID_FIELD_TYPE.
+*/
+
+
+xbInt16 xbDbf4::ValidateSchema( xbSchema * s ){
+
+ xbInt16 iFieldCnt = 0;
+ uiRecordLen = 0;
+
+ // Count the number of fields and check paramaters
+ xbInt16 i = 0;
+ while( s[i].cType != 0 ){
+ iFieldCnt++;
+ // Version IV field types
+ if( s[i].cType != 'C' &&
+ s[i].cType != 'N' &&
+ s[i].cType != 'F' &&
+ s[i].cType != 'D' &&
+ #ifdef XB_MEMO_SUPPORT
+ s[i].cType != 'M' &&
+ #endif /* XB_MEMO_SUPPORT */
+ s[i].cType != 'L' ){
+ return XB_INVALID_FIELD_TYPE;
+ }
+
+ if(s[i].cType == 'D'){
+ s[i].iFieldLen = 8;
+ s[i].iNoOfDecs = 0;
+ }
+
+ else if(s[i].cType == 'C')
+ s[i].iNoOfDecs = 0;
+
+ // check for numeric fields which are too long
+ else if((s[i].cType == 'N' || s[i].cType == 'F') && s[i].iFieldLen > 19 ){
+ return XB_INVALID_FIELD_LEN;
+ }
+
+ #ifdef XB_MEMO_SUPPORT
+ else if(s[i].cType == 'M'){
+ s[i].iFieldLen = 10;
+ s[i].iNoOfDecs = 0;
+ }
+ #endif // XB_MEMO_SUPPORT
+
+ uiRecordLen += s[i].iFieldLen;
+ i++;
+ }
+ return iFieldCnt;
+}
+
+} /* namespace */
+#endif /* XB_DBF4_SUPPORT */ \ No newline at end of file
diff --git a/src/core/xbexp.cpp b/src/core/xbexp.cpp
new file mode 100755
index 0000000..d3e8ca8
--- /dev/null
+++ b/src/core/xbexp.cpp
@@ -0,0 +1,2643 @@
+/* xbexp.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2017,2021,2022 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+
+This module is part of the expression logic and has the code
+for parsing various tokens out of an expression
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_EXPRESSION_SUPPORT
+
+namespace xb{
+
+/*************************************************************************/
+//! Constructor
+/*!
+ \param x Pointer to xbXBase instance.
+*/
+
+xbExp::xbExp( xbXBase *x ){
+ xbase = x;
+ dbf = NULL;
+ nTree = NULL;
+}
+
+/*************************************************************************/
+//! Constructor
+/*!
+ \param x Pointer to xbXBase instance.
+ \param d Pointer to xbDbf instance.
+*/
+xbExp::xbExp( xbXBase *x, xbDbf *d ){
+ xbase = x;
+ dbf = d;
+ nTree = NULL;
+}
+
+/*************************************************************************/
+//! Deconstrucor.
+
+xbExp::~xbExp() {
+
+ if( nTree )
+ delete nTree;
+}
+
+/*************************************************************************/
+//! Calulate expression return length
+/*!
+
+ This function returns the maximum possible length of an expression
+ The create index functions use this for determining the fixed length keys
+ It sets the return length field in the node.
+
+ \param n Start node
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::CalcFunctionResultLen( xbExpNode * n ) const{
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 iReturnLenCalc = 0;;
+ xbInt32 lReturnLenVal = 0;
+ xbString sNodeText;
+
+
+ try{
+
+ n->GetNodeText( sNodeText );
+ char cReturnType = 0;
+ if(( iRc = xbase->GetFunctionInfo( sNodeText, cReturnType, iReturnLenCalc, lReturnLenVal )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ if( iReturnLenCalc == 1 ){
+ // use the value from iReturnLenVal
+ n->SetResultLen( (xbUInt32) lReturnLenVal );
+ }
+ else if( iReturnLenCalc == 2 ){
+ // use the length from the child node identified in lReturnLenVal
+ xbExpNode *nChild = n->GetChild( (xbUInt32) lReturnLenVal - 1 );
+ if( !nChild ){
+ iErrorStop = 20;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ n->SetResultLen( nChild->GetResultLen());
+ }
+
+ else if( iReturnLenCalc == 3 ){
+ // use the length from the child node identified in lReturnLenVal
+ xbExpNode *nChild = n->GetChild( (xbUInt32) lReturnLenVal - 1 );
+ if( !nChild ){
+ iErrorStop = 30;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ n->SetResultLen( (xbUInt32) nChild->GetNumericResult());
+ }
+ else if( iReturnLenCalc == 4 ){
+ // use the value from the length in parm 1 multiplied by the value in parm 2 (REPLICATE)
+ xbExpNode *nChild1 = n->GetChild( 0 );
+ xbExpNode *nChild2 = n->GetChild( 1 );
+ if( !nChild1 || !nChild2 ){
+ iErrorStop = 40;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ n->SetResultLen( nChild1->GetResultLen() * (xbUInt32) nChild2->GetNumericResult());
+ }
+ else if( iReturnLenCalc == 5 ){
+ // use the larger of the length of the value in parm2 or parm 3 (IIF statement)
+ xbExpNode *nChild2 = n->GetChild( 1 );
+ xbExpNode *nChild3 = n->GetChild( 2 );
+ if( !nChild2 || !nChild3 ){
+ iErrorStop = 50;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ if( nChild2->GetResultLen() >= nChild3->GetResultLen())
+ n->SetResultLen( nChild2->GetResultLen());
+ else
+ n->SetResultLen( nChild3->GetResultLen());
+ }
+
+ else if( iReturnLenCalc == 6 ){
+
+ if( n->GetChildCnt() >= 2 ){
+ xbExpNode *nChild2 = n->GetChild( 1 );
+ n->SetResultLen( (xbUInt32) nChild2->GetNumericResult());
+ } else {
+ n->SetResultLen( (xbUInt32) lReturnLenVal );
+ }
+
+ } else {
+ iErrorStop = 100;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::GetFunctionResultLen() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+ return iRc;
+}
+
+/*************************************************************************/
+//! Check parens and quotes
+/*!
+ This routine looks for unbalanced parens and quotes
+
+ \param sExpression Expression to examine.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbExp::CheckParensAndQuotes( const xbString &sExpression ){
+
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ xbBool bInQuotes = xbFalse;
+ xbInt16 iLparenCtr = 0;
+ xbInt16 iRparenCtr = 0;
+ xbInt16 iQuoteType = 0;
+ const char *s = sExpression;
+
+ try{
+
+ while( *s ){
+ if( !bInQuotes ){
+ if( *s == '(' ){
+ iLparenCtr++;
+ } else if( *s == ')' ){
+ iRparenCtr++;
+ } else if( *s == '\'' ){
+ bInQuotes++;
+ iQuoteType = 0;
+ } else if( *s == '"' ){
+ bInQuotes++;
+ iQuoteType = 1;
+ }
+ } else {
+ if(( *s == '\'' && iQuoteType == 0 ) || (*s == '"' && iQuoteType == 1 ))
+ bInQuotes--;
+ }
+ s++;
+ }
+ if( iLparenCtr != iRparenCtr ){
+ iErrorStop = 10;
+ iRc = XB_UNBALANCED_PARENS;
+ throw iRc;
+ }
+ if( bInQuotes ){
+ iErrorStop = 20;
+ iRc = XB_UNBALANCED_QUOTES;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::CheckParensAndQuots() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( sExpression );
+ }
+ return iRc;
+}
+/*************************************************************************/
+//! Clear tree handle.
+/*!
+ This routine clears the expression tree and frees any associated memory.
+ \returns void.
+*/
+
+void xbExp::ClearTreeHandle(){
+ if( nTree ){
+ nTree = NULL;
+ }
+}
+
+/*************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+//! Dump the tree.
+/*!
+ \param iOption - Output opton.
+ \returns void.
+*/
+
+void xbExp::DumpTree( xbInt16 iOption ){
+ nTree->DumpNode( iOption );
+}
+
+//! Dump token
+/*!
+ \param iOption - Output opton.
+ \returns void.
+*/
+
+
+void xbExp::DumpToken( xbExpToken &t, xbInt16 iOption ){
+
+ xbString sMsg;
+ sMsg = "Processing Token";
+ xbase->WriteLogMessage( sMsg.Str(), iOption );
+
+ sMsg.Sprintf( "Expression = [%s]", t.sExpression.Str());
+ xbase->WriteLogMessage( sMsg.Str(), iOption );
+
+ sMsg.Sprintf( "Token = [%s]", t.sToken.Str());
+ xbase->WriteLogMessage( sMsg.Str(), iOption );
+
+ sMsg.Sprintf( "NodeType = [%c]", t.cNodeType );
+ xbase->WriteLogMessage( sMsg.Str(), iOption );
+
+ sMsg.Sprintf( "ReturnType = [%c]", t.cReturnType );
+ xbase->WriteLogMessage( sMsg.Str(), iOption );
+
+ sMsg.Sprintf( "Sts = [%d]", t.iSts );
+ xbase->WriteLogMessage( sMsg.Str(), iOption );
+
+ sMsg.Sprintf( "PrevNodeType = [%c]", t.cPrevNodeType );
+ xbase->WriteLogMessage( sMsg.Str(), iOption );
+
+ sMsg.Sprintf( "PrevReturnType = [%c]", t.cPrevReturnType );
+ xbase->WriteLogMessage( sMsg.Str(), iOption );
+}
+
+#endif
+
+/*************************************************************************/
+//! Get date result.
+/*!
+ If the expression generates a date return type, this method retrieves the date value.
+ \param dtResult - Output date value.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::GetDateResult( xbDate &dtResult ){
+ if( nTree ){
+ dtResult.JulToDate8( (xbInt32) nTree->GetNumericResult() );
+ return XB_NO_ERROR;
+ }
+ else{
+ //dtResult = ?;
+ return XB_PARSE_ERROR;
+ }
+}
+/*************************************************************************/
+//! Get bool result.
+/*!
+ If the expression generates a boolean return type, this method retrieves the boolean value.
+ \param bResult - Output boolean value.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbExp::GetBoolResult( xbBool &bResult){
+ if( nTree ){
+ bResult = nTree->GetBoolResult();
+ return XB_NO_ERROR;
+ }
+ else{
+ return XB_PARSE_ERROR;
+ }
+}
+
+/*************************************************************************/
+//! Get the next node in the tree.
+/*!
+ \param n Node to starting point. To get the first node of the entire tree, set n = NULL
+ \returns Pointer to next node.
+*/
+
+xbExpNode *xbExp::GetNextNode( xbExpNode * n ) const {
+
+ // to get the first node of the entire tree, set n = NULL
+ // std::cout << "In GetNextNode\n";
+
+ if( n == nTree )
+ return NULL;
+
+ else if( !n ){
+ if( !nTree )
+ return NULL;
+ else
+ return nTree->GetFirstNode();
+ }
+ return n->GetNextNode();
+}
+
+/*************************************************************************/
+//! GetNextToken
+/*! This method returns the next token in an expression of one or more tokens
+ \param t Token
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::GetNextToken( xbExpToken &t ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ t.iSts = XB_NO_ERROR;
+ t.sExpression.Ltrim();
+
+ if( t.sExpression.Len() == 0 ){
+ t.iSts = XB_END_OF_EXPRESSION;
+ return XB_NO_ERROR;
+ }
+
+ // Check for date constant
+ if((t.sExpression.Len() >= 10 && t.sExpression[1] == '{' && t.sExpression[4] == '/' && t.sExpression[7] == '/') &&
+ (t.sExpression[10] == '}' || (t.sExpression.Len() >= 12 && t.sExpression[12] == '}'))){
+ if(( iRc = GetTokenDateConstant( t )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+ // Check for parens
+ else if( t.sExpression[1] == '(' || t.sExpression[1] == '{' ){
+ if(( iRc = GetTokenParen( t )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ // Check for a char constant
+ else if( t.sExpression[1] == '"' || t.sExpression[1] == '\'' ){
+ if(( iRc = GetTokenCharConstant( t )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+ // Check for logical constant
+ else if( IsLogicalConstant( t.sExpression )){
+ if(( iRc = GetTokenLogicalConstant( t )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+ // check for numeric constant
+ else if( IsNumericConstant( t.sExpression, t.cPrevNodeType )){
+ if(( iRc = GetTokenNumericConstant( t )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+ // check for operator
+ else if( IsOperator( t.sExpression )){
+ if(( iRc = GetTokenOperator( t )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+ // check for function
+ else if( IsFunction( t.sExpression, t.cReturnType )){
+ if(( iRc = GetTokenFunction( t )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+ else if(( iRc = GetTokenDatabaseField( t )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+
+ //t.sExpression;
+ // std::cout << ">>>>>>>>>" << sMsg.Str() << "\n";
+ // sMsg.Sprintf( "[%d][%s]", iErrorStop, t.sExpression.Str() );
+ // sMsg.Sprintf( "xbexp::GetNextToken() Exception Caught. Error Stop = [%d] %s", iErrorStop, t.sExpression.Str());
+
+ sMsg.Sprintf( "xbexp::GetNextToken() Exception Caught. Error Stop = [%d] iRc = [%d] Expression = [%s]", iErrorStop, iRc, t.sExpression.Str() );sMsg.Sprintf( "xbexp::GetNextToken() Exception Caught. Error Stop = [%d] iRc = [%d] Expression = [%s]", iErrorStop, iRc, t.sExpression.Str() );sMsg.Sprintf( "xbexp::GetNextToken() Exception Caught. Error Stop = [%d] iRc = [%d] Expression = [%s]", iErrorStop, iRc, t.sExpression.Str() );sMsg.Sprintf( "xbexp::GetNextToken() Exception Caught. Error Stop = [%d] iRc = [%d] Expression = [%s]", iErrorStop, iRc, t.sExpression.Str() );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+
+ return iRc;
+}
+
+/*************************************************************************/
+//! Get numeric result.
+/*!
+ If the expression generates a numeric return type, this method retrieves the numeric value.
+ \param dResult - Output numeric value.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::GetNumericResult( xbDouble &dResult){
+ if( nTree ){
+ dResult = nTree->GetNumericResult();
+ return XB_NO_ERROR;
+ }
+ else{
+ dResult = 0;
+ return XB_PARSE_ERROR;
+ }
+}
+
+/*************************************************************************/
+//! Get result length.
+/*!
+ This routine returns the result length.
+ \returns Result length.
+*/
+
+xbInt16 xbExp::GetResultLen() const{
+ if( nTree )
+ return nTree->GetResultLen();
+ else
+ return 0;
+}
+
+/*************************************************************************/
+//! Get return type.
+/*!
+ \returns Expression return type.
+*/
+
+char xbExp::GetReturnType() const{
+ if( nTree )
+ return nTree->GetReturnType();
+ else
+ return ' ';
+}
+
+/*************************************************************************/
+//! Get string result.
+/*!
+ If the expression generates a string return type, this method retrieves the string value.
+ \param sResult - Output string value.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::GetStringResult( xbString &sResult){
+ if( nTree ){
+ sResult = nTree->GetStringResult();
+ return XB_NO_ERROR;
+ }
+ else{
+ sResult = "";
+ return XB_PARSE_ERROR;
+ }
+}
+
+/*************************************************************************/
+//! Get string result.
+/*!
+ If the expression generates a string return type, this method retrieves the string value.
+ \param vpResult - Pointer to user supplied buffer for result.
+ \param ulLen - Max size of buffer.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbExp::GetStringResult( char * vpResult, xbUInt32 ulLen ){
+ if( nTree ){
+ nTree->GetStringResult().strncpy((char *) vpResult, ulLen );
+ return XB_NO_ERROR;
+ }
+ else{
+ return XB_PARSE_ERROR;
+ }
+}
+
+
+
+/*************************************************************************/
+//! GetTokenCharConstant
+/*! This method returns the character constant in a pair of quotes
+
+ This routine returns the tokens inside a set of matching quotes in sOutToken
+ If there is nothing between the quotes then sOutToken is returned empty
+ sOutRemainder contains whatever remains to the right of the right quote
+
+ \param t Token
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+
+xbInt16 xbExp::GetTokenCharConstant( xbExpToken &t ){
+
+ const char *s = t.sExpression;
+ const char *sToken; // pointer to beginning of token
+ xbInt16 iQuoteType;
+ xbUInt32 ulTokenLen = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbBool bDone = xbFalse;
+
+ try{
+ if( *s == '"' )
+ iQuoteType = 0;
+ else
+ iQuoteType = 1;
+ s++;
+ sToken = s;
+ while( *s && !bDone ){
+ if(( *s == '"' && iQuoteType == 0 ) || (*s == '\'' && iQuoteType == 1 ))
+ bDone = xbTrue;
+ s++;
+ ulTokenLen++;
+ }
+ if( bDone ){ // found matching paren
+ t.cNodeType = XB_EXP_CONSTANT;
+ t.cReturnType = XB_EXP_CHAR;
+ t.sToken.Set( sToken, ulTokenLen - 1 );
+ t.sExpression.Ltrunc( ulTokenLen + 1 );
+ } else {
+ iRc = XB_PARSE_ERROR;
+ t.iSts = XB_UNBALANCED_QUOTES;
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::GetTokenCharConstant() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+ return iRc;
+}
+
+
+/*************************************************************************/
+//! GetTokenDateConstant
+/*! This method returns the date constant in a pair of {}
+
+ Date format is one of {mm/dd/yy} or {mm/dd/yyyy}
+ \param t Token.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::GetTokenDateConstant( xbExpToken &t ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char wBuf[13];
+ xbDate dt;
+
+ try{
+ memset( wBuf, 0x00, 13 );
+ t.cNodeType = XB_EXP_CONSTANT;
+ t.cReturnType = XB_EXP_DATE;
+
+ if( t.sExpression[10] == '}' ){
+ for( xbInt16 i = 0; i < 8; i++ )
+ wBuf[i] = t.sExpression[i+2];
+
+ if(( iRc = dt.CTOD( wBuf )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ t.sToken.Set( dt.Str() );
+ t.sExpression.Ltrunc( 10 );
+
+ } else if( t.sExpression[12] == '}' ){
+
+ wBuf[0] = t.sExpression[8];
+ wBuf[1] = t.sExpression[9];
+ wBuf[2] = t.sExpression[10];
+ wBuf[3] = t.sExpression[11];
+ wBuf[4] = t.sExpression[2];
+ wBuf[5] = t.sExpression[3];
+ wBuf[6] = t.sExpression[5];
+ wBuf[7] = t.sExpression[6];
+
+ t.sToken.Set( wBuf );
+ t.sExpression.Ltrunc( 12 );
+ } else {
+ iRc = XB_PARSE_ERROR;
+ t.iSts = XB_INVALID_DATE;
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::GetTokenDateConstant() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+ return iRc;
+}
+
+/*************************************************************************/
+//! GetTokenField
+/*! This method gets a database field token
+
+ Looks for a xbase field in one of the following formats
+
+ FIELDNAME
+ or
+ TABLENAME->FIELDNAME
+
+ \param t Token.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::GetTokenDatabaseField( xbExpToken &t ){
+
+ const char *s = t.sExpression;
+ xbUInt32 ulTokenLen = 0;
+ xbUInt32 ulTokenLen2 = 0;
+
+ while( *s && !IsTokenSeparator( *s ) && !IsWhiteSpace( *s )) {
+ ulTokenLen++;
+ s++;
+ }
+
+ // go past any white space
+ while( *s && !IsTokenSeparator( *s ) && IsWhiteSpace( *s )) {
+ ulTokenLen2++;
+ s++;
+ }
+
+ // look for ->
+ // remove the field name from before the ->
+ if( strncmp( s, "->", 2 ) == 0 ){
+ ulTokenLen2+=2;
+ s+=2;
+ // go past white space
+ while( *s && !IsTokenSeparator( *s ) && IsWhiteSpace( *s )) {
+ ulTokenLen2++;
+ s++;
+ }
+ // go to the end
+ while( *s && !IsTokenSeparator( *s ) && !IsWhiteSpace( *s )) {
+ ulTokenLen2++;
+ s++;
+ }
+ ulTokenLen += ulTokenLen2;
+ }
+ t.cNodeType = XB_EXP_FIELD;
+ t.cReturnType = XB_EXP_UNKNOWN;
+ t.sToken.Set( t.sExpression, ulTokenLen );
+ t.sExpression.Ltrunc( ulTokenLen );
+
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! GetTokenFunction
+/*!
+ This method gets a function and everything between the following quotes
+ \param t Token
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+
+xbInt16 xbExp::GetTokenFunction( xbExpToken &t ){
+
+ xbUInt32 lPos = t.sExpression.Pos( '(' );
+ if( lPos == 0 )
+ return XB_PARSE_ERROR;
+
+ xbBool bDone = xbFalse;
+ xbUInt32 lLen = t.sExpression.Len();
+ xbInt16 iDepthCtr = 1;
+
+ while( ++lPos <= lLen && !bDone ){
+ if( t.sExpression[lPos] == ')' ){
+ iDepthCtr--;
+ if( iDepthCtr == 0 )
+ bDone = xbTrue;
+ } else if( t.sExpression[lPos] == '(' ){
+ iDepthCtr++;
+ }
+ }
+
+ t.cNodeType = XB_EXP_FUNCTION;
+ t.sToken.Set( t.sExpression, lPos-1 );
+ t.sExpression.Ltrunc( lPos-1 );
+
+// std::cout << "lPos = [" << lPos << "] done= [" << bDone << "][" << t.sExpression << "] len=[" << lLen << "] return type = [" << t.cReturnType << "]\n";
+
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! GetTokenCharConstant
+/*! This method returns the character constant in a pair of quotes
+
+ This routine returns the tokens inside a set of matching quotes in sOutToken
+ If there is nothing between the quotes then sOutToken is returned empty
+ sOutRemainder contains whatever remains to the right of the right quote
+
+ \param t Token
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::GetTokenLogicalConstant( xbExpToken &t ){
+
+ t.cNodeType = XB_EXP_CONSTANT;
+ t.cReturnType = XB_EXP_LOGICAL;
+ t.sToken = t.sExpression[2];
+
+ if( t.sExpression[3] == '.' )
+ t.sExpression.Ltrunc( 3 );
+ else if( t.sExpression[6] == '.' )
+ t.sExpression.Ltrunc( 6 );
+ else if( t.sExpression[7] == '.' )
+ t.sExpression.Ltrunc( 7 );
+
+ return XB_NO_ERROR;
+}
+
+
+/*************************************************************************/
+//! GetTokenNumericConstant
+/*! This method returns a numeric constant in
+
+ This routine returns a numeric constant token
+ sOutRemainder contains whatever remains to the right of the right quote
+
+ \param t Token
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::GetTokenNumericConstant( xbExpToken &t ){
+
+ const char * s = t.sExpression;
+ xbUInt32 ulTokenLen = 0;
+ t.sToken = "";
+
+ t.cNodeType = XB_EXP_CONSTANT;
+ t.cReturnType = XB_EXP_NUMERIC;
+
+ // capture the leading sign
+ if( *s == '-' || *s == '+' || *s == '.' ){
+ t.sToken = *s;
+ ulTokenLen++;
+ s++;
+
+ // go past any white space between sign and number
+ while( *s && IsWhiteSpace( *s )){
+ s++;
+ ulTokenLen++;
+ }
+ }
+
+ // add the number to the token
+ while( *s && (isdigit( *s ) || *s == '.' )){
+ t.sToken += *s;
+ s++;
+ ulTokenLen++;
+ }
+ t.sExpression.Ltrunc( ulTokenLen );
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! GetTokenOperator
+/*! This method returns the operator
+
+ \param t Token
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+
+xbInt16 xbExp::GetTokenOperator( xbExpToken &t ){
+
+ const char *s = t.sExpression;
+
+ // Logical operators
+ if((strncmp( s, "<>", 2 ) == 0 ) || (strncmp( s, "!=", 2 ) == 0 ) ||
+ (strncmp( s, "<=", 2 ) == 0 ) || (strncmp( s, ">=", 2 ) == 0 )){
+ t.cReturnType = XB_EXP_LOGICAL;
+ t.sToken.Assign( s, 1, 2 );
+ t.sExpression.Ltrunc( 2 );
+ t.cNodeType = XB_EXP_OPERATOR;
+ return XB_NO_ERROR;
+ }
+
+ if( *s == '=' || *s == '<' || *s == '>' || *s == '$' || *s == '#' ){
+ t.cReturnType = XB_EXP_LOGICAL;
+ t.sToken.Assign( s, 1, 1 );
+ t.sExpression.Ltrunc( 1 );
+ t.cNodeType = XB_EXP_OPERATOR;
+ return XB_NO_ERROR;
+ }
+
+ if( (strncmp( s, ".NOT.", 5 ) == 0 ) || (strncmp( s, ".AND.", 5 ) == 0 )){
+ t.cReturnType = XB_EXP_LOGICAL;
+ t.sToken.Assign( s, 1, 5 );
+ t.sExpression.Ltrunc( 5 );
+ t.cNodeType = XB_EXP_OPERATOR;
+ return XB_NO_ERROR;
+ }
+
+ if( (strncmp( s, "NOT ", 4 ) == 0 ) || (strncmp( s, "AND ", 4 ) == 0 )){
+ t.cReturnType = XB_EXP_LOGICAL;
+ t.sToken.Assign( s, 1, 3 );
+ t.sExpression.Ltrunc( 3 );
+ t.cNodeType = XB_EXP_OPERATOR;
+ return XB_NO_ERROR;
+ }
+
+ if( strncmp( s, ".OR.", 4 ) == 0 ) {
+ t.cReturnType = XB_EXP_LOGICAL;
+ t.sToken.Assign( s, 1, 4 );
+ t.sExpression.Ltrunc( 4 );
+ t.cNodeType = XB_EXP_OPERATOR;
+ return XB_NO_ERROR;
+ }
+
+ if( strncmp( s, "OR ", 3 ) == 0 ) {
+ t.cReturnType = XB_EXP_LOGICAL;
+ t.sToken.Assign( s, 1, 2 );
+ t.sExpression.Ltrunc( 2 );
+ t.cNodeType = XB_EXP_OPERATOR;
+ return XB_NO_ERROR;
+ }
+
+ // Numeric operators
+ if(( strncmp( s, "**", 2 ) == 0 ) || ( strncmp( s, "+=", 2 ) == 0 ) ||
+ ( strncmp( s, "-=", 2 ) == 0 ) || ( strncmp( s, "*=", 2 ) == 0 ) || ( strncmp( s, "/=", 2 ) == 0 )){
+ t.cReturnType = XB_EXP_NUMERIC;
+ t.sToken.Assign( s, 1, 2 );
+ t.sExpression.Ltrunc( 2 );
+ t.cNodeType = XB_EXP_OPERATOR;
+ return XB_NO_ERROR;
+ }
+
+ // Pre/post increment/decrement operators ++ or --
+ if(( strncmp( s, "--", 2 ) == 0 ) || ( strncmp( s, "++", 2 ) == 0 )){
+ t.cReturnType = XB_EXP_NUMERIC;
+ t.sToken.Assign( s, 1, 2 );
+ t.sExpression.Ltrunc( 2 );
+ if( t.sExpression.Len() > 0 && (isdigit( t.sExpression[1] ) || isalpha( t.sExpression[1] )))
+ t.cNodeType = XB_EXP_PRE_OPERATOR;
+ else
+ t.cNodeType = XB_EXP_POST_OPERATOR;
+
+ return XB_NO_ERROR;
+ }
+
+ if( *s == '*' || *s == '/' || *s == '%' || *s == '^' ){
+ t.cReturnType = XB_EXP_NUMERIC;
+ t.sToken.Assign( s, 1, 1 );
+ t.sExpression.Ltrunc( 1 );
+ t.cNodeType = XB_EXP_OPERATOR;
+ return XB_NO_ERROR;
+ }
+
+ // multi return type operators
+ t.cReturnType = XB_EXP_UNKNOWN;
+ if( *s == '+' || *s == '-' ){
+ t.sToken.Assign( s, 1, 1 );
+ t.sExpression.Ltrunc( 1 );
+ t.cNodeType = XB_EXP_OPERATOR;
+ return XB_NO_ERROR;
+ }
+ return XB_PARSE_ERROR;
+}
+
+/*************************************************************************/
+//! GetTokenParen
+/*! This method returns the tokens in a pair of enclosed parens
+
+ This routine returns the tokens inside a set of matching parens in sOutToken
+ If there is nothing between the parens then sOutToken is returned empty
+ sOutRemainder contains whatever remains to the right of the right paren
+
+ \param t Token
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbExp::GetTokenParen( xbExpToken &t ){
+
+ const char * s = t.sExpression;
+ const char * sToken; // pointer to beginning of token
+ xbInt16 iParenType = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 iDepthCtr = 0; // depth inside of nested parens
+ xbUInt32 ulTokenLen = 0;
+ xbBool bDone = xbFalse;
+
+ try{
+ if( *s == '{' )
+ iParenType = 0;
+ else
+ iParenType = 1;
+ iDepthCtr = 1;
+ s++;
+ sToken = s;
+
+ while( *s && !bDone ){
+ if(( *s == ')' && iParenType == 1 ) || (*s == '}' && iParenType == 0 )){
+ iDepthCtr--;
+ if( iDepthCtr == 0 )
+ bDone = xbTrue;
+ } else if(( *s == '(' && iParenType == 1 ) || (*s == '{' && iParenType == 0 )){
+ iDepthCtr++;
+ }
+ s++;
+ ulTokenLen++;
+ }
+
+ if( bDone ){ // found matching paren
+ t.cNodeType = XB_EXP_NOTROOT;
+ t.cReturnType = XB_EXP_UNKNOWN;
+ t.sToken.Set( sToken, ulTokenLen - 1 );
+ t.sExpression.Ltrunc( ulTokenLen + 1 );
+ } else {
+ t.sToken = "";
+ t.cNodeType = XB_EXP_NOTROOT;
+ t.cReturnType = XB_EXP_UNKNOWN;
+ t.iSts = XB_UNBALANCED_PARENS;
+ iRc = XB_PARSE_ERROR;
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::GetTokenParen() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ }
+ return iRc;
+}
+
+/*************************************************************************/
+//! Get the expression tree handle.
+/*!
+ \returns Pointer to the top most node in the expression tree.
+*/
+xbExpNode *xbExp::GetTreeHandle(){
+ return nTree;
+}
+
+/*************************************************************************/
+//! Is Function
+/*! This method determines if the next token is a function.
+
+ \param sExpression - String expression to be evaluated.
+ \param cReturnType Output - Return type.
+ \returns xbTrue - Is a function.<br>
+ xbFalse - Is not a function.
+*/
+
+xbBool xbExp::IsFunction( const xbString & sExpression, char &cReturnType ){
+
+ xbInt16 i = 0;
+ xbInt32 l = 0;
+ if( sExpression.Pos( '(' ) > 0 ){
+ if( xbase->GetFunctionInfo( sExpression, cReturnType, i, l ) == XB_NO_ERROR )
+ return xbTrue;
+ }
+ return xbFalse;
+}
+
+/*************************************************************************/
+//! Is Logical constant
+/*! This method determines if the next token is a logical constant (T/F, etc).
+
+ \param sExpression - String expression to be evaluated.
+ \returns xbTrue - Is a logical constant.<br>
+ xbFalse - Is not a logical constant.
+*/
+
+xbBool xbExp::IsLogicalConstant( const xbString & sExpression ){
+
+ const char *s = sExpression;
+ if(( strncmp( s, ".T.", 3 ) == 0 ) || ( strncmp( s, ".F.", 3 ) == 0 ))
+ return xbTrue;
+ else if( strncmp( s, ".TRUE.", 6 ) == 0 )
+ return xbTrue;
+ else if( strncmp( s, ".FALSE.", 7 ) == 0 )
+ return xbTrue;
+
+ return xbFalse;
+}
+
+/*************************************************************************/
+//! Is Numeric constant
+/*! This method determines if the next token is a numeric constant.
+
+ \param sExpression - String expression to be evaluated.
+ \param cPrevNodeType - Type of previous node.
+ \returns xbTrue - Is a numeric constant.<br>
+ xbFalse - Is not a numeric constant.
+*/
+xbBool xbExp::IsNumericConstant( const xbString & sExpression, char cPrevNodeType ){
+
+ // check for positive, negative or decimal number constants
+
+ const char *s = sExpression;
+ if(( *s == '-' && ( cPrevNodeType == 'O' || cPrevNodeType == 0 )) ||
+ ( *s == '+' && ( cPrevNodeType == 'O' || cPrevNodeType == 0 ))){
+ s++;
+ while( *s && IsWhiteSpace( *s ))
+ s++;
+ }
+ if( *s == '.' )
+ s++;
+
+ if( isdigit( *s ))
+ return xbTrue;
+ else
+ return xbFalse;
+}
+
+/*************************************************************************/
+//! Is Operator.
+/*! This method determines if the next token is an operator.
+
+ \param sExpression - String expression to be evaluated.
+ \returns xbTrue - Is an operator.<br>
+ xbFalse - Is not an operator.
+*/
+xbBool xbExp::IsOperator( const xbString & sExpression ){
+
+ const char *s = sExpression;
+ if( *s == '+' || *s == '-' || *s == '/' || *s == '^' || *s == '=' || *s == '$' ||
+ *s == '#' || *s == '*' || *s == '<' || *s == '>' || *s == '%' )
+ return xbTrue;
+
+ if( strncmp( s, "!=", 2 ) == 0 )
+ return xbTrue;
+
+ if((strncmp( s, ".NOT.", 5 ) == 0 ) || (strncmp( s, ".OR.", 4 ) == 0 ) || (strncmp( s, ".AND.", 5 ) == 0 ))
+ return xbTrue;
+
+ if((strncmp( s, "NOT ", 4 ) == 0 ) || (strncmp( s, "OR ", 3 ) == 0 ) || (strncmp( s, "AND ", 4 ) == 0 ))
+ return xbTrue;
+
+ return xbFalse;
+}
+
+/*************************************************************************/
+//! Is Token seperator
+/*! This method determines if the next token is a seperator.
+
+ \param sExpression - String expression to be evaluated.
+ \returns xbTrue - Is a token seperator.<br>
+ xbFalse - Is not a token seperator.
+*/
+char xbExp::IsTokenSeparator( char c ){
+ if( c == '-' || c == '+' || c == '*' || c == '/' || c == '$' || c == '#' ||
+ c == '<' || c == '>' || c == '^' || c == '=' || c == '.' || c == '!' )
+ return c;
+ else
+ return 0;
+}
+/*************************************************************************/
+//! Is White space
+/*! This method determines if a given character is white space.
+
+ \param c - Character to be evaluated.
+ \returns xbTrue - Is white space.<br>
+ xbFalse - Is not white space.
+*/
+xbBool xbExp::IsWhiteSpace( char c ){
+ return(( c == 0x20 )? 1 : 0 );
+}
+
+/*************************************************************************/
+//! Get operator weight.
+/*!
+ This method determines the priority of an operator
+
+ Operator precendence
+ 10 .AND. .OR. .NOT. (not really an operator)
+ 9 > or < (includes <= or >=)
+ 6 unary plus or minus (+,-) -- not passed this routine
+ 5 prefix increment and/or decrement (++,--)
+ 4 exponentiation ** or ^
+ 3 multiplication,division or modulus (*,/,%)
+ 2 Addition, subtraction (+,-)
+ 1 Postfix increment and/or decrement (++,--)
+
+ \param sOper - Operator.
+ \returns Operator weight
+
+*/
+
+xbInt16 xbExp::OperatorWeight( const xbString &sOper ){
+
+ if( sOper == "" || sOper.Len() > 5 )
+ return 0;
+
+ else if( sOper == "--0" || sOper == "++0" ) // 0 is prefix
+ return 9;
+ else if( sOper == "**" || sOper == "^" )
+ return 8;
+ else if( sOper == "*" || sOper == "/" || sOper == "%" || sOper == "*=" || sOper == "/=" )
+ return 7;
+ else if( sOper == "+" || sOper == "-" || sOper == "+=" || sOper == "-=" )
+ return 6;
+ else if( sOper == "--1" || sOper == "++1" ) // 1 is post fix
+ return 5;
+ else if( sOper == ">" || sOper == ">=" || sOper == "<" || sOper == "<=" ||
+ sOper == "<>" || sOper == "!=" || sOper == "#" || sOper == "$" || sOper == "=" )
+ return 4;
+ else if( sOper == ".NOT." || sOper == "NOT" )
+ return 3;
+ else if( sOper == ".AND." || sOper == "AND" )
+ return 2;
+ else if( sOper == ".OR." || sOper == "OR" )
+ return 1;
+
+ return 0;
+}
+
+
+/*************************************************************************/
+//! Parse expression.
+/*!
+ \param sExpression - Expression to parse.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::ParseExpression( const xbString &sExpression ){
+ return ParseExpression( sExpression, (xbInt16) 0 );
+}
+
+/*************************************************************************/
+//! Parse expression.
+/*!
+ \param dbf - Pointer to xbDbf instance.
+ \param sExpression - Expression to parse.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::ParseExpression( xbDbf *dbf, const xbString &sExpression ){
+ this->dbf = dbf;
+ return ParseExpression( sExpression, (xbInt16) 0 );
+}
+
+/*************************************************************************/
+//! Parse expression.
+/*!
+ \param sExpression - Expression to parse.
+ \param iWeight.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbExp::ParseExpression( const xbString &sExpression, xbInt16 iWeight ){
+
+ xbExpNode *n;
+ xbExpNode *nLastNode = NULL; // pointer to the last node processed
+ xbExpToken t;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbString s;
+
+ try {
+
+ if( nTree )
+ delete nTree;
+
+ if(( iRc = CheckParensAndQuotes( sExpression )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ t.sExpression = sExpression;
+
+ xbString sOriginalExp;
+ while( t.iSts == XB_NO_ERROR && iRc == XB_NO_ERROR ){
+
+ sOriginalExp = t.sExpression; // test code
+ iRc = GetNextToken( t );
+ if( !iRc && !t.iSts ){
+
+ // comment / uncomment debug / live
+ // DumpToken( t, 0 );
+
+ if( t.cNodeType == XB_EXP_NOTROOT ){
+ xbExp enr( xbase, dbf );
+ if(( iRc = enr.ParseExpression( t.sToken, iWeight + 10 )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ n = enr.GetTreeHandle();
+ enr.ClearTreeHandle();
+
+ } else {
+
+ switch( t.cNodeType ) {
+
+ case XB_EXP_CONSTANT:
+ n = new xbExpNode( t.sToken, t.cNodeType );
+ if(( iRc = ParseExpressionConstant( t, n )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ break;
+
+ case XB_EXP_FUNCTION:
+ n = new xbExpNode( t.cNodeType );
+ if(( iRc = ParseExpressionFunction( t, n, iWeight )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ break;
+
+ case XB_EXP_FIELD:
+ n = new xbExpNode( t.cNodeType );
+ if(( iRc = ParseExpressionField( t, n )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ break;
+
+ case XB_EXP_OPERATOR:
+ case XB_EXP_PRE_OPERATOR:
+ case XB_EXP_POST_OPERATOR:
+ n = new xbExpNode( t.sToken, t.cNodeType );
+ if(( iRc = ParseExpressionOperator( t, n, iWeight )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ break;
+
+ default:
+ iErrorStop = 70;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ // break;
+ }
+ }
+ t.cPrevNodeType = t.cNodeType;
+ t.cPrevReturnType = t.cReturnType;
+
+ // determine where in the expression tree to insert the latest node "n"
+ // Is this the first node to be added to the tree?
+ if( !nTree ){
+ nTree = n;
+ }
+
+ // else if last node was XB_EXB_PRE_OPERATOR then append this as child to last node
+ else if( nLastNode && nLastNode->GetNodeType() == XB_EXP_PRE_OPERATOR ){
+ n->SetParent( nLastNode );
+ nLastNode->AddChild( n );
+ }
+
+ // else if last node was XB_EXB_POST_OPERATOR then append this as child to last node
+ else if( nLastNode && n->GetNodeType() == XB_EXP_POST_OPERATOR ){
+ n->AddChild( nLastNode );
+ nLastNode->SetParent( n );
+ if( nLastNode == nTree ){
+ nTree = n;
+ } else {
+ nLastNode->GetParent()->RemoveLastChild();
+ nLastNode->GetParent()->AddChild( n );
+ n->SetParent( nLastNode->GetParent() );
+ }
+ }
+
+ else if( n->GetNodeType() == XB_EXP_OPERATOR ){
+ xbExpNode * nWorkNode = nLastNode;
+ while( nWorkNode && ( nWorkNode->GetNodeType() != XB_EXP_OPERATOR || n->GetWeight() <= nWorkNode->GetWeight())){
+ nWorkNode = nWorkNode->GetParent();
+ }
+
+ if( !nWorkNode ){ // we are at the top
+ nTree->SetParent( n );
+ n->AddChild( nTree );
+ nTree = n;
+
+ } else if( nWorkNode->GetChildCnt() == 1 ){
+ nWorkNode->AddChild( n );
+ n->SetParent( nWorkNode );
+
+ } else if( nWorkNode->GetChildCnt() == 2 ){
+ xbExpNode * nChild2 = nWorkNode->GetChild(1);
+ n->AddChild( nChild2 );
+ nWorkNode->RemoveLastChild();
+ nWorkNode->AddChild( n );
+ n->SetParent( nWorkNode );
+
+ } else{
+ // should not be stopping on anything but an operator node with one or two children
+ iErrorStop = 80;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ } else {
+ n->SetParent( nLastNode );
+ nLastNode->AddChild( n );
+ }
+ nLastNode = n;
+ n = NULL;
+ }
+ }
+
+ // for each node in the tree, calculate the length if it's not already set
+ xbExpNode * nWork = GetNextNode( NULL );
+ xbExpNode * nChild1;
+ xbExpNode * nChild2;
+
+
+ while( nWork ){
+
+ if( nWork->GetReturnType() == XB_EXP_UNKNOWN ){
+ nWork->GetNodeText( s );
+
+ // std::cout << "XB_EXP_UNKNOWN logic [" << s << "][" << nWork->GetChildCnt() << "]\n";
+ // if this is "-" and child 1 and child 2 are both dates, set this result type to numeric
+ if( s == "-" && nWork->GetChildCnt() == 2 &&
+ nWork->GetChild(0)->GetReturnType() == XB_EXP_DATE && nWork->GetChild(1)->GetReturnType() == XB_EXP_DATE )
+ nWork->SetReturnType( XB_EXP_NUMERIC );
+ else if( nWork->GetChildCnt() > 0 )
+ nWork->SetReturnType( nWork->GetChild(0)->GetReturnType());
+ else{
+ iErrorStop = 90;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+ if( nWork->GetResultLen() == 0 ){
+
+ switch( nWork->GetReturnType() ){
+
+ case XB_EXP_NUMERIC:
+ nWork->SetResultLen( 4 );
+ break;
+
+ case XB_EXP_CHAR:
+ if( nWork->GetNodeType() != XB_EXP_OPERATOR ){
+ iErrorStop = 100;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ if( nWork->GetChildCnt() < 2 ){
+ iErrorStop = 110;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ nChild1 = nWork->GetChild( 0 );
+ nChild2 = nWork->GetChild( 1 );
+ nWork->SetResultLen( nChild1->GetResultLen() + nChild2->GetResultLen());
+ break;
+
+ case XB_EXP_DATE:
+ nWork->SetResultLen( 8 );
+ break;
+
+ case XB_EXP_LOGICAL:
+ nWork->SetResultLen( 1 );
+ break;
+
+ default:
+ iErrorStop = 120;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ // break;
+ }
+ }
+ if( nWork->IsUnaryOperator() ){
+ if( nWork->GetChildCnt() != 1 ){
+ iErrorStop = 130;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ } else if( nWork->IsOperator() && nWork->GetChildCnt() != 2 ){
+ iErrorStop = 140;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ nWork = GetNextNode( nWork );
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::ParseExpression() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+ return iRc;
+}
+/*************************************************************************/
+//! Parse expression constant.
+/*!
+ \param t - Token.
+ \param n - Node.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbExp::ParseExpressionConstant( xbExpToken &t, xbExpNode *n ){
+
+ xbDate dtWork;
+ n->SetReturnType( t.cReturnType );
+
+ // std::cout << "parse expression constant[" << t.sToken << "]\n";
+
+ switch( t.cReturnType ){
+ case XB_EXP_CHAR:
+ n->SetResultLen( t.sToken.Len() );
+ n->SetResult( t.sToken );
+ break;
+
+ case XB_EXP_DATE:
+ n->SetResultLen( 8 );
+ dtWork.Set( t.sToken );
+ n->SetResult( dtWork );
+ break;
+
+ case XB_EXP_LOGICAL:
+ n->SetResultLen( 1 );
+ if( strncmp( t.sToken, "T", 1 ) == 0 )
+ n->SetResult( (xbBool) xbTrue );
+ else
+ n->SetResult( (xbBool) xbFalse );
+ break;
+
+ case XB_EXP_NUMERIC:
+ n->SetResultLen( 4 );
+ n->SetResult( strtod( t.sToken, 0 ));
+ n->SetResult( t.sToken );
+ break;
+
+ default:
+ return XB_PARSE_ERROR;
+ // break;
+ }
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! Parse expression field.
+/*!
+ \param t - Token.
+ \param n - Node.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbExp::ParseExpressionField( xbExpToken &t, xbExpNode *n ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbDbf * pDbf;
+ xbString sFieldName;
+
+ // do the db lookup and set the field number for the field
+
+ try{
+
+ xbUInt32 lPos;
+ if(( lPos = t.sToken.Pos( "->" )) > 0 ){
+ // table name is part of the token
+ xbString sTableName = t.sToken;
+ sTableName.Left( lPos-1 );
+ sFieldName = t.sToken;
+ sFieldName.Mid( lPos + 2, t.sToken.Len() - lPos - 1 );
+ pDbf = (xbDbf *) xbase->GetDbfPtr( sTableName );
+ } else {
+ // table name is not part of the token
+ pDbf = dbf;
+ sFieldName = t.sToken;
+ }
+ if( !pDbf ){
+ iErrorStop = 10;
+ iRc = XB_INVALID_FIELD;
+ throw iRc;
+ }
+ xbInt16 iFieldNo = 0;
+
+ if(( iRc = pDbf->GetFieldNo( sFieldName, iFieldNo )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ char cFieldType;
+ if(( iRc = pDbf->GetFieldType( iFieldNo, cFieldType )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ n->SetDbfInfo( pDbf, iFieldNo );
+ switch( cFieldType ){
+ case XB_CHAR_FLD:
+ n->SetReturnType( XB_EXP_CHAR );
+ break;
+
+ case XB_LOGICAL_FLD:
+ n->SetReturnType( XB_EXP_LOGICAL );
+ break;
+
+ case XB_NUMERIC_FLD:
+ case XB_FLOAT_FLD:
+ n->SetReturnType( XB_EXP_NUMERIC );
+ break;
+
+ case XB_DATE_FLD:
+ n->SetReturnType( XB_EXP_DATE );
+ break;
+
+ case XB_MEMO_FLD:
+ default:
+ iErrorStop = 30;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ // break;
+ }
+ n->SetNodeText( sFieldName );
+ xbInt16 iResultLen = 0;
+ if(( iRc = pDbf->GetFieldLen( iFieldNo, iResultLen )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ n->SetResultLen( (xbUInt32) iResultLen );
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::ParseExpressionField() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+ return iRc;
+}
+
+/*************************************************************************/
+//! Parse expression function.
+/*!
+ \param t - Token.
+ \param n - Node.
+ \param iWeight
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbExp::ParseExpressionFunction( xbExpToken &t, xbExpNode *n, xbInt16 iWeight ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ // find the first "("
+ xbUInt32 lPos = t.sToken.Pos( '(' );
+ if( lPos == 0 ){
+ iErrorStop = 10;
+ iRc = XB_INVALID_FUNCTION;
+ throw iRc;
+ }
+ // Get the function name and look it up in the table
+
+
+ xbString sFunc = t.sToken;
+ sFunc.Left( lPos - 1 ).Trim();
+ char cReturnType;
+ xbInt16 i = 0;
+ xbInt32 l = 0;
+ if(( iRc = xbase->GetFunctionInfo( sFunc, cReturnType, i, l )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ n->SetNodeText( sFunc );
+
+
+ // Get the function parms
+ xbString sParms = t.sToken;
+ sParms.Mid( lPos+1, t.sToken.Len() - lPos );
+ lPos = sParms.GetLastPos( ')' );
+ if( lPos == 0 ){
+ iErrorStop = 30;
+ iRc = XB_INVALID_FUNCTION;
+ throw iRc;
+ }
+
+ // remove the trailing ")" paren
+ sParms.Left( lPos - 1 ).Trim();
+
+ // if this function has parms, put them in the tree
+ if( sParms.Len() > 0 ){
+ xbExp enr( xbase, dbf );
+
+ // create a linked list of parms
+ xbLinkList<xbString> llParms;
+ if(( iRc = ParseExpressionFunctionParms( sParms, llParms )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ // for each function parm, recursively process it
+ xbLinkListNode<xbString> * llN = llParms.GetHeadNode();
+ xbString sParm;
+ while( llN ){
+ sParm = llN->GetKey();
+ if(( iRc = enr.ParseExpression( sParm, iWeight + 10 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ n->AddChild( enr.GetTreeHandle());
+ enr.ClearTreeHandle();
+ llN = llN->GetNextNode();
+ }
+ llParms.Clear();
+ }
+
+ if( cReturnType == '1' ){
+ if( n->GetChildCnt() > 0 ){
+ xbExpNode *n1 = n->GetChild( 0 );
+ n->SetReturnType( n1->GetReturnType());
+ }
+
+ } else {
+ n->SetReturnType( cReturnType );
+ }
+
+ if(( iRc = CalcFunctionResultLen( n )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::ParseExpressionFunction() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+ return iRc;
+}
+
+/*************************************************************************/
+//! Parse expression function.
+/*!
+
+ Creates a linked list of function parms as xbStrings
+ This function pulls out the parms and addresses embedded parens and quotes within the parms
+
+ \param sParms
+ \param lParms
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::ParseExpressionFunctionParms( const xbString &sParms, xbLinkList<xbString> & llParms ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 iParenCtr = 0;
+ xbInt16 iInQuotes = 0;
+ xbInt16 iDoubleQuotes = 0;
+ xbInt16 iSingleQuotes = 0;
+ xbInt32 lStartPos = 0;
+ xbInt32 lParmLen = 0;
+
+ xbString sParm;
+
+ try{
+ const char *sp = sParms;
+
+ while( *sp ){
+ if( *sp == '(')
+ iParenCtr++;
+ else if( *sp == ')' )
+ iParenCtr--;
+ else if( !iInQuotes && *sp == '"' ){
+ iInQuotes++;
+ iDoubleQuotes++;
+ } else if( iInQuotes && *sp == '"' ){
+ iInQuotes--;
+ iDoubleQuotes--;
+ }
+ else if( !iInQuotes && *sp == '\'' ){
+ iInQuotes++;
+ iSingleQuotes++;
+ } else if( iInQuotes && *sp == '\'' ){
+ iInQuotes--;
+ iSingleQuotes--;
+
+ } else if( !iInQuotes && !iParenCtr && *sp == ',' ){
+ // found a valid comma - at the end of a parm
+ // add it to the end of the linked list
+ sParm = sParms;
+ sParm.Mid( (xbUInt32) lStartPos + 1, (xbUInt32) lParmLen ).Trim(); // mid is one based
+ llParms.InsertAtEnd( sParm );
+
+ // set the start pos for the next one on the list
+ lStartPos += lParmLen + 1;
+ lParmLen = -1;
+ // lParmLen = 0;
+ }
+ lParmLen++;
+ sp++;
+ }
+ if( lParmLen > 0 ){
+ // get the last parm, it didn't end with a comma
+ sParm = sParms;
+ sParm.Mid( (xbUInt32) lStartPos + 1, (xbUInt32) lParmLen ).Trim();
+ llParms.InsertAtEnd( sParm );
+ }
+
+ }
+ // try / catch not used in this method, structure added for potential future use
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::ParseExpressionFunctionParms() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+ return iRc;
+}
+/*************************************************************************/
+//! Parse expression operator.
+/*!
+ \param t - Token.
+ \param n - Node.
+ \param iWeight
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbExp::ParseExpressionOperator( xbExpToken &t, xbExpNode *n, xbInt16 iWeight ){
+
+ n->SetResult( t.sToken );
+ n->SetWeight( iWeight + OperatorWeight( t.sToken) );
+
+// std::cout << "ParseExpressionOperator [" << t.cPrevNodeType << "][" << t.sToken << "] Weight = [" << iWeight;
+// std::cout << "] PrevReturnType [" << t.cPrevReturnType;
+// std::cout << "] Operator weight [" << OperatorWeight( t.sToken ) << "] getweight [" << n->GetWeight() << "]\n";
+
+ if( t.sToken == "**" || t.sToken == "^" ||
+ t.sToken == "*" || t.sToken == "/" || t.sToken == "%" || t.sToken == "*=" || t.sToken == "/=" )
+ n->SetReturnType( XB_EXP_NUMERIC );
+
+ else if( t.sToken == "--" || t.sToken == "++" || t.sToken == "+=" || t.sToken == "-=" ) // could be date or numeric
+ n->SetReturnType( XB_EXP_UNKNOWN );
+
+ else if( t.cPrevReturnType == XB_EXP_CHAR && ( t.sToken == "+" || t.sToken == "-" ))
+ n->SetReturnType( XB_EXP_CHAR );
+
+ else if( t.sToken == ".AND." || t.sToken == ".OR." || t.sToken == ".NOT." ||
+ t.sToken == "AND" || t.sToken == "OR" || t.sToken == "NOT" ||
+ t.sToken == ">" || t.sToken == ">=" || t.sToken == "<" ||
+ t.sToken == "<=" || t.sToken == "<>" || t.sToken == "!=" ||
+ t.sToken == "$" || t.sToken == "#" || t.sToken == "=" )
+ n->SetReturnType( XB_EXP_LOGICAL );
+
+
+ else if( t.cPrevReturnType == XB_EXP_UNKNOWN )
+ n->SetReturnType( XB_EXP_UNKNOWN );
+
+ // added for date constant logic 10/28/17
+ else if(( t.sToken == "+" || t.sToken == "-" ) && t.cPrevReturnType == XB_EXP_DATE )
+ n->SetReturnType( XB_EXP_DATE );
+
+ else if( t.sToken == "+" || t.sToken == "-" )
+ n->SetReturnType( XB_EXP_NUMERIC );
+
+ return XB_NO_ERROR;
+}
+
+
+/************************************************************************/
+//! ProcessExpression
+/*! This method processes an expression tree leaving the result in the
+ root node of the tree
+*/
+xbInt16 xbExp::ProcessExpression(){
+ return ProcessExpression( 0 );
+}
+/************************************************************************/
+//! ProcessExpression
+/*! This method processes a parsed expression tree leaving the result in the
+ root node of the tree
+ \param iRecBufSw Record buffer to use when evaluating expression.<br>
+ 0 - Current record buffer.<br>
+ 1 - Original record buffer.
+*/
+
+xbInt16 xbExp::ProcessExpression( xbInt16 iRecBufSw ){
+
+// iRecBufSw 0 - Record Buffer
+// 1 - Original Record Buffer
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ xbExpNode * nWork = GetNextNode( NULL );
+ xbExpNode * nChild1;
+ xbDbf * dbf;
+ xbString sWork1;
+ xbString sWork2;
+ xbString sOperator;
+ xbDate dtWork1;
+
+ xbBool bWork;
+ xbDouble dWork;
+
+ while( nWork ){
+ switch( nWork->GetNodeType() ){
+
+ case XB_EXP_CONSTANT:
+ break;
+
+ case XB_EXP_PRE_OPERATOR: // increment value before setting in head node
+ if( nWork->GetChildCnt() != 1 ){
+ iErrorStop = 10;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ nChild1 = nWork->GetChild( 0 );
+ //if( nChild1->GetReturnType() == XB_EXP_DATE )
+ // nChild1->SetResult( (xbDouble) nChild1->GetDateResult().JulianDays());
+
+ nWork->GetNodeText( sWork1 );
+ if( sWork1 == "++" )
+ nChild1->SetResult( nChild1->GetNumericResult() + 1 );
+ else
+ nChild1->SetResult( nChild1->GetNumericResult() - 1 );
+
+ nWork->SetResult( nChild1->GetNumericResult());
+
+ //if( nChild1->GetReturnType() == XB_EXP_DATE ){
+ // dtWork1.JulToDate8( (xbInt32) nChild1->GetNumericResult());
+ // nChild1->SetResult( dtWork1 );
+ // nWork->SetResult( dtWork1 );
+ // }
+ break;
+
+ case XB_EXP_POST_OPERATOR: // increment value after setting in head node
+ if( nWork->GetChildCnt() != 1 ){
+ iErrorStop = 20;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ nChild1 = nWork->GetChild( 0 );
+ //if( nChild1->GetReturnType() == XB_EXP_DATE ){
+ // nWork->SetResult( nChild1->GetDateResult());
+ // nChild1->SetResult( (xbDouble) nChild1->GetDateResult().JulianDays());
+ //}
+ //else
+ nWork->SetResult( nChild1->GetNumericResult());
+
+ nWork->GetNodeText( sWork1 );
+ if( sWork1 == "++" )
+ nChild1->SetResult( nChild1->GetNumericResult() + 1 );
+ else
+ nChild1->SetResult( nChild1->GetNumericResult() - 1 );
+
+ //if( nChild1->GetReturnType() == XB_EXP_DATE ){
+ // dtWork1.JulToDate8( (xbInt32) nChild1->GetNumericResult());
+ // nChild1->SetResult( dtWork1 );
+ // }
+ break;
+
+ case XB_EXP_FIELD:
+
+ if(( dbf = nWork->GetDbf()) == NULL ){
+ iErrorStop = 30;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ switch( nWork->GetReturnType()){
+ case XB_EXP_CHAR:
+ if(( iRc = dbf->GetField( nWork->GetFieldNo(), sWork1, iRecBufSw )) < XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ nWork->SetResult( sWork1 );
+ break;
+
+ case XB_EXP_DATE:
+
+ if(( iRc = dbf->GetField( nWork->GetFieldNo(), sWork1, iRecBufSw )) < XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ if( sWork1 == " " ){
+ nWork->SetResult( (xbDouble) 21474835648 ); // dbase sets a date value in ndx to this if spaces on dbf record
+ } else {
+ dtWork1.Set( sWork1 );
+ nWork->SetResult( (xbDouble) dtWork1.JulianDays() );
+ }
+ break;
+
+ case XB_EXP_LOGICAL:
+ if(( iRc = dbf->GetLogicalField( nWork->GetFieldNo(), bWork, iRecBufSw )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ nWork->SetResult( bWork );
+ break;
+
+ case XB_EXP_NUMERIC:
+ if(( iRc = dbf->GetDoubleField( nWork->GetFieldNo(), dWork, iRecBufSw )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ nWork->SetResult( dWork );
+ break;
+
+ default:
+ iErrorStop = 80;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ // break;
+ }
+ break;
+
+
+ case XB_EXP_OPERATOR:
+ if(( iRc = ProcessExpressionOperator( nWork )) != XB_NO_ERROR ){
+ iErrorStop = 300;
+ throw iRc;
+ }
+
+ break;
+
+ case XB_EXP_FUNCTION:
+ if(( iRc = ProcessExpressionFunction( nWork, iRecBufSw )) != XB_NO_ERROR ){
+ iErrorStop = 400;
+ throw iRc;
+ }
+ break;
+
+ default:
+ iErrorStop = 500;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ // break;
+ }
+ nWork = GetNextNode( nWork );
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::ProcessExpression() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+ return iRc;
+}
+/*************************************************************************/
+//! ProcessExpression
+/*! This method processes an expression tree for a given node.
+*/
+
+xbInt16 xbExp::ProcessExpressionFunction( xbExpNode * n, xbInt16 iRecBufSw ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ xbString sFunction;
+ xbString sResult;
+ xbDouble dResult;
+ xbDate dtResult;
+ xbBool bResult;
+
+ n->GetNodeText( sFunction );
+
+ // process functions with no children first
+ xbExpNode * nChild1;
+ if( n->GetChildCnt() == 0 ){
+ if( sFunction == "DATE" ){
+ if(( iRc = xbase->DATE( dtResult )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ n->SetResult( dtResult );
+ } else if( sFunction == "DEL" ){
+ if(( iRc = xbase->DEL( dbf, sResult, iRecBufSw )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "DELETED" ){
+ if(( iRc = xbase->DELETED( dbf, bResult, iRecBufSw )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ n->SetResult( bResult );
+ } else if( sFunction == "RECCOUNT" ){
+ if(( iRc = xbase->RECCOUNT( dbf, dResult )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "RECNO" ){
+ if(( iRc = xbase->RECNO( dbf, dResult )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ }
+ // process functions with one child
+ } else if( n->GetChildCnt() == 1 ){
+
+ nChild1 = n->GetChild( 0 );
+
+ if( sFunction == "ABS" ){
+ if(( iRc = xbase->ABS( nChild1->GetNumericResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "ALLTRIM" ){
+ if(( iRc = xbase->ALLTRIM( nChild1->GetStringResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "ASC" ){
+ if(( iRc = xbase->ASC( nChild1->GetStringResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 220;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "CDOW" ){
+ xbDate d( (xbInt32) nChild1->GetNumericResult());
+ if(( iRc = xbase->CDOW( d, sResult )) != XB_NO_ERROR ){
+ iErrorStop = 230;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "CHR" ){
+ if(( iRc = xbase->CHR( nChild1->GetNumericResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 240;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "CMONTH" ){
+ xbDate d( (xbInt32) nChild1->GetNumericResult());
+ if(( iRc = xbase->CMONTH( d, sResult )) != XB_NO_ERROR ){
+ iErrorStop = 250;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "CTOD" ){
+ if(( iRc = xbase->CTOD( nChild1->GetStringResult(), dtResult )) != XB_NO_ERROR ){
+ iErrorStop = 260;
+ throw iRc;
+ }
+ n->SetResult( dtResult );
+ } else if( sFunction == "DAY" ){
+ xbDate d( (xbInt32) nChild1->GetNumericResult());
+ if(( iRc = xbase->DAY( d, dResult )) != XB_NO_ERROR ){
+ iErrorStop = 270;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "DESCEND" ){
+
+ if( n->GetReturnType() == XB_EXP_CHAR ){
+ if(( iRc = xbase->DESCEND( nChild1->GetStringResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 280;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+
+ } else if( n->GetReturnType() == XB_EXP_DATE ){
+ xbDate d( (xbInt32) nChild1->GetNumericResult());
+ if(( iRc = xbase->DESCEND( d, dtResult )) != XB_NO_ERROR ){
+ iErrorStop = 290;
+ throw iRc;
+ }
+ n->SetResult( dtResult );
+
+ } else if( n->GetReturnType() == XB_EXP_NUMERIC ){
+ if(( iRc = xbase->DESCEND( nChild1->GetNumericResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 300;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+
+ } else {
+ iErrorStop = 310;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+
+ } else if( sFunction == "DOW" ){
+ xbDate d( (xbInt32) nChild1->GetNumericResult());
+ if(( iRc = xbase->DOW( d, dResult )) != XB_NO_ERROR ){
+ iErrorStop = 320;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "DTOC" ){
+ xbDate d( (xbInt32) nChild1->GetNumericResult());
+ if(( iRc = xbase->DTOC( d, sResult )) != XB_NO_ERROR ){
+ iErrorStop = 330;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "DTOS" ){
+ xbDate d( (xbInt32) nChild1->GetNumericResult());
+ if(( iRc = xbase->DTOS( d, sResult )) != XB_NO_ERROR ){
+ iErrorStop = 340;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "EXP" ){
+ if(( iRc = xbase->EXP( nChild1->GetNumericResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 350;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "INT" ){
+ if(( iRc = xbase->INT( nChild1->GetNumericResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 360;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "ISALPHA" ){
+ if(( iRc = xbase->ISALPHA( nChild1->GetStringResult(), bResult )) != XB_NO_ERROR ){
+ iErrorStop = 370;
+ throw iRc;
+ }
+ n->SetResult( bResult );
+ } else if( sFunction == "ISLOWER" ){
+ if(( iRc = xbase->ISLOWER( nChild1->GetStringResult(), bResult )) != XB_NO_ERROR ){
+ iErrorStop = 380;
+ throw iRc;
+ }
+ n->SetResult( bResult );
+ } else if( sFunction == "ISUPPER" ){
+ if(( iRc = xbase->ISUPPER( nChild1->GetStringResult(), bResult )) != XB_NO_ERROR ){
+ iErrorStop = 390;
+ throw iRc;
+ }
+ n->SetResult( bResult );
+ } else if( sFunction == "LEN" ){
+ if(( iRc = xbase->LEN( nChild1->GetStringResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 400;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "LOG" ){
+ if(( iRc = xbase->LOG( nChild1->GetNumericResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 410;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "LTRIM" ){
+ if(( iRc = xbase->LTRIM( nChild1->GetStringResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 420;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "LOWER" ){
+ if(( iRc = xbase->LOWER( nChild1->GetStringResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 430;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "MONTH" ){
+ xbDate d( (xbInt32) nChild1->GetNumericResult());
+ if(( iRc = xbase->MONTH( d, dResult )) != XB_NO_ERROR ){
+ iErrorStop = 440;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "RTRIM" ){
+ if(( iRc = xbase->RTRIM( nChild1->GetStringResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 450;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "STOD" ){
+ if(( iRc = xbase->STOD( nChild1->GetStringResult(), dtResult )) != XB_NO_ERROR ){
+ iErrorStop = 460;
+ throw iRc;
+ }
+ n->SetResult( dtResult );
+ } else if( sFunction == "SPACE" ){
+ if(( iRc = xbase->SPACE( (xbInt32) nChild1->GetNumericResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 470;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "SQRT" ){
+ if(( iRc = xbase->SQRT( nChild1->GetNumericResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 480;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "STR" ){
+ if(( iRc = xbase->STR( nChild1->GetNumericResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 490;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "TRIM" ){
+ if(( iRc = xbase->TRIM( nChild1->GetStringResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 500;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "UPPER" ){
+ if(( iRc = xbase->UPPER( nChild1->GetStringResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 510;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "VAL" ){
+ if(( iRc = xbase->VAL( nChild1->GetStringResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 520;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "YEAR" ){
+ xbDate d( (xbInt32) nChild1->GetNumericResult());
+ if(( iRc = xbase->YEAR( d, dResult )) != XB_NO_ERROR ){
+ iErrorStop = 530;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else {
+ iErrorStop = 540;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ } else if( n->GetChildCnt() == 2 ){
+ xbExpNode * nChild2;
+ nChild1 = n->GetChild( 0 );
+ nChild2 = n->GetChild( 1 );
+
+ if( sFunction == "AT" ){
+ if(( iRc = xbase->AT( nChild1->GetStringResult(), nChild2->GetStringResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 700;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "LEFT" ){
+ if(( iRc = xbase->LEFT( nChild1->GetStringResult(), (xbUInt32) nChild2->GetNumericResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 710;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "MAX" ){
+ if(( iRc = xbase->MAX( nChild1->GetNumericResult(), nChild2->GetNumericResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 720;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ } else if( sFunction == "MIN" ){
+ if(( iRc = xbase->MIN( nChild1->GetNumericResult(), nChild2->GetNumericResult(), dResult )) != XB_NO_ERROR ){
+ iErrorStop = 730;
+ throw iRc;
+ }
+ n->SetResult( dResult );
+ }
+ else if( sFunction == "REPLICATE" ){
+ if(( iRc = xbase->REPLICATE( nChild1->GetStringResult(), (xbUInt32) nChild2->GetNumericResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 800;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "RIGHT" ){
+ if(( iRc = xbase->RIGHT( nChild1->GetStringResult(), (xbUInt32) nChild2->GetNumericResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 810;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "STR" ){
+ if(( iRc = xbase->STR( nChild1->GetNumericResult(), (xbUInt32) nChild2->GetNumericResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 820;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else {
+ iErrorStop = 830;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ } else if( n->GetChildCnt() == 3 ){
+ xbExpNode * nChild2;
+ xbExpNode * nChild3;
+ nChild1 = n->GetChild( 0 );
+ nChild2 = n->GetChild( 1 );
+ nChild3 = n->GetChild( 2 );
+
+ if( sFunction == "IIF" ){
+ if(( iRc = xbase->IIF( nChild1->GetBoolResult(), nChild2->GetStringResult(), nChild3->GetStringResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 900;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "STR" ){
+ if(( iRc = xbase->STR( nChild1->GetNumericResult(), (xbUInt32) nChild2->GetNumericResult(), (xbUInt32) nChild3->GetNumericResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 910;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "STRZERO" ){
+ if(( iRc = xbase->STRZERO( nChild1->GetNumericResult(), (xbUInt32) nChild2->GetNumericResult(), (xbUInt32) nChild3->GetNumericResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 920;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else if( sFunction == "SUBSTR" ){
+ if(( iRc = xbase->SUBSTR( nChild1->GetStringResult(), (xbUInt32) nChild2->GetNumericResult(), (xbUInt32) nChild3->GetNumericResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 930;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else {
+ iErrorStop = 950;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ } else if( n->GetChildCnt() == 4 ){
+ xbExpNode * nChild2;
+ xbExpNode * nChild3;
+ xbExpNode * nChild4;
+ nChild1 = n->GetChild( 0 );
+ nChild2 = n->GetChild( 1 );
+ nChild3 = n->GetChild( 2 );
+ nChild4 = n->GetChild( 3 );
+
+ if( sFunction == "STR" ){
+ if(( iRc = xbase->STR( nChild1->GetNumericResult(), (xbUInt32) nChild2->GetNumericResult(),
+ (xbUInt32) nChild3->GetNumericResult(), nChild4->GetStringResult(), sResult )) != XB_NO_ERROR ){
+ iErrorStop = 1000;
+ throw iRc;
+ }
+ n->SetResult( sResult );
+ } else {
+ iErrorStop = 1010;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+
+ } else {
+ iErrorStop = 2000;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::ProcessExpressionFunction() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+ return iRc;
+}
+/*************************************************************************/
+//! Process Expression Operator
+/*! This method processes an expression operator for a given node.
+*/
+
+xbInt16 xbExp::ProcessExpressionOperator( xbExpNode * n ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ xbExpNode * nChild1 = NULL;
+ xbExpNode * nChild2 = NULL;
+ xbString sOperator;
+ xbString sWork1;
+ xbString sWork2;
+ xbDate dtWork1;
+
+ xbString sMsg;
+
+ try{
+
+ n->GetNodeText( sOperator );
+ nChild1 = n->GetChild( 0 );
+ if( !n->IsUnaryOperator())
+ nChild2 = n->GetChild( 1 );
+
+ switch( n->GetReturnType()){
+ case XB_EXP_CHAR:
+ if( sOperator == "+" ){
+ sWork1 = nChild1->GetStringResult();
+ sWork1 += nChild2->GetStringResult();
+ n->SetResult( sWork1 );
+ } else if( sOperator == "-" ){
+ sWork1 = nChild1->GetStringResult();
+ sWork1.Rtrim();
+ sWork1 += nChild2->GetStringResult();
+ sWork1.PadRight( ' ', n->GetResultLen());
+ n->SetResult( sWork1 );
+ } else {
+ iErrorStop = 100;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ break;
+
+ case XB_EXP_NUMERIC:
+ if( sOperator == "+" )
+ n->SetResult( nChild1->GetNumericResult() + nChild2->GetNumericResult());
+ else if( sOperator == "-" ){
+ n->SetResult( nChild1->GetNumericResult() - nChild2->GetNumericResult());
+
+ }
+ else if( sOperator == "*" )
+ n->SetResult( nChild1->GetNumericResult() * nChild2->GetNumericResult());
+ else if( sOperator == "/" )
+ n->SetResult( nChild1->GetNumericResult() / nChild2->GetNumericResult());
+ else if( sOperator == "^" || sOperator == "**" )
+ n->SetResult( pow( nChild1->GetNumericResult(), nChild2->GetNumericResult()));
+ else if( sOperator == "+=" ){
+ n->SetResult( nChild1->GetNumericResult() + nChild2->GetNumericResult());
+ nChild1->SetResult( n->GetNumericResult() );
+ }
+ else if( sOperator == "-=" ){
+ n->SetResult( nChild1->GetNumericResult() - nChild2->GetNumericResult());
+ nChild1->SetResult( n->GetNumericResult() );
+ }
+ else if( sOperator == "*=" ){
+ n->SetResult( nChild1->GetNumericResult() * nChild2->GetNumericResult());
+ nChild1->SetResult( n->GetNumericResult() );
+ }
+ else if( sOperator == "/=" ){
+ n->SetResult( nChild1->GetNumericResult() / nChild2->GetNumericResult());
+ nChild1->SetResult( n->GetNumericResult() );
+ } else {
+ iErrorStop = 200;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ break;
+
+
+ case XB_EXP_DATE:
+ // if date values in the leaf nodes, convert to numeric for operator logic
+
+ if( sOperator == "+" )
+ n->SetResult( nChild1->GetNumericResult() + nChild2->GetNumericResult());
+ else if( sOperator == "-" ){
+ n->SetResult( nChild1->GetNumericResult() - nChild2->GetNumericResult());
+ xbDate d( (xbInt32) n->GetNumericResult());
+ }
+ else if( sOperator == "+=" ){
+ n->SetResult( nChild1->GetNumericResult() + nChild2->GetNumericResult());
+ nChild1->SetResult( n->GetNumericResult() );
+ }
+ else if( sOperator == "-=" ){
+ n->SetResult( nChild1->GetNumericResult() - nChild2->GetNumericResult());
+ nChild1->SetResult( n->GetNumericResult() );
+ } else {
+ iErrorStop = 300;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ break;
+
+ case XB_EXP_LOGICAL:
+
+ if( !n->IsUnaryOperator() && (nChild1->GetReturnType() != nChild2->GetReturnType())){
+ iErrorStop = 400;
+ iRc = XB_INCOMPATIBLE_OPERANDS;
+ throw iRc;
+ }
+
+ if( sOperator == ".AND." || sOperator == "AND" )
+ n->SetResult((xbBool) (nChild1->GetBoolResult() && nChild2->GetBoolResult()) );
+
+ else if( sOperator == ".OR." || sOperator == "OR" )
+ n->SetResult((xbBool) (nChild1->GetBoolResult() || nChild2->GetBoolResult()) );
+
+ else if( sOperator == ".NOT." || sOperator == "NOT" ){
+ if( nChild1->GetBoolResult())
+ n->SetResult((xbBool) xbFalse );
+ else
+ n->SetResult((xbBool) xbTrue );
+ }
+
+ else if( sOperator == ">" ){
+
+ if( nChild1->GetReturnType() == XB_EXP_CHAR )
+ n->SetResult((xbBool)(nChild1->GetStringResult() > nChild2->GetStringResult()));
+ else if( nChild1->GetReturnType() == XB_EXP_NUMERIC || nChild1->GetReturnType() == XB_EXP_DATE )
+ n->SetResult((xbBool)(nChild1->GetNumericResult() > nChild2->GetNumericResult()));
+
+ else {
+ iErrorStop = 410;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+
+ else if( sOperator == ">=" ){
+ if( nChild1->GetReturnType() == XB_EXP_CHAR )
+ n->SetResult((xbBool)(nChild1->GetStringResult() >= nChild2->GetStringResult()));
+
+ else if( nChild1->GetReturnType() == XB_EXP_NUMERIC || nChild1->GetReturnType() == XB_EXP_DATE )
+ n->SetResult((xbBool)(nChild1->GetNumericResult() >= nChild2->GetNumericResult()));
+
+ else {
+ iErrorStop = 420;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+
+ else if( sOperator == "<" ){
+
+ if( nChild1->GetReturnType() == XB_EXP_CHAR )
+ n->SetResult((xbBool)( nChild1->GetStringResult() < nChild2->GetStringResult()));
+
+ else if( nChild1->GetReturnType() == XB_EXP_NUMERIC || nChild1->GetReturnType() == XB_EXP_DATE )
+ n->SetResult((xbBool)( nChild1->GetNumericResult() < nChild2->GetNumericResult()));
+
+ else {
+ iErrorStop = 430;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+
+ else if( sOperator == "<=" ){
+
+ if( nChild1->GetReturnType() == XB_EXP_CHAR )
+ n->SetResult((xbBool)( nChild1->GetStringResult() <= nChild2->GetStringResult()));
+
+ else if( nChild1->GetReturnType() == XB_EXP_NUMERIC || nChild1->GetReturnType() == XB_EXP_DATE )
+ n->SetResult((xbBool)( nChild1->GetNumericResult() <= nChild2->GetNumericResult()));
+
+ else {
+ iErrorStop = 440;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+
+ else if( sOperator == "<>" || sOperator == "#" || sOperator == "!=" ){
+
+ if( nChild1->GetReturnType() == XB_EXP_CHAR )
+ n->SetResult((xbBool)( nChild1->GetStringResult() != nChild2->GetStringResult()));
+
+ else if( nChild1->GetReturnType() == XB_EXP_NUMERIC || nChild1->GetReturnType() == XB_EXP_DATE )
+ n->SetResult((xbBool)( nChild1->GetNumericResult() != nChild2->GetNumericResult()));
+
+ else {
+ iErrorStop = 450;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+ }
+
+ else if( sOperator == "$" ){
+ if( nChild1->GetReturnType() == XB_EXP_CHAR )
+ if( nChild2->GetStringResult().Pos( nChild1->GetStringResult()) > 0 )
+ n->SetResult((xbBool) xbTrue );
+ else
+ n->SetResult((xbBool) xbFalse );
+ else {
+ iErrorStop = 460;
+ iRc = XB_INCOMPATIBLE_OPERANDS;
+ throw iRc;
+ }
+ }
+
+ else if( sOperator == "=" ){
+
+ if( nChild1->GetReturnType() == XB_EXP_CHAR ){
+ xbString sChld1 = nChild1->GetStringResult();
+ xbString sChld2 = nChild2->GetStringResult();
+ sChld1.Rtrim();
+ sChld2.Rtrim();
+ n->SetResult((xbBool)( sChld1 == sChld2 ));
+
+ } else if( nChild1->GetReturnType() == XB_EXP_NUMERIC || nChild1->GetReturnType() == XB_EXP_DATE )
+ n->SetResult((xbBool)( nChild1->GetNumericResult() == nChild2->GetNumericResult()));
+
+ else {
+ iErrorStop = 470;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+
+ } else {
+ iErrorStop = 500;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ }
+
+ break;
+
+ default:
+ iErrorStop = 600;
+ iRc = XB_PARSE_ERROR;
+ throw iRc;
+ // break;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbexp::ProcessExpressionOperator() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ }
+ return iRc;
+}
+
+/*************************************************************************/
+}; // namespace
+#endif // XB_EXPRESSION_SUPPORT
+/*************************************************************************/
diff --git a/src/core/xbexpnode.cpp b/src/core/xbexpnode.cpp
new file mode 100755
index 0000000..77a8c33
--- /dev/null
+++ b/src/core/xbexpnode.cpp
@@ -0,0 +1,562 @@
+/* xbexpnode.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2017,2022 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_EXPRESSION_SUPPORT
+
+namespace xb{
+/************************************************************************/
+//! @brief Constructor
+xbExpNode::xbExpNode(){
+ sNodeText = "";
+ cReturnType = 0;
+ cNodeType = 0;
+ dResult = 0;
+ iFieldNo = 0;
+ ulResultLen = 0;
+ iWeight = 0;
+ nParent = NULL;
+ dbf = NULL;
+}
+
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param sNodeText Node text.
+ \param cReturnType Return type.
+ \param cNodeType Node type.
+*/
+
+xbExpNode::xbExpNode( xbString &sNodeText, char cReturnType, char cNodeType ){
+ this->sNodeText = sNodeText;
+ this->cReturnType = cReturnType;
+ this->cNodeType = cNodeType;
+ dResult = 0;
+ iFieldNo = 0;
+ ulResultLen = 0;
+ iWeight = 0;
+ nParent = NULL;
+ dbf = NULL;
+}
+
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param sNodeText Node text.
+ \param cNodeType Node type.
+*/
+xbExpNode::xbExpNode( xbString &sNodeText, char cNodeType ){
+ this->sNodeText = sNodeText;
+ this->cReturnType = 0x00;
+ this->cNodeType = cNodeType;
+ dResult = 0;
+ iFieldNo = 0;
+ ulResultLen = 0;
+ iWeight = 0;
+ nParent = NULL;
+ dbf = NULL;
+}
+
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param cNodeType Node type.
+*/
+xbExpNode::xbExpNode( char cNodeType ){
+ this->cReturnType = 0x00;
+ this->cNodeType = cNodeType;
+ dResult = 0;
+ iFieldNo = 0;
+ ulResultLen = 0;
+ iWeight = 0;
+ nParent = NULL;
+ dbf = NULL;
+}
+
+/************************************************************************/
+//! @brief Deconstructor
+xbExpNode::~xbExpNode(){
+
+ xbExpNode * n;
+ while( llChildren.GetNodeCnt() > 0 ){
+ llChildren.RemoveFromFront( n );
+ delete n;
+ }
+}
+
+/************************************************************************/
+//! @brief Add child node to linked list.
+/*!
+ \param n Pointer to node to add to linked list.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbExpNode::AddChild( xbExpNode *n ){
+ n->SetParent( this );
+ return llChildren.InsertAtEnd( n );
+}
+
+/************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+
+//! @brief Dump Node.
+/*!
+ \param iOption xbTrue - Print child info if they exist.<bt>
+ xbFalse - Don't print child info.
+ \returns void.
+*/
+void xbExpNode::DumpNode( xbInt16 iOption ) const {
+ xbString sMsg;
+ std::cout << "Me=[" << this << "] ";
+ if( nParent )
+ std::cout << "Par=[" << nParent << "] ";
+
+ std::cout << "nTyp=[" << cNodeType << "] ";
+ std::cout << "dTyp=[" << cReturnType << "] ";
+ if( iWeight != 0 )
+ std::cout << "W=[" << iWeight << "] ";
+
+ if( cNodeType == XB_EXP_FIELD )
+ std::cout << "FieldNo=[" << iFieldNo << "] ";
+
+ std::cout << "Txt=[" << sNodeText << "] ";
+ if( sResult != "" )
+ std::cout << "sVal=[" << sResult << "] ";
+
+ if( ulResultLen > 0 )
+ std::cout << "Len=[" << ulResultLen << "] ";
+ if( cReturnType == XB_EXP_DATE ){
+ xbDate d( (xbInt32) dResult );
+ std::cout << "dtVal=[" << d.Str() << "] ";
+ }
+
+ if( cReturnType == XB_EXP_DATE || cReturnType == XB_EXP_NUMERIC ){
+ sMsg.Sprintf( "dVal=[%f]\n", dResult );
+ std::cout << sMsg.Str();
+ }
+
+ if( cReturnType == XB_EXP_LOGICAL ){
+ sMsg.Sprintf( "lVal=[%d]\n", (xbInt32) dResult );
+ std::cout << sMsg.Str();
+ }
+
+ if( iOption ){
+ xbLinkListNode<xbExpNode *> *lln = llChildren.GetHeadNode();
+ xbExpNode *n;
+ if( lln ){
+ std::cout << " Children: ";
+ while( lln ){
+ n = lln->GetKey();
+ std::cout << " [" << n << "]";
+ lln = lln->GetNextNode();
+ }
+ std::cout << std::endl;
+
+ lln = llChildren.GetHeadNode();
+ while( lln ){
+ n = lln->GetKey();
+ n->DumpNode( iOption );
+ lln = lln->GetNextNode();
+ }
+ }
+ }
+
+ std::cout << std::endl;
+}
+#endif
+
+/************************************************************************/
+//! @brief Get boolean result.
+/*!
+ \returns Boolean result.
+*/
+
+xbBool xbExpNode::GetBoolResult() const {
+ return (xbBool) dResult;
+}
+
+/************************************************************************/
+//! @brief Get pointer to child.
+/*!
+ \param ulChildNo - Which child? 1,2 or3
+ \returns Pointer to child node or null if none exists.
+*/
+xbExpNode *xbExpNode::GetChild( xbUInt32 ulChildNo ) const {
+
+ xbLinkListNode<xbExpNode *> *lln = llChildren.GetNodeForNo( ulChildNo );
+ if( lln )
+ return lln->GetKey();
+ else
+ return 0x00;
+}
+/************************************************************************/
+//! @brief Get child count.
+/*!
+ \returns Child count.
+*/
+xbUInt32 xbExpNode::GetChildCnt() const{
+ return llChildren.GetNodeCnt();
+}
+
+/************************************************************************/
+//! @brief Get the current child number for this node.
+/*!
+ \returns Child number: 1, 2 or 3.
+*/
+
+xbUInt32 xbExpNode::GetChildNo() const {
+
+ if( !nParent )
+ return 0;
+
+ for( xbUInt32 i = 0; i < nParent->GetChildCnt(); i++ ){
+ if( this == nParent->GetChild( i )){
+ // std::cout << "get child no [" << this << "][" << nParent->GetChild(i) << "]\n";
+ return i;
+ }
+ }
+ return 0;
+}
+
+/************************************************************************/
+//! @brief Get the dbf pointer.
+/*!
+ \returns Pointer to dbf.
+*/
+xbDbf *xbExpNode::GetDbf() const {
+ return dbf;
+}
+/************************************************************************/
+//! @brief Get the field number.
+/*!
+ \returns Field number for field node.
+*/
+
+xbInt16 xbExpNode::GetFieldNo() const {
+ return iFieldNo;
+}
+
+/*************************************************************************/
+//! @brief Get the first node.
+/*!
+ \returns Pointer to left most child node or *this if childless.
+*/
+
+xbExpNode *xbExpNode::GetFirstNode() {
+ xbExpNode *n = this;
+ while( n && n->GetChildCnt() > 0 )
+ n = n->GetChild(0);
+ return n;
+}
+
+/*************************************************************************/
+//! @brief Get the next node.
+/*!
+ \returns Pointer to right node or parent if right node does not exist.
+*/
+
+xbExpNode *xbExpNode::GetNextNode() const {
+
+ if( HasRightSibling())
+ return GetRightSibling()->GetFirstNode();
+ else
+ return nParent;
+}
+
+/************************************************************************/
+//! @brief Get the node text.
+/*!
+ \param sOutText Output string containing node text.
+ \returns void
+*/
+
+void xbExpNode::GetNodeText( xbString &sOutText ) const{
+ sOutText = sNodeText;
+}
+
+/************************************************************************/
+//! @brief Get the node type.
+/*!
+ \returns Node type.
+*/
+
+char xbExpNode::GetNodeType() const{
+ return cNodeType;
+}
+
+/************************************************************************/
+//! @brief Get numeric result.
+/*!
+ \returns Numeric result.
+*/
+
+xbDouble xbExpNode::GetNumericResult() const {
+ return dResult;
+}
+
+/************************************************************************/
+//! @brief Get parent.
+/*!
+ \returns Pointer to parent node.
+*/
+
+xbExpNode *xbExpNode::GetParent() const{
+ return nParent;
+}
+
+/************************************************************************/
+//! @brief Get result length.
+/*!
+ \returns Result length.
+*/
+xbUInt32 xbExpNode::GetResultLen() const{
+ return ulResultLen;
+}
+/************************************************************************/
+//! @brief Get result type.
+/*!
+ \returns Result type.
+*/
+char xbExpNode::GetReturnType() const{
+ return cReturnType;
+}
+
+/*************************************************************************/
+//! @brief Get right sibling.
+/*!
+ \returns Pointer to right sibling.
+*/
+
+xbExpNode *xbExpNode::GetRightSibling() const {
+
+ xbExpNode * nParent;
+ if(( nParent = GetParent()) == NULL )
+ return NULL;
+
+ if( nParent->GetChildCnt() <= 0 )
+ return NULL;
+
+ xbUInt32 ulChildNo = GetChildNo();
+
+ if( ulChildNo < (nParent->GetChildCnt() - 1))
+ return nParent->GetChild( ulChildNo + 1 );
+ else
+ return NULL;
+}
+/************************************************************************/
+//! @brief Get string result.
+/*!
+ \returns String result.
+*/
+xbString &xbExpNode::GetStringResult(){
+ return sResult;
+}
+/************************************************************************/
+//! @brief Get node weight.
+/*!
+ Each node is assigned a weight used internally to detmerine processing sequence.
+ \returns Node weight.
+*/
+
+xbInt16 xbExpNode::GetWeight() const {
+ return iWeight;
+}
+
+/*************************************************************************/
+//! @brief Determine if node has a right sibling.
+/*!
+ \returns xbTrue - Node has right sibling.<br>
+ xbFalse - Node has no right sibling.
+*/
+
+xbBool xbExpNode::HasRightSibling() const {
+
+ // std::cout << "in HasRightSibling [" << sNodeText << "]\n";
+
+ if( nParent == NULL )
+ return xbFalse;
+
+ xbUInt32 ulChildNo = GetChildNo();
+
+ if( ulChildNo < (nParent->GetChildCnt() - 1)){
+ // std::cout << "Has Right Sibling = " << iChildNo << "] of [" << nParent->GetChildCnt() << "]\n";
+ return xbTrue;
+}
+ else
+ return xbFalse;
+}
+
+
+/*************************************************************************/
+//! @brief Determine if node is an operator.
+/*!
+ \returns xbTrue - Node is an operator.<br>
+ xbFalse - Node is not an operator.
+*/
+
+xbBool xbExpNode::IsOperator() const {
+
+ if( cNodeType == XB_EXP_OPERATOR )
+ return xbTrue;
+ else
+ return xbFalse;
+}
+
+/*************************************************************************/
+//! @brief Determine if node is a unary operator.
+/*!
+ \returns xbTrue - Node is a unary operator.<br>
+ xbFalse - Node is not a unary operator.
+*/
+xbBool xbExpNode::IsUnaryOperator() const {
+
+ if( cNodeType == XB_EXP_PRE_OPERATOR || cNodeType == XB_EXP_POST_OPERATOR )
+ return xbTrue;
+ else if( cNodeType == XB_EXP_OPERATOR && (sNodeText == ".NOT." || sNodeText == "NOT" ))
+ return xbTrue;
+ else
+ return xbFalse;
+}
+/************************************************************************/
+//! @brief Remove last child from node.
+/*!
+ \returns void.
+*/
+
+void xbExpNode::RemoveLastChild(){
+ xbExpNode *n;
+ llChildren.RemoveFromEnd( n );
+}
+
+/************************************************************************/
+//! @brief Set dbf info on node.
+/*!
+ \param dbf Pointer to dbf.
+ \param iFieldNo Field number of field.
+ \returns void.
+*/
+void xbExpNode::SetDbfInfo( xbDbf *dbf, xbInt16 iFieldNo ){
+ this->dbf = dbf;
+ this->iFieldNo = iFieldNo;
+}
+
+/************************************************************************/
+//! @brief Set dbf info on node.
+/*!
+ \param dbf Pointer to dbf.
+ \returns void.
+*/
+void xbExpNode::SetDbfInfo( xbDbf *dbf ){
+ this->dbf = dbf;
+}
+/************************************************************************/
+//! @brief Set node type.
+/*!
+ \param cNodeType Node type.
+ \returns void.
+*/
+void xbExpNode::SetNodeType( char cNodeType ){
+ this->cNodeType = cNodeType;
+}
+
+/************************************************************************/
+//! @brief Set node text.
+/*!
+ \param sNodeText Node text.
+ \returns void.
+*/
+void xbExpNode::SetNodeText( xbString & sNodeText ){
+ this->sNodeText = sNodeText;
+}
+
+/************************************************************************/
+//! @brief Set parent.
+/*!
+ \param n Pointer to parent.
+ \returns void.
+*/
+void xbExpNode::SetParent( xbExpNode *n ){
+ this->nParent = n;
+}
+
+/************************************************************************/
+//! @brief Set date result.
+/*!
+ \param dtResult Date result.
+ \returns void.
+*/
+void xbExpNode::SetResult( xbDate &dtResult ){
+ this->dResult = dtResult.JulianDays();
+}
+
+/************************************************************************/
+//! @brief Set boolean result.
+/*!
+ \param bResult Boolean result.
+ \returns void.
+*/
+void xbExpNode::SetResult( xbBool bResult ){
+ this->dResult = bResult;
+}
+/************************************************************************/
+//! @brief Set numeric result.
+/*!
+ \param dResult Double numeric result.
+ \returns void.
+*/
+void xbExpNode::SetResult( xbDouble dResult ){
+ this->dResult = dResult;
+}
+/************************************************************************/
+//! @brief Set string result.
+/*!
+ \param sResult String result.
+ \returns void.
+*/
+void xbExpNode::SetResult( xbString &sResult ){
+ this->sResult = sResult;
+}
+/************************************************************************/
+//! @brief Set result length.
+/*!
+ \param ulResultLen Set result length.
+ \returns void.
+*/
+void xbExpNode::SetResultLen( xbUInt32 ulResultLen ){
+ this->ulResultLen = ulResultLen;
+}
+/************************************************************************/
+//! @brief Set return type.
+/*!
+ \param cReturnType Return Type.
+ \returns void.
+*/
+void xbExpNode::SetReturnType( char cReturnType ){
+ this->cReturnType = cReturnType;
+}
+/************************************************************************/
+//! @brief Set weight.
+/*!
+ \param iWeight Weight to set this node at.
+ \returns void.
+*/
+void xbExpNode::SetWeight( xbInt16 iWeight ){
+ this->iWeight = iWeight;
+}
+/*************************************************************************/
+}; // namespace
+#endif // XB_EXPRESSION_SUPPORT
+/*************************************************************************/
diff --git a/src/core/xbfields.cpp b/src/core/xbfields.cpp
new file mode 100755
index 0000000..8cfb4e6
--- /dev/null
+++ b/src/core/xbfields.cpp
@@ -0,0 +1,1122 @@
+/* xbfields.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+namespace xb{
+
+/************************************************************************/
+//! @brief Get xbDouble field for field name.
+/*!
+ \param sFieldName Name of field to retrieve.
+ \param dFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetDoubleField( const xbString &sFieldName, xbDouble &dFieldValue ) const {
+ return GetDoubleField( GetFieldNo( sFieldName ), dFieldValue );
+}
+
+/************************************************************************/
+//! @brief Get xbDouble field for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param dFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetDoubleField( xbInt16 iFieldNo, xbDouble &dFieldValue ) const {
+ xbInt16 iRc = XB_NO_ERROR;
+ char buf[21];
+ memset( buf, 0x00, 21 );
+ if(( iRc = GetRawField( iFieldNo, buf, 21, 0 )) >= XB_NO_ERROR ){
+ dFieldValue = strtod( buf, NULL );
+ return XB_NO_ERROR;
+ } else
+ return iRc;
+}
+/************************************************************************/
+//! @brief Get xbDouble field for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param dFieldValue Output field value.
+ \param iRecBufSw 0 - Record buffer with any updates.<br>1 - Record buffer with original data.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetDoubleField( xbInt16 iFieldNo, xbDouble &dFieldValue, xbInt16 iRecBufSw ) const {
+ xbInt16 iRc = XB_NO_ERROR;
+ char buf[21];
+ memset( buf, 0x00, 21 );
+ if(( iRc = GetRawField( iFieldNo, buf, 21, iRecBufSw )) >= XB_NO_ERROR ){
+ dFieldValue = strtod( buf, NULL );
+ return XB_NO_ERROR;
+ } else
+ return iRc;
+}
+
+/************************************************************************/
+//! @brief Get xbDate field for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param dtFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetDateField( xbInt16 iFieldNo, xbDate &dtFieldValue ) const{
+ xbString s;
+ xbInt16 iRc;
+ if(( iRc = GetField( iFieldNo, s )) != XB_NO_ERROR )
+ return iRc;
+ dtFieldValue.Set( s );
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Get xbDate field for field name.
+/*!
+ \param sFieldName Name of field to retrieve.
+ \param dtFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetDateField( const xbString &sFieldName, xbDate &dtFieldValue ) const{
+ xbString s;
+ xbInt16 iRc;
+ if(( iRc = GetField( sFieldName, s )) != XB_NO_ERROR )
+ return iRc;
+ dtFieldValue.Set( s );
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Get xbString field for field name.
+/*!
+ \param sFieldName Name of field to retrieve
+ \param sFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetField( const xbString &sFieldName, xbString &sFieldValue ) const{
+ return GetField( GetFieldNo( sFieldName ), sFieldValue, 0 );
+}
+/************************************************************************/
+//! @brief Get field data for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param sFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetField( xbInt16 iFieldNo, xbString &sFieldValue ) const{
+ return GetField( iFieldNo, sFieldValue, 0 );
+}
+/************************************************************************/
+//! @brief Get field data for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param sFieldValue Output field value.
+ \param iRecBufSw 0 - Record buffer with any updates.<br>1 - Record buffer with original data.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetField( xbInt16 iFieldNo, xbString &sFieldValue, xbInt16 iRecBufSw) const
+{
+ xbUInt32 iLen;
+ if( iFieldNo < 0 || iFieldNo >= iNoOfFields ) {
+ sFieldValue = "";
+ return XB_INVALID_FIELD_NO;
+ }
+ iLen = SchemaPtr[iFieldNo].cFieldLen;
+ sFieldValue = "";
+ if( iRecBufSw )
+ sFieldValue.Append( (char *) SchemaPtr[iFieldNo].pAddress2, iLen ); // original record buffer
+ else
+ sFieldValue.Append( (char *) SchemaPtr[iFieldNo].pAddress, iLen ); // current record buffer
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Get decimal for field name.
+/*!
+ This routine retreives a field's decimal length.
+ \param sFieldName Name of field to retrieve
+ \param iFieldDecimal Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetFieldDecimal( const xbString &sFieldName, xbInt16 & iFieldDecimal ) const {
+ return GetFieldDecimal( GetFieldNo( sFieldName ), iFieldDecimal );
+}
+
+
+/************************************************************************/
+//! @brief Get decimal for field number.
+/*!
+ This routine retreives a field's decimal length.
+ \param iFieldNo Number of field to retrieve
+ \param iFieldDecimal Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetFieldDecimal( xbInt16 iFieldNo, xbInt16 & iFieldDecimal ) const {
+
+ if( iFieldNo < 0 || iFieldNo >= iNoOfFields ) {
+ return XB_INVALID_FIELD_NO;
+ }
+ iFieldDecimal = SchemaPtr[iFieldNo].cNoOfDecs;
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Get field length for field name.
+/*!
+
+ This function retrieves a field's length.
+
+ \param sFieldName Name of field to retrieve
+ \param iFieldLen Output field length value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetFieldLen( const xbString &sFieldName, xbInt16 &iFieldLen ) const {
+ return GetFieldLen( GetFieldNo( sFieldName ), iFieldLen );
+}
+
+
+/************************************************************************/
+//! @brief Get field length for field number.
+/*!
+ This function retrieves a field's length.
+
+ \param iFieldNo Name of field to retrieve
+ \param iFieldLen Output field length value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetFieldLen( xbInt16 iFieldNo, xbInt16 &iFieldLen ) const {
+ if( iFieldNo >= 0 && iFieldNo < iNoOfFields ){
+ iFieldLen = SchemaPtr[iFieldNo].cFieldLen;
+ return XB_NO_ERROR;
+ } else
+ return XB_INVALID_FIELD_NO;
+}
+
+/************************************************************************/
+//! @brief Get the field number for name.
+/*! Returns the field number for the named field.
+
+ All field get/put methods require either a field number or field name as
+ one of the parameters. Using the methods that take the field numbers will
+ yield slightly better performance because the methods that take a name, have
+ to look up the number.
+
+ \param sFieldName Name of field.
+ \param iFieldNo Output field number for the given name.
+ \returns Number of field named fldName.
+*/
+
+xbInt16 xbDbf::GetFieldNo( const xbString & sFieldName, xbInt16 &iFieldNo ) const
+{
+ int i;
+
+ if( sFieldName.Len() > 10 )
+ return XB_INVALID_FIELD_NAME;
+
+ for( i = 0; i < iNoOfFields; i++ ){
+ if( sFieldName == SchemaPtr[i].cFieldName ){
+ iFieldNo = i;
+ return XB_NO_ERROR;
+ }
+ }
+ return XB_INVALID_FIELD_NAME;
+}
+
+/************************************************************************/
+//! Get field ID number for a given field name.
+/*! Returns the field number for the named field.
+
+ \param sFieldName Name of field.
+ \returns Number of field or XB_INVALID_FIELD_NAME.
+*/
+
+xbInt16 xbDbf::GetFieldNo( const xbString &sFieldName ) const {
+ int i;
+
+ if( sFieldName.Len() > 10 )
+ return XB_INVALID_FIELD_NAME;
+
+ for( i = 0; i < iNoOfFields; i++ ){
+ if( sFieldName == SchemaPtr[i].cFieldName )
+ return i;
+ }
+ return XB_INVALID_FIELD_NAME;
+}
+
+/************************************************************************/
+//! Get field type for field number.
+/*!
+ \param iFieldNo Field number.
+ \param cFieldType Output field type.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetFieldType( xbInt16 iFieldNo, char & cFieldType ) const{
+
+ if( iFieldNo >= 0 && iFieldNo < iNoOfFields ){
+ cFieldType = SchemaPtr[iFieldNo].cType;
+ return XB_NO_ERROR;
+ }
+ else
+ return XB_INVALID_FIELD_NO;
+}
+
+/************************************************************************/
+//! Get field type for field name.
+/*!
+ \param sFieldName Field name.
+ \param cFieldType Output field type.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetFieldType( const xbString &sFieldName, char & cFieldType ) const{
+ return( GetFieldType( GetFieldNo( sFieldName ), cFieldType));
+}
+
+/************************************************************************/
+//! @brief Returns the name of the specified field.
+/*! Returns a pointer to the name for the field specified by iFieldNo.
+
+ \param iFieldNo Number of field.
+ \param sFieldName Output variable containing the field name.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetFieldName( xbInt16 iFieldNo, xbString &sFieldName ) const{
+ if( iFieldNo >= 0 && iFieldNo < iNoOfFields ){
+ sFieldName = SchemaPtr[iFieldNo].cFieldName;
+ return XB_NO_ERROR;
+ }
+ else
+ return XB_INVALID_FIELD_NO;
+}
+
+/************************************************************************/
+//! @brief Get xbFloat field for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param fFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetFloatField( xbInt16 iFieldNo, xbFloat & fFieldValue ) const {
+
+ char cFieldType;
+ xbInt16 rc = GetFieldType( iFieldNo, cFieldType );
+ if( rc < 0 )
+ return rc;
+
+ if( cFieldType != 'N' && cFieldType != 'F' )
+ return XB_INVALID_FIELD_TYPE;
+
+ xbString sTemp;
+ rc = GetField( iFieldNo, sTemp, 0 );
+ if( rc < 0 )
+ return rc;
+
+ fFieldValue = (xbFloat) atof( sTemp.Str());
+ return XB_NO_ERROR;
+}
+
+
+/************************************************************************/
+//! @brief Get xbFloat field for field name.
+/*!
+ \param sFieldName Number of field to retrieve.
+ \param fFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetFloatField( const xbString & sFieldName, xbFloat & fFieldValue ) const {
+ return GetFloatField( GetFieldNo(sFieldName ), fFieldValue );
+}
+
+/************************************************************************/
+//! @brief Get logical field for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param sFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetLogicalField( xbInt16 iFieldNo, xbString &sFieldValue ) const {
+
+ char cFieldType;
+ xbInt16 iRc = GetFieldType( iFieldNo, cFieldType );
+ if( iRc < 0 )
+ return iRc;
+ else if( cFieldType != 'L' )
+ return XB_INVALID_FIELD_TYPE;
+
+ if(( iRc = GetField( iFieldNo, sFieldValue )) < XB_NO_ERROR )
+ return iRc;
+ else
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Get logical field for field name.
+/*!
+ \param sFieldName Name of field to retrieve.
+ \param sFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetLogicalField( const xbString &sFieldName, xbString &sFieldValue ) const {
+ return GetLogicalField( GetFieldNo( sFieldName ), sFieldValue );
+}
+
+
+/************************************************************************/
+//! @brief Get logical field for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param bFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetLogicalField( xbInt16 iFieldNo, xbBool &bFieldValue ) const {
+ return GetLogicalField( iFieldNo, bFieldValue, 0 );
+}
+
+/************************************************************************/
+//! @brief Get logical field for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param bFieldValue Output field value.
+ \param iRecBufSw 0 - Record buffer with any updates.<br>1 - Record buffer with original data.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetLogicalField( xbInt16 iFieldNo, xbBool &bFieldValue, xbInt16 iRecBufSw ) const {
+
+ char cFieldType;
+ xbInt16 iRc = GetFieldType( iFieldNo, cFieldType );
+ if((iRc = GetFieldType( iFieldNo, cFieldType )) != XB_NO_ERROR )
+ return iRc;
+
+ if( cFieldType != 'L' )
+ return XB_INVALID_FIELD_TYPE;
+
+ xbString sFieldValue;
+ if(( iRc = GetField( iFieldNo, sFieldValue, iRecBufSw )) < XB_NO_ERROR )
+ return iRc;
+
+ if( sFieldValue == 'T' || sFieldValue == 't' || sFieldValue == 'Y' || sFieldValue == 'y' )
+ bFieldValue = xbTrue;
+ else
+ bFieldValue = xbFalse;
+
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Get logical field for field name.
+/*!
+ \param sFieldName Name of field to retrieve.
+ \param bFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetLogicalField( const xbString &sFieldName, xbBool &bFieldValue ) const {
+ return GetLogicalField( GetFieldNo( sFieldName ), bFieldValue );
+}
+/************************************************************************/
+//! @brief Get long field for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param lFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetLongField( xbInt16 iFieldNo, xbInt32 & lFieldValue ) const {
+
+ xbInt16 rc = 0;
+ xbInt16 iErrorStop = 0;
+ char cFieldType;
+
+ try{
+
+ if(( rc = GetFieldType( iFieldNo, cFieldType )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+
+ if( cFieldType != 'N' && cFieldType != 'F' && cFieldType != 'M' ){
+ iErrorStop = 20;
+ rc = XB_INVALID_FIELD_TYPE;
+ throw rc;
+ }
+
+ xbString sTemp;
+ if(( rc = GetField( iFieldNo, sTemp, 0 )) < 0 ){
+ iErrorStop = 30;
+ throw rc;
+ }
+
+ if( !sTemp.ValidNumericValue() || ((int) sTemp.Pos( '.' ) > 0)){
+ iErrorStop = 40;
+ rc = XB_INVALID_DATA;
+ throw rc;
+ }
+
+ lFieldValue = atol( sTemp.Str());
+ }
+
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbDbf::GetLongField() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+//! @brief Get memo field for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param sMemoValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetMemoField( xbInt16 iFieldNo, xbString &sMemoValue ){
+ return Memo->GetMemoField( iFieldNo, sMemoValue );
+}
+/************************************************************************/
+//! @brief Get memo field for field name.
+/*!
+
+ \param sFieldName Name of field to retrieve.
+ \param sMemoValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetMemoField( const xbString & sFieldName, xbString & sMemoValue ){
+ return Memo->GetMemoField( GetFieldNo( sFieldName ), sMemoValue );
+}
+
+/************************************************************************/
+//! @brief Get the memo field count for this table.
+/*!
+ \returns Returns the number of memo fields in the table,
+*/
+xbInt16 xbDbf::GetMemoFieldCnt() const {
+ return iMemoFieldCnt;
+}
+/************************************************************************/
+//! @brief Get memo field length for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param ulMemoFieldLen Output memo field value length.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetMemoFieldLen( xbInt16 iFieldNo, xbUInt32 & ulMemoFieldLen ){
+ return Memo->GetMemoFieldLen( iFieldNo, ulMemoFieldLen );
+}
+/************************************************************************/
+//! @brief Get memo field length for field name.
+/*!
+ \param sFieldName Name of field to retrieve.
+ \param ulMemoFieldLen Output memo field value length.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetMemoFieldLen( const xbString &sFieldName, xbUInt32 &ulMemoFieldLen ){
+ return Memo->GetMemoFieldLen( GetFieldNo( sFieldName ), ulMemoFieldLen );
+}
+
+#endif // XB_MEMO_SUPPORT
+
+/************************************************************************/
+//! @brief Get unsigned long field for field number.
+/*!
+ \param iFieldNo Number of field to retrieve.
+ \param ulFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::GetULongField( xbInt16 iFieldNo, xbUInt32 & ulFieldValue ) const {
+
+ xbInt16 rc = 0;
+ xbInt16 iErrorStop = 0;
+ char cFieldType;
+
+ try{
+
+ if(( rc = GetFieldType( iFieldNo, cFieldType )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+
+ if( cFieldType != 'N' && cFieldType != 'F' && cFieldType != 'M' ){
+ iErrorStop = 20;
+ rc = XB_INVALID_FIELD_TYPE;
+ throw rc;
+ }
+
+ xbString sTemp;
+ if(( rc = GetField( iFieldNo, sTemp, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw rc;
+ }
+ sTemp.Trim();
+ if( !sTemp.ValidNumericValue() || ((int) sTemp.Pos( '.' ) > 0)){
+ iErrorStop = 40;
+ rc = XB_INVALID_DATA;
+ throw rc;
+ }
+ ulFieldValue = strtoul( sTemp.Str(), NULL, 10 );
+ }
+
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbDbf::GetULongField() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Get long field for field name.
+/*!
+ \param sFieldName Number of field to retrieve.
+ \param lFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetLongField( const xbString &sFieldName, xbInt32 &lFieldValue ) const {
+ return GetLongField( GetFieldNo( sFieldName ), lFieldValue );
+}
+
+/************************************************************************/
+//! @brief Get unsigned long field for field name.
+/*!
+ \param sFieldName Number of field to retrieve.
+ \param ulFieldValue Output field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::GetULongField( const xbString &sFieldName, xbUInt32 &ulFieldValue ) const {
+ return GetULongField( GetFieldNo( sFieldName ), ulFieldValue );
+}
+
+/************************************************************************/
+//! @brief Get raw field data for field number.
+/*!
+
+ This is a protected method, used by other methods. This method would be
+ subject to buffer overflows if made public.
+
+ \param iFieldNo Number of field to retrieve.
+ \param cBuf Pointer to buffer area provided by calling application program.
+ \param ulBufSize Size of data to copy
+ \param iRecBufSw 0 - Record buffer with any updates.<br>1 - Record buffer with original data.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+
+xbInt16 xbDbf::GetRawField( xbInt16 iFieldNo, char *cBuf, xbUInt32 ulBufSize, xbInt16 iRecBufSw ) const
+{
+ if( iFieldNo < 0 || iFieldNo >= iNoOfFields ) {
+ return XB_INVALID_FIELD_NO;
+ }
+
+ size_t stCopySize;
+ if( ulBufSize > (size_t) (SchemaPtr[iFieldNo].cFieldLen ))
+ stCopySize = (size_t) (SchemaPtr[iFieldNo].cFieldLen );
+ else
+ stCopySize = ulBufSize - 1;
+
+ if( iRecBufSw )
+ memcpy( cBuf, SchemaPtr[iFieldNo].pAddress2, stCopySize );
+ else
+ memcpy( cBuf, SchemaPtr[iFieldNo].pAddress, stCopySize );
+
+ cBuf[stCopySize] = 0x00;
+ return XB_NO_ERROR;
+}
+
+
+/************************************************************************/
+//! @brief Put double field for field name.
+/*!
+ \param sFieldName Name of field to update.
+ \param dFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::PutDoubleField( const xbString &sFieldName, xbDouble dFieldValue ){
+ return PutDoubleField( GetFieldNo( sFieldName ), dFieldValue );
+}
+
+/************************************************************************/
+//! @brief Put double field for field number.
+/*!
+ \param iFieldNo Number of field to update.
+ \param dFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::PutDoubleField( xbInt16 iFieldNo, xbDouble dFieldValue ){
+
+ xbInt16 rc;
+ xbString sDoubleFmt;
+ xbString sDoubleFmt2;
+ xbString sDoubleVal;
+ xbInt16 iFieldLen;
+ xbInt16 iNoOfDecs;
+
+ if(( rc = GetFieldDecimal( iFieldNo, iNoOfDecs )) != XB_NO_ERROR )
+ return rc;
+
+ if(( rc = GetFieldLen( iFieldNo, iFieldLen )) != XB_NO_ERROR )
+ return rc;
+
+ sDoubleFmt.Sprintf( "%d.%df", iFieldLen, iNoOfDecs );
+ sDoubleFmt2 = "%-";
+ sDoubleFmt2 += sDoubleFmt;
+ sDoubleVal.Sprintf( sDoubleFmt2.Str(), dFieldValue );
+ sDoubleVal.Rtrim();
+ return PutField( iFieldNo, sDoubleVal );
+}
+
+/************************************************************************/
+//! @brief Put date field for field name.
+/*!
+ \param sFieldName Name of field to update.
+ \param dtFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::PutDateField(const xbString &sFieldName, const xbDate &dtFieldValue ){
+ return PutField( GetFieldNo( sFieldName ), dtFieldValue.Str() );
+}
+
+/************************************************************************/
+//! @brief Put date field for field number.
+/*!
+ \param iFieldNo Number of field to update.
+ \param dtFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::PutDateField( xbInt16 iFieldNo, const xbDate &dtFieldValue ){
+ return PutField( iFieldNo, dtFieldValue.Str() );
+}
+
+/************************************************************************/
+//! @brief Put field for field name.
+/*!
+ \param sFieldName Name of field to update.
+ \param sFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::PutField(const xbString &sFieldName, const xbString &sFieldValue ) {
+ return PutField( GetFieldNo( sFieldName ), sFieldValue );
+}
+/************************************************************************/
+//! @brief Put field for field number.
+/*!
+ \param iFieldNo Number of field to update.
+ \param sFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::PutField( xbInt16 iFieldNo, const xbString &sFieldValue ) {
+ xbInt16 iLen;
+ xbInt16 iDecPos; /* Decimal Position */
+ char * startpos;
+ char * tp; /* Target Pointer */
+
+ if( iFieldNo < 0 || iFieldNo >= iNoOfFields )
+ return XB_INVALID_FIELD_NO;
+
+ if( SchemaPtr[iFieldNo].cType == 'L' && !sFieldValue.ValidLogicalValue())
+ return XB_INVALID_DATA;
+
+ else if( SchemaPtr[iFieldNo].cType == 'D' ){
+ xbDate d;
+ if( !d.DateIsValid( sFieldValue ))
+ return XB_INVALID_DATA;
+ iLen = 8;
+ }
+ else
+ {
+ iLen = (xbInt16) sFieldValue.Len();
+ if( SchemaPtr[iFieldNo].cType == 'F' || SchemaPtr[iFieldNo].cType == 'N' || SchemaPtr[iFieldNo].cType == 'M' ){
+ if( !sFieldValue.ValidNumericValue()) {
+ return XB_INVALID_DATA;
+ }
+ else {
+ iDecPos = (xbInt16) sFieldValue.Pos( "." ); // 0 is no decimal
+ int mlod; // max no of digits left of decimal point digit count
+
+
+ if( SchemaPtr[iFieldNo].cNoOfDecs > 0 )
+ mlod = SchemaPtr[iFieldNo].cFieldLen - SchemaPtr[iFieldNo].cNoOfDecs - 1;
+ else
+ mlod = iLen;
+
+ if( iDecPos == 0 ){ // no decimal in incoming data
+
+ // check digits to the left of the decimal
+ if( SchemaPtr[iFieldNo].cNoOfDecs > 0 && iLen > mlod ) /* no decimal in incoming data */
+ return XB_INVALID_DATA;
+
+ else if( SchemaPtr[iFieldNo].cNoOfDecs == 0 && iLen > SchemaPtr[iFieldNo].cFieldLen )
+ return XB_INVALID_DATA;
+
+ }
+ else // decimal in incoming data
+ {
+ if( (iDecPos-1) > mlod ) // too many digits to the left of dec in incoming data
+ return XB_INVALID_DATA;
+
+ // check digits to the right of the decimal
+ else if((iLen - iDecPos) > SchemaPtr[iFieldNo].cNoOfDecs )
+ return XB_INVALID_DATA;
+ }
+ }
+ }
+ }
+
+ // do all field edits before this point
+ if( iDbfStatus != XB_UPDATED ){
+ iDbfStatus = XB_UPDATED;
+ memcpy( RecBuf2, RecBuf, uiRecordLen ); // save the original record bufer before making updates
+ }
+
+ memset( SchemaPtr[iFieldNo].pAddress, 0x20, SchemaPtr[iFieldNo].cFieldLen );
+
+ if( iLen > SchemaPtr[iFieldNo].cFieldLen )
+ iLen = SchemaPtr[iFieldNo].cFieldLen;
+
+ if( SchemaPtr[iFieldNo].cType == 'F' || SchemaPtr[iFieldNo].cType == 'N'
+ || SchemaPtr[iFieldNo].cType == 'M') {
+
+ xbInt16 iDecPos = (xbInt16) sFieldValue.Pos( "." );
+ if( iDecPos == 0 ){
+ iLen = (xbInt16) sFieldValue.Len();
+ iDecPos = 0;
+ }
+ else{
+ iLen = iDecPos - 1;
+ }
+
+ if( SchemaPtr[iFieldNo].cNoOfDecs > 0 ){
+ tp = SchemaPtr[iFieldNo].pAddress;
+ tp += SchemaPtr[iFieldNo].cFieldLen - SchemaPtr[iFieldNo].cNoOfDecs - 1;
+ *tp++ = '.';
+
+ if( iDecPos == 0 ){
+ for( xbInt32 i = 0; i < SchemaPtr[iFieldNo].cNoOfDecs; i++ )
+ *tp++ = '0';
+ } else {
+ xbInt32 j = iDecPos + 1;
+ for( xbInt32 i = 0; i < SchemaPtr[iFieldNo].cNoOfDecs; i++, j++ ){
+ if( j <= (xbInt32) sFieldValue.Len())
+ *tp++ = sFieldValue[j];
+ else
+ *tp++ = '0';
+ }
+ }
+ startpos= SchemaPtr[iFieldNo].pAddress +
+ SchemaPtr[iFieldNo].cFieldLen -
+ SchemaPtr[iFieldNo].cNoOfDecs - iLen - 1;
+
+ }
+ else
+ startpos=SchemaPtr[iFieldNo].pAddress+SchemaPtr[iFieldNo].cFieldLen-iLen;
+ }
+ else
+ startpos = SchemaPtr[iFieldNo].pAddress;
+
+ memcpy( startpos, sFieldValue.Str(), (size_t) iLen );
+ return 0;
+}
+
+/************************************************************************/
+//! @brief Put float field for field number.
+/*!
+ \param iFieldNo Number of field to update.
+ \param fFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::PutFloatField( xbInt16 iFieldNo, xbFloat fFieldValue ){
+
+ xbInt16 rc;
+ xbString sFloatFmt;
+ xbString sFloatFmt2;
+ xbString sFloatVal;
+ xbInt16 iFieldLen;
+ xbInt16 iNoOfDecs;
+
+ if(( rc = GetFieldDecimal( iFieldNo, iNoOfDecs )) != XB_NO_ERROR )
+ return rc;
+
+ if(( rc = GetFieldLen( iFieldNo, iFieldLen )) != XB_NO_ERROR )
+ return rc;
+
+ sFloatFmt.Sprintf( "%d.%df", iFieldLen, iNoOfDecs );
+ sFloatFmt2 = "%-";
+ sFloatFmt2 += sFloatFmt;
+ sFloatVal.Sprintf( sFloatFmt2.Str(), fFieldValue );
+ sFloatVal.Rtrim();
+ return PutField( iFieldNo, sFloatVal );
+}
+
+/************************************************************************/
+//! @brief Put float field for field name.
+/*!
+ \param sFieldName Name of field to update.
+ \param fFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::PutFloatField( const xbString &sFieldName, xbFloat fFieldValue ){
+ return PutFloatField( GetFieldNo( sFieldName ), fFieldValue );
+}
+
+/************************************************************************/
+//! @brief Put logical field for field number.
+/*!
+ \param iFieldNo Number of field to update.
+ \param sFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::PutLogicalField( xbInt16 iFieldNo, const xbString &sFieldValue ) {
+ return PutField( iFieldNo, sFieldValue );
+}
+
+/************************************************************************/
+//! @brief Put logical field for field name.
+/*!
+ \param sFieldName Name of field to update.
+ \param sFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::PutLogicalField( const xbString &sFieldName, const xbString &sFieldValue ) {
+ return PutField( GetFieldNo( sFieldName ), sFieldValue );
+}
+
+/************************************************************************/
+//! @brief Put logical field for field number.
+/*!
+ \param iFieldNo Number of field to update.
+ \param bFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::PutLogicalField( xbInt16 iFieldNo, xbBool bFieldValue ) {
+
+ if( bFieldValue )
+ return PutField( iFieldNo, "T" );
+ else
+ return PutField( iFieldNo, "F" );
+}
+
+/************************************************************************/
+//! @brief Put logical field for field name.
+/*!
+ \param sFieldName Name of field to update.
+ \param bFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+xbInt16 xbDbf::PutLogicalField( const xbString &sFieldName, xbBool bFieldValue ) {
+ return PutLogicalField( GetFieldNo( sFieldName ), bFieldValue );
+}
+
+/************************************************************************/
+//! @brief Put long field for field number.
+/*!
+ \param iFieldNo Number of field to update.
+ \param lFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::PutLongField( xbInt16 iFieldNo, xbInt32 lFieldValue ) {
+ xbString sLong;
+ sLong.Sprintf( "%ld", (xbInt32) lFieldValue );
+ return PutField( iFieldNo, sLong.Str() );
+}
+
+/************************************************************************/
+//! @brief Put long field for field name.
+/*!
+ \param sFieldName Name of field to update.
+ \param lFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::PutLongField( const xbString &sFieldName, xbInt32 lFieldValue ) {
+ return PutLongField( GetFieldNo( sFieldName ), lFieldValue );
+}
+
+/************************************************************************/
+//! @brief Put unsigned long field for field number.
+/*!
+ \param iFieldNo Number of field to update.
+ \param ulFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::PutULongField( xbInt16 iFieldNo, xbUInt32 ulFieldValue ) {
+ xbString sLong;
+ sLong.Sprintf( "%lu", (xbInt32) ulFieldValue );
+ return PutField( iFieldNo, sLong.Str() );
+}
+
+/************************************************************************/
+//! @brief Put unsigned long field for field name.
+/*!
+ \param sFieldName Name of field to update.
+ \param ulFieldValue Field value.
+ \returns The field routines return one of:<br>
+ XB_NO_ERROR<br>XB_INVALID_DATA<br>XB_INVALID_FIELD_NO<br>XB_INVALID_FIELD_NAME<br>
+ XB_INVALID_FIELD_TYPE<br>XB_INVALID_DATA
+*/
+
+xbInt16 xbDbf::PutULongField( const xbString &sFieldName, xbUInt32 ulFieldValue ) {
+ return PutLongField( GetFieldNo( sFieldName ), (xbInt32) ulFieldValue );
+}
+
+/************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+//! @brief Check if memo field exists for field name.
+/*!
+ \param sFieldName Name of field to check.
+ \returns xbTrue Field exists.<br> xbFale Field does not exist.
+*/
+
+xbBool xbDbf::MemoFieldExists( const xbString &sFieldName ) const{
+ return MemoFieldExists( GetFieldNo( sFieldName ));
+}
+
+/************************************************************************/
+//! @brief Check if memo field exists for field number.
+/*!
+ \param iFieldNo Number of field to check.
+ \returns xbTrue Field exists.<br> xbFale Field does not exist.
+*/
+
+xbBool xbDbf::MemoFieldExists( xbInt16 iFieldNo ) const{
+
+ xbInt32 lFld = 0L;
+ GetLongField( iFieldNo, lFld );
+ if( lFld == 0L )
+ return xbFalse;
+ else
+ return xbTrue;
+}
+
+#endif
+} /* namespace */
+
diff --git a/src/core/xbfile.cpp b/src/core/xbfile.cpp
new file mode 100755
index 0000000..a7d5257
--- /dev/null
+++ b/src/core/xbfile.cpp
@@ -0,0 +1,2052 @@
+/* xbfile.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+This module handles all the low level file I/O and is the base class
+for the table, memo and index classes
+
+*/
+
+#include "xbase.h"
+
+namespace xb{
+
+/************************************************************************/
+//! @brief Class Constructor.
+xbFile::xbFile( xbXBase * x ){
+ fp = NULL;
+ bFileOpen = xbFalse;
+ ulBlockSize = 0;
+ iFileNo = 0;
+ xbase = x;
+ if( GetMultiUser() == xbTrue )
+ iShareMode = XB_MULTI_USER;
+ else
+ iShareMode = XB_SINGLE_USER;
+ iOpenMode = 0;
+ #ifdef XB_LOCKING_SUPPORT
+ iLockRetries = -1;
+ #endif
+ #ifdef HAVE_SETENDOFFILE_F
+ fHandle = NULL;
+ #endif
+}
+
+/************************************************************************/
+//! @brief Class Destructor.
+xbFile::~xbFile(){
+ if( bFileOpen )
+ xbFclose();
+}
+
+/************************************************************************/
+//! @brief Create a unique file name.
+/*!
+ Given a directory and file extension as inputs, create a unique file name.
+
+ \param sDirIn Directory
+ \param sExtIn File Extension
+ \param sFqnOut A fully qualifed unique file name as output
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbFile::CreateUniqueFileName( const xbString & sDirIn, const xbString & sExtIn, xbString &sFqnOut ){
+ return CreateUniqueFileName( sDirIn, sExtIn, sFqnOut, 0 );
+}
+
+/************************************************************************/
+//! @brief Create a unique file name.
+/*!
+ Given a directory and file extension as inputs, create a unique file name.
+
+ \param sDirIn Directory
+ \param sExtIn File Extension
+ \param iOption 0 - look only for one file for a given directory and extension<br>
+ 1 - if file name extension is "dbf" or "DBF", verify unique dbt or DBT (memo) file is also available<br>
+ \param sFqnOut A fully qualifed unique file name as output
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::CreateUniqueFileName( const xbString & sDirIn, const xbString & sExtIn, xbString &sFqnOut, xbInt16 iOption ){
+
+ xbBool bUniqueFileNameFound = xbFalse;
+ xbFile f( xbase);
+ xbInt32 l = 1;
+ xbString sMemoFileName;
+
+
+ while( !bUniqueFileNameFound ){
+ sFqnOut.Sprintf( "%sxbTmp%03d.%s", sDirIn.Str(), l, sExtIn.Str());
+ if( iOption == 1 && sExtIn == "DBF" ){
+ sMemoFileName.Sprintf( "%sxbTmp%03d.DBT", sDirIn.Str(), l );
+ }
+ else if( iOption == 1 && sExtIn == "dbf" ){
+ sMemoFileName.Sprintf( "%sxbTmp%03d.dbt", sDirIn.Str(), l );
+ }
+ if( f.FileExists( sFqnOut ) || ( sMemoFileName.Len() > 0 && f.FileExists( sMemoFileName ))){
+ l++;
+ }
+ else
+ {
+ bUniqueFileNameFound = xbTrue;
+ }
+ if( l > 999 )
+ return XB_FILE_EXISTS;
+ }
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Determine which version the memo (dbt) file is.
+/*!
+
+ This routine uses the first byte in the dbf file to determine which memo
+ file version is in use. The main difference between version 3 and 4 is that
+ version 4 will reuse blocks if they become available. Version 3 does not.
+
+ \param cFileTypeByte is an output field and is one of:<br>
+ <br>
+ 0 - none<br>
+ 3 - Dbase III+<br>
+ 4 - Dbase IV<br>
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::DetermineXbaseMemoVersion( unsigned char cFileTypeByte ) const {
+
+
+ if( BitSet( cFileTypeByte, 3 ) && BitSet( cFileTypeByte, 7 ))
+ return 4;
+ else if( BitSet( cFileTypeByte, 7 ))
+ return 3;
+
+ return 0;
+}
+/*************************************************************************/
+//! @brief Determine xbase dbf version.
+/*!
+
+ This routine is used to determine which version of the Xbase classes can
+ be used for a given DBF file.<br>
+
+ It attempts to use the highest version compiled into the library.<br>
+
+ References:<br>
+ This routine uses the first byte from the dbf file.<br>
+ Per DBase documentation:<br>
+ Valid dBASE for Windows table file, bits 0-2 indicate version number: 3 for dBASE Level 5, 4 for dBASE Level 7.<br>
+ Bit 3 and bit 7 indicate presence of a dBASE IV or dBASE for Windows memo file;<br>
+ Bits 4-6 indicate the presence of a dBASE IV SQL table;<br>
+ Bit 7 indicates the presence of any .DBT memo file (either a dBASE III PLUS type or a dBASE IV or dBASE for Windows memo file).<br>
+<br>
+ Bachmann spec (used extensively in library build), page 7 - does not match DBase documentation<br>
+<br>
+ returns<br>
+ 0 - unknown<br>
+ 3 - Dbase level 3<br>
+ 4 - Dbase level 4<br>
+ 5 - Dbase Level 5 (future)<br>
+ 7 - Dbase Level 7 (future)<br>
+<br>
+ 1x - Clipper files (future)<br>
+ 2x - Foxbase files (future)<br>
+<br>
+*/
+
+xbInt16 xbFile::DetermineXbaseTableVersion( unsigned char cFileTypeByte ) const {
+
+ xbInt16 iMemoVersion = DetermineXbaseMemoVersion(cFileTypeByte);
+ char cDbfLevel = cFileTypeByte & 0x07;
+
+ #ifdef XB_DBF4_SUPPORT
+ if( cDbfLevel == 3 && iMemoVersion != 3 )
+ return 4;
+ #endif
+
+ #ifdef XB_DBF3_SUPPORT
+ if( cDbfLevel == 3 && iMemoVersion != 4 )
+ return 3;
+ #endif
+
+ return 0;
+}
+
+/*************************************************************************/
+//! @brief Get a portable double value.
+/*!
+
+ This routine returns a double value from an 8 byte character stream,
+ accounting for endian type.
+
+ Converts a double (64 bit floating point) value stored at p from a portable
+ format to the machine format.
+
+ \param p pointer to memory containing the portable double value
+
+ \returns the double value.
+*/
+
+xbDouble xbFile::eGetDouble( const char *p ) const {
+ xbDouble d;
+ const char *sp;
+ char *tp;
+ xbInt16 i;
+
+ tp = (char *) &d;
+ sp = p;
+ if( iEndianType == 'L' )
+ for( i = 0; i < 8; i++ ) *tp++ = *sp++;
+ else
+ {
+ sp+=7;
+ for( i = 0; i < 8; i++ ) *tp++ = *sp--;
+ }
+
+ return d;
+}
+
+/*************************************************************************/
+//! @brief Get a portable long value.
+
+/*!
+ This routine returns a long int value from a 4 byte character stream,
+ accounting for endian type.
+
+ \param p pointer to memory containing the portable long value
+
+ \returns the long value.
+*/
+
+xbInt32 xbFile::eGetInt32( const char *p ) const {
+ xbInt32 l;
+ char *tp;
+ xbInt16 i;
+
+ tp = (char *) &l;
+ if( iEndianType == 'L' )
+ for( i = 0; i < 4; i++ ) *tp++ = *p++;
+ else {
+ p+=3;
+ for( i = 0; i < 4; i++ ) *tp++ = *p--;
+ }
+ return l;
+
+}
+/*************************************************************************/
+//! @brief Get a portable unsigned long value.
+
+/*!
+ This routine returns an unsigned long int value from a 4 byte character stream,
+ accounting for endian type.
+
+ \param p pointer to memory containing the portable long value
+
+ \returns the unsigned long value.
+*/
+
+xbUInt32 xbFile::eGetUInt32( const char *p ) const {
+ xbUInt32 ul;
+ xbInt16 i;
+ char *tp;
+
+ tp = (char *) &ul;
+ if( iEndianType == 'L' )
+ for( i = 0; i < 4; i++ ) *tp++ = *p++;
+ else{
+ p+=3;
+ for( i = 0; i < 4; i++ ) *tp++ = *p--;
+ }
+ return ul;
+}
+
+/*************************************************************************/
+//! @brief Get a portable short value.
+
+/*!
+ This routine returns a short int value from a 2 byte character stream,
+ accounting for endian type.
+
+ \param p pointer to memory containing the portable long value
+
+ \returns the short value.
+*/
+
+xbInt16 xbFile::eGetInt16(const char *p) const {
+ xbInt16 s, i;
+ char *tp;
+ tp = (char *) &s;
+ if( iEndianType == 'L' )
+ for( i = 0; i < 2; i++ ) *tp++ = *p++;
+ else{
+ p++;
+ for( i = 0; i < 2; i++ ) *tp++ = *p--;
+ }
+ return s;
+}
+/*************************************************************************/
+//! @brief Get a portable unsigned short value.
+
+/*!
+ This routine returns a short unsigned int value from a 2 byte character stream,
+ accounting for endian type.
+
+ \param p pointer to memory containing the portable long value
+
+ \returns the short value.
+*/
+
+xbUInt16 xbFile::eGetUInt16(const char *p) const {
+ xbInt16 i;
+ xbUInt16 uI;
+ char *tp;
+
+ tp = (char *) &uI;
+ if( iEndianType == 'L' )
+ for( i = 0; i < 2; i++ ) *tp++ = *p++;
+ else{
+ p++;
+ for( i = 0; i < 2; i++ ) *tp++ = *p--;
+ }
+ return uI;
+}
+
+
+/*************************************************************************/
+//! @brief Write a portable double value to memory location.
+/*!
+ Converts a double (64 bit floating point) value from machine format to a
+ portable format and stores the converted value in the memory referenced
+ by c.
+
+ This routine puts a double value to an 8 byte character stream
+
+ \param c Pointer to memory to hold converted value
+ \param d Input value to be converted
+*/
+
+void xbFile::ePutDouble( char *c, xbDouble d ){
+ const char *sp;
+ char *tp;
+ xbInt16 i;
+
+ tp = c;
+ sp = (const char *) &d;
+ if( iEndianType == 'L' )
+ for( i = 0; i < 8; i++ ) *tp++ = *sp++;
+ else
+ {
+ sp+=7;
+ for( i = 0; i < 8; i++ ) *tp++ = *sp--;
+ }
+ return;
+}
+
+/*************************************************************************/
+//! @brief Write a portable short value to memory location.
+/*!
+ Converts a short (16 bit integer) value from machine format to a
+ portable format and stores the converted value in the memory referenced
+ by c.
+
+ This routine puts a short value to a 2 byte character stream
+
+ \param c Pointer to memory to hold converted value
+ \param s Input value to be converted
+*/
+
+void xbFile::ePutInt16( char * c, xbInt16 s ){
+ const char *sp;
+ char *tp;
+ xbInt16 i;
+
+ tp = c;
+ sp = (const char *) &s;
+
+ if( iEndianType == 'L' )
+ for( i = 0; i < 2; i++ ) *tp++ = *sp++;
+ else{ /* big endian */
+ sp++;
+ for( i = 0; i < 2; i++ ) *tp++ = *sp--;
+ }
+ return;
+}
+/*************************************************************************/
+//! @brief Write a portable unsigned short value to memory location.
+/*!
+ Converts an unsigned short (16 bit integer) value from machine format to a
+ portable format and stores the converted value in the memory referenced
+ by c.
+
+ This routine puts an unsigned short value to a 2 byte character stream
+
+ \param c Pointer to memory to hold converted value
+ \param s Input value to be converted
+*/
+
+void xbFile::ePutUInt16( char * c, xbUInt16 s ){
+ const char *sp;
+ char *tp;
+ xbInt16 i;
+
+ tp = c;
+ sp = (const char *) &s;
+
+ if( iEndianType == 'L' )
+ for( i = 0; i < 2; i++ ) *tp++ = *sp++;
+ else{ /* big endian */
+ sp++;
+ for( i = 0; i < 2; i++ ) *tp++ = *sp--;
+ }
+ return;
+}
+
+/*************************************************************************/
+//! @brief Write a portable long value to memory location.
+/*!
+ Converts a long (32 bit integer) value from machine format to a
+ portable format and stores the converted value in the memory referenced
+ by c.
+
+ This routine puts a long value to a 4 byte character stream.
+
+ \param c Pointer to memory to hold converted value
+ \param l Input value to be converted
+*/
+
+void xbFile::ePutInt32( char * c, xbInt32 l )
+{
+ const char *sp;
+ char *tp;
+ xbInt16 i;
+
+ tp = c;
+ sp = (const char *) &l;
+ if( iEndianType == 'L' )
+ for( i = 0; i < 4; i++ ) *tp++ = *sp++;
+ else {
+ sp+=3;
+ for( i = 0; i < 4; i++ ) *tp++ = *sp--;
+ }
+ return;
+}
+
+
+/*************************************************************************/
+//! @brief Write a portable unsigned long value to memory location.
+/*!
+ Converts an unsigned long (32 bit integer) value from machine format to a
+ portable format and stores the converted value in the memory referenced
+ by c.
+
+ This routine puts an unsigned long value to a 4 byte character stream.
+
+ \param c Pointer to memory to hold converted value
+ \param ul Input value to be converted
+*/
+
+void xbFile::ePutUInt32( char * c, xbUInt32 ul )
+{
+ const char *sp;
+ char *tp;
+ xbInt16 i;
+
+ tp = c;
+ sp = (const char *) &ul;
+ if( iEndianType == 'L' )
+ for( i = 0; i < 4; i++ ) *tp++ = *sp++;
+ else
+ {
+ sp+=3;
+ for( i = 0; i < 4; i++ ) *tp++ = *sp--;
+ }
+ return;
+}
+
+/************************************************************************/
+//! @brief Determines if a file exists.
+/*!
+ \returns xbTrue if file exists<br>
+ xbFalse if file does not exist
+
+*/
+xbBool xbFile::FileExists() const {
+ return FileExists( sFqFileName, 0 );
+}
+/************************************************************************/
+//! @brief Determines if a file exists.
+/*!
+ \param iOption if 1, assume this is a request for a dbf file and
+ check for the a dbt memo file also, returns true if both files are found
+
+ \returns xbTrue if both files exist<br>
+ xbFalse if file does not exist
+
+*/
+xbBool xbFile::FileExists( xbInt16 iOption ) const {
+ return FileExists( sFqFileName, iOption );
+}
+
+/************************************************************************/
+//! @brief Determines if a file exists.
+/*!
+ \param sFileName - file name to check for
+
+ \returns xbTrue if file exists<br>
+ xbFalse if file does not exist
+*/
+
+xbBool xbFile::FileExists(const xbString &sFileName ) const {
+ return FileExists( sFileName, 0 );
+}
+
+/************************************************************************/
+//! @brief Determines if a file exists.
+/*!
+ \param sFileName - file name to check for
+ \param iOption if 1, assume this is a request for a dbf file and
+ check for the a dbt memo file also, returns true if both files are found
+
+ \returns xbTrue if both dbf and dbt files exist<br>
+ xbFalse if file does not exist
+*/
+
+xbBool xbFile::FileExists( const xbString & sFileName, xbInt16 iOption ) const {
+
+ struct stat buffer;
+ if(( stat( sFileName.Str(), &buffer ) != 0 )){
+ return xbFalse;
+ }
+
+ #ifdef XB_MEMO_SUPPORT
+ if( iOption == 1 ){
+ xbString sFileName2 = sFileName;
+
+ if( sFileName2[sFileName2.Len()] == 'F' )
+ sFileName2.PutAt( sFileName2.Len(), 'T' );
+ else
+ sFileName2.PutAt( sFileName2.Len(), 't' );
+
+ if(( stat( sFileName2.Str(), &buffer) != 0 ))
+ return xbFalse;
+ }
+ #endif
+ return xbTrue;
+}
+
+/************************************************************************/
+//! @brief Determines if file is open.
+/*!
+
+ \returns xbTrue if file is open<br>
+ xbFalse if file is not open
+*/
+
+xbBool xbFile::FileIsOpen() const {
+ return bFileOpen;
+}
+/************************************************************************/
+//! @brief Get the block size.
+/*!
+ \returns Block Size
+*/
+
+xbUInt32 xbFile::GetBlockSize() const {
+ return ulBlockSize;
+}
+
+/************************************************************************/
+//! @brief Get the directory name.
+/*!
+ \returns the directory name of the file
+*/
+
+const xbString & xbFile::GetDirectory() const {
+ return sDirectory;
+}
+
+/************************************************************************/
+//! @brief Get the directory part of the file name.
+/*!
+ \param sFileDirPartOut - the returned directory name
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbFile::GetFileDirPart( xbString & sFileDirPartOut ) const {
+ return GetFileDirPart( sFqFileName, sFileDirPartOut );
+}
+
+/************************************************************************/
+//! @brief Get the directory part of the file name.
+/*!
+ \param sCompleteFileNameIn - a fully qualfied input file name
+ \param sFileDirPartOut - the returned directory name part out of sCompleteFileNameIn
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbFile::GetFileDirPart( const xbString & sCompleteFileNameIn, xbString & sFileDirPartOut ) const {
+
+ sFileDirPartOut = sCompleteFileNameIn;
+ sFileDirPartOut.SwapChars( '\\', '/' );
+ xbUInt32 iPos = sFileDirPartOut.GetLastPos( '/' );
+
+ if( iPos > 0 ){
+ xbString sTemp = sFileDirPartOut;
+ sFileDirPartOut.Assign( sTemp, 1, iPos );
+ return XB_NO_ERROR;
+ }
+ return XB_INVALID_DATA;
+}
+
+/************************************************************************/
+//! @brief Get the extension part of the file name.
+/*!
+ \param sFileNameExtOut - the returned extension part out of sCompleteFileNameIn
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbFile::GetFileExtPart( xbString & sFileNameExtOut ) const {
+ return GetFileExtPart( sFqFileName, sFileNameExtOut );
+}
+
+/************************************************************************/
+//! @brief Get the extension part of the file name.
+/*!
+ \param sCompleteFileNameIn - a fully qualfied input file name
+
+ \param sFileExtPartOut - the returned directory name part out of sCompleteFileNameIn
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbFile::GetFileExtPart( const xbString & sCompleteFileNameIn, xbString & sFileExtPartOut ) const {
+
+
+ sFileExtPartOut = sCompleteFileNameIn;
+ xbUInt32 iPos = sFileExtPartOut.GetLastPos( '.' );
+ if( iPos > 0 ){ /* get rid of the directory part of the name */
+ sFileExtPartOut.Ltrunc( iPos );
+ return XB_NO_ERROR;
+ }
+ return XB_INVALID_DATA;
+}
+/************************************************************************/
+//! @brief Get the time of last file modification timestamp as reported by the OS.
+/*!
+ \param mtime - returned time of last file modification
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::GetFileMtime( time_t &mtime ){
+
+ struct stat buffer;
+ if( stat( sFqFileName.Str(), &buffer ))
+ return XB_FILE_NOT_FOUND;
+ else{
+ mtime = buffer.st_mtime;
+ return XB_NO_ERROR;
+ }
+}
+/************************************************************************/
+//! @brief Get the file name.
+/*!
+ \returns the file name portion of the file
+*/
+
+const xbString & xbFile::GetFileName() const {
+ return sFileName;
+}
+
+
+/************************************************************************/
+//! @brief Get the name part of the file name.
+/*!
+ \param sFileNamePartOut - the returned file name part out of sCompleteFileNameIn
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbFile::GetFileNamePart( xbString & sFileNamePartOut ) const {
+ return GetFileNamePart( sFqFileName, sFileNamePartOut );
+}
+
+/************************************************************************/
+//! @brief Get the name part of the file name.
+/*!
+ \param sCompleteFileNameIn - a fully qualified input file name
+ \param sFileNamePartOut - the returned file name part out of sCompleteFileNameIn
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+//*********** fixme should this be static?????
+
+xbInt16 xbFile::GetFileNamePart( const xbString & sCompleteFileNameIn, xbString & sFileNamePartOut ) const {
+ /* extract the file name part out of the string */
+
+ sFileNamePartOut = sCompleteFileNameIn;
+ sFileNamePartOut.SwapChars( '\\', '/' );
+ xbUInt32 iPos = sFileNamePartOut.GetLastPos( '/' );
+ if( iPos > 0 ) /* get rid of the directory part of the name */
+ sFileNamePartOut.Ltrunc( iPos );
+ iPos = sFileNamePartOut.Pos( '.' );
+ if( iPos > 0 ){ /* get rid of the extension part of the name */
+ xbString sTemp = sFileNamePartOut;
+ sFileNamePartOut.Assign( sTemp, 1, iPos-1 );
+ }
+ return XB_NO_ERROR;
+}
+
+
+/************************************************************************/
+//! @brief Get the size of the file as reported by the OS.
+/*!
+ \param ullFileSize - unsigned long long field as output
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::GetFileSize( xbUInt64 &ullFileSize ){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ if(( iRc = xbFseek( 0, SEEK_END )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ ullFileSize = xbFtell();
+ }
+
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFile::GetFileSize() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/************************************************************************/
+//! @brief Get the file type aka Capitalized file extension
+/*!
+ \param sFileTypeOut - the returned extension part out of sCompleteFileNameIn
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbFile::GetFileType( xbString & sFileTypeOut ) const {
+
+ xbInt16 iRc = GetFileExtPart( sFqFileName, sFileTypeOut );
+ sFileTypeOut.ToUpperCase();
+ return iRc;
+}
+/************************************************************************/
+//! @brief Get the fully qualified file name.
+/*!
+ \returns the fully qualfied name of the file
+*/
+
+const xbString & xbFile::GetFqFileName() const {
+ return sFqFileName;
+}
+
+/************************************************************************/
+//! @brief Get the open mode of the file.
+/*!
+ \returns XB_READ<br>
+ XB_READ_WRITE<br>
+ XB_WRITE<BR>
+*/
+
+xbInt16 xbFile::GetOpenMode() const {
+ return iOpenMode;
+}
+
+/************************************************************************/
+//! @brief Get the share mode of the file.
+/*!
+ \returns XB_SINGLE_USER - (file buffering on><br>
+ XB_MULTI_USER - (file buffering off)<br>
+*/
+
+
+xbInt16 xbFile::GetShareMode() const {
+ return iShareMode;
+}
+
+
+/************************************************************************/
+//! @brief Get the file type byte and version of the dbf file.
+/*!
+
+ Pull the first bye off the DBF file for further inspection.
+ First byte has various bits set to determine what the file format is.
+
+ \param sFileName - Name of file to examine
+ \param iVersion - Returned file version
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::GetXbaseFileTypeByte( const xbString &sFileName, xbInt16 &iVersion )
+{
+ unsigned char cFileTypeByte;
+ return GetXbaseFileTypeByte( sFileName, cFileTypeByte, iVersion );
+}
+
+/************************************************************************/
+//! @brief Get the file type byte and version of the dbf file.
+/*!
+ Pull the first bye off the DBF file for further inspection.
+ First byte has various bits set to determine what the file format is.
+
+ \param sFileName - Name of file to examine
+ \param cFileTypeByte - Retruned first byte of dbf file
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbFile::GetXbaseFileTypeByte( const xbString &sFileName, unsigned char &cFileTypeByte )
+{
+ xbInt16 iVersion;
+ return GetXbaseFileTypeByte( sFileName, cFileTypeByte, iVersion );
+}
+
+/************************************************************************/
+//! @brief Get the file type byte and version of the dbf file.
+/*!
+ Pull the first bye off the DBF file for further inspection.
+ First byte has various bits set to determine what the file format is.
+
+
+ \param sFileName - Name of file to examine
+ \param cFileTypeByte - Returned first byte of dbf file
+ \param iVersion - Returned file version
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::GetXbaseFileTypeByte( const xbString &sFileName, unsigned char &cFileTypeByte, xbInt16 &iVersion ){
+ xbInt16 iErrorStop = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+ size_t stRc;
+ FILE *tfp;
+
+ try{
+
+ iVersion = 0;
+ cFileTypeByte = 0x00;
+ #ifdef HAVE__FSOPEN_F
+ // 0x40 is SH_DENYNO or _SH_DENYNO
+ if(( tfp = _fsopen( sFileName.Str(), "r", 0x40 )) == NULL ){
+ iErrorStop = 20;
+ iRc = XB_OPEN_ERROR;
+ throw iRc;
+ }
+ #else
+ if(( tfp = fopen( sFileName.Str(), "r" )) == NULL ){
+ iErrorStop = 20;
+ iRc = XB_OPEN_ERROR;
+ throw iRc;
+ }
+ #endif
+
+ #ifdef HAVE_FSEEKO_F
+ iRc = fseeko( tfp, 0, SEEK_SET );
+ #else
+ iRc = fseek( tfp, 0, SEEK_SET );
+ #endif
+
+ if( iRc != 0 ){
+ iErrorStop = 30;
+ iRc = XB_SEEK_ERROR;
+ throw iRc;
+ }
+ stRc = fread( &cFileTypeByte, (size_t) 1, (size_t) 1, tfp );
+ if( stRc != (size_t) 1 ){
+ iErrorStop = 40;
+ iRc = XB_READ_ERROR;
+ throw iRc;
+ }
+ iRc = XB_NO_ERROR;
+ fclose( tfp );
+ iVersion = DetermineXbaseTableVersion( cFileTypeByte );
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFile::GetXbaseFileType() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/************************************************************************/
+//! @brief Determines status of file extension.
+/*!
+
+ \param sFileName - Name of file to examine
+ \param iOption - Inspection type<br>
+ 1 check for DBF<br>
+ 2 check for NDX<br>
+ 3 check for MDX<br>
+ 4 check for NTX<br>
+
+ \returns 0 if suffix found<br>
+ 1 if suffix not found, lower case<br>
+ 2 is suffix not found, upper case<br>
+
+*/
+
+xbInt16 xbFile::NameSuffixMissing( const xbString & sFileName, xbInt16 iOption ) const {
+
+ xbUInt32 ulLen = sFileName.Len();
+ if( ulLen <= 4 ){
+ if( sFileName[ulLen] >= 'A' && sFileName[ulLen] <= 'Z' )
+ return 2;
+ else
+ return 1;
+ }
+ if( iOption == 1 && sFileName[ulLen-3] == '.' &&
+ ( sFileName[ulLen-2] == 'd' || sFileName[ulLen-2] == 'D' ) &&
+ ( sFileName[ulLen-1] == 'b' || sFileName[ulLen-1] == 'B' ) &&
+ ( sFileName[ulLen] == 'f' || sFileName[ulLen] == 'F' )
+ )
+ return 0;
+ if( iOption == 2 && sFileName[ulLen-3] == '.' &&
+ ( sFileName[ulLen-2] == 'n' || sFileName[ulLen-2] == 'N' ) &&
+ ( sFileName[ulLen-1] == 'd' || sFileName[ulLen-1] == 'D' ) &&
+ ( sFileName[ulLen] == 'x' || sFileName[ulLen] == 'X' )
+ )
+ return 0;
+ if( iOption == 3 && sFileName[ulLen-3] == '.' &&
+ ( sFileName[ulLen-2] == 'm' || sFileName[ulLen-2] == 'M' ) &&
+ ( sFileName[ulLen-1] == 'd' || sFileName[ulLen-1] == 'D' ) &&
+ ( sFileName[ulLen] == 'x' || sFileName[ulLen] == 'X' )
+ )
+ return 0;
+ if( iOption == 4 && sFileName[ulLen-3] == '.' &&
+ ( sFileName[ulLen-2] == 'n' || sFileName[ulLen-2] == 'N' ) &&
+ ( sFileName[ulLen-1] == 't' || sFileName[ulLen-1] == 'T' ) &&
+ ( sFileName[ulLen] == 'x' || sFileName[ulLen] == 'X' )
+ )
+ return 0;
+ // next line might be problematic if file naem has mixed case and extension is missing
+ if( sFileName[ulLen-4] >= 'A' && sFileName[ulLen-4] <= 'Z' )
+ return 2;
+ else
+ return 1;
+}
+
+/***********************************************************************/
+//! @brief Read a block of data from file.
+/*!
+
+ \param ulBlockNo - block number to read
+ \param lReadSize - size of data to read at block location, set to 0 to read blocksize
+ \param *buf - pointer to buffer to write output data, assumed to be previosuly allocated
+ and large enough to contain data
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+
+xbInt16 xbFile::ReadBlock( xbUInt32 ulBlockNo, size_t lReadSize, void * buf ){
+ return ReadBlock( ulBlockNo, ulBlockSize, lReadSize, buf );
+}
+
+
+/***********************************************************************/
+//! @brief Read a block of data from file.
+/*!
+
+ \param ulBlockNo - block number to read
+ \param ulBlockSize - block size
+ \param lReadSize - size of data to read at block location, set to 0 to read blocksize
+ \param buf - pointer to buffer to write output data, assumed to be previosuly allocated
+ and large enough to contain data
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbFile::ReadBlock( xbUInt32 ulBlockNo, xbUInt32 ulBlockSize, size_t lReadSize, void * buf ){
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 iRc = XB_NO_ERROR;
+
+ try{
+ if( ulBlockSize <= 0 ){
+ iErrorStop = 10;
+ iRc = XB_INVALID_BLOCK_SIZE;
+ throw iRc;
+ }
+
+ if(( iRc = xbFseek(((xbInt64) ulBlockNo*ulBlockSize ), SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ iRc = XB_SEEK_ERROR;
+ throw iRc;
+ }
+
+ if( lReadSize <= 0 )
+ lReadSize = ulBlockSize;
+
+ if(( iRc = xbFread( buf, lReadSize, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ iRc = XB_READ_ERROR;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFile::ReadBlock() Exception Caught. Error Stop = [%d] iRc = [%d] BlkNo=[%ld] BlkSize=[%ld] ReadSize=[%ld]", iErrorStop, iRc, ulBlockNo, ulBlockSize, lReadSize );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/************************************************************************/
+//! @brief Set the block size.
+/*!
+
+ \param ulBlockSize - unsigned long block size, divisible by 512
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::SetBlockSize( xbUInt32 ulBlockSize ){
+ if( ulBlockSize %512 != 0 )
+ return XB_INVALID_BLOCK_SIZE;
+
+ this->ulBlockSize = ulBlockSize;
+ return XB_NO_ERROR;
+}
+/************************************************************************/
+//! @brief Set the directory.
+/*!
+ \param sDirectory - Valid directory name
+*/
+
+
+void xbFile::SetDirectory( const xbString & sDirectory ){
+
+ this->sDirectory = sDirectory;
+ char cLastChar = sDirectory[sDirectory.Len()];
+ if( cLastChar != '/' && cLastChar != '\\' )
+ sFqFileName.Sprintf( "%s/%s", sDirectory.Str(), sFileName.Str());
+ else
+ sFqFileName.Sprintf( "%s%s", sDirectory.Str(), sFileName.Str());
+
+ #ifdef WIN32
+ sFqFileName.SwapChars( '/', '\\' );
+ #else
+ sFqFileName.SwapChars( '\\', '/' );
+ #endif
+}
+
+/************************************************************************/
+//! @brief Set the filename.
+/*!
+ This routine builds out two internal variables from the input file name<br>
+ sFileName - the file name part<br>
+ sFqFileName - the fully qualified file name<br>
+
+
+ \param sFileName - Input file name
+*/
+void xbFile::SetFileName( const xbString & sFileName ){
+
+ if( sFileName == "" ){
+ sFqFileName = "";
+ return;
+ }
+
+ char cPathSep = sFileName.GetPathSeparator();
+
+ if( cPathSep ){
+
+ xbString sName;
+ xbString sExt;
+ // GetFileDirPart( this->sDirectory );
+ GetFileNamePart( sFileName, sName );
+ GetFileExtPart( sFileName, sExt );
+ this->sFileName.Sprintf( "%s.%s", sName.Str(), sExt.Str());
+ sFqFileName = sFileName;
+
+ } else {
+
+ this->sFileName = sFileName;
+ if( sDirectory.Len() == 0 ){
+ sDirectory = GetDataDirectory();
+ char cLastChar = sDirectory[sDirectory.Len()];
+ if( cLastChar != '/' && cLastChar != '\\' )
+ sFqFileName.Sprintf( "%s/%s", sDirectory.Str(), sFileName.Str() );
+ else
+ sFqFileName = sDirectory + sFileName;
+ }
+ else{
+ char cLastChar = sDirectory[sDirectory.Len()];
+ if( cLastChar != '/' && cLastChar != '\\' )
+ sFqFileName.Sprintf( "%s/%s", sDirectory.Str(), sFileName.Str() );
+ else
+ sFqFileName = sDirectory + sFileName;
+ }
+ }
+
+ #ifdef WIN32
+ sFqFileName.SwapChars( '/', '\\' );
+ #else
+ sFqFileName.SwapChars( '\\', '/' );
+ #endif
+}
+
+/************************************************************************/
+//! @brief Set the fully qualifed filename.
+/*!
+ \param sFqFileName - Fully qualifed input file name
+*/
+
+void xbFile::SetFqFileName( const xbString & sFqFileName ){
+ this->sFqFileName = sFqFileName;
+
+ xbString sDir;
+ xbString sName;
+ xbString sExt;
+
+ GetFileDirPart ( sFqFileName, sDir );
+ GetFileNamePart( sFqFileName, sName );
+ GetFileExtPart ( sFqFileName, sExt );
+
+ sDirectory = sDir;
+ sFileName.Sprintf( "%s.%s", sName.Str(), sExt.Str() );
+
+ #ifdef WIN32
+ this->sDirectory.SwapChars ( '/', '\\' );
+ this->sFqFileName.SwapChars( '/', '\\' );
+ #else
+ this->sDirectory.SwapChars ( '\\', '/' );
+ this->sFqFileName.SwapChars( '\\', '/' );
+ #endif
+}
+
+/************************************************************************/
+//! @brief Write a block of data to file.
+/*!
+
+ \param ulBlockNo - block number to write
+ \param lWriteSize - size of data to write, set to 0 to write blocksize
+ \param *buf - pointer to buffer of data to be written
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbFile::WriteBlock( xbUInt32 ulBlockNo, size_t lWriteSize, void * buf ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ if( ulBlockSize == 0 ){
+ iErrorStop = 10;
+ iRc = XB_INVALID_BLOCK_SIZE;
+ throw iRc;
+ }
+ if( lWriteSize <= 0 )
+ lWriteSize = ulBlockSize;
+ if(( iRc = xbFseek(( (xbInt64) ulBlockNo*ulBlockSize), SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( buf, lWriteSize, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFile::WriteBlock() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fclose.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFclose(){
+
+ int iRc = 0;
+ if( bFileOpen ){
+ iRc = fclose( fp );
+ if( iRc != 0 ){
+ return XB_CLOSE_ERROR;
+ }
+ else{
+ bFileOpen = xbFalse;
+ }
+ iFileNo = 0;
+ }
+ return XB_NO_ERROR;
+}
+
+
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary feof.
+/*!
+ \returns non zero if end-of-file is set for the stream.
+*/
+xbInt16 xbFile::xbFeof(){
+ return feof( fp );
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fflush.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFflush() {
+
+ if( fflush( fp ) )
+ return XB_WRITE_ERROR;
+ else
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fgetc.
+/*!
+ \param c - output integer returned by fgetc
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFgetc( xbInt32 &c ) {
+
+ int i;
+
+ i = fgetc( fp );
+ if( i == EOF )
+ return XB_EOF;
+
+ c = i;
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fgetc.
+/*!
+ \param c - output character returned by fgetc
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFgetc( char &c ) {
+
+ int i;
+ i = fgetc( fp );
+ if( i == EOF )
+ return XB_EOF;
+
+ c = (char) i;
+ return XB_NO_ERROR;
+}
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fgets.
+/*!
+ \param lSize - reads in at most, one character less than lSize
+ \param s - an xbString containing data returned by fseek
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFgets( size_t lSize, xbString &s ) {
+
+ s = "";
+ if( feof( fp ))
+ return XB_EOF;
+
+ char *sBuf = (char *) malloc( lSize + 1 );
+
+ if( fgets( sBuf, (xbInt32) lSize, fp ) == NULL ){
+ free( sBuf );
+ return XB_EOF;
+ }
+ s.Set( sBuf );
+ free( sBuf );
+ return XB_NO_ERROR;
+}
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fopen.
+/*!
+
+ This routine supports all the standard C library open modes. The Xbase routines only
+ use "r" and "r+b".
+
+ \param sOpenMode
+ <table>
+ <tr><th>OpenMode<th>Description
+ <tr><td>r<td>Reading
+ <tr><td>r+<td>Reading and Writing
+ <tr><td>w<td>Open for writing. Truncate to zero bytes if it exists
+ <tr><td>w+<td>Open for reading and writing, truncate to zero bytes if it exists
+ <tr><td>a<td>Open for append
+ <tr><td>a+<td>Open for reading and writing (at end).
+ </table>
+ The mode can also include the letter "b" for binary ie; "r+b". The "b" is ignored on
+ POSIX compliant systems, but is included for cross platform compatibility.
+ \param sFileName File name to open
+ \param iShareMode
+ XB_SINGLE_USER<br>
+ XB_MULTI_USER<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFopen( const xbString &sOpenMode, const xbString &sFileName, xbInt16 iShareMode ) {
+ if( sFileName == "" || sFqFileName == "" )
+ SetFileName( sFileName );
+ return xbFopen( sOpenMode, iShareMode );
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fopen.
+/*!
+
+ This routine supports all the standard C library open modes. The Xbase routines only
+ use "r" and "r+".
+
+
+ \param sOpenMode
+ <table>
+ <tr><th>OpenMode<th>Description
+ <tr><td>r<td>Reading
+ <tr><td>r+<td>Reading and Writing
+ <tr><td>w<td>Open for writing. Truncate to zero bytes if it exists
+ <tr><td>w+<td>Open for reading and writing, truncate to zero bytes if it exists
+ <tr><td>a<td>Open for append
+ <tr><td>a+<td>Open for reading and writing (at end).
+ </table>
+ The mode can also include the letter "b" for binary ie; "r+b". The "b" is ignored on
+ POSIX compliant systems, but is included for cross platform compatibility.
+ \param iShareMode
+ XB_SINGLE_USER<br>
+ XB_MULTI_USER<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFopen( const xbString & sOpenMode, xbInt16 iShareMode ) {
+
+ #ifdef HAVE__FSOPEN_F
+ if(( fp = _fsopen( sFqFileName.Str(), sOpenMode.Str(), 0x40 )) != NULL ){
+ #else
+ if(( fp = fopen( sFqFileName.Str(), sOpenMode.Str())) != NULL ){
+ #endif
+
+ if( sOpenMode == "r" )
+ iOpenMode = XB_READ;
+ else if( sOpenMode == "w" )
+ iOpenMode = XB_WRITE;
+ else
+ iOpenMode = XB_READ_WRITE;
+
+ bFileOpen = xbTrue;
+ this->iShareMode = iShareMode;
+
+ #ifdef HAVE__FILENO_F
+ iFileNo = _fileno( fp );
+ #else
+ iFileNo = fileno( fp );
+ #endif
+
+ #ifdef HAVE_SETENDOFFILE_F
+ //used by visual studio, 32 bit
+ fHandle = (HANDLE) _get_osfhandle( iFileNo );
+ #endif
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iShareMode )
+ xbFTurnOffFileBuffering();
+ #endif
+
+ return XB_NO_ERROR;
+ }
+ else
+ return XB_OPEN_ERROR;
+}
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fopen.
+/*!
+ \param iOpenMode
+ XB_READ<br>
+ XB_READ_WRITE<br>
+ \param iShareMode
+ XB_SINGLE_USER<br>
+ XB_MULTI_USER<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFopen( xbInt16 iOpenMode, xbInt16 iShareMode ) {
+ this->iOpenMode = iOpenMode;
+ if( iOpenMode == XB_READ_WRITE )
+ return xbFopen( "r+b", iShareMode );
+ else if( iOpenMode == XB_READ )
+ return xbFopen( "r", iShareMode );
+ else
+ return XB_INVALID_OPTION;
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fputc.
+/*!
+ \param c Character to write
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbFile::xbFputc( xbInt32 c ) {
+ return xbFputc( c, 1 );
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fputc.
+/*!
+ \param c Character to write
+ \param iNoOfTimes Number of times to write the character
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbFile::xbFputc( xbInt32 c, xbInt32 iNoOfTimes ) {
+
+ for( xbInt32 l = 0; l < iNoOfTimes; l++ )
+ if( fputc( c, fp ) != (int) c )
+ return XB_WRITE_ERROR;
+
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fputs.
+/*!
+ \param s xbString to write to file
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFputs( const xbString & s ){
+ if( fputs( s.Str(), fp ) < 0 )
+ return XB_WRITE_ERROR;
+ else
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fread.
+/*!
+ \param p Pointer to data to write
+ \param size size of write
+ \param nmemb Number of times to write it
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFread( void *p, size_t size, size_t nmemb ) {
+
+ size_t iRc;
+ iRc = fread( p, size, nmemb, fp );
+ if( iRc == nmemb )
+ return XB_NO_ERROR;
+ else
+ return XB_READ_ERROR;
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fseek.
+/*!
+ \param lOffset Position in file to seek to
+ \param iWhence SEEK_SET - from beginning of file<br>
+ SEEK_CUR - from current position<br>
+ SEEK_END - from end of file<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbFseek( xbInt64 lOffset, xbInt32 iWhence ) {
+
+ xbInt32 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try {
+
+ #if defined(HAVE_FSEEKO_F)
+ iRc = fseeko( fp, lOffset, iWhence );
+ if( iRc != 0 ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ #elif defined(HAVE__FSEEKI64_F)
+ iRc = _fseeki64( fp, lOffset, iWhence );
+ if( iRc != 0 ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ #else
+ #ifdef XB_PLATFORM_32
+ /* if request is larger than 2 gig,this is a part of a locking request,
+ assuming offset is less than 4 gig, split the request into 2 fseek calls */
+ if( lOffset > 2147483647 && iWhence == SEEK_SET ){
+ /* move forward max amt - 2G */
+ if(( iRc = fseek( fp, 2147483647, SEEK_SET )) != 0 ){
+ iErrorStop = 300;
+ throw iRc;
+ }
+ lOffset -= 2147483647;
+ iWhence = SEEK_CUR;
+ }
+ #endif
+ iRc = fseek( fp, (long) lOffset, iWhence );
+ if( iRc != 0 ){
+ iErrorStop = 310;
+ throw iRc;
+ }
+ #endif
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFile::xbFseek() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ iRc = XB_SEEK_ERROR;
+ }
+ return iRc;
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary ftell.
+/*!
+ Returns the current file position.
+ \returns Current file position.
+*/
+
+size_t xbFile::xbFtell() {
+ return (size_t) ftell( fp );
+}
+
+/************************************************************************/
+//! @brief Turn off file buffering.
+/*!
+ Turns off file buffering. File buffering can't be used while in multi user mode.
+
+*/
+
+void xbFile::xbFTurnOffFileBuffering() {
+ setvbuf( fp, NULL, _IONBF, 0 );
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for standard libary fwrite.
+/*!
+ \param p Pointer to data buffer to write
+ \param size Size of data to write
+ \param nmemb Number of times to write data buffer
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbFile::xbFwrite( const void *p, size_t size, size_t nmemb ) {
+
+ size_t iRc;
+ iRc = fwrite( p, size, nmemb, fp );
+ if( iRc == nmemb )
+ return XB_NO_ERROR;
+ else
+ return XB_READ_ERROR;
+}
+
+/************************************************************************/
+//! @brief Read file until a particular character is encountered on input stream.
+/*!
+ This routine will read until cDelim is encountered or eof, which ever occurs first.
+
+ \param cDelim Delimiter to stop writing at.
+ \param sOut Output xbString containing data read
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbReadUntil( const char cDelim, xbString &sOut ){
+
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char c;
+
+ try{
+ sOut = "";
+ if(( iRc = xbFgetc( c )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ sOut = c;
+ while( iRc == XB_NO_ERROR && c != cDelim ){
+ if(( iRc = xbFgetc( c )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ sOut += c;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFile::xbReadUntil() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/************************************************************************/
+//! @brief Delete file.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbFile::xbRemove() {
+ return xbRemove( sFqFileName.Str(), 0 );
+}
+
+/************************************************************************/
+//! @brief Delete file.
+/*!
+ \param sFileNameIn Name of file to delete
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbRemove( const xbString & sFileNameIn ) {
+ return xbRemove( sFileNameIn, 0 );
+}
+
+
+/************************************************************************/
+//! @brief Delete file.
+/*!
+ \param sFileNameIn Name of file to delete
+ \param iOption If Set to 1, assume this is a delete request for a dbf file, and should rename the dbt file also
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbFile::xbRemove( const xbString & sFileNameIn, xbInt16 iOption ) {
+
+ xbInt32 iRc = remove( sFileNameIn.Str());
+ if( iRc != 0 )
+ return XB_DELETE_FAILED;
+
+ if( iOption == 1 ){
+ xbString sFileName2 = sFileNameIn;
+
+ if( sFileName2[sFileName2.Len()] == 'F' )
+ sFileName2.PutAt( sFileName2.Len(), 'T' );
+ else
+ sFileName2.PutAt( sFileName2.Len(), 't' );
+
+ iRc = remove( sFileName2.Str());
+ if( iRc != 0 )
+ return XB_DELETE_FAILED;
+ }
+
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+//! @brief Rename file.
+/*!
+ \param sOldName Original file name
+ \param sNewName New file name
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbFile::xbRename( const xbString & sOldName, const xbString & sNewName ){
+ return xbRename( sOldName, sNewName, 0 );
+}
+
+/************************************************************************/
+//! @brief Rename file.
+/*!
+ \param sOldName Original file name
+ \param sNewName New file name
+ \param iOption If Set to 1, assume this is a rename request for a dbf file, and should rename the dbt file also
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbFile::xbRename( const xbString & sOldName, const xbString & sNewName, xbInt16 iOption ){
+
+
+ if( rename( sOldName.Str(), sNewName.Str())){
+ return XB_RENAME_ERROR;
+ }
+ if( iOption == 1 ){
+ xbString sOldName2 = sOldName;
+ xbString sNewName2 = sNewName;
+
+ if( sOldName2[sOldName2.Len()] == 'F' )
+ sOldName2.PutAt( sOldName2.Len(), 'T' );
+ else
+ sOldName2.PutAt( sOldName2.Len(), 't' );
+
+ if( sNewName2[sNewName2.Len()] == 'F' )
+ sNewName2.PutAt( sNewName2.Len(), 'T' );
+ else
+ sNewName2.PutAt( sNewName2.Len(), 't' );
+
+ if( rename( sOldName2.Str(), sNewName2.Str()))
+ return XB_RENAME_ERROR;
+ }
+ return XB_NO_ERROR;
+}
+
+
+/************************************************************************/
+//! @brief Xbase wrapper for rewind.
+/*!
+ Set file pointer at beginning of file.
+*/
+
+void xbFile::xbRewind() {
+ rewind( fp );
+}
+
+/************************************************************************/
+//! @brief Xbase wrapper for ftruncate.
+/*!
+ Set file size to llSize
+ \param llSize New file size.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbFile::xbTruncate( xbInt64 llSize ) {
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ try{
+ #ifdef HAVE_FTRUNCATE_F
+ if(( iRc = ftruncate( iFileNo, llSize )) != 0 ){
+ iErrorStop = 10;
+ iRc = XB_WRITE_ERROR;
+ throw iRc;
+ }
+ #elif defined(HAVE_SETENDOFFILE_F)
+ if(( iRc = xbFseek( llSize, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ if(( iRc = SetEndOfFile( fHandle )) == 0 ){
+ iErrorStop = 30;
+ iRc = XB_WRITE_ERROR;
+ throw iRc;
+ } else {
+ iRc = XB_NO_ERROR;
+ }
+ #else
+
+ // check that cmake can find function SetEndOfFile -
+ // cmake could not find for Borland 5.5
+ FATAL_COMPILE_ERROR
+ CANT_LOCATE_FUNCTION_ftruncate_or_SetEndOfFile
+
+ #endif
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFile::xbTruncate() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+
+#ifdef XB_LOCKING_SUPPORT
+
+//! @brief Lock / unlock file.
+/*!
+ \param iFunction XB_LOCK<br>
+ XB_UNLOCK<br>
+ \param lOffset Position in file to lock
+ \param stLen Length to lock
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbFile::xbLock( xbInt16 iFunction, xbInt64 lOffset, size_t stLen ){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbInt16 iTries = 0;
+
+ try{
+ #ifdef HAVE_FCNTL_F
+ /* Unix lock function */
+
+ if(( iRc = xbFseek( lOffset, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ struct flock fl;
+ switch( iFunction ){
+ case( XB_LOCK ):
+ fl.l_type = F_WRLCK;
+ break;
+ case( XB_UNLOCK ):
+ fl.l_type = F_UNLCK;
+ break;
+ default:
+ iErrorStop = 20;
+ iRc = XB_INVALID_LOCK_OPTION;
+ throw iRc;
+ break;
+ }
+ fl.l_whence = SEEK_CUR;
+ fl.l_start = 0;
+ fl.l_len = (xbInt32) stLen;
+ do{
+ iRc = fcntl( iFileNo, F_SETLK, &fl );
+ if( iRc && (errno == EACCES || errno == EAGAIN )){
+ iTries++;
+ xbase->xbSleep( GetDefaultLockWait() );
+ } else if( iRc ){
+ iErrorStop = 30;
+ iRc = XB_LOCK_FAILED;
+ throw iRc;
+ }
+ } while( iRc && iTries < GetLockRetryCount());
+ if( iRc )
+ iRc = XB_LOCK_FAILED; // lock failed, don't log an exception
+
+ #elif defined(HAVE_LOCKFILE_F)
+ /* Windows 64 byte lock functions */
+ /* split a quad word into two double words */
+ typedef union{
+ size_t Qword;
+ xbUInt32 Dword[2];
+ } Qsplit;
+
+ Qsplit lPos;
+ Qsplit lLen;
+ lPos.Qword = lOffset;
+ lLen.Qword = stLen;
+
+ do{
+ if( iFunction == XB_LOCK ){
+ if(( iRc = LockFile( fHandle, lPos.Dword[0], lPos.Dword[1], lLen.Dword[0], lLen.Dword[1] )) == 0 ){
+ iTries++;
+ xbase->xbSleep( GetDefaultLockWait() );
+ }
+ }
+ else if( iFunction == XB_UNLOCK ){
+ if(( iRc = UnlockFile( fHandle, lPos.Dword[0], lPos.Dword[1], lLen.Dword[0], lLen.Dword[1] )) == 0 ){
+ iTries++;
+ xbase->xbSleep( GetDefaultLockWait() );
+ }
+ }
+ else
+ {
+ iErrorStop = 30;
+ iRc = XB_INVALID_LOCK_OPTION;
+ throw iRc;
+ }
+ } while( iRc == 0 && iTries < GetLockRetryCount());
+ if( iRc == 0 )
+ iRc = XB_LOCK_FAILED; // lock failed, don't log an exception
+ else
+ iRc = XB_NO_ERROR;
+
+ #elif defined(HAVE_LOCKING_F) || defined(HAVE__LOCKING_F)
+
+ /* older 32 bit locking functions */
+ xbInt32 iLockType;
+ if( iFunction == XB_LOCK ){
+ iLockType = 2;
+ } else if( iFunction == XB_UNLOCK ){
+ iLockType = 0;
+ } else {
+ iErrorStop = 50;
+ iRc = XB_INVALID_LOCK_OPTION;
+ throw iRc;
+ }
+
+ if(( iRc = xbFseek( lOffset, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ iRc = XB_SEEK_ERROR;
+ throw iRc;
+ }
+
+ do{
+ #ifdef HAVE__LOCKING_F
+ if(( iRc = _locking( iFileNo, iLockType, stLen )) != 0 ){
+ #else
+ if(( iRc = locking( iFileNo, iLockType, stLen )) != 0 ){
+ #endif
+ iTries++;
+ xbase->xbSleep( GetDefaultLockWait() );
+ }
+ } while( iRc != 0 && iTries < GetLockRetryCount());
+
+ if( iRc != 0 )
+ iRc = XB_LOCK_FAILED; // lock failed, don't log an exception
+ else
+ iRc = XB_NO_ERROR;
+
+ #else
+
+ FATAL ERROR - CANT BUILD LIBRARY IN CURRENT CONFIG - MISSING - no file locking function defined in xbfile.cpp
+
+ #endif
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFile::xbLock() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ return iRc;
+
+
+}
+
+//! @brief Return the locking retry setting.
+/*!
+
+ \returns The lock retry setting for this file or ths system default setting if the lock retry for the file
+ has not been set.
+*/
+
+xbInt16 xbFile::GetLockRetryCount() const {
+
+ if( iLockRetries == -1 )
+ return xbase->GetDefaultLockRetries();
+ else
+ return iLockRetries;
+}
+
+//! @brief Set the lock retry countr for this specific file.
+/*!
+ \param iLockRetries The number of retries to attempt before returning failure for this file
+*/
+
+void xbFile::SetLockRetryCount( xbInt16 iLockRetries ) {
+ this->iLockRetries = iLockRetries;
+}
+
+#endif
+/***********************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+//! @brief Debugging routine - dump a block to the log file.
+/*!
+ This routine dumps a block to a file in the log file. This is
+ primarily used for debugging and analysis purposes.
+
+ \param ulBlockNo Block number to write
+ \param lBlxkSize Size of block
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbFile::DumpBlockToDisk( xbUInt32 ulBlockNo, size_t lBlkSize ){
+
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ xbUInt32 ulStartBlock;
+ xbUInt32 ulEndBlock;
+
+ char *p = 0x00;
+
+ xbString sDir;
+ xbString sFn;
+ char *buf = NULL;
+ FILE *fpd = NULL;
+ try{
+ iErrorStop = 10;
+
+ if( ulBlockNo == 0 ){
+ ulStartBlock = 0;
+ xbUInt64 ullFileSizeulBlockNo;
+ if(( iRc = GetFileSize( ullFileSizeulBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ ulEndBlock = (xbUInt32) (ullFileSizeulBlockNo / lBlkSize);
+ } else {
+ ulStartBlock = ulBlockNo;
+ ulEndBlock = ulBlockNo;
+ }
+
+ if(( buf = (char *) malloc( lBlkSize )) == NULL ){
+ iErrorStop = 30;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ sDir = GetDefaultLogDirectory();
+ char cLastChar = sDir[sDir.Len()];
+
+ for( xbUInt32 l = ulStartBlock; l < ulEndBlock; l++ ){
+
+ if(( iRc = ReadBlock( l, lBlkSize, buf )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ // build logfile name
+ if( cLastChar != '/' && cLastChar != '\\' )
+ sFn.Sprintf( "%s/Blockdump.B%ld", sDir.Str(), l);
+ else
+ sFn.Sprintf( "%sBlockDump.%ld", sDir.Str(), l);
+
+ // open the dump file for append
+ #ifdef HAVE__FSOPEN_F
+ if(( fpd = _fsopen( sFn.Str(), "w+b", 0x40 )) == NULL ){
+ #else
+ if(( fpd = fopen( sFn.Str(), "w+b")) == NULL ){
+ #endif
+ iErrorStop = 50;
+ iRc = XB_OPEN_ERROR;
+ throw iRc;
+ }
+
+ // dump the block to the file
+ p = buf;
+ for( size_t l = 0; l < lBlkSize; l++ ){
+ //if( fputc( *p, fpd ) != *p ){
+ if( fputc( *p, fpd ) == EOF ){
+ iErrorStop = 60;
+ iRc = XB_WRITE_ERROR;
+ throw iRc;
+ }
+ p++;
+ }
+ // close the dump file
+ fclose( fpd );
+ }
+
+ // free the buffer
+ if( buf )
+ free( buf );
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ if( iErrorStop == 60 )
+ sMsg.Sprintf( "xbFile::DumpBlockToDisk() Exception Caught. Error Stop = [%d] iRc = [%d] c=[%c][%x]", iErrorStop, iRc, *p, *p );
+ else
+ sMsg.Sprintf( "xbFile::DumpBlockToDisk() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( buf )
+ free( buf );
+ if( fpd )
+ fclose( fpd );
+ }
+ return iRc;
+
+}
+#endif
+/***********************************************************************/
+} /* namespace xb */
+
+
+
diff --git a/src/core/xbfilter.cpp b/src/core/xbfilter.cpp
new file mode 100755
index 0000000..e75f583
--- /dev/null
+++ b/src/core/xbfilter.cpp
@@ -0,0 +1,569 @@
+/* xbfilter.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+
+This module handles uda (user data area) methods
+
+
+*/
+
+#include "xbase.h"
+
+
+// might need to change thisto XB_EXPRESSION_SUPPORT
+#ifdef XB_FILTER_SUPPORT
+
+
+namespace xb{
+
+/************************************************************************/
+xbFilter::xbFilter( xbXBase *xbase, xbDbf *dbf ) {
+ this->xbase = xbase;
+ this->dbf = dbf;
+ this->exp = NULL;
+ lLimit = 0; // max number of responses
+ lCurQryCnt = 0; // current number, this query + = moving fwd
+ // - = moving backwards
+
+ #ifdef XB_INDEX_SUPPORT
+ pIx = NULL; // if index is set, the class uses the index tag, otherwise table
+ vpTag = NULL;
+ #endif // XB_INDEX_SUPPORT
+
+}
+/************************************************************************/
+xbFilter::~xbFilter() {
+ if( exp )
+ delete exp;
+}
+/************************************************************************/
+xbInt32 xbFilter::GetLimit() const {
+ return lLimit;
+}
+/************************************************************************/
+xbInt32 xbFilter::GetQryCnt() const {
+ return lCurQryCnt;
+}
+/************************************************************************/
+void xbFilter::SetLimit( xbInt32 lLimit ){
+ this->lLimit = lLimit;
+}
+/************************************************************************/
+void xbFilter::ResetQryCnt(){
+ this->lCurQryCnt = 0;
+}
+
+/************************************************************************/
+xbInt16 xbFilter::Set( xbString &sFilter ) {
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( exp )
+ delete exp;
+
+ exp = new xbExp( xbase, dbf );
+ if(( iRc = exp->ParseExpression( sFilter.Str() )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ if( exp->GetReturnType() != XB_EXP_LOGICAL ){
+ iErrorStop = 20;
+ iRc = XB_INVALID_EXPRESSION;
+ delete exp;
+ exp = NULL;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFilter::SetExpression() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( xbase->GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/************************************************************************/
+xbInt16 xbFilter::GetFirstRecord( xbInt16 iOption ) {
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( !exp ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ #ifdef XB_INDEX_SUPPORT
+ if( dbf->GetCurIx() && dbf->GetCurTag() )
+ return GetFirstRecordIx( iOption );
+ #endif
+
+ lCurQryCnt = 0;
+ if(( iRc = dbf->GetFirstRecord( iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_EMPTY || iRc == XB_EOF )
+ return iRc;
+ else{
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+
+ xbBool bFound = xbFalse;
+ while( !bFound && iRc == XB_NO_ERROR ){
+ if(( iRc = exp->ProcessExpression()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if(( iRc = exp->GetBoolResult( bFound )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if( !bFound ){
+ if(( iRc = dbf->GetNextRecord( iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_EOF ){
+ return iRc;
+ } else {
+ iErrorStop = 50;
+ throw iRc;
+ }
+ }
+ }
+ }
+ lCurQryCnt++;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFilter::GetFirstRecord() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( xbase->GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/************************************************************************/
+xbInt16 xbFilter::GetNextRecord( xbInt16 iOption ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( !exp ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ #ifdef XB_INDEX_SUPPORT
+ if( dbf->GetCurIx() && dbf->GetCurTag())
+ return GetNextRecordIx( iOption );
+ #endif
+
+ if( lLimit != 0 && abs( lCurQryCnt ) >= lLimit )
+ return XB_LIMIT_REACHED;
+
+ if(( iRc = dbf->GetNextRecord( iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_EOF )
+ return iRc;
+ else{
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+
+ xbBool bFound = xbFalse;
+ while( !bFound && iRc == XB_NO_ERROR ){
+ if(( iRc = exp->ProcessExpression()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if(( iRc = exp->GetBoolResult( bFound )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if( !bFound ){
+ if(( iRc = dbf->GetNextRecord( iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_EOF ){
+ return iRc;
+ } else {
+ iErrorStop = 50;
+ throw iRc;
+ }
+ }
+ }
+ }
+ lCurQryCnt++;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFilter::GetNextRecord() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( xbase->GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/************************************************************************/
+xbInt16 xbFilter::GetPrevRecord( xbInt16 iOption ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( !exp ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ #ifdef XB_INDEX_SUPPORT
+ //if( pIx && vpTag )
+ if( dbf->GetCurIx() && dbf->GetCurTag())
+ return GetPrevRecordIx( iOption );
+ #endif
+
+ if( lLimit != 0 && abs( lCurQryCnt ) >= lLimit )
+ return XB_LIMIT_REACHED;
+
+ if(( iRc = dbf->GetPrevRecord( iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_BOF )
+ return iRc;
+ else{
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+
+ xbBool bFound = xbFalse;
+ while( !bFound && iRc == XB_NO_ERROR ){
+ if(( iRc = exp->ProcessExpression()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if(( iRc = exp->GetBoolResult( bFound )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if( !bFound ){
+ if(( iRc = dbf->GetPrevRecord( iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_BOF ){
+ return iRc;
+ } else {
+ iErrorStop = 50;
+ throw iRc;
+ }
+ }
+ }
+ }
+ lCurQryCnt--;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFilter::GetPrevRecord() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( xbase->GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/************************************************************************/
+xbInt16 xbFilter::GetLastRecord( xbInt16 iOption ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( !exp ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ #ifdef XB_INDEX_SUPPORT
+ if( dbf->GetCurIx() && dbf->GetCurTag())
+ return GetLastRecordIx( iOption );
+ #endif
+
+ lCurQryCnt = 0;
+ if(( iRc = dbf->GetLastRecord( iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_EOF )
+ return iRc;
+ else{
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+
+ xbBool bFound = xbFalse;
+ while( !bFound && iRc == XB_NO_ERROR ){
+ if(( iRc = exp->ProcessExpression()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if(( iRc = exp->GetBoolResult( bFound )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if( !bFound ){
+ if(( iRc = dbf->GetPrevRecord( iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_BOF ){
+ return iRc;
+ } else {
+ iErrorStop = 50;
+ throw iRc;
+ }
+ }
+ }
+ }
+ lCurQryCnt--;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFilter::GetLastRecord() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( xbase->GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/************************************************************************/
+
+#ifdef XB_INDEX_SUPPORT
+
+//void xbFilter::Set( xbIx *pIx, void *vpTag ) {
+// this->pIx = pIx;
+// this->vpTag = vpTag;
+//}
+
+/************************************************************************/
+xbInt16 xbFilter::GetFirstRecordIx( xbInt16 iOption ) {
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( !exp ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ lCurQryCnt = 0;
+ if(( iRc = dbf->GetCurIx()->GetFirstKey( dbf->GetCurTag(), iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_EMPTY || iRc == XB_EOF )
+ return iRc;
+ else{
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+
+ xbBool bFound = xbFalse;
+ while( !bFound && iRc == XB_NO_ERROR ){
+ if(( iRc = exp->ProcessExpression()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if(( iRc = exp->GetBoolResult( bFound )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if( !bFound ){
+ // if(( iRc = pIx->GetNextKey( vpTag, iOption )) != XB_NO_ERROR ){
+ if(( iRc = dbf->GetCurIx()->GetNextKey( dbf->GetCurTag(), iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_EOF ){
+ return iRc;
+ } else {
+ iErrorStop = 50;
+ throw iRc;
+ }
+ }
+ }
+ }
+ lCurQryCnt++;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFilter::GetFirstRecordIx() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( xbase->GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/************************************************************************/
+xbInt16 xbFilter::GetNextRecordIx( xbInt16 iOption ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( !exp ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ if( lLimit != 0 && abs( lCurQryCnt ) >= lLimit )
+ return XB_LIMIT_REACHED;
+
+ if(( iRc = dbf->GetCurIx()->GetNextKey( dbf->GetCurTag(), iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_EOF )
+ return iRc;
+ else{
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+
+ xbBool bFound = xbFalse;
+ while( !bFound && iRc == XB_NO_ERROR ){
+ if(( iRc = exp->ProcessExpression()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if(( iRc = exp->GetBoolResult( bFound )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if( !bFound ){
+ // if(( iRc = pIx->GetNextKey( vpTag, iOption )) != XB_NO_ERROR ){
+ if(( iRc = dbf->GetCurIx()->GetNextKey( dbf->GetCurTag(), iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_EOF ){
+ return iRc;
+ } else {
+ iErrorStop = 50;
+ throw iRc;
+ }
+ }
+ }
+ }
+ lCurQryCnt++;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFilter::GetNextRecordIx() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( xbase->GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/************************************************************************/
+xbInt16 xbFilter::GetPrevRecordIx( xbInt16 iOption ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( !exp ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ if( lLimit != 0 && abs( lCurQryCnt ) >= lLimit )
+ return XB_LIMIT_REACHED;
+
+ if(( iRc = dbf->GetCurIx()->GetPrevKey( dbf->GetCurTag(), iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_BOF )
+ return iRc;
+ else{
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+
+ xbBool bFound = xbFalse;
+ while( !bFound && iRc == XB_NO_ERROR ){
+ if(( iRc = exp->ProcessExpression()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if(( iRc = exp->GetBoolResult( bFound )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if( !bFound ){
+ //if(( iRc = pIx->GetPrevKey( vpTag, iOption )) != XB_NO_ERROR ){
+ if(( iRc = dbf->GetCurIx()->GetPrevKey( dbf->GetCurTag(), iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_BOF ){
+ return iRc;
+ } else {
+ iErrorStop = 50;
+ throw iRc;
+ }
+ }
+ }
+ }
+ lCurQryCnt--;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFilter::GetPrevRecordIx() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( xbase->GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/************************************************************************/
+xbInt16 xbFilter::GetLastRecordIx( xbInt16 iOption ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ if( !exp ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ lCurQryCnt = 0;
+ if(( iRc = dbf->GetCurIx()->GetLastKey( dbf->GetCurTag(), iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_EOF )
+ return iRc;
+ else{
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+
+ xbBool bFound = xbFalse;
+ while( !bFound && iRc == XB_NO_ERROR ){
+ if(( iRc = exp->ProcessExpression()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if(( iRc = exp->GetBoolResult( bFound )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if( !bFound ){
+ if(( iRc = dbf->GetCurIx()->GetPrevKey( dbf->GetCurTag(), iOption )) != XB_NO_ERROR ){
+ if( iRc == XB_BOF ){
+ return iRc;
+ } else {
+ iErrorStop = 50;
+ throw iRc;
+ }
+ }
+ }
+ }
+ lCurQryCnt--;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbFilter::GetLastRecordIx() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( xbase->GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+#endif // XB_INDEX_SUPPORT
+
+
+/************************************************************************/
+} /* namespace */
+#endif /* XB_FILTER_SUPPORT */ \ No newline at end of file
diff --git a/src/core/xbfuncs.cpp b/src/core/xbfuncs.cpp
new file mode 100755
index 0000000..a038611
--- /dev/null
+++ b/src/core/xbfuncs.cpp
@@ -0,0 +1,850 @@
+/* xbfuncs.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2017,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_FUNCTION_SUPPORT
+
+namespace xb{
+
+
+// All funtions have a similar structure, return an xbInt16 return code
+// Have a variable number of input operands and one output operand
+
+/************************************************************************/
+//! @brief Calculate absolute value of a numeric expression.
+/*!
+ Expression function ABS().
+ \param dIn Input - Numeric expression.
+ \param dOut Output - Absolute value.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbXBase::ABS( xbDouble dIn, xbDouble &dOut ){
+ if( dIn < 0 )
+ dOut = dIn * -1;
+ else
+ dOut = dIn;
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Trim leading and trailing white space from a string.
+/*!
+ Expression function ALLTRIM().
+ \param sIn Input - Input string to trim.
+ \param sOut Output - Trimmed string.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbXBase::ALLTRIM( const xbString &sIn, xbString &sOut ){
+ sOut = sIn;
+ sOut.Trim();
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Return ASCII code for the first character in a string.
+/*!
+ Expression function ASC().
+ \param sIn Input - Input character string.
+ \param dAscOut Output - Ascii code of first character in string.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::ASC( const xbString &sIn, xbDouble &dAscOut ){
+ if( sIn == "" )
+ return XB_PARSE_ERROR;
+
+ dAscOut = sIn[1];
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Return number indicating starting position of string within a string.
+/*!
+ Expression function AT().
+ \param s1 Input - Input string to search for.
+ \param s2 Input - Input string to search.
+ \param dPos Output - Position of string s1 within s2.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::AT( const xbString &s1, const xbString &s2, xbDouble &dPos ){
+ /* looks for s1 in s2 */
+ xbInt32 lCnt = 0;
+ const char *p;
+ const char *p2 = s2;
+ if( strlen( s1 ) > strlen( s2 )) return 0;
+ if(( p = strstr( s2, s1 )) == NULL )
+ return XB_NO_ERROR;
+ while( p2++ != p ) lCnt++;
+ dPos = lCnt + 1;
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Return character weekday name for date.
+/*!
+ Expression function CDOW().
+ \param dInDate Input - Input date.
+ \param sOutDow Output - Character day of week.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::CDOW( xbDate &dInDate, xbString &sOutDow ){
+ return dInDate.CharDayOf( sOutDow );
+}
+
+/*************************************************************************/
+//! @brief Convert numeric expression to a character.
+/*!
+ Expression function CHR().
+ \param dAsciCd Input - Numeric expression.
+ \param sOut Output - Character result.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::CHR( xbDouble dAsciCd, xbString &sOut ){
+ static char buf[2];
+ buf[0] = (char) dAsciCd;
+ buf[1] = 0x00;
+ sOut = buf;
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Return character month name for date.
+/*!
+ Expression function CMONTH().
+ \param dInDate Input - Input date.
+ \param sOutMonth Output - Character month.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::CMONTH( xbDate &dInDate, xbString &sOutMonth ){
+ return dInDate.CharMonthOf( sOutMonth );
+}
+/*************************************************************************/
+//! @brief Return date from character input date.
+/*!
+ Expression function CTOD().
+ \param sInDate Input - Input date in MM/DD/YY format.
+ \param dOutDate Output - Output date.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::CTOD( const xbString &sInDate, xbDate &dOutDate ){
+ return dOutDate.CTOD( sInDate );
+}
+/*************************************************************************/
+//! @brief Return system date.
+/*!
+ Expression function DATE().
+ \param dOutDate Output - Output date.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::DATE( xbDate &dOutDate ){
+ return dOutDate.Sysdate();
+}
+/*************************************************************************/
+//! @brief Return the day of the month from a date.
+/*!
+ Expression function DAY().
+ \param dInDate Input - Input date.
+ \param dOutDay Output - Output day of month.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::DAY( const xbDate &dInDate, xbDouble &dOutDay ){
+ xbInt16 iOutDay;;
+ iOutDay = dInDate.DayOf( XB_FMT_MONTH );
+ if( iOutDay < 0 ){
+ return iOutDay;
+ }else{
+ dOutDay = iOutDay;
+ return XB_NO_ERROR;
+ }
+}
+/*************************************************************************/
+//! @brief Return record deletion status for current record.
+/*!
+ Expression function DEL().
+ \param dbf Input - Table to check record deletion status.
+ \param iRecBufSw Input - Which buffer. 0 = Current record buffer, 1 = Original record buffer
+ \param sOut Output - "*" if record is deleted, otherise space.
+ \returns XB_NO_ERROR<br>XB_PARSE_ERROR.
+
+*/
+xbInt16 xbXBase::DEL( xbDbf *dbf , xbString &sOut, xbInt16 iRecBufSw ) {
+
+ if( dbf ){
+ if( dbf->RecordDeleted( iRecBufSw ))
+ sOut = "*";
+ else
+ sOut = " ";
+ return XB_NO_ERROR;
+ } else {
+ return XB_PARSE_ERROR;
+ }
+}
+
+/*************************************************************************/
+//! @brief Return record deletion status for current record.
+/*!
+ Expression function DELETED().
+ \param dbf Input - Table to check record deletion status for.
+ \param iRecBufSw Input - Which buffer. 0 = Current record buffer, 1 = Original record buffer
+ \param bOut Output - xbTrue if record is deleted.<br>xbFalse if record is not deleted.
+ \returns XB_NO_ERROR<br>XB_PARSE_ERROR.
+*/
+xbInt16 xbXBase::DELETED( xbDbf *dbf , xbBool &bOut, xbInt16 iRecBufSw ) {
+
+ if( dbf ){
+ bOut = dbf->RecordDeleted( iRecBufSw );
+ return XB_NO_ERROR;
+ } else {
+ return XB_PARSE_ERROR;
+ }
+}
+
+/*************************************************************************/
+//! @brief Clipper DESCEND function.
+/*!
+ Expression function DESCEND().
+ \param dtInDate Input - Input date.
+ \param dtOutDate Output - Output date.
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbXBase::DESCEND( const xbDate &dtInDate, xbDate &dtOutDate ){
+ xbDate d( "29991231" );
+ dtOutDate.JulToDate8( 2415021 + d.JulianDays() - dtInDate.JulianDays());
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Clipper DESCEND function.
+/*!
+ Expression function DESEND().
+ \param dIn Input - Input number.
+ \param dOut Output - Output number.
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbXBase::DESCEND( xbDouble dIn, xbDouble &dOut ){
+ dOut = dIn * -1;
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Clipper DESCEND function.
+/*!
+ Expression function DESEND().
+ \param sIn Input - Input string.
+ \param sOut Output - Output string.
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbXBase::DESCEND( const xbString &sIn, xbString &sOut ){
+
+ sOut = sIn;
+ for( xbUInt32 l = 0; l < sIn.Len(); l++ )
+ sOut.PutAt( l+1, (char) (255 - sOut[l+1]));
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Return number of day of week.
+/*!
+ Expression function DOW().
+ \param dtInDate Input - Input date.
+ \param dDowOut Output - Output day of week.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::DOW( const xbDate &dtInDate, xbDouble &dDowOut ){
+ xbInt16 iDow;
+ iDow = dtInDate.DayOf( XB_FMT_WEEK );
+ if( iDow < 0 ){
+ return XB_PARSE_ERROR;
+ }else{
+ dDowOut = iDow;
+ return XB_NO_ERROR;
+ }
+}
+
+/*************************************************************************/
+//! @brief Return character date from input date.
+/*!
+ Expression function DTOC().
+ \param dInDate Input - Input date.
+ \param sOutFmtDate Output - Output date.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::DTOC( xbDate &dInDate, xbString &sOutFmtDate ){
+ return dInDate.FormatDate( "MM/DD/YY", sOutFmtDate );
+}
+/*************************************************************************/
+//! @brief Return char CCYYMMDD date from input date.
+/*!
+ Expression function DTOS().
+ \param dtInDate Input - Input date.
+ \param sOutFmtDate Output - Output date.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::DTOS( xbDate &dtInDate, xbString &sOutFmtDate ){
+ return dtInDate.FormatDate( "YYYYMMDD", sOutFmtDate );
+}
+/*************************************************************************/
+//! @brief Return exponent value.
+/*!
+ Expression function EXP().
+ This function returns e**x where e is approximately 2.71828 and x is dIn.
+
+ \param dIn Input - exp value.
+ \param dOut Output - value.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbXBase::EXP( xbDouble dIn, xbDouble &dOut )
+{
+ dOut = exp( dIn );
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Immediate if.
+/*!
+ Expression function IIF().
+ \param bResult Input - boolean expression.
+ \param sTrueResult Input - value if boolean expression is true.
+ \param sFalseResult Input - value if boolean expression is false.
+ \param sResult Output - sTrueResult or sFalseResult depending on bResultvalue.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbXBase::IIF( xbBool bResult, const xbString &sTrueResult, const xbString &sFalseResult, xbString &sResult )
+{
+ if( sFalseResult.Len() != sTrueResult.Len())
+ return XB_INCONSISTENT_PARM_LENS;
+ if( bResult )
+ sResult = sTrueResult;
+ else
+ sResult = sFalseResult;
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Convert number to integer, truncate any decimals.
+/*!
+ Expression function INT().
+ \param dIn Input - Input number.
+ \param dOut Output - integer.
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbXBase::INT( xbDouble dIn, xbDouble &dOut )
+{
+ xbInt64 ll = (xbInt64) dIn;
+ dOut = (xbDouble) ll;
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Check if string begins with alpha character.
+/*!
+ Expression function ISALPHA().
+ \param sIn Input - Input string.
+ \param bResult Output - xbTrue if string begins with alpha character.<br>xbFalse if string does not begin with alpha character.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbXBase::ISALPHA( const xbString &sIn, xbBool &bResult ){
+ if( isalpha(sIn[1]))
+ bResult = 1;
+ else
+ bResult = 0;
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Check if string begins with lower case alpha character.
+/*!
+ Expression function ISLOWER().
+ \param sIn Input - Input string.
+ \param bResult Output - xbTrue if string begins with lower case alpha character.<br>
+ xbFalse if string does not begin with lower case alpha character.
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbXBase::ISLOWER( const xbString &sIn, xbBool &bResult ){
+ if( islower(sIn[1]))
+ bResult = 1;
+ else
+ bResult = 0;
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Check if string begins with upper case alpha character.
+/*!
+ Expression function ISUPPER().
+ \param sIn Input - Input string.
+ \param bResult Output - xbTrue if string begins with upper case alpha character.<br>
+ xbFalse if string does not begin with upper case alpha character.
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbXBase::ISUPPER( const xbString &sIn, xbBool &bResult ){
+ if( isupper(sIn[1]))
+ bResult = 1;
+ else
+ bResult = 0;
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Return left characters from string.
+/*!
+ Expression function LEFT().
+ \param sIn Input - string.
+ \param ulCharCnt Input - number of characters to extract from string.
+ \param sOut Output - resultant string.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbXBase::LEFT( const xbString &sIn, xbUInt32 ulCharCnt, xbString &sOut ){
+ sOut.Assign( sIn, 1, ulCharCnt );
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Return length of string.
+/*!
+ Expression function LEN().
+ \param sIn Input - Input string.
+ \param dOut Output - string length.
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbXBase::LEN( const xbString &sIn, xbDouble &dOut ){
+ dOut = sIn.Len();
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Calculate logarithm.
+/*!
+ Expression function LOG().
+ \param dIn Input - numeric expression.
+ \param dOut Output - numeric log value.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbXBase::LOG( xbDouble dIn, xbDouble &dOut ){
+ dOut = log( dIn );
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Trim left side of string.
+/*!
+ Expression function LTRIM().
+ \param sIn Input - string.
+ \param sOut Output - string result.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbXBase::LTRIM( const xbString &sIn, xbString &sOut ){
+ sOut = sIn;
+ sOut.Ltrim();
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Convert upper case to lower case.
+/*!
+ Expression function LOWER().
+ \param sIn Input - string.
+ \param sOut Output - string result.
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbXBase::LOWER( const xbString &sIn, xbString &sOut ){
+ sOut = sIn;
+ sOut.ToLowerCase();
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Return higher of two values.
+/*!
+ Expression function MAX().
+ \param d1 Input - Numeric value 1.
+ \param d2 Input - Numeric value 2.
+ \param dOut Output - Higher of d1 or d2.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbXBase::MAX( xbDouble d1, xbDouble d2, xbDouble &dOut )
+{
+ if( d1 > d2 )
+ dOut = d1;
+ else
+ dOut = d2;
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Return lessor of two values.
+/*!
+ Expression function MIN().
+ \param d1 Input - Numeric value 1.
+ \param d2 Input - Numeric value 2.
+ \param dOut Output - Lessor of d1 or d2.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbXBase::MIN( xbDouble d1, xbDouble d2, xbDouble &dOut )
+{
+ if( d1 < d2 )
+ dOut = d1;
+ else
+ dOut = d2;
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Return number of month for a given date.
+/*!
+ Expression function MONTH().
+ \param dInDate Input date.
+ \param dOutMonth - Month number.
+ \returns XB_NO_ERROR.<br>XB_PARSE_ERROR.
+*/
+xbInt16 xbXBase::MONTH( xbDate &dInDate, xbDouble &dOutMonth ){
+
+ xbInt16 iRc = dInDate.MonthOf();
+ if( iRc < 0 )
+ return XB_PARSE_ERROR;
+ else{
+ dOutMonth = iRc;
+ return XB_NO_ERROR;
+ }
+}
+
+/*************************************************************************/
+//! @brief Return number of records in a given table.
+/*!
+ Expression function RECCOUNT().
+ \param dbf - Table.
+ \param dOut - Number of records.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::RECCOUNT( xbDbf *dbf , xbDouble &dOut ) {
+
+ xbUInt32 ulRecCnt;
+ xbInt16 iRc = dbf->GetRecordCnt( ulRecCnt );
+ dOut = (xbDouble) ulRecCnt;
+ return iRc;
+
+}
+
+/*************************************************************************/
+//! @brief Return current record number for a given table.
+/*!
+ Expression function RECNO().
+ \param dbf - Table.
+ \param dOut - Record number.
+ \returns XB_NO_ERROR.<br>XB_PARSE_ERROR.
+*/
+
+xbInt16 xbXBase::RECNO( xbDbf *dbf , xbDouble &dOut ) {
+ if( dbf ){
+ dOut = (xbDouble) dbf->GetCurRecNo();
+ return XB_NO_ERROR;
+ } else {
+ dOut = -1;
+ return XB_PARSE_ERROR;
+ }
+}
+
+/*************************************************************************/
+//! @brief Repeat character expression N times.
+/*!
+ Expression function REPLICATE().
+ \param sIn Inout - String to replicate.
+ \param ulRepCnt Input - Number of times to repeat.
+ \param sOut Output - String result.
+ \returns XB_NO_ERROR.<br>XB_PARSE_ERROR.
+*/
+xbInt16 xbXBase::REPLICATE( const xbString &sIn, xbUInt32 ulRepCnt, xbString &sOut ){
+ sOut = "";
+ for( xbUInt32 i = 0; i < ulRepCnt; i++ )
+ sOut += sIn;
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Return right characters from string.
+/*!
+ Expression function RIGHT().
+ \param sIn Input - string.
+ \param ulCharCnt Input - number of characters to extract from string.
+ \param sOut Output - resultant string.
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbXBase::RIGHT( const xbString &sIn, xbUInt32 ulCharCnt, xbString &sOut ){
+ if( sIn.Len() < ulCharCnt )
+ sOut = sIn;
+ else
+ sOut.Assign( sIn, sIn.Len() - ulCharCnt + 1, ulCharCnt );
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Trim right side of string.
+/*!
+ Expression function RTRIM().
+ \param sIn Input - string.
+ \param sOut Output - string result.
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbXBase::RTRIM( const xbString &sIn, xbString &sOut ){
+ sOut = sIn;
+ sOut.Rtrim();
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Generate a string of N spaces.
+/*!
+ Expression function SPACE().
+ \param lCnt Input - Number of spaces.
+ \param sOut Output - Output String.
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbXBase::SPACE( xbInt32 lCnt, xbString &sOut ){
+ sOut = "";
+ sOut.PadLeft( ' ', (xbUInt32) lCnt );
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Calculate a square root.
+/*!
+ Expression function SQRT().
+ \param dBase Input - Base number.
+ \param dSqrRoot Output - Square root.
+ \returns XB_NO_ERROR.
+*/
+
+xbInt16 xbXBase::SQRT( xbDouble dBase, xbDouble &dSqrRoot )
+{
+ dSqrRoot = sqrt( dBase );
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Converts a valid 8 byte (CCYYMMDD) input date into a date class.
+/*!
+ Expression function STOD().
+ \param sInDate Input - Input date.
+ \param dtOutDate Output - Output date.
+ \returns XB_NO_ERROR.<br>XB_INVALID_DATE.
+*/
+
+xbInt16 xbXBase::STOD( const xbString &sInDate, xbDate &dtOutDate ){
+
+ if( dtOutDate.DateIsValid( sInDate )){
+ dtOutDate = sInDate;
+ return XB_NO_ERROR;
+ } else {
+ return XB_INVALID_DATE;
+ }
+}
+
+/*************************************************************************/
+//! @brief Convert number to a character string.
+/*!
+ Expression function STR().
+ \param dIn Input - Number.
+ \param sOut Output - String.
+ \returns XB_NO_ERROR.
+*/
+
+xbInt16 xbXBase::STR( xbDouble dIn, xbString &sOut) {
+ xbString sPadChar = " ";
+ return STR( dIn, 10, 0, sPadChar, sOut );
+}
+
+/*************************************************************************/
+//! @brief Convert number to a character string.
+/*!
+ Expression function STR().
+ \param dIn Input - Number.
+ \param ulLen Input - Length.
+ \param sOut Output - String.
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbXBase::STR( xbDouble dIn, xbUInt32 ulLen, xbString &sOut) {
+ xbString sPadChar = " ";
+ return STR( dIn, ulLen, 0, sPadChar, sOut );
+}
+
+/*************************************************************************/
+//! @brief Convert number to a character string.
+/*!
+ Expression function STR().
+ \param dIn Input - Number.
+ \param ulLen Input - Length.
+ \param ulDec Input - Number of decimals.
+ \param sOut Output - String.
+ \returns XB_NO_ERROR.
+*/
+
+xbInt16 xbXBase::STR( xbDouble dIn, xbUInt32 ulLen, xbUInt32 ulDec, xbString &sOut) {
+ xbString sPadChar = " ";
+ return STR( dIn, ulLen, ulDec, sPadChar, sOut );
+}
+
+/*************************************************************************/
+//! @brief Convert number to a character string.
+/*!
+ Expression function STR().
+ \param dIn Input - Number.
+ \param ulLen Input - Length.
+ \param ulDec Input - Number of decimals.
+ \param sPadChar Input - Left pad character, typically zero or space.
+ \param sOut Output - String.
+ \returns XB_NO_ERROR.
+*/
+
+xbInt16 xbXBase::STR( xbDouble dIn, xbUInt32 ulLen, xbUInt32 ulDec, xbString &sPadChar, xbString &sOut) {
+
+ xbString sFmt;
+ sFmt.Sprintf( "%c%d.%df", '%', ulLen, ulDec );
+ sOut.Sprintf( sFmt.Str(), dIn, 0 );
+
+ // convert to all "*" if result is too long
+ if( sOut.Len() > ulLen ){
+ sOut = "*";
+ do{
+ sOut += "*";
+ } while( ulLen > sOut.Len());
+ } else if( sPadChar.Len() > 0 && sPadChar != " " ){
+ // this logic doesn't make sense when processing negative numbers,
+ // but it does behave like the original dbase
+ // you could end up with something like 0000-12.17 when you really want -000012.17
+ // that is probably why the STRZERO function came into being
+ xbUInt32 l = 1;
+ while( sOut[l] == ' ' ){
+ sOut.PutAt( l, sPadChar[1]);
+ l++;
+ }
+ }
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Convert number to a character string with leading zeroes.
+/*!
+ Expression function STRZERO().
+ \param dIn Input - Number.
+ \param ulLen Input - Length.
+ \param ulDec Input - Number of decimals.
+ \param sOut Output - String.
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbXBase::STRZERO( xbDouble dIn, xbUInt32 ulLen, xbUInt32 ulDec, xbString &sOut){
+
+ xbString sFmt;
+ if( dIn < 0 )
+ sFmt.Sprintf( "%c+0%d.%df", '%', ulLen, ulDec );
+ else
+ sFmt.Sprintf( "%c0%d.%df", '%', ulLen, ulDec );
+ sOut.Sprintf( sFmt.Str(), dIn );
+
+ // convert to all "*" if result is too long
+ if( sOut.Len() > ulLen ){
+ sOut = "*";
+ do{
+ sOut += "*";
+ } while( ulLen > sOut.Len());
+ }
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Extract a portion of a string from another string.
+/*!
+ Expression function SUBSTR().
+ \param sIn Input - Source string.
+ \param ulStartPos Input - Starting position for string extraction.
+ \param ulLen Input - Number of characters to extract.
+ \param sOut Output - String.
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbXBase::SUBSTR( const xbString &sIn, xbUInt32 ulStartPos, xbUInt32 ulLen, xbString &sOut ){
+ sOut = sIn;
+ sOut.Mid( ulStartPos, ulLen );
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Trim left and right sides of string.
+/*!
+ Expression function TRIM().
+ \param sIn Input - string.
+ \param sOut Output string result.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbXBase::TRIM( const xbString &sIn, xbString &sOut ){
+ return RTRIM( sIn, sOut );
+}
+
+/*************************************************************************/
+//! @brief Convert lower case to upper case.
+/*!
+ Expression function UPPER().
+ \param sIn Input - string.
+ \param sOut Output - string result.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbXBase::UPPER( const xbString &sIn, xbString &sOut ){
+ sOut = sIn;
+ sOut.ToUpperCase();
+ return XB_NO_ERROR;
+}
+
+/*************************************************************************/
+//! @brief Convert numeric characters to number.
+/*!
+ Expression function VAL().
+ \param sIn Input - string.
+ \param dOut Output - numeric result.
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbXBase::VAL( const xbString &sIn, xbDouble &dOut )
+{
+ if( sIn )
+ // strtod(nptr,NULL);
+ dOut = atof( sIn );
+ else
+ dOut = 0;
+ return XB_NO_ERROR;
+}
+/*************************************************************************/
+//! @brief Return year for a given date.
+/*!
+ Expression function YEAR().
+ \param dInDate Input date.
+ \param dOutYear - Year.
+ \returns XB_NO_ERROR.<br>XB_PARSE_ERROR.
+*/
+
+xbInt16 xbXBase::YEAR( xbDate &dInDate, xbDouble &dOutYear ){
+
+ xbInt16 iRc = dInDate.YearOf();
+ if( iRc < 0 )
+ return XB_PARSE_ERROR;
+ else{
+ dOutYear = iRc;
+ return XB_NO_ERROR;
+ }
+}
+/*************************************************************************/
+}; // namespace
+#endif // XB_FUNCTION_SUPPORT
+/*************************************************************************/
diff --git a/src/core/xbixbase.cpp b/src/core/xbixbase.cpp
new file mode 100755
index 0000000..40c1563
--- /dev/null
+++ b/src/core/xbixbase.cpp
@@ -0,0 +1,792 @@
+/* xbixbase.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+ Base index class
+
+*/
+
+#include "xbase.h"
+#ifdef XB_INDEX_SUPPORT
+
+namespace xb{
+
+/***********************************************************************/
+//! @brief Class constructor.
+/*!
+ /param dbf Pointer to dbf instance.
+*/
+xbIx::xbIx( xbDbf *dbf ) : xbFile( dbf->GetXbasePtr()) {
+ this->dbf = dbf;
+ vpCurTag = NULL;
+ cNodeBuf = NULL;
+ bLocked = xbFalse;
+}
+/***********************************************************************/
+//! @brief Class Destructor.
+xbIx::~xbIx(){}
+
+
+/***********************************************************************/
+//! @brief Add Keys for record number
+/*!
+ For a given a record number, add keys to each tag in the index file
+ if it was updated
+
+ \param ulRecNo Record number to add keys for
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIx::AddKeys( xbUInt32 ulRecNo ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 i = 0;
+ xbInt16 iKeySts;
+// std::cout << "xbIx::AddKeys\n";
+
+ try{
+ void * vpTag;
+ xbInt16 iTagCount = GetTagCount();
+
+ for( i = 0; i < iTagCount; i++ ){
+ vpTag = GetTag( i );
+
+ iKeySts = GetKeySts( vpTag );
+// std::cout << "AddKeys() KeySts = " << iKeySts << "\n";
+
+ if( iKeySts == 1 || iKeySts == 2 ){
+ if(( iRc = UpdateTagKey( 'A', vpTag, ulRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIx::AddKeys() Exception Caught. Error Stop = [%d] iRc = [%d] Tag=[%d]", iErrorStop, iRc, i );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Allocate memory for index node.
+/*!
+ Allocate an index node.
+
+ \param ulBufSize Size of buffer to allocate
+ \returns null on error<br>Pointer to newly allocated xbIxNode on success
+*/
+xbIxNode * xbIx::AllocateIxNode( xbUInt32 ulBufSize, xbInt16 )
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ xbIxNode * pNode = (xbIxNode *) calloc( 1, sizeof( xbIxNode ));
+ if( pNode == NULL ){
+ iErrorStop = 100;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ if( ulBufSize == 0 )
+ ulBufSize = GetBlockSize();
+
+ pNode->ulBufSize = ulBufSize;
+ pNode->cpBlockData = (char *) calloc( 1, ulBufSize );
+ if( pNode->cpBlockData == NULL ){
+ free( pNode );
+ iErrorStop = 110;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ return pNode;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIx::AllocateIxNode() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return NULL;
+}
+
+
+/***********************************************************************/
+//! @brief Binary search for given value on an index node.
+/*!
+
+ Binary search for key lookups
+ \param cKeyType Key type
+ \param npNode Pointer to index node for search
+ \param lKeyItemLen Lenth of key plus pointer values
+ \param vpKey Pointer to key value
+ \param lSearchKeyLen length of key to search
+ \param iCompRc output return code from the CompareKey routine. CompareKey returns an
+ integer value less than, equal to or greater than zero in when comparing values
+
+ \param bDescending xbTrue for descending index key lookup.<br>
+ xbFalse for ascending index key lookup.
+ \return The position in the node the key was found, if multiples it returns the first occurrence.
+ If the key is not found, it returns the slot it should be in.
+*/
+
+xbInt16 xbIx::BSearchBlock( char cKeyType, xbIxNode *npNode, xbInt32 lKeyItemLen, const void *vpKey,
+ xbInt32 lSearchKeyLen, xbInt16 &iCompRc, xbBool bDescending ) const {
+ xbInt32 lLo = 0;
+ xbInt32 lHi = 0;
+ xbInt32 lMid = 0;
+ xbInt32 lKeyCnt = GetKeyCount( npNode );
+
+
+ if( !bDescending ){
+ lHi = lKeyCnt - 1;
+
+ while( lLo <= lHi ){
+ lMid = (lLo + lHi) / 2;
+ iCompRc = CompareKey( cKeyType, GetKeyData( npNode, lMid, lKeyItemLen ), vpKey, (size_t) lSearchKeyLen );
+ if( iCompRc > 0 )
+ lHi = lMid - 1;
+ else if( iCompRc < 0 )
+ lLo = lMid + 1;
+ else{ // found match, look for leftmost occurrence
+
+ xbInt32 lFoundPos = lMid;
+ lMid--;
+ while( lMid >= 0 && CompareKey( cKeyType, GetKeyData( npNode, lMid, lKeyItemLen ), vpKey, (size_t) lSearchKeyLen ) == 0 ){
+ lFoundPos = lMid;
+ lMid--;
+ }
+ iCompRc = 0;
+ lLo = lFoundPos;
+ lHi = -1;
+ }
+ }
+ // update the compare key results
+ if( lMid != lLo ){
+ if( lLo >= lKeyCnt )
+ iCompRc = 1;
+ else
+ iCompRc = CompareKey( cKeyType, GetKeyData( npNode, lLo, lKeyItemLen ), vpKey, (size_t) lSearchKeyLen );
+ }
+ return (xbInt16) lLo;
+
+ } else { // descending key
+
+ lLo = lKeyCnt - 1;
+ while( lLo >= lHi && lHi != -1 ){
+ lMid = (lLo + lHi) / 2;
+ iCompRc = CompareKey( cKeyType, GetKeyData( npNode, lMid, lKeyItemLen ), vpKey, (size_t) lSearchKeyLen );
+
+ if( iCompRc > 0 ) {
+ lHi = lMid + 1;
+ }
+ else if( iCompRc < 0) {
+ lLo = lMid - 1;
+ }
+ else{ // found match, look for leftmost occurrence
+
+ xbInt32 lFoundPos = lMid;
+ lMid--;
+ while( lMid >= 0 && CompareKey( cKeyType, GetKeyData( npNode, lMid, lKeyItemLen ), vpKey, (size_t) lSearchKeyLen ) == 0 ){
+ lFoundPos = lMid;
+ lMid--;
+ }
+ iCompRc = 0;
+ lHi = lFoundPos;
+ lLo = -1;
+ }
+ }
+
+ // std::cout << "BSB1 lo = " << lLo << " mid = " << lMid << " hi = " << lHi << " keycnt = " << lKeyCnt << " iCompRc = " << iCompRc << "\n"; // key=" << (char *) vpKey << "\n";
+ if( lLo < 0 && iCompRc < 0 )
+ iCompRc = 1;
+ else if( iCompRc != 0 ) {
+ iCompRc = CompareKey( cKeyType, GetKeyData( npNode, (lLo < 0 ? 0 : lLo), lKeyItemLen ), vpKey, (size_t) lSearchKeyLen );
+ }
+ // std::cout << "BSB2 lo = " << lLo << " mid = " << lMid << " hi = " << lHi << " keycnt = " << lKeyCnt << " iCompRc = " << iCompRc << "\n"; // key=" << (char *) vpKey << "\n";
+ return (xbInt16) lHi;
+ }
+
+ // should never get here
+ // return (xbInt16) 0;
+}
+
+/***********************************************************************/
+//! @brief Check for duplicate keys.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::CheckForDupKeys(){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 i = 0;
+
+ try{
+ void * vpTag;
+ xbInt16 iTagCount = GetTagCount();
+ for( i = 0; i < iTagCount; i++ ){
+ vpTag = GetTag( i );
+ if(( iRc = CheckForDupKey( vpTag )) < XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ if( iRc != XB_KEY_NOT_UNIQUE ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxBase::CheckForDupKeys() Exception Caught. Error Stop = [%d] iRc = [%d] Tag=[%d]", iErrorStop, iRc, i );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Close index file.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIx::Close(){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ if(( iRc = xbFclose()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIx::Close() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Compare keys.
+/*!
+ \param cKeyType C - Character compare.<br>
+ N - Numeric BCD compare.<br>
+ D - Numeric compare.<br>
+ F - Numeric compare.<br>
+ \param v1 Left compare.<br>v2 - Right Compare.
+ \param iSearchKeyLen Length of key compare.
+ \returns 1 - Left operand is greater then right operand.<br>
+ 0 - Left operand is equal to right operand.<br>
+ -1 - Left operand is less than right operand.
+*/
+inline xbInt16 xbIx::CompareKey( char cKeyType, const void *v1, const void *v2, size_t iSearchKeyLen ) const{
+ if( cKeyType == 'C' ){ // character compare
+ return memcmp( v1, v2, iSearchKeyLen );
+ } else if( cKeyType == 'N' ){ // numeric bcd compare, mdx bcd numeric indices
+ xbBcd bcdk1( v1 );
+ return bcdk1.Compare( v2 );
+ } else if( cKeyType == 'D' || cKeyType == 'F' ){ // julian date compare, ndx float numeric indices
+ xbDouble *d1 = (xbDouble *) v1;
+ xbDouble *d2 = (xbDouble *) v2;
+ if( *d1 < *d2 )
+ return -1;
+ else if( *d1 > *d2 )
+ return 1;
+ else
+ return 0;
+ } else {
+// std::cout << "Unhandled key type [" << cKeyType << "]\n";
+ }
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+//! @brief Create Keys for record number
+/*!
+ \param iOpt 0 Build a key for FindKey usage, only rec buf 0.<br>
+ 1 Append Mode, Create key for an append, only use rec buf 0, set updated switch.<br>
+ 2 Update Mode, Create old version and new version keys, check if different, set update switch appropriately.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::CreateKeys( xbInt16 iOpt ) {
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 i = 0;
+
+ try{
+ void * vpTag;
+ xbInt16 iTagCount = GetTagCount();
+
+ for( i = 0; i < iTagCount; i++ ){
+ vpTag = GetTag( i );
+ if(( iRc = CreateKey( vpTag, iOpt )) < XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIx::CreateKeys() Exception Caught. Error Stop = [%d] iRc = [%d] Tag=[%d]", iErrorStop, iRc, i );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+//! @brief Delete keys for record number
+/*!
+ Delete keys to each tag in the index file if it was updated as determined
+ by CreateKeys function
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+//xbInt16 xbIx::DeleteKeys( xbUInt32 ulRecNo ){
+
+xbInt16 xbIx::DeleteKeys(){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 i = 0;
+
+ try{
+ void * vpTag;
+ xbInt16 iTagCount = GetTagCount();
+
+ for( i = 0; i < iTagCount; i++ ){
+ vpTag = GetTag( i );
+ if( GetKeySts( vpTag ) > 1 ){ // 0 = no update 1 = add 2 = update, 3 = delete
+ if(( iRc = UpdateTagKey( 'D', vpTag )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIx::DeleteKeys() Exception Caught. Error Stop = [%d] iRc = [%d] Tag=[%d]", iErrorStop, iRc, i );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+//! @brief Dump anode for debug purposes.
+/*!
+ \param pNode Pointer to node to dump.
+ \param iOption 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIx::DumpNode( void *, xbIxNode *pNode, xbInt16 iOption ) const
+{
+ xbString s;
+ s.Sprintf( "Dump Node Block=[%d] CurKey=[%d]", pNode->ulBlockNo, pNode->iCurKeyNo );
+ xbase->WriteLogMessage( s, iOption );
+
+ return XB_NO_ERROR;
+}
+#endif // XB_DEBUG_SUPPORT
+
+/***********************************************************************/
+//! @brief Find double key
+/*!
+ \param vpTag Pointer to tag to search.
+ \param dKey Double value to search for.
+ \param iRetrieveSw xbTrue - Retrieve the record if key found.<br>
+ xbFalse - Don't retrieve record, check for key existence only.
+ \returns XB_NO_ERROR - Key found.<br>
+ XB_NOT_FOUND - Key not found.<br>
+ <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::FindKey( void *vpTag, xbDouble dKey, xbInt16 iRetrieveSw ){
+ return FindKey( vpTag, &dKey, 8, iRetrieveSw );
+}
+/***********************************************************************/
+//! @brief Find string key
+/*!
+ \param vpTag Pointer to tag to search.
+ \param sKey String data to search for.
+ \param iRetrieveSw xbTrue - Retrieve the record if key found.<br>
+ xbFalse - Don't retrieve record, check for key existence only.
+ \returns XB_NO_ERROR - Key found.<br>
+ XB_NOT_FOUND - Key not found.<br>
+ <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::FindKey( void *vpTag, const xbString &sKey, xbInt16 iRetrieveSw ){
+ return FindKey( vpTag, sKey.Str(), (xbInt32) sKey.Len(), iRetrieveSw );
+}
+/***********************************************************************/
+//! @brief Find character key
+/*!
+ \param vpTag Pointer to tag to search.
+ \param cKey String data to search for.
+ \param lKeyLen Length of key to search for.
+ \param iRetrieveSw xbTrue - Retrieve the record if key found.<br>
+ xbFalse - Don't retrieve record, check for key existence only.
+ \returns XB_NO_ERROR - Key found.<br>
+ XB_NOT_FOUND - Key not found.<br>
+ <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::FindKey( void *vpTag, const char *cKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw ){
+ return FindKey( vpTag, (void *) cKey, lKeyLen, iRetrieveSw );
+}
+/***********************************************************************/
+//! @brief Find bcd key
+/*!
+ \param vpTag Pointer to tag to search.
+ \param bcd BCD data to search for.
+ \param iRetrieveSw xbTrue - Retrieve the record if key found.<br>
+ xbFalse - Don't retrieve record, check for key existence only.
+
+ \returns XB_NO_ERROR - Key found.<br>
+ XB_NOT_FOUND - Key not found.<br>
+ <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::FindKey( void *vpTag, const xbBcd &bcd, xbInt16 iRetrieveSw ){
+ return FindKey( vpTag, bcd.GetBcd(), 12, iRetrieveSw );
+}
+/***********************************************************************/
+//! @brief Find date key
+/*!
+ \param vpTag Pointer to tag to search.
+ \param dtKey Date data to search for.
+ \param iRetrieveSw xbTrue - Retrieve the record if key found.<br>
+ xbFalse - Don't retrieve record, check for key existence only.
+ \returns XB_NO_ERROR - Key found.<br>
+ XB_NOT_FOUND - Key not found.<br>
+ <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::FindKey( void *vpTag, const xbDate &dtKey, xbInt16 iRetrieveSw ){
+ xbDouble d = (xbDouble) dtKey.JulianDays();
+ return FindKey( vpTag, &d, 8, iRetrieveSw );
+}
+/***********************************************************************/
+//! @brief Free all nodes in a linked list.
+/*!
+ \param np Pointer to first node in linked list to free.
+ \returns NULL.
+*/
+xbIxNode *xbIx::FreeNodeChain( xbIxNode *np ){
+
+ // routine returns NULL
+ if( np ){
+ // free memory for a given chain of nodes
+ xbIxNode * np2;
+
+ // Clear the previous node's next pointer
+ if( np->npPrev )
+ np->npPrev->npNext = NULL;
+
+ // Clear out the tree
+ while( np ){
+ np2 = np->npNext;
+ NodeFree( np );
+ np = NULL;
+ np = np2;
+ }
+ }
+ return NULL;
+}
+/***********************************************************************/
+//! @brief Read block for block number.
+/*!
+ Routine to read a node/block out of an index file and store in xbIxNode structure
+ \param vpTag Pointer to tag.
+ \param ulBlockNo Block number to read off disk.
+ \param iOpt
+ 0 = Node is read into block buffer, not added to the node chain<br>
+ 1 = Node is read into new xbIxNode, then added to the node chain, and sets CurNode with new node<br>
+ 2 = Node is read into new xbIxNode, not added to the node chain<br>
+ CurNode points to new node<br>
+ \param ulAddlBuf Additional buffer size added to memory
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+
+xbInt16 xbIx::GetBlock( void *vpTag, xbUInt32 ulBlockNo, xbInt16 iOpt, xbUInt32 ulAddlBuf ){
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbIxNode *np = NULL;
+ try{
+
+ if( !vpTag && iOpt == 1 ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ // set target location of block read to read
+ char *cp;
+ if( iOpt == 0 )
+ cp = cNodeBuf;
+ else{
+ if(( np = AllocateIxNode(GetBlockSize() + ulAddlBuf )) == NULL ){
+ iErrorStop = 110;
+ iRc = XB_NO_MEMORY;
+ throw( iRc );
+ }
+ cp = np->cpBlockData;
+ }
+ if(( iRc = ReadBlock( ulBlockNo, GetBlockSize(), cp )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ if( iOpt == 0 )
+ return iRc;
+ np->ulBlockNo = ulBlockNo;
+ np->iCurKeyNo = 0;
+ if( iOpt == 1 )
+ AppendNodeChain( vpTag, np );
+ else if( iOpt == 2 ){
+ std::cout << "Future use stub. xbIxbase::GetBlock() option 2 not coded.\n";
+ iErrorStop = 130;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ // SetCurNode( vpTag, np );
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIx::GetBlock() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( np ) NodeFree( np );
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Get pointer to current tag.
+/*!
+ \returns Pointer to current tag.
+*/
+
+void *xbIx::GetCurTag() const {
+ return vpCurTag;
+}
+/***********************************************************************/
+//! @brief Get pointer to dbf.
+/*!
+ \returns Pointer to dbf.
+*/
+xbDbf *xbIx::GetDbf() const {
+ return this->dbf;
+}
+/***********************************************************************/
+//! @brief Get the first key for the current tag.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::GetFirstKey(){
+ return GetFirstKey( vpCurTag, 0 );
+}
+
+/***********************************************************************/
+//! @brief Get the first key for a given tag.
+/*!
+ \param vpTag Tag for get first key operation.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::GetFirstKey( void *vpTag ){
+ return GetFirstKey( vpTag, 0 );
+}
+/***********************************************************************/
+//! @brief Get the last key for the current tag.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::GetLastKey(){
+ return GetLastKey( 0, vpCurTag, 0 );
+}
+/***********************************************************************/
+//! @brief Get the last key for a given tag.
+/*!
+ \param vpTag Tag for get last key operation.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::GetLastKey( void *vpTag ){
+ return GetLastKey( 0, vpTag, 0 );
+}
+
+/***********************************************************************/
+//! @brief Get the file lock status.
+/*!
+ \returns xbTrue - Index file is locked.<br>xbFalse - Index file is not locked.
+*/
+xbBool xbIx::GetLocked() const {
+ return bLocked;
+}
+
+/***********************************************************************/
+//! @brief Get the key count for number of keys on a node.
+/*!
+ \param np Given node for key count.
+ \returns Number of keys on the node.
+*/
+xbInt32 xbIx::GetKeyCount( xbIxNode *np ) const {
+ // assumes the first four bytes of the block is a four byte number
+ // representing the number of keys contained on the block
+ return eGetInt32( np->cpBlockData );
+}
+/***********************************************************************/
+//! @brief Get key data for a given key number.
+/*!
+ \param np Given node for key retrieval.
+ \param iKeyNo Which key to pull.
+ \param iKeyItemLen Length of key plus pointers.
+ \returns Pointer to a given key.
+*/
+char * xbIx::GetKeyData( xbIxNode *np, xbInt16 iKeyNo, xbInt16 iKeyItemLen ) const {
+ if( !np ) return NULL;
+ char *p = np->cpBlockData;
+ xbUInt32 ulKeyCnt = eGetUInt32( p );
+ if( iKeyNo < 0 || iKeyNo > (xbInt16) ulKeyCnt ) return NULL;
+ xbInt16 iOffset = 12 + (iKeyNo * iKeyItemLen);
+ p+=iOffset;
+ return p;
+}
+/***********************************************************************/
+//! @brief Get the next key for the current tag.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::GetNextKey(){
+ return GetNextKey( vpCurTag, 0 );
+}
+/***********************************************************************/
+//! @brief Get the next key for the given tag.
+/*!
+ \param vpTag Tag for next key operation.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::GetNextKey( void *vpTag ){
+ return GetNextKey( vpTag, 0 );
+}
+/***********************************************************************/
+//! @brief Get the prev key for the current tag.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::GetPrevKey(){
+ return GetPrevKey( vpCurTag, 0 );
+}
+/***********************************************************************/
+//! @brief Get the previous key for the given tag.
+/*!
+ \param vpTag Tag for previous key operation.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::GetPrevKey( void *vpTag ){
+ return GetPrevKey( vpTag, 0 );
+}
+/***********************************************************************/
+//! @brief Free an index node
+/*!
+ \param ixNode Pointer to index node to free.
+ \returns void
+*/
+void xbIx::NodeFree( xbIxNode *ixNode ){
+ if( ixNode ){
+ if( ixNode->cpBlockData ){
+ free( ixNode->cpBlockData );
+ ixNode->cpBlockData = NULL;
+ }
+ free( ixNode );
+ ixNode = NULL;
+ }
+}
+/***********************************************************************/
+//! @brief Open an index file.
+/*!
+ MDX files are opened automatically and don't need opened.
+ NDX files that are associated with the DBF file are opened automatically.
+
+ Non production indexes that haven't been opened will need to be opened to be used.
+ \param sFileName Index file name to open.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIx::Open( const xbString & sFileName ){
+
+ // There are no locking requirements when opening an NDX index
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ /* copy the file name to the class variable */
+ this->SetFileName( sFileName );
+
+ if( !FileExists()){
+ iErrorStop = 10;
+ iRc = XB_FILE_NOT_FOUND;
+ throw iRc;
+ }
+ /* open the file */
+ if(( iRc = xbFopen( dbf->GetOpenMode(), dbf->GetShareMode())) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ if(( iRc = ReadHeadBlock()) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ SetCurTag( (xbInt16) 0 ); // default the first tag as the current tag
+ }
+
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIx::Open( %s ) Exception Caught. Error Stop = [%d] iRc = [%d]", sFileName.Str(), iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Set the current tag.
+/*!
+ \param vpCurTag Pointer to tag to set as current.
+ \returns void
+*/
+void xbIx::SetCurTag( void *vpCurTag ){
+ this->vpCurTag = vpCurTag;
+}
+/***********************************************************************/
+//! @brief Set the dbf pointer.
+/*!
+ \param dbf Dbf pointer to set.
+ \returns void
+*/
+void xbIx::SetDbf( xbDbf *dbf ){
+ this->dbf = dbf;
+}
+/***********************************************************************/
+//! @brief Set the file lock status.
+/*!
+ \param bLocked xbTrue - Set to locked.<br>xbFalse - Set to unlocked.
+ \returns void
+*/
+void xbIx::SetLocked( xbBool bLocked ){
+ this->bLocked = bLocked;
+}
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_INDEX_SUPPORT */
diff --git a/src/core/xbixmdx.cpp b/src/core/xbixmdx.cpp
new file mode 100755
index 0000000..53d7053
--- /dev/null
+++ b/src/core/xbixmdx.cpp
@@ -0,0 +1,5067 @@
+/* xbixmdx.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+
+ MDX indices are comprised of blocks and pages.
+ A page is 512 bytes.
+ A Block is one or more pages.
+ The default block size is two 512 byte pages per block.
+ Nodes are used for storing block images in memory
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_MDX_SUPPORT
+
+namespace xb{
+
+/***********************************************************************/
+xbIxMdx::xbIxMdx( xbDbf *dbf ) : xbIx( dbf ){
+ Init();
+}
+/***********************************************************************/
+//void xbIxMdx::Init( xbInt16 iOpt ){
+void xbIxMdx::Init( xbInt16 ){
+
+ cVersion = 0;
+ cCreateYY = 0;
+ cCreateMM = 0;
+ cCreateDD = 0;
+ sFileName = "";
+ iBlockFactor = 0;
+ cProdIxFlag = 0;
+ cTagEntryCnt = 0;
+ iTagLen = 0;
+ iTagUseCnt = 0;
+ cNextTag = 0;
+ c1B = 0x0b;
+ ulPageCnt = 0;
+ ulFirstFreePage = 0;
+ ulNoOfBlockAvail = 0;
+ cUpdateYY = 0;
+ cUpdateMM = 0;
+ cUpdateDD = 0;
+ mdxTagTbl = NULL;
+ cNodeBuf = NULL;
+ bReuseEmptyNodes = xbTrue;
+}
+/***********************************************************************/
+xbIxMdx::~xbIxMdx(){
+ if( cNodeBuf )
+ free( cNodeBuf );
+
+ if( FileIsOpen())
+ Close();
+}
+/***********************************************************************/
+//! @brief Add key.
+/*!
+ Add key. If this is a unique index, this logic assumes the duplicate
+ check logic was already done.
+
+ \param vpTag Tag to update.
+ \param ulRecNo Record number to add key for.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::AddKey( void * vpTag, xbUInt32 ulRecNo ){
+
+ xbMdxTag * npTag = (xbMdxTag *) vpTag;
+ if( GetUniqueKeyOpt() == XB_EMULATE_DBASE && npTag->bFoundSts )
+ return XB_NO_ERROR;
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 iHeadNodeUpdateOpt = 2;
+ xbIxNode * npRightNode = NULL;
+ xbUInt32 ulNewRightChild = 0;
+
+ try{
+ if(( iRc = xbIxMdx::KeySetPosAdd( npTag, ulRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ xbInt32 lKeyCnt = GetKeyCount( npTag->npCurNode );
+
+ // std::cout << "xbIxMdx::AddKeys() lKeyCnt = " << lKeyCnt << " KeysPerBlock = " << npTag->iKeysPerBlock << " npBlockNo = " << npTag->npCurNode->ulBlockNo << "\n";
+
+ if( lKeyCnt < npTag->iKeysPerBlock ){
+ // Section A - add key to appropriate position if space available
+ // std::cout << "AddKey Section A begin\n";
+ if(( iRc = InsertNodeL( npTag, npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->cpKeyBuf, ulRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ //std::cout << "AddKey Section A end\n";
+ } else {
+
+ // land here with a full leaf node
+ //std::cout << "Section B begin split leaf node\n";
+
+ iHeadNodeUpdateOpt = 1;
+ npRightNode = AllocateIxNode( npTag, GetBlockSize() + (xbUInt32) npTag->iKeyItemLen, npTag->npCurNode->ulBlockNo * (xbUInt32) iBlockFactor );
+ if( !npRightNode ){
+ iErrorStop = 120;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ if(( npTag->npCurNode->ulBlockNo * (xbUInt32) iBlockFactor ) == npTag->ulRightChild ){
+ ulNewRightChild = npRightNode->ulBlockNo * (xbUInt32) iBlockFactor;
+ }
+
+ //std::cout << "ulNewRightChild = " << ulNewRightChild << "\n";
+
+ if(( iRc = xbIxMdx::SplitNodeL( npTag, npTag->npCurNode, npRightNode, npTag->npCurNode->iCurKeyNo, npTag->cpKeyBuf, ulRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ xbUInt32 ulTempBlockNo = npRightNode->ulBlockNo;
+
+
+ //std::cout << "ulTempBlockNo = " << ulTempBlockNo << "\n";
+ //std::cout << "key count left block " << GetKeyCount( npTag->npCurNode ) << "\n";
+ //std::cout << "key count right block " << GetKeyCount( npRightNode ) << "\n";
+
+
+ //std::cout << "Section B end\n";
+
+ // section C - go up the tree, splitting nodes as necessary
+ xbIxNode * npParent = npTag->npCurNode->npPrev;
+
+
+ while( npParent && GetKeyCount( npParent ) >= npTag->iKeysPerBlock ){
+ //std::cout << "Section C begin interior node is full\n";
+ npRightNode = FreeNodeChain( npRightNode );
+ npRightNode = AllocateIxNode( npTag, GetBlockSize() + (xbUInt32) npTag->iKeyItemLen, npParent->ulBlockNo * (xbUInt32) iBlockFactor );
+ //std::cout << "Section C - B new right node block number for interior node split= " << npRightNode->ulBlockNo << "\n";
+
+ if( !npRightNode ){
+ iErrorStop = 140;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ //std::cout << "Section C - going to split interior node C\n";
+
+ if(( iRc = SplitNodeI( npTag, npParent, npRightNode, npParent->iCurKeyNo, BlockToPage( ulTempBlockNo ))) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ // std::cout << "Section C - interior node split \n";
+ ulTempBlockNo = npRightNode->ulBlockNo;
+ npTag->npCurNode = npParent;
+ npParent = npParent->npPrev;
+ }
+
+ // std::cout << "Past Section C Cur Node Block No = " << npTag->npCurNode->ulBlockNo << " root page = " << npTag->ulRootPage << "\n";
+ // section D - if cur node is split root, create new root
+
+ if(( npTag->npCurNode->ulBlockNo * (xbUInt32) iBlockFactor ) == npTag->ulRootPage ){
+ // std::cout << "Section D begin\n";
+
+ if(( iRc = AddKeyNewRoot( npTag, npTag->npCurNode, npRightNode )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+
+ if( npRightNode )
+ npRightNode = FreeNodeChain( npRightNode );
+
+ //std::cout << "Section D end\n";
+
+ } else {
+ // std::cout << "Section E, put key in parent\n";
+ if(( iRc = InsertNodeI( (void *) vpTag, (xbIxNode *) npParent, (xbInt16) npParent->iCurKeyNo, BlockToPage( npRightNode->ulBlockNo ))) != XB_NO_ERROR ){
+ iErrorStop = 170;
+ throw iRc;
+ }
+ }
+ }
+
+ // update the header
+ if(( iRc = WriteHeadBlock( iHeadNodeUpdateOpt )) != XB_NO_ERROR ){
+ iErrorStop = 180;
+ throw iRc;
+ }
+
+ // if adding the first key, set the cHasKeys field
+ if( !npTag->cHasKeys ){
+ npTag->cHasKeys = 0x01;
+ if(( iRc = xbFseek( ((npTag->ulTagHdrPageNo * 512) + 246), SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 190;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( &npTag->cHasKeys, 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ }
+
+ if( ulNewRightChild > 0 ){
+
+// std::cout << "ulRightChild was = " << npTag->ulRightChild << " changed to " << ulNewRightChild << "\n";
+
+ char cBuf[4];
+ ePutUInt32( cBuf, ulNewRightChild );
+ if(( iRc = xbFseek( ((npTag->ulTagHdrPageNo * 512) + 252), SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( &cBuf, 4, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 220;
+ throw iRc;
+ }
+// std::cout << "setting right child\n";
+ npTag->ulRightChild = ulNewRightChild;
+ }
+
+ if( npRightNode )
+ npRightNode = FreeNodeChain( npRightNode );
+ npTag->npNodeChain = FreeNodeChain( npTag->npNodeChain );
+ npTag->npCurNode = NULL;
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::AddKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+void xbIxMdx::AppendNodeChain( void *vpTag, xbIxNode * npNode ){
+ xbMdxTag * mdxTag = (xbMdxTag *) vpTag;
+ if( mdxTag->npNodeChain == NULL ){
+ mdxTag->npNodeChain = npNode;
+ mdxTag->npCurNode = npNode;
+ } else {
+ npNode->npPrev = mdxTag->npCurNode;
+ mdxTag->npCurNode->npNext = npNode;
+ mdxTag->npCurNode = npNode;
+ }
+ // time stamp the node chain
+ GetFileMtime( mdxTag->tNodeChainTs );
+}
+
+/***********************************************************************/
+//! @brief Add new root node.
+/*!
+ \param mpTag Tag to update.
+ \param npLeft Left node.
+ \param npRight Right node.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxMdx::AddKeyNewRoot( xbMdxTag *npTag, xbIxNode *npLeft, xbIxNode *npRight ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char *pLastKey = NULL;
+
+ try{
+ xbIxNode *npRoot = AllocateIxNode( npTag, GetBlockSize() + (xbUInt32) npTag->iKeyItemLen, npRight->ulBlockNo * (xbUInt32) iBlockFactor );
+ if( !npRoot ){
+ iErrorStop = 100;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ npTag->ulRootPage = npRoot->ulBlockNo;
+
+ // std::cout << "AddKeyNewRoot - RootBlock = " << npRoot->ulBlockNo << "\n";
+ // std::cout << "AddKeyNewRoot - LeftBlock = " << npLeft->ulBlockNo << "\n";
+ // std::cout << "AddKeyNewRoot - RightBlock = " << npRight->ulBlockNo << "\n";
+
+ pLastKey = (char *) malloc( (size_t) npTag->iKeyLen );
+
+ if(( iRc = GetLastKeyForBlockNo( npTag, npLeft->ulBlockNo, pLastKey )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ char * pTrg = npRoot->cpBlockData;
+
+ // set no of keys to 1
+ ePutUInt32( pTrg, 1 );
+
+ // set the left node number
+ pTrg += 8;
+ ePutUInt32( pTrg, npLeft->ulBlockNo * (xbUInt32) iBlockFactor );
+
+ // set the key
+ pTrg+= 4;
+ memcpy( pTrg, pLastKey, (size_t) npTag->iKeyLen );
+
+ // set the right node number
+ pTrg+= (npTag->iKeyLen);
+ ePutUInt32( pTrg, npRight->ulBlockNo * (xbUInt32) iBlockFactor );
+
+ // write out the new block
+ if(( iRc = WriteBlock( npRoot->ulBlockNo, GetBlockSize(), npRoot->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+
+ // write out the new root node number in the tag header
+ // position the file
+ xbUInt32 ulPagePos = npTag->ulTagHdrPageNo * 512;
+
+ // std::cout << "ulPagePos = " << ulPagePos << " root block no = " << npRoot->ulBlockNo << " \n";
+
+ // save the number to a buffer
+ char cBuf[4];
+ ePutUInt32( cBuf, npRoot->ulBlockNo * ((xbUInt32) iBlockFactor ));
+
+ if(( iRc = xbFseek( ulPagePos, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( &cBuf, 4, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+
+ if( pLastKey )
+ free( pLastKey );
+
+ npRoot = FreeNodeChain( npRoot );
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::AddKeyNewRoot() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( pLastKey )
+ free( pLastKey );
+ }
+ return iRc;
+}
+
+
+
+/***********************************************************************/
+//! @brief Allocate a node.
+/*!
+ \param mpTag Pointer to mdx tag
+ \param ulBufSize Buffer size.
+ \param ulBlock2 Value to load in ulBlock2 field, bytes 4-7 in the first page of the block
+ \returns Pointer to new node.
+*/
+xbIxNode * xbIxMdx::AllocateIxNode( xbMdxTag * mpTag, xbUInt32 ulBufSize, xbUInt32 ulBlock2 ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbIxNode *n = NULL;
+
+ try{
+
+ // std::cout << "xbIxMdx::AllocateIxNode()\n";
+
+ if(( n = xbIx::AllocateIxNode( ulBufSize )) == NULL ){
+ iRc = XB_NO_MEMORY;
+ iErrorStop = 100;
+ throw iRc;
+ }
+ char *p = n->cpBlockData;
+ p += 4;
+
+ if( ulFirstFreePage > 0 && bReuseEmptyNodes ){
+ // we have an empty node we can reuse
+
+ // std::cout << "Reusing node " << ulFirstFreePage << "\n";
+
+ n->ulBlockNo = PageToBlock( ulFirstFreePage );
+ if(( iRc = ReadBlock( n->ulBlockNo, GetBlockSize(), n->cpBlockData )) != XB_NO_ERROR ){
+ iRc = 110;
+ throw iRc;
+ }
+ // update ulFirstFreePage
+ ulFirstFreePage = eGetUInt32( p );
+ if(( iRc = xbFseek( 36, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( p, 4, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ // memset cpBlockData to zeroes
+ memset( n->cpBlockData, 0x00, GetBlockSize());
+
+
+ } else {
+ n->ulBlockNo = ulPageCnt / (xbUInt32) iBlockFactor;
+ ulPageCnt += (xbUInt32) iBlockFactor;
+ }
+
+ mpTag->ulTagSize += (xbUInt32) iBlockFactor;
+ if( ulBlock2 > 0 ){
+ ePutUInt32( p, ulBlock2 );
+ }
+
+ // std::cout << "AllocateIxNode incremented the block to " << ulPageCnt << "\n";
+ // std::cout << "AllocateIxNode new block number = " << n->ulBlockNo << "\n";
+ }
+ catch( xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::AllocateIxNode() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( n )
+ n = FreeNodeChain( n );
+ }
+
+ return n;
+
+}
+/***********************************************************************/
+//! @brief Calculate B-tree pointers.
+/*!
+ Set binary tree pointer value. The MDX tags are stored with binary
+ tree positions. This routine calculates the value in memory.
+ \returns void
+*/
+
+void xbIxMdx::CalcBtreePointers(){
+
+ xbInt16 iaLeftChild[48];
+ xbInt16 iaRightChild[48];
+ xbInt16 iaParent[48];
+
+ for( xbInt16 i = 0; i < 48; i++ ){
+ iaLeftChild[i] = 0;
+ iaRightChild[i] = 0;
+ iaParent[i] = 0;
+ }
+
+ // anything to do?
+ if( iTagUseCnt > 1 ){
+ xbString sBaseTag;
+ xbString sThisTag;
+ xbString sWorkTag;
+ xbInt16 iWorkTagNo;
+ xbBool bDone;
+ sBaseTag = GetTagName( GetTag( 0 ));
+
+ for( xbInt16 iThisTagNo = 1; iThisTagNo < iTagUseCnt; iThisTagNo++ ){
+ iWorkTagNo = 0;
+ sWorkTag.Set( sBaseTag );
+ sThisTag = GetTagName( GetTag( iThisTagNo ));
+ bDone = xbFalse;
+ while( !bDone ){
+ if( sThisTag < sWorkTag ){
+ if( iaLeftChild[iWorkTagNo] == 0 ) {
+ iaLeftChild[iWorkTagNo] = iThisTagNo + 1;
+ iaParent[iThisTagNo] = iWorkTagNo + 1;
+ bDone = xbTrue;
+ } else {
+ iWorkTagNo = iaLeftChild[iWorkTagNo]-1;
+ sWorkTag = GetTagName( GetTag( iWorkTagNo));
+ }
+ } else {
+ if( iaRightChild[iWorkTagNo] == 0 ) {
+ iaRightChild[iWorkTagNo] = iThisTagNo + 1;
+ iaParent[iThisTagNo] = iWorkTagNo + 1;
+ bDone = xbTrue;
+ } else {
+ iWorkTagNo = iaRightChild[iWorkTagNo]-1;
+ sWorkTag = GetTagName( GetTag( iWorkTagNo ));
+ }
+ }
+ }
+ }
+ }
+
+ xbString s;
+ xbMdxTag *mpTag = mdxTagTbl;
+ for( xbInt16 i = 0; i < iTagUseCnt; i++ ){
+// s.Sprintf( "tag = [%d] parent = [%d] left = [%d] right = [%d]\n", i, iaParent[i], iaLeftChild[i], iaRightChild[i]);
+// std::cout << s;
+ mpTag->cLeftChild = (char ) iaLeftChild[i];
+ mpTag->cRightChild = (char ) iaRightChild[i];
+ mpTag->cParent = (char ) iaParent[i];
+ mpTag = mpTag->next;
+ }
+}
+
+/**************************************************************************************************************/
+//! @brief Calculate the page number for a given block
+/*!
+ This routine is called by any function needing to calculate the page number for a given block.
+ Page numbers are stored internally in the physical file, and the library reads and writes in
+ blocks of one or more pages.
+
+ Assumes valid data input
+
+ \param ulBlockNo Block Number
+ \returns Calculated page number.
+*/
+
+inline xbUInt32 xbIxMdx::BlockToPage( xbUInt32 ulBlockNo ){
+ return ulBlockNo * (xbUInt32) iBlockFactor;
+}
+/***********************************************************************/
+char xbIxMdx::CalcTagKeyFmt( xbExp &exp ){
+
+ xbExpNode *n = exp.GetTreeHandle();
+ if( n->GetChildCnt() == 0 && n->GetNodeType() == XB_EXP_FIELD )
+ return 0x01;
+ else
+ return 0;
+}
+/***********************************************************************/
+//! @brief Check for duplicate key.
+/*!
+ \param vpTag Tag to check.
+ \returns XB_KEY_NOT_UNIQUE<br>XB_NO_ERROR
+*/
+
+xbInt16 xbIxMdx::CheckForDupKey( void *vpTag )
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbMdxTag *mpTag = (xbMdxTag *) vpTag;
+ mpTag->bFoundSts = xbFalse;
+ try{
+ if( GetUnique( mpTag )){
+ if( mpTag->iKeySts == XB_ADD_KEY || mpTag->iKeySts == XB_UPD_KEY )
+ if( KeyExists( mpTag )){
+ if( GetUniqueKeyOpt() == XB_EMULATE_DBASE ){
+ mpTag->bFoundSts = xbTrue;
+ return 0;
+ } else {
+ return XB_KEY_NOT_UNIQUE;
+ }
+ }
+ }
+ return 0;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::CheckForDupKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Check tag integrity.
+/*!
+ Check a tag for accuracy.
+
+ \param vpTag Tag to create key for.
+ \param iOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxMdx::CheckTagIntegrity( void *vpTag, xbInt16 iOpt ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iRc2;
+ xbInt16 iRc3;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulIxCnt = 0;
+ xbUInt32 ulThisRecNo = 0;
+ xbUInt32 ulPrevRecNo = 0;
+ xbBool bDone = false;
+ xbString sMsg;
+ char cKeyType;
+ char *pPrevKeyBuf = NULL;
+ xbMdxTag *npTag = (xbMdxTag *) vpTag;
+ xbInt16 iAutoLock;
+ xbBool bDescending = npTag->cKeyFmt2 & 0x08;
+
+ try{
+// xbase->WriteLogMessage( "xbIxMdx::CheckTagIntegrity()", iOpt );
+
+ #ifdef XB_LOCKING_SUPPORT
+ iAutoLock = dbf->GetAutoLock();
+ if( iAutoLock && !dbf->GetTableLocked() ){
+ if(( iRc = dbf->LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+ #endif
+
+ memset( npTag->cpKeyBuf2, 0x00, (size_t) npTag->iKeyLen );
+ cKeyType = GetKeyType( vpTag );
+
+ // sMsg.Sprintf( "Checking index type [%c]", cKeyType );
+ // xbase->WriteLogMessage( sMsg, iOpt );
+
+ pPrevKeyBuf = (char *) calloc( 1, (size_t) npTag->iKeyLen );
+ iRc = GetFirstKey( vpTag, 0 );
+ memcpy( pPrevKeyBuf, GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->iKeyItemLen ), (size_t) npTag->iKeyLen );
+
+ // for each key in the index, make sure it is trending in the right direction
+ while( iRc == XB_NO_ERROR && !bDone ){
+ ulIxCnt++;
+
+ iRc = GetNextKey( vpTag, 0 );
+ if( iRc == XB_NO_ERROR ){
+
+ // compare this key to prev key
+ iRc2 = CompareKey( cKeyType, GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->iKeyItemLen ),
+ pPrevKeyBuf, (size_t) npTag->iKeyLen );
+
+ if(( iRc2 < 0 && !bDescending ) || ( iRc2 > 0 && bDescending )){
+ sMsg.Sprintf( "Key sequence error at key number [%ld].", ulIxCnt );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ iErrorStop = 110;
+ iRc = XB_INVALID_INDEX;
+ throw iRc;
+ }
+
+ ulThisRecNo = 0;
+ if(( iRc3 = GetDbfPtr( vpTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulThisRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc3;
+ }
+
+ if( iRc2 == 0 && (ulThisRecNo <= ulPrevRecNo )){
+ sMsg.Sprintf( "Dbf record number sequence error at key number [%ld].", iOpt );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ iErrorStop = 130;
+ iRc = XB_INVALID_INDEX;
+ throw iRc;
+ }
+ // save this key info to prev key
+ memcpy( pPrevKeyBuf, GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->iKeyItemLen ), (size_t) npTag->iKeyLen );
+ ulPrevRecNo = ulThisRecNo;
+ }
+ }
+
+ xbUInt32 ulDbfCnt = 0;
+ if(( iRc = dbf->GetRecordCnt( ulDbfCnt )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+
+ xbUInt32 ulFiltCnt = 0;
+ xbBool bFiltered = xbTrue;
+ // verify each record in the dbf file has a corresponding index entry
+ xbUInt32 j = 0;
+ while( j < ulDbfCnt ){
+
+ if(( iRc = dbf->GetRecord( ++j )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ if( npTag->cHasFilter ){
+ if(( iRc = npTag->filter->ProcessExpression( 0 )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+ if(( iRc = npTag->filter->GetBoolResult( bFiltered )) != XB_NO_ERROR ){
+ iErrorStop = 170;
+ throw iRc;
+ }
+ }
+
+ if( bFiltered ){
+ if(( iRc = FindKeyForCurRec( vpTag )) != XB_NO_ERROR ){
+ ulThisRecNo = j;
+ iErrorStop = 180;
+ throw iRc;
+ }
+ ulFiltCnt++;
+ }
+ }
+
+ if((GetUniqueKeyOpt() == XB_EMULATE_DBASE) && (GetUnique( vpTag ))){
+ // can't compare counts if using XB_EMULATE_DBASE and it's a unique index
+ } else {
+ if( ulIxCnt != ulFiltCnt && GetUniqueKeyOpt() == XB_HALT_ON_DUPKEY ){
+ if( npTag->cHasFilter )
+ sMsg.Sprintf( "xbIxMdx::CheckTagIntegrity() Filtered index entry count [%ld] does not match dbf record count [%ld] for tag [%s]", ulIxCnt, ulFiltCnt, npTag->cTagName );
+ else
+ sMsg.Sprintf( "xbIxMdx::CheckTagIntegrity() Index entry count [%ld] does not match dbf record count [%ld] for tag [%s]", ulIxCnt, ulFiltCnt, npTag->cTagName );
+
+ xbase->WriteLogMessage( sMsg, iOpt );
+ iErrorStop = 190;
+ iRc = XB_INVALID_INDEX;
+ throw iRc;
+ }
+ if( npTag->cHasFilter )
+ sMsg.Sprintf( "xbIxMdx::CheckTagIntegrity() Filtered index entry count [%ld] matches dbf record count [%ld] for tag [%s]", ulIxCnt, ulFiltCnt, npTag->cTagName );
+ else
+ sMsg.Sprintf( "xbIxMdx::CheckTagIntegrity() Index entry count [%ld] matches dbf record count [%ld] for tag [%s]", ulIxCnt, ulFiltCnt, npTag->cTagName );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && dbf->GetTableLocked() ){
+ if(( iRc = dbf->LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ }
+ #endif
+
+ if( pPrevKeyBuf )
+ free( pPrevKeyBuf );
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::CheckTagIntegrity() Exception Caught. Error Stop = [%d] iRc = [%d] Tag = [%s]", iErrorStop, iRc, npTag->cTagName );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ), iOpt );
+ if( pPrevKeyBuf )
+ free( pPrevKeyBuf );
+
+ if( iErrorStop == 160 ){
+ sMsg.Sprintf( "xbIxNdx::CheckTagIntegrity() Missing index entry for record [%d]", ulThisRecNo );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ }
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+xbMdxTag *xbIxMdx::ClearTagTable(){
+
+ // clear the list of tags
+ xbMdxTag *tt = mdxTagTbl;
+ xbMdxTag *tt2;
+ while( tt ){
+ tt2 = tt;
+ tt = tt->next;
+ tt2->npNodeChain = FreeNodeChain( tt2->npNodeChain );
+ tt2->npCurNode = NULL;
+ if( tt2->cpKeyBuf )
+ free( tt2->cpKeyBuf );
+ if( tt2->cpKeyBuf2 )
+ free( tt2->cpKeyBuf2 );
+ if( tt2->exp )
+ delete tt2->exp;
+ if( tt2->filter )
+ delete tt2->filter;
+ if( tt2->sKeyExp )
+ delete tt2->sKeyExp;
+ if( tt2->sTagName )
+ delete tt2->sTagName;
+ if( tt2->sFiltExp )
+ delete tt2->sFiltExp;
+ free( tt2 );
+ }
+ return NULL;
+}
+/***********************************************************************/
+xbInt16 xbIxMdx::Close(){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ mdxTagTbl = ClearTagTable();
+ if(( iRc = xbIx::Close()) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::Close() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+
+/***********************************************************************/
+//! @brief Create key.
+/*!
+
+ \param vpTag Tag
+ \param iOpt 1 = Append, 2 = Update
+ \returns XB_KEY_NOT_UNIQUE<br>XB_NO_ERROR
+
+ iKeySts 0 - No Updates
+ 1 - Add Key XB_ADD_KEY
+ 2 - Update Key XB_UPD_KEY
+ 3 - Delete Key XB_DEL_KEY
+
+ bKeyFiltered xbFalse - Key filtered out
+ xbTrue - Key filtered in
+
+ cpKeyBuf - Key buffer for add
+ cpKeyBuf2 - Key buffer for delete
+
+*/
+
+xbInt16 xbIxMdx::CreateKey( void *vpTag, xbInt16 iOpt ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ xbBool bFilter0 = xbFalse; // filter against RecBuf, updated record buffer
+ xbBool bFilter1 = xbFalse; // filter against recBuf2, original record buffer
+
+ try{
+
+ xbMdxTag *npTag = (xbMdxTag *) vpTag;
+ npTag->iKeySts = 0;
+
+ // char *p0 = dbf->GetRecordBuf(0);
+ // char *p1 = dbf->GetRecordBuf(1);
+
+ // do tag filter logic
+ if( npTag->cHasFilter ){
+ if(( iRc = npTag->filter->ProcessExpression( 0 )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ if(( iRc = npTag->filter->GetBoolResult( bFilter0 )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ // std::cout << "cp1 f0 = " << bFilter0 << "\n";
+ // printf( "del byte 0 [%x] 1 [%x]\n", *p0, *p1 );
+ } else {
+ bFilter0 = xbTrue;
+ }
+
+ // if add request and filtered out, we're done
+ if( iOpt == 1 && !bFilter0 )
+ return XB_NO_ERROR;
+
+ if(( iRc = npTag->exp->ProcessExpression( 0 )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ if( npTag->exp->GetReturnType() == XB_EXP_CHAR )
+ npTag->exp->GetStringResult( npTag->cpKeyBuf, (xbUInt32) npTag->iKeyLen );
+ else if( npTag->exp->GetReturnType() == XB_EXP_NUMERIC ){
+ xbDouble d;
+ npTag->exp->GetNumericResult( d );
+ xbBcd bcd( d );
+ bcd.ToChar( npTag->cpKeyBuf );
+ }
+ else if( npTag->exp->GetReturnType() == XB_EXP_DATE ){
+ xbDouble d;
+ npTag->exp->GetNumericResult( d );
+ memcpy( npTag->cpKeyBuf, &d, 8 );
+ }
+
+ if( iOpt == 1 ) // Append
+ npTag->iKeySts = XB_ADD_KEY;
+
+ else if( iOpt == 2 ){ // Update
+ if( npTag->cHasFilter ){
+ if(( iRc = npTag->filter->ProcessExpression( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ if(( iRc = npTag->filter->GetBoolResult( bFilter1 )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ } else {
+ bFilter1 = xbTrue;
+ }
+
+ if(( iRc = npTag->exp->ProcessExpression( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+
+ if( npTag->exp->GetReturnType() == XB_EXP_CHAR ){
+ npTag->exp->GetStringResult( npTag->cpKeyBuf2, (xbUInt32) npTag->iKeyLen );
+
+ } else if( npTag->exp->GetReturnType() == XB_EXP_NUMERIC ){
+ xbDouble d;
+ npTag->exp->GetNumericResult( d );
+ xbBcd bcd( d );
+ bcd.ToChar( npTag->cpKeyBuf2 );
+
+ } else if( npTag->exp->GetReturnType() == XB_EXP_DATE ){
+ xbDouble d;
+ npTag->exp->GetNumericResult( d );
+ memcpy( npTag->cpKeyBuf2, &d, 8 );
+
+ }
+
+ if( bFilter1 ){ // original key was indexed
+ if( bFilter0 ){ // new key s/b indexed, update it if changed
+ if( memcmp( npTag->cpKeyBuf, npTag->cpKeyBuf2, (size_t) npTag->iKeyLen )){
+ npTag->iKeySts = XB_UPD_KEY;
+ }
+ } else { // original key indexed, new key not indexed, delete it
+ npTag->iKeySts = XB_DEL_KEY;
+ }
+ } else { // original key not indexed
+ if( bFilter0 )
+ npTag->iKeySts = XB_ADD_KEY;
+ }
+ }
+
+// std::cout << "xbIxMdx::CreateKey key sts = " << npTag->iKeySts << " iOpt = " << iOpt << " type = " << npTag->exp->GetReturnType() << " name = " << npTag->cTagName;
+// std::cout << " f0 = " << bFilter0 << " f1 = " << bFilter1 << "\n";
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::CreateKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Create new tag.
+/*!
+ This routine creates a new tag. When complete, sets the cur tag pointer to
+ the newly created tag.
+
+ \param sName Tag Name, including .MDX suffix
+ \param sKey Key Expression
+ \param sFilter Filter expression.
+ \param iDescending
+ \param iUnique xbtrue - Unique.<br>xbFalse - Not unique.
+ \param iOverLay xbTrue - Overlay if file already exists.<br>xbFalse - Don't overlay.
+ \param vpTag Output from method Pointer to vptag pointer.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbIxMdx::CreateTag( const xbString &sName, const xbString &sKey, const xbString &sFilter, xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverlay, void **vpTag ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbMdxTag *tte = NULL;
+
+
+ // std::cout << "CreateTag() name=[" << sName.Str() << "] key=[" << sKey.Str() << "] sFilter=[" << sFilter.Str() << "]\n";
+ // std::cout << "TagUseCnt = " << iTagUseCnt << std::endl;
+
+
+ try{
+ // verify room for new tag
+ if( !( iTagUseCnt < 47 )){
+ iErrorStop = 100;
+ iRc = XB_LIMIT_REACHED;
+ throw iRc;
+ }
+
+ // verify valid tag name
+ xbString sWorker = sName;
+ sWorker.Trim();
+ if( sWorker.Len() > 10 ){
+ iErrorStop = 110;
+ iRc = XB_INVALID_TAG;
+ throw iRc;
+ }
+
+ // verify tag not already defined
+ if( iTagUseCnt > 0 ){
+ if( GetTag( sWorker )){
+ iErrorStop = 120;
+ iRc = XB_INVALID_TAG;
+ throw iRc;
+ }
+ }
+
+ // allocate a tag structure here
+ if(( tte = (xbMdxTag *) calloc( 1, (size_t) sizeof( xbMdxTag ))) == NULL ){
+ iErrorStop = 130;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ *vpTag = tte;
+ tte->sTagName = new xbString( sWorker );
+
+ //set up the key expression
+ sWorker = sFilter;
+ sWorker.Trim();
+ if( sWorker.Len() > 0 ){
+ if( sWorker.Len() == 0 || sWorker.Len() > 220 ){
+ iRc = XB_INVALID_TAG;
+ iErrorStop = 140;
+ throw iRc;
+ }
+ tte->sFiltExp = new xbString( sWorker );
+ tte->filter = new xbExp( dbf->GetXbasePtr());
+ if(( iRc = tte->filter->ParseExpression( dbf, sWorker )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+
+ // tte->filter->DumpTree( 1 );
+
+ if((tte->filter->GetReturnType()) != 'L' ){
+ iRc = XB_INVALID_TAG;
+ iErrorStop = 160;
+ throw iRc;
+ }
+ tte->cHasFilter = 0x01;
+ }
+
+ //set up the key expression
+ sWorker = sKey;
+ sWorker.Trim();
+ if( sWorker.Len() == 0 || sWorker.Len() > 100 ){
+ iRc = XB_INVALID_TAG;
+ iErrorStop = 170;
+ throw iRc;
+ }
+ tte->sKeyExp = new xbString( sWorker );
+ tte->exp = new xbExp( dbf->GetXbasePtr());
+ if(( iRc = tte->exp->ParseExpression( dbf, sWorker )) != XB_NO_ERROR ){
+ iErrorStop = 180;
+ throw iRc;
+ }
+
+ xbDate d;
+
+ if( iTagUseCnt == 0 ){
+ // first tag, new mdx file
+ // create the file name
+ xbString sIxFileName = dbf->GetFqFileName();
+ sIxFileName.Trim();
+ xbUInt32 lLen = sIxFileName.Len();
+ sIxFileName.PutAt( lLen-2, 'M' );
+ sIxFileName.PutAt( lLen-1, 'D' );
+ sIxFileName.PutAt( lLen, 'X' );
+
+ // copy the file name to the class variable
+ this->SetFileName( sIxFileName );
+ if( FileExists() && !iOverlay ){
+ iErrorStop = 190;
+ iRc = XB_FILE_EXISTS;
+ throw iRc;
+ }
+
+ // first tag, need to create the file
+ if(( iRc = xbFopen( "w+b", dbf->GetShareMode())) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ cVersion = 2;
+ cCreateYY = (char) d.YearOf() - 1900;
+ cCreateMM = (char) d.MonthOf();
+ cCreateDD = (char) d.DayOf( XB_FMT_MONTH );
+
+ GetFileNamePart( sFileName );
+ sFileName.ToUpperCase();
+
+ SetBlockSize( (xbUInt32) dbf->GetCreateMdxBlockSize());
+ iBlockFactor = GetBlockSize() / 512;
+
+ cProdIxFlag = 1;
+ cTagEntryCnt = 48;
+ iTagLen = 32;
+ ulPageCnt = 4;
+ ulFirstFreePage = 0;
+ ulNoOfBlockAvail = 0;
+ cNextTag = 1;
+ c1B = 0x1B;
+ cUpdateYY = cCreateYY;
+ cUpdateMM = cCreateMM;
+ cUpdateDD = cCreateDD;
+
+ if(( iRc = WriteHeadBlock( 0 )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+ }
+
+ // populate the tag table entry structure
+ tte->ulTagHdrPageNo = ulPageCnt;
+ ulPageCnt += (xbUInt32) iBlockFactor;
+ tte->sTagName->strncpy( tte->cTagName, 10 );
+
+ // cKeyFmt is always 0x10;
+ // tested 2+ZIPCD CITY+STATE or just standalone field - always 0x10
+ tte->cKeyFmt = 0x10; // = CalcTagKeyFmt( *tte->exp );
+
+ switch( tte->exp->GetReturnType()){
+ case XB_EXP_CHAR:
+ tte->cKeyType = 'C';
+ tte->iKeyLen = tte->exp->GetResultLen();
+ tte->iSecKeyType = 0;
+ break;
+
+ case XB_EXP_NUMERIC:
+ tte->cKeyType = 'N';
+ tte->iKeyLen = 12;
+ tte->iSecKeyType = 0;
+ break;
+
+ case XB_EXP_DATE:
+ tte->cKeyType = 'D';
+ tte->iKeyLen = 8;
+ tte->iSecKeyType = 1;
+ break;
+
+ default:
+ iErrorStop = 200;
+ iRc = XB_INVALID_INDEX;
+ throw iRc;
+ }
+
+ tte->cpKeyBuf = (char *) malloc( (size_t) tte->iKeyLen + 1 );
+ tte->cpKeyBuf2 = (char *) malloc( (size_t) tte->iKeyLen + 1 );
+
+// if( 0 ){
+// printf( "ulTagHdrPageNo=[%d] cTagName=[%-11s], cLeftChild=[%d] cRightChild=[%d] cParent=[%d] cKeyType=[%c]\n\n",
+// tte->ulTagHdrPageNo, tte->cTagName, tte->cLeftChild, tte->cRightChild, tte->cParent, tte->cKeyType );
+// }
+
+ // write the new tte entry here
+ char tteBuf[21];
+ memset( tteBuf, 0x00, 21 );
+
+ ePutUInt32( &tteBuf[0], tte->ulTagHdrPageNo );
+ for( xbUInt32 l = 0; l < tte->sTagName->Len() && l < 10; l++ ){
+ tteBuf[l+4] = tte->sTagName->GetCharacter(l+1);
+ }
+ tteBuf[15] = tte->cKeyFmt;
+ tteBuf[19] = 0x02; // appears to always be a 0x02
+ tteBuf[20] = tte->cKeyType;
+
+ if(( iRc = xbFseek( (iTagUseCnt * 32) + 544, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( tteBuf, 21, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 220;
+ throw iRc;
+ }
+
+
+ // Begin Tag Header
+ tte->ulRootPage = ulPageCnt;
+ tte->ulTagSize = (xbUInt32) iBlockFactor;
+ ulPageCnt += 2;
+ tte->cKeyFmt2 = 0x10;
+ if( iDescending )
+ tte->cKeyFmt2 += 0x08;
+ if( iUnique ){
+ tte->cKeyFmt2 += 0x40;
+ tte->cUnique = 0x01;
+ }
+
+ tte->cTag11 = 0x1B; // always 0x1b ?
+ tte->cSerialNo = 0x01; // version incremented with each tag update
+ tte->ulLeftChild = tte->ulRootPage;
+ tte->ulRightChild = tte->ulRootPage;
+
+ tte->cTagYY = (char) d.YearOf() - 1900;
+ tte->cTagMM = (char) d.MonthOf();
+ tte->cTagDD = (char) d.DayOf( XB_FMT_MONTH );
+
+ tte->cKeyType2 = tte->cKeyType;
+ tte->iKeyItemLen = tte->iKeyLen + 4;
+
+ tte->iKeysPerBlock = (xbInt16) (GetBlockSize() - 12) / tte->iKeyItemLen;
+ tte->cKeyFmt3 = CalcTagKeyFmt( *tte->exp );
+
+// printf( "ulRootPage=[%d] cKeyFmt2=[%d] cKeyType2=[%d] iKeyLen=[%d]iKeysPerBlock=[%d]\n", tte->ulRootPage, tte->cKeyFmt2, tte->cKeyType2, tte->iKeyLen, tte->iKeysPerBlock );
+// printf( "iSecKeyType=[%d] iKeyItemLen=[%d] cUnique=[%d] \n", tte->iSecKeyType, tte->iKeyItemLen, tte->cUnique );
+
+ char *pBuf;
+ if(( pBuf = (char *) calloc( 1, (size_t) GetBlockSize())) == NULL ){
+ iErrorStop = 230;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ char *wPtr;
+ wPtr = pBuf;
+ ePutUInt32( wPtr, tte->ulRootPage );
+
+ wPtr += 4;
+ ePutUInt32( wPtr, tte->ulTagSize );
+
+ wPtr += 4;
+ *wPtr = tte->cKeyFmt2;
+
+ wPtr++;
+ *wPtr = tte->cKeyType2;
+
+ wPtr += 2;
+ *wPtr = tte->cTag11;
+
+ wPtr += 1;
+ ePutInt16( wPtr, tte->iKeyLen );
+
+ wPtr += 2;
+ ePutInt16( wPtr, tte->iKeysPerBlock );
+
+ wPtr += 2;
+ ePutInt16( wPtr, tte->iSecKeyType );
+
+ wPtr += 2;
+ ePutInt16( wPtr, tte->iKeyItemLen );
+
+ wPtr += 2;
+ *wPtr = tte->cSerialNo;
+
+ wPtr += 3;
+ *wPtr = tte->cUnique;
+
+ wPtr++;
+ for( xbUInt32 l = 0; l < tte->sKeyExp->Len(); l++ )
+ *wPtr++ = tte->sKeyExp->GetCharacter(l+1);
+
+ wPtr = pBuf;
+
+ tte->cHasKeys = 0x00;
+ pBuf[246] = tte->cHasKeys;
+
+ wPtr += 248;
+ ePutUInt32( wPtr, tte->ulLeftChild );
+ wPtr += 4;
+ ePutUInt32( wPtr, tte->ulRightChild );
+
+ pBuf[257] = tte->cTagYY;
+ pBuf[258] = tte->cTagMM;
+ pBuf[259] = tte->cTagDD;
+ pBuf[480] = tte->cKeyFmt3;
+
+ if( sFilter.Len() > 0 ){
+ pBuf[245] = tte->cHasFilter;
+ wPtr = pBuf;
+ wPtr += 762;
+ for( xbUInt32 l = 0; l < sFilter.Len(); l++ )
+ *wPtr++ = sFilter.GetCharacter(l+1);
+ }
+
+ if(( iRc = xbFseek( tte->ulTagHdrPageNo * 512, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 240;
+ throw iRc;
+ }
+
+ if(( iRc = xbFwrite( pBuf, GetBlockSize(), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 250;
+ throw iRc;
+ }
+
+ memset( pBuf, 0x00, GetBlockSize() );
+ if(( iRc = xbFwrite( pBuf, GetBlockSize(), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 260;
+ throw iRc;
+ }
+
+ iTagUseCnt++;
+ cNextTag++;
+
+
+ if(( iRc = WriteHeadBlock( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 270;
+ throw iRc;
+ }
+
+ // update the dbf file if needed - discreet field, has no filter
+ // 10/15/22 - dbase 7 does not update this field on index creation
+ if( tte->cKeyFmt3 == 0x01 && !tte->cHasFilter ){
+ // printf( "cKeyFmt3 = [%x]\n", tte->cKeyFmt3 );
+ xbInt16 iFldNo;
+ if(( iRc = dbf->GetFieldNo( sKey, iFldNo )) != XB_NO_ERROR ){
+ iErrorStop = 280;
+ throw iRc;
+ }
+ xbInt64 lOffset = 31 + ((iFldNo + 1) * 32 );
+
+ if(( iRc = dbf->xbFseek( lOffset, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 290;
+ iRc = XB_SEEK_ERROR;
+ throw iRc;
+ }
+ char cBuf[2];
+ cBuf[0] = 0x01;
+ cBuf[1] = 0x00;
+
+ if(( iRc = dbf->xbFwrite( cBuf, 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 300;
+ throw iRc;
+ }
+ dbf->UpdateSchemaIxFlag( iFldNo, 0x01 );
+ }
+
+ // add the new entry to the end of the list of tags
+ if( mdxTagTbl == NULL ){
+ mdxTagTbl = tte;
+ } else {
+ xbMdxTag *tteL = mdxTagTbl;
+ while( tteL->next )
+ tteL = tteL->next;
+ tteL->next = tte;
+ }
+
+ /* update the btree pointers */
+ CalcBtreePointers();
+ char bBuf[3];
+ xbMdxTag *tteWork = mdxTagTbl;
+
+ if(( iRc = xbFseek( 560, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 310;
+ throw iRc;
+ }
+ while( tteWork ){
+ bBuf[0] = tteWork->cLeftChild;
+ bBuf[1] = tteWork->cRightChild;
+ bBuf[2] = tteWork->cParent;
+
+ if(( iRc = xbFwrite( bBuf, 3, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 320;
+ throw iRc;
+ }
+ if( tteWork->next ){
+ if(( iRc = xbFseek( 29, SEEK_CUR )) != XB_NO_ERROR ){
+ iErrorStop = 330;
+ throw iRc;
+ }
+ }
+ tteWork = tteWork->next;
+ }
+ free( pBuf );
+
+// xbIx::SetCurTag( ( void *) tte );
+
+ }
+
+ catch (xbInt16 iRc ){
+ if( tte ){
+ if( tte->cpKeyBuf )
+ free( tte->cpKeyBuf );
+ if( tte->cpKeyBuf2 )
+ free( tte->cpKeyBuf2 );
+ if( tte->exp )
+ delete tte->exp;
+ if( tte->filter )
+ delete tte->filter;
+ if( tte->sKeyExp )
+ delete tte->sKeyExp;
+ if( tte->sFiltExp )
+ delete tte->sFiltExp;
+ if( tte->sTagName )
+ delete tte->sTagName;
+ free( tte );
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::CreateTag() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ return iRc;
+};
+
+/***********************************************************************/
+//! @brief Delete a key from a node.
+/*!
+ This routine deletes a key from a supplied node.
+ \param vpTag Tag to delete key on.
+ \param npNode Node to delete key on.
+ \param iSlotNo Slot number of key to delete.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxMdx::DeleteFromNode( void *vpTag, xbIxNode * npNode, xbInt16 iSlotNo )
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbMdxTag * npTag = (xbMdxTag *) vpTag;
+
+ try{
+ xbInt32 lKeyCnt = GetKeyCount( npNode );
+ xbInt16 iLen = (lKeyCnt - iSlotNo - 1) * npTag->iKeyItemLen;
+ xbBool bLeaf = IsLeaf( vpTag, npNode );
+ if( !bLeaf )
+ iLen += 4;
+
+ char *pTrg = npNode->cpBlockData;
+ if( iLen > 0 ){
+ pTrg += (8 + (npTag->iKeyItemLen * (iSlotNo)) ); //lTrgPos;
+ // std::cout << "TrgSpot = " << (8 + (npTag->iKeyItemLen * (iSlotNo)) ) << "\n";
+ char *pSrc = pTrg;
+ pSrc += npTag->iKeyItemLen;
+ memmove( pTrg, pSrc, (size_t) iLen );
+ }
+
+ // zap out the right most key
+ pTrg = npNode->cpBlockData;
+ if( bLeaf ){
+ pTrg += (8 + (npTag->iKeyItemLen * ( lKeyCnt-1 )));
+
+ } else {
+ pTrg += (12 + (npTag->iKeyItemLen * ( lKeyCnt-1 )));
+
+ }
+
+ for( xbInt16 i = 0; i < npTag->iKeyItemLen; i++ )
+ *pTrg++ = 0x00;
+
+ // set the new number of keys
+ ePutUInt32( npNode->cpBlockData, (xbUInt32) lKeyCnt - 1 );
+
+ // if node empty, add it to the free node chain
+ if( lKeyCnt < 2 ){
+ if( bReuseEmptyNodes ){
+ if( bLeaf && lKeyCnt == 1 ){
+ if(( iRc = HarvestEmptyNode( npTag, npNode, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+ }
+ }
+
+ // write out the block
+ if(( iRc = WriteBlock( npNode->ulBlockNo, GetBlockSize(), npNode->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ // do any empty node processing here
+// if( bReuseEmptyNodes ){
+// if( bLeaf && lKeyCnt == 1 ){
+// std::cout << "Empty node ready for reuse\n";
+// }
+// }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::DeleteFromNode() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return XB_NO_ERROR;
+}
+
+/***********************************************************************/
+//! @brief Delete a key.
+/*!
+ This routine deletes a key. It assumes the key to delete
+ is the current key in the node chain.
+
+ \param vpTag Tag to delete key on.
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::DeleteKey( void *vpTag ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbMdxTag * npTag = (xbMdxTag *) vpTag;
+
+ // save copy of node chain to reset to after delete completed
+ xbIxNode *npSaveNodeChain = npTag->npNodeChain;
+ npTag->npNodeChain = NULL;
+ xbIxNode * npSaveCurNode = npTag->npCurNode;
+
+ // std::cout << "xbIxMdx::DeleteKey()\n";
+
+ try{
+ xbString sMsg;
+
+ if(( iRc = xbIxMdx::KeySetPosDel( npTag )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ // Delete key needs to handle two scenarios
+ // 1 - if delete is on the only key of leaf,
+ // traverse up tree, trim as needed
+ // 2 - if last key on node is deleted, and key value is not the same
+ // as prev key, ascend tree looking for an interior node needing
+ // updated key value
+
+
+ xbInt32 lOrigKeyCnt = GetKeyCount( npTag->npCurNode );
+ if(( iRc = DeleteFromNode( npTag, npTag->npCurNode, npTag->npCurNode->iCurKeyNo )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ if( lOrigKeyCnt == 1 ){
+
+ // scenario 1
+ xbBool bDone = xbFalse;
+ xbBool bIsLeaf = xbFalse;
+ xbInt32 lKeyCnt;
+ npTag->npCurNode = npTag->npCurNode->npPrev;
+
+ while( npTag->npCurNode && !bDone ){
+ lKeyCnt = GetKeyCount( npTag->npCurNode );
+ bIsLeaf = IsLeaf( npTag, npTag->npCurNode );
+ if( lKeyCnt > 0 ){
+ if(( iRc = DeleteFromNode( npTag, npTag->npCurNode, npTag->npCurNode->iCurKeyNo )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ } else if(( iRc = HarvestEmptyNode( npTag, npTag->npCurNode, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+
+ if( (bIsLeaf && lKeyCnt > 1) || (!bIsLeaf && lKeyCnt > 0) )
+ bDone = xbTrue;
+ else
+ npTag->npCurNode = npTag->npCurNode->npPrev;
+ }
+
+ } else if( npTag->npCurNode->iCurKeyNo == (xbUInt32) lOrigKeyCnt - 1 ){
+
+ // scenario 2
+ // if last two keys identical, then nothing to do, else go up looking for a key to change
+ if( memcmp( GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->iKeyItemLen ),
+ GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo-1, npTag->iKeyItemLen ),
+ (size_t) npTag->iKeyLen )){
+
+ xbIxNode *pNode = npTag->npCurNode->npPrev;
+ char *pSrc = GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo-1, npTag->iKeyItemLen );
+
+ while( pNode && pNode->ulBlockNo != npTag->ulRootPage && pNode->iCurKeyNo == (xbUInt32) GetKeyCount( pNode ) )
+ pNode = pNode->npPrev;
+
+ if( pNode ){
+ if( pNode->iCurKeyNo < (xbUInt32) GetKeyCount( pNode )){
+ char *pTrg = pNode->cpBlockData;
+ pTrg += 12 + (pNode->iCurKeyNo * (xbUInt32) npTag->iKeyItemLen);
+ for( xbInt16 i = 0; i < npTag->iKeyLen; i++ )
+ *pTrg++ = *pSrc++;
+ // write out the block
+ if(( iRc = WriteBlock( pNode->ulBlockNo, GetBlockSize(), pNode->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ }
+ }
+ }
+ }
+ // restore node chain to pre delete status (which should be post add status)
+ npTag->npNodeChain = FreeNodeChain( npTag->npNodeChain );
+ npTag->npNodeChain = npSaveNodeChain;
+ npTag->npCurNode = npSaveCurNode;
+
+ // update the serial number
+ if(( iRc = TagSerialNo( 3, npTag )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::DeleteKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( npSaveNodeChain ){
+ npTag->npNodeChain = npSaveNodeChain;
+ npSaveNodeChain = FreeNodeChain( npSaveNodeChain );
+ npTag->npCurNode = npSaveCurNode;
+ }
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Dump a given block for a tag
+/*!
+ \param vpTag Input tag ptr for tag to be deleted<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a><br>
+ 1 = Deleted entire MDX file, only had one tag
+
+*/
+
+xbInt16 xbIxMdx::DeleteTag( void *vpTag ){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+ xbIxNode *n = NULL;
+ xbBool bLoneTag = xbFalse;
+
+ try{
+
+ if( !vpTag ){
+ iErrorStop = 100;
+ iRc = XB_INVALID_TAG;
+ throw iRc;
+ }
+
+ char cSaveHasFilter = mpTag->cHasFilter;
+ char cSaveKeyFmt3 = mpTag->cKeyFmt3;
+ xbString sSaveKey = mpTag->sKeyExp->Str();
+
+ if( iTagUseCnt == 1 ){
+ // std::cout << "xbIxMdx::DeleteTag - one tag found, delete the mdx file\n";
+
+ // close the mdx file
+ if(( iRc = xbIxMdx::Close()) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ // delete the file
+ xbRemove();
+
+ // init variables - needed?
+ // Init();
+ // iRc > 0 defines this as the only tag in an MDX file, MDX file deleted.
+ // signals to the calling process to drop the MDX file from the
+ // list of updateable indices.
+ bLoneTag = xbTrue;
+
+ } else {
+
+ // harvest tag nodes
+
+ if(( iRc = HarvestTagNodes( mpTag, xbTrue )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+
+ // remove an entry from tag table
+ // which tag is this?
+ xbInt16 iTagNo = 0;
+ xbMdxTag *mp = mdxTagTbl;
+ xbMdxTag *mpPrev = NULL;
+ while( mp && mp->ulTagHdrPageNo != mpTag->ulTagHdrPageNo ){
+ iTagNo++;
+ mpPrev = mp;
+ mp = mp->next;
+ }
+
+ // remove it from the linked list of tags
+ if( !mpPrev ){
+ mdxTagTbl = mp->next;
+ } else {
+ mpPrev->next = mp->next;
+ }
+ if( mp ){
+ if( mp->cpKeyBuf ) free( mp->cpKeyBuf );
+ if( mp->cpKeyBuf2 ) free( mp->cpKeyBuf2 );
+ if( mp->exp ) delete mp->exp;
+ if( mp->filter ) delete mp->filter;
+ if( mp->sKeyExp ) delete mp->sKeyExp;
+ if( mp->sFiltExp ) delete mp->sFiltExp;
+ if( mp->sTagName ) delete mp->sTagName;
+ free( mp );
+ }
+ xbInt32 iTarg = iTagNo * 32;
+ xbInt32 iSrc = iTarg + 32;
+ xbInt32 iLen = (iTagUseCnt - iTagNo) * 32;
+
+ if(( iRc = xbFseek( 544, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+ char Buf[1536]; // 47 tags + 1 in case tag #47 is deleted
+ memset( Buf, 0x00, 1536 );
+ if(( iRc = xbFread( Buf, 1504, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 170;
+ throw iRc;
+ }
+ char *pTrg = Buf;
+ pTrg += iTarg;
+ char *pSrc = Buf;
+ pSrc += iSrc;
+ for( xbInt32 i = 0; i < iLen; i++ )
+ *pTrg++ = *pSrc++;
+
+ if(( iRc = xbFseek( 544, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 180;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( Buf, 1504, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 190;
+ throw iRc;
+ }
+
+ iTagUseCnt--;
+ if(( iRc = WriteHeadBlock( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+
+ /* update the btree pointers */
+ CalcBtreePointers();
+ char bBuf[3];
+ xbMdxTag *tteWork = mdxTagTbl;
+
+ if(( iRc = xbFseek( 560, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+ while( tteWork ){
+ bBuf[0] = tteWork->cLeftChild;
+ bBuf[1] = tteWork->cRightChild;
+ bBuf[2] = tteWork->cParent;
+
+ if(( iRc = xbFwrite( bBuf, 3, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 320;
+ throw iRc;
+ }
+ if( tteWork->next ){
+ if(( iRc = xbFseek( 29, SEEK_CUR )) != XB_NO_ERROR ){
+ iErrorStop = 330;
+ throw iRc;
+ }
+ }
+ tteWork = tteWork->next;
+ }
+ }
+
+ // update the dbf file if needed, if discreet field with no filter
+ // printf( "cSaveKeyFmt3 = [%x] cSaveHasFilter=[%x] SaveKey = [%s]\n", cSaveKeyFmt3, cSaveHasFilter, sSaveKey.Str());
+
+ if( cSaveKeyFmt3 == 0x01 && !cSaveHasFilter ){
+ xbInt16 iFldNo;
+ if(( iRc = dbf->GetFieldNo( sSaveKey, iFldNo )) != XB_NO_ERROR ){
+ iErrorStop = 340;
+ throw iRc;
+ }
+ xbInt64 lOffset = 31 + ((iFldNo + 1) * 32 );
+
+ if(( iRc = dbf->xbFseek( lOffset, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 350;
+ iRc = XB_SEEK_ERROR;
+ throw iRc;
+ }
+ char cBuf[2];
+ cBuf[0] = 0x00;
+ cBuf[1] = 0x00;
+ if(( iRc = dbf->xbFwrite( cBuf, 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 360;
+ throw iRc;
+ }
+ dbf->UpdateSchemaIxFlag( iFldNo, 0x00 );
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::DeleteTag() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( n )
+ free( n );
+ }
+ if( bLoneTag && !iRc )
+ return 1;
+ else
+ return iRc;
+}
+
+/***********************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+
+
+//! @brief Dump a given block for a tag
+/*!
+ \param iOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \param ulBlockNo Block number to dump
+ \param mpTag Index tag pointer
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+
+xbInt16 xbIxMdx::DumpBlock( xbInt16 iOpt, xbUInt32 ulBlockNo, xbMdxTag *mpTag ){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbString s, s2;
+ xbBool bLeaf;
+ char *p;
+
+ try{
+ if(( iRc = GetBlock( mpTag, ulBlockNo, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ p = cNodeBuf;
+ xbInt32 lNoOfKeys = eGetInt32( p );
+ p+=4;
+ xbUInt32 ulNode2 = eGetUInt32( p );
+
+ if( !mpTag ){
+ // if no tag info, print what is available without tag info and exit
+ s.Sprintf( "--- BlkNo = %ld Page = %ld NoOfKeys = %ld Node2 (opt NextFreePage) = %ld", ulBlockNo, BlockToPage( ulBlockNo ), lNoOfKeys, ulNode2 );
+ xbase->WriteLogMessage( s, iOpt );
+ return XB_NO_ERROR;
+ }
+
+ p+=4;
+ p+= mpTag->iKeyItemLen * lNoOfKeys;
+ if( eGetUInt32( p ) == 0 ){
+ bLeaf = xbTrue;
+ // std::cout << "No of keys = " << lNoOfKeys << "\n";
+ s.Sprintf( "--- Leaf Node KeyCnt %d\t Page %d\t Block %d", lNoOfKeys, BlockToPage( ulBlockNo ), ulBlockNo );
+ } else {
+ bLeaf = xbFalse;
+ s.Sprintf( "--- Interior Node KeyCnt %d\t Page %d\t Block %d", lNoOfKeys, BlockToPage( ulBlockNo ), ulBlockNo );
+ }
+ if( ulNode2 > 0 )
+ s.Sprintf( "%s Node2 (opt NextFreePage) = %d", s.Str(), ulNode2 );
+
+ xbase->WriteLogMessage( s, iOpt );
+
+ xbInt32 l;
+ for( l = 0; l < lNoOfKeys; l++ ){
+ p = cNodeBuf + (8 + (l * mpTag->iKeyItemLen ));
+ s.Sprintf( "%08ld\t", eGetUInt32( p ));
+ p+=4;
+ if( mpTag->cKeyType2 == 'C' ){ //CHAR
+ for( xbInt32 l = 0; l < (mpTag->iKeyItemLen-4); l++ )
+ s += *p++;
+ s.Trim();
+ } else if( mpTag->cKeyType2 == 'N' ){ // NUMERIC
+ xbBcd bcd( p );
+ bcd.ToString( s2 );
+ s += s2;
+ } else if( mpTag->cKeyType2 == 'D' ){ // DATE
+ xbInt32 lDate = (xbInt32) eGetDouble( p );
+ xbDate d( lDate );
+ s.Sprintf( "%s\t%ld\t(%s)", s.Str(), lDate, d.Str());
+ } else {
+ s.Sprintf( "Unknown key type [%c]", mpTag->cKeyType2 );
+ }
+ xbase->WriteLogMessage( s, iOpt );
+ }
+ if( !bLeaf ){
+ // interior node has one extra key at the right most position
+ p = cNodeBuf + (8 + (l * mpTag->iKeyItemLen ));
+ s.Sprintf( "\t%08ld", eGetUInt32( p ));
+ xbase->WriteLogMessage( s, iOpt );
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::DumpBlock() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/**************************************************************************************************************/
+//! @brief Dump free blocks.
+/*!
+ Dump free blocks for index debugging purposes.
+
+ \param iOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+xbInt16 xbIxMdx::DumpFreeBlocks( xbInt16 iOpt ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbString s;
+ char *pBuf = NULL;
+ char *pNextPage;
+ xbUInt32 ulNextPage;
+
+ try{
+
+ if(( iRc = ReadHeadBlock( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ xbUInt32 ulLastBlock = PageToBlock( ulPageCnt );
+
+ pBuf = (char *) malloc( (size_t) GetBlockSize());
+ if( !pBuf ){
+ iErrorStop = 110;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ if( ulFirstFreePage > 0 ){
+ xbUInt32 ulThisFreePage = ulFirstFreePage;
+ xbUInt32 ulNextFreePage = 0;
+ xbUInt32 ulCnt = 0;
+ xbase->WriteLogMessage( "*** Free Blocks ***", iOpt );
+ s.Sprintf( "File Header - FirstFreePage = %ld Block = %ld", ulFirstFreePage, PageToBlock( ulFirstFreePage ));
+ xbase->WriteLogMessage( s, iOpt );
+ while( ulThisFreePage > 0 ){
+ if(( iRc = ReadBlock( PageToBlock( ulThisFreePage ), GetBlockSize(), pBuf )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ pNextPage = pBuf;
+ pNextPage+=4;
+ ulNextFreePage = eGetUInt32( pNextPage );
+ s.Sprintf( "Free Page# = %ld\t(Block# = %ld)\tNext Free Page = %ld\t(Block = %ld)", ulThisFreePage, PageToBlock( ulThisFreePage ), ulNextFreePage, PageToBlock( ulNextFreePage ));
+ xbase->WriteLogMessage( s, iOpt );
+ ulThisFreePage = ulNextFreePage;
+ ulCnt++;
+ }
+ s.Sprintf( "%ld free blocks (%ld pages)", ulCnt, BlockToPage( ulCnt ));
+ xbase->WriteLogMessage( s, iOpt );
+ xbase->WriteLogMessage( "*** End Of Free Blocks ***", iOpt );
+ }
+
+ pNextPage = pBuf;
+ pNextPage+=4;
+
+ s = "*** Beginning of Block2 Info ***";
+ xbase->WriteLogMessage( s, iOpt );
+ s = "ulBlock2 info. ulBlock2 is either one of a linked list of free nodes, or the id of the original node that this node was split from.";
+ xbase->WriteLogMessage( s, iOpt );
+ s = "Stored in physical file as pages, processed in blocks";
+ xbase->WriteLogMessage( s, iOpt );
+
+ xbUInt32 ulFirstBlock = 3;
+
+ for( xbUInt32 ul = ulFirstBlock; ul < ulLastBlock; ul++ ){
+ if(( iRc = ReadBlock( ul, GetBlockSize(), pBuf )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ ulNextPage = eGetUInt32( pNextPage );
+ if( ulNextPage > 0 ){
+ s.Sprintf( " Block# = %ld\tPage# = %ld\tulBlock2 = %ld\tulBlock2(Page) = %ld", ul, BlockToPage( ul ), PageToBlock( ulNextPage ), ulNextPage );
+ xbase->WriteLogMessage( s, iOpt );
+ }
+ }
+ s = "*** End of Block2 Info ***";
+ xbase->WriteLogMessage( s, iOpt );
+
+ if( pBuf ) free( pBuf );
+ }
+
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::DumpFreeBlocks() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( pBuf ) free( pBuf );
+ }
+ return iRc;
+}
+
+/**************************************************************************************************************/
+
+//! @brief Dump interior and leaf blocks for a given tag.
+/*!
+ Dump blocks for given tag for index debugging purposes.
+
+ A page is 512 bytes<br>
+ A block is one or more pages<br>
+ The default mdx block size is 2 pages, or 1024 bytes<br>
+ The first four pages or header pages<br>
+
+ \param iOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \param vpTag Index tag pointer, defaults to all tags if null.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+
+xbInt16 xbIxMdx::DumpTagBlocks( xbInt16 iOpt, void * vpTag ){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbInt16 iCurTag = 0;
+ xbString s;
+ xbInt16 iBlockCtr = 0;
+
+ try{
+
+ xbMdxTag * mpTag;
+ if( vpTag == NULL )
+ mpTag = (xbMdxTag *) GetTag( iCurTag++ );
+ else
+ mpTag = (xbMdxTag *) vpTag;
+
+ if( mpTag == NULL ){
+ iErrorStop = 100;
+ iRc = XB_INVALID_TAG;
+ throw iRc;
+ }
+
+ xbIxNode *n;
+ xbString s;
+ xbString s2;
+ xbBool bDone = xbFalse;
+
+ xbUInt32 ulBlkNo;
+ xbLinkListOrd<xbUInt32> ll;
+ xbLinkListNode<xbUInt32> * llN;
+
+ ll.SetDupKeys( xbFalse );
+
+ s.Sprintf( "%s Root Page %ld (Block %ld)", mpTag->cTagName, mpTag->ulRootPage, PageToBlock( mpTag->ulRootPage ) );
+ xbase->WriteLogMessage( s, iOpt );
+
+ // for each tag
+ while( !bDone ){
+
+ // clear out any history
+ ll.Clear();
+ if( mpTag->npNodeChain ){
+ mpTag->npNodeChain = FreeNodeChain( mpTag->npNodeChain );
+ mpTag->npCurNode = NULL;
+ }
+
+ while( GetNextKey( mpTag, 0 ) == 0 ){
+ n = mpTag->npNodeChain;
+
+ while(n){
+ ll.InsertKey( n->ulBlockNo, (xbUInt32) n->iCurKeyNo );
+ n = n->npNext;
+ }
+ }
+ llN = ll.GetHeadNode();
+
+ while( llN ){
+
+ ulBlkNo = llN->GetKey();
+ xbIxMdx::DumpBlock( iOpt, ulBlkNo, mpTag );
+ llN = llN->GetNextNode();
+ iBlockCtr++;
+ }
+
+ if( vpTag || iCurTag >= GetTagCount())
+ bDone = xbTrue;
+ else
+ mpTag = (xbMdxTag *) GetTag( iCurTag++ );
+ }
+
+ s.Sprintf( "\nTotal Blocks: %d", iBlockCtr );
+ xbase->WriteLogMessage( s, iOpt );
+
+ if( mpTag->npNodeChain ){
+ mpTag->npNodeChain = FreeNodeChain( mpTag->npNodeChain );
+ mpTag->npCurNode = NULL;
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::DumpTagBlocks() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Dump index file header.
+/*!
+ Dump a index file header for debugging purposes.
+ \param iOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \param iFmtOpt Output Format<br>
+ 0, 1 = Header info only<br>
+ 2 = Tag info<br>
+ 3 = Header && Tag info<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxMdx::DumpHeader( xbInt16 iOpt, xbInt16 iFmtOpt )
+{
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbString s;
+ if(( iRc = ReadHeadBlock( 1 )) != XB_NO_ERROR )
+ return iRc;
+
+// std::cout << "xbIxMdx::DumpHeader options - " << iDestOpt << " fmtopt = " << iFmtOpt << "\n";
+
+ char c, tfv, cDisplayMask = 1;
+ cDisplayMask = cDisplayMask << 7;
+ if( iFmtOpt != 2 && iFmtOpt != 4 ){
+ s = "*** MDX Index Header ***";
+ xbase->WriteLogMessage( s, iOpt );
+ s = "Version = ";
+ tfv = cVersion;
+ for( c = 1; c<= 8; c++ ){
+ //std::cout << (tfv & cDisplayMask ? '1' : '0');
+ s+= (tfv & cDisplayMask ? '1' : '0');
+ tfv <<= 1;
+ }
+ xbase->WriteLogMessage( s, iOpt );
+
+
+// std::cout << std::endl;
+// std::cout <<
+ s.Sprintf( "Create Date = %d/%d/%d", (int) cCreateMM, (int) cCreateDD, (int) cCreateYY % 100 );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "File Name = %s", sFileName.Str() );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "Block Factor = %d", iBlockFactor );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "Block Size = %d", GetBlockSize() );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "Prod Ix Flag = %d", (xbInt16) cProdIxFlag );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "Tag Entry Cnt = %d", (xbInt16) cTagEntryCnt );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "Tag Len = %d", iTagLen );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "Next Tag = %d", (xbInt16) cNextTag );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "Tag Use Cnt = %d", iTagUseCnt );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "Page Cnt = %d", ulPageCnt );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "First Free Page = %d", ulFirstFreePage );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "No Of Block Avail = %d\n", ulNoOfBlockAvail );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "Last update date = %d/%d/%d", (int) cCreateMM, (int) cCreateDD, (int) cCreateYY % 100 );
+ xbase->WriteLogMessage( s, iOpt );
+
+ if( ulFirstFreePage > 0 ){
+ xbString s;
+ xbUInt32 ulNfp = ulFirstFreePage; // next free page
+ xbInt16 lc = 0;
+ while( ulNfp && lc++ < 5 ){
+ if( s.Len() > 0 )
+ s += ",";
+ s.Sprintf( "%s%ld", s.Str(), ulNfp );
+ if(( iRc = GetBlock( NULL, (xbUInt32) (ulNfp / (xbUInt32) iBlockFactor), 0 )) != 0 )
+ return iRc;
+ ulNfp = eGetUInt32( cNodeBuf+4 );
+ }
+ xbase->WriteLogMessage( s, iOpt );
+ }
+ }
+ if( iFmtOpt > 1 ){
+ xbMdxTag *tt = mdxTagTbl;
+ xbString s;
+ xbInt16 i = 0;
+
+ if( tt ){
+ while( tt ){
+ i++;
+ if(( iRc = LoadTagDetail( 2, tt )) != XB_NO_ERROR )
+ return iRc;
+
+ s.Sprintf( "TTE (%d)\tName HdrPage\tFormat\tLeftChild\tRightChild\tParent\tKeyType", i );
+ xbase->WriteLogMessage( s, iOpt );
+ s.Sprintf( "TTE (%d)\t%-12s %d\t\t%d\t%d\t\t%d\t\t%d\t%c\n", i, tt->cTagName, tt->ulTagHdrPageNo, tt->cKeyFmt, tt->cLeftChild, tt->cRightChild, tt->cParent, tt->cKeyType );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "TTH (%d)\tRoot\tTagSize\tKeyFmt2\tType2\tKeyLen\tKeysPerBlock\tSecType\tKeyItemLen\tSerial#\tHasKeys\tFilter\tDesc\tUnique\tLchild\tRchild\tKeyFmt3\tTagDate", i );
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "TTH (%d)\t%d\t%d\t%d\t%c\t%d\t%d\t\t%d\t%d\t\t%x\t%x\t%d\t%d\t%d\t%d\t%d\t%d\t%d/%d/%d",
+ i, tt->ulRootPage, tt->ulTagSize, tt->cKeyFmt2, tt->cKeyType2, tt->iKeyLen, tt->iKeysPerBlock, tt->iSecKeyType, tt->iKeyItemLen, tt->cSerialNo, tt->cHasKeys, tt->cHasFilter,
+ (((tt->cKeyFmt2 & 0x08) > 0) ? 1 : 0), // descending?
+ tt->cUnique, tt->ulLeftChild, tt->ulRightChild, tt->cKeyFmt3, (int) tt->cTagMM, (int) tt->cTagDD, (int) tt->cTagYY % 100 );
+
+ xbase->WriteLogMessage( s, iOpt );
+
+ s.Sprintf( "Key (%d) %s", i, tt->sKeyExp->Str());
+ xbase->WriteLogMessage( s, iOpt );
+
+ if( tt->cHasFilter ){
+ s.Sprintf( "Flt (%d) %s", i, tt->sFiltExp->Str());
+ xbase->WriteLogMessage( s, iOpt );
+ }
+ xbase->WriteLogMessage( "", iOpt );
+ tt = tt->next;
+
+ }
+ }
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+xbInt16 xbIxMdx::DumpIxForTag( void *vpTag, xbInt16 iOutputOpt )
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 iDepth = 0;
+ xbUInt32 lKeyCtr = 0;
+ xbInt32 iMinDepth = 999999;
+ xbInt32 iMaxDepth = 0;
+
+ try{
+ /*
+ get first node
+ while interior node
+ print the left key
+ level++
+ go down one on the left
+ */
+
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+ if( mpTag->npNodeChain ){
+ mpTag->npNodeChain = FreeNodeChain( mpTag->npNodeChain );
+ mpTag->npCurNode = NULL;
+ }
+
+ // Get the root
+ if(( iRc = LoadTagDetail( 2, mpTag )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ // lRootBlock is now available
+ if(( iRc = GetBlock( vpTag, (mpTag->ulRootPage / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ // if no keys on this node, then the index is empty
+ xbUInt32 ulKeyPtr = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ if( ulKeyPtr == 0 ){
+ iErrorStop = 120;
+ iRc = XB_EMPTY;
+ throw iRc;
+ }
+ while( !IsLeaf( vpTag, mpTag->npCurNode )){ // go down the chain looking for a leaf node
+ PrintKey( vpTag, mpTag->npCurNode , 0, iDepth++, 'I', iOutputOpt );
+ if(( iRc = GetKeyPtr( vpTag, 0, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ if(( iRc = GetBlock( vpTag, (ulKeyPtr / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ }
+ if(( iRc = GetKeyPtr( vpTag, 0, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ // loop through the leaf entries of left most leaf
+ if( iDepth < iMinDepth ) iMinDepth = iDepth;
+ if( iDepth > iMaxDepth ) iMaxDepth = iDepth;
+ xbUInt32 ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ for( xbUInt32 ul = 0; ul < ulNoOfKeys; ul++ ){
+ PrintKey( vpTag, mpTag->npCurNode , ul, iDepth, 'L', iOutputOpt );
+ lKeyCtr++;
+ }
+
+ // if head node = start node, return
+ if( mpTag->npCurNode->ulBlockNo == ( mpTag->ulRootPage / (xbUInt32) iBlockFactor ))
+ return XB_NO_ERROR;
+
+ xbBool bEof = false;
+ while( !bEof ){
+
+ // go up the chain, looking for an interior node with more keys on it
+ xbIxNode * TempIxNode = mpTag->npCurNode;
+ mpTag->npCurNode = mpTag->npCurNode->npPrev;
+ mpTag->npCurNode->npNext = NULL;
+ TempIxNode->npPrev = NULL;
+ TempIxNode = FreeNodeChain( TempIxNode );
+ iDepth--;
+
+ while( mpTag->npCurNode->iCurKeyNo >= eGetUInt32( mpTag->npCurNode->cpBlockData ) &&
+ mpTag->npCurNode->ulBlockNo != ( mpTag->ulRootPage / (xbUInt32) iBlockFactor) ){
+ TempIxNode = mpTag->npCurNode;
+ mpTag->npCurNode = mpTag->npCurNode->npPrev;
+ mpTag->npCurNode->npNext = NULL;
+ TempIxNode->npPrev = NULL;
+ TempIxNode = FreeNodeChain( TempIxNode );
+ iDepth--;
+ }
+ // if head node && right most key, return
+ if( mpTag->npCurNode->ulBlockNo == (mpTag->ulRootPage / (xbUInt32) iBlockFactor) &&
+ mpTag->npCurNode->iCurKeyNo == eGetUInt32( mpTag->npCurNode->cpBlockData ))
+ bEof = true;
+
+ if( !bEof ){
+ mpTag->npCurNode->iCurKeyNo++;
+ if(( iRc = GetKeyPtr( vpTag, mpTag->npCurNode->iCurKeyNo, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+ PrintKey( vpTag, mpTag->npCurNode , mpTag->npCurNode->iCurKeyNo, iDepth++, 'I', iOutputOpt );
+
+ if(( iRc = GetBlock( vpTag, (ulKeyPtr / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 170;
+ throw iRc;
+ }
+
+ // traverse down the left side of the tree
+ while( !IsLeaf( vpTag, mpTag->npCurNode )) // go down the chain looking for a leaf node
+ {
+ PrintKey( vpTag, mpTag->npCurNode , 0, iDepth++, 'I', iOutputOpt );
+ if(( iRc = GetKeyPtr( vpTag, 0, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 180;
+ throw iRc;
+ }
+ if(( iRc = GetBlock( vpTag, (ulKeyPtr / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 190;
+ throw iRc;
+ }
+ }
+ if( iDepth < iMinDepth ) iMinDepth = iDepth;
+ if( iDepth > iMaxDepth ) iMaxDepth = iDepth;
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ for( xbUInt32 ul = 0; ul < ulNoOfKeys; ul++ ){
+ PrintKey( vpTag, mpTag->npCurNode , ul, iDepth, 'L', iOutputOpt );
+ lKeyCtr++;
+ }
+ }
+ }
+ xbString s;
+ s.Sprintf( "Total keys = [%ld] Min Depth = [%d] Max Depth = [%d]", lKeyCtr, iMinDepth, iMaxDepth );
+ xbase->WriteLogMessage( s.Str(), 2 );
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::DumpIxForTag() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/**************************************************************************************************************/
+void xbIxMdx::DumpIxNodeChain( void *vpTag, xbInt16 iOutputOpt ) const
+{
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+ xbString s( "Dump Node Chain" );
+ xbase->WriteLogMessage( s, 2 );
+
+ if( mpTag->npNodeChain ){
+ xbIxNode *n = mpTag->npNodeChain;
+ xbInt16 iCtr = 0;
+ char cLeaf;
+ s.Sprintf( "Cnt\tThis Prev Next CurKeyNo BlockNo Page NoOfKeys Type" );
+ xbase->WriteLogMessage( s, iOutputOpt );
+ while( n ){
+ IsLeaf( vpTag, n ) ? cLeaf = 'L' : cLeaf = 'I';
+ s.Sprintf( "%d\t%08x %08x %08x %08d %08d %08d %08ld %c",
+ iCtr++, n, n->npPrev, n->npNext, n->iCurKeyNo,
+ n->ulBlockNo, n->ulBlockNo * (xbUInt32) iBlockFactor,
+ eGetUInt32( n->cpBlockData ), cLeaf );
+ xbase->WriteLogMessage( s, 2 );
+ n = n->npNext;
+ }
+ } else {
+ s = "Empty Node Chain";
+ xbase->WriteLogMessage( s, 2 );
+ }
+}
+#endif
+
+/***********************************************************************************************/
+xbInt16 xbIxMdx::FindKey( void *vpTag, xbDouble dKey, xbInt16 iRetrieveSw ){
+
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+ if( mpTag->cKeyType2 == 'N' ){ // mdx indices store numeric keys as bcd values
+ xbBcd bcd( dKey );
+ return xbIx::FindKey( vpTag, bcd, iRetrieveSw );
+ } else // this would be a julian date inquiry
+ return FindKey( vpTag, &dKey, 8, iRetrieveSw );
+}
+
+/***********************************************************************************************/
+// iRetrieveSw = 1 - position db file to index position
+// 0 - do not position dbf file
+
+xbInt16 xbIxMdx::FindKey( void *vpTag, const void * vpKey,
+ xbInt32 lSearchKeyLen, xbInt16 iRetrieveSw ){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ // clean up any previous table updates before moving on
+ if( iRetrieveSw ){
+ if( dbf->GetDbfStatus() == XB_UPDATED ){
+ if( dbf->GetAutoCommit() == 1 ){
+ if(( iRc = dbf->Commit()) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ } else {
+ if(( iRc = dbf->Abort()) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ }
+ }
+ }
+
+ xbUInt32 ulNoOfKeys;
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+ char cKeyType = GetKeyType( vpTag );
+ xbBool bDescending = mpTag->cKeyFmt2 & 0x08;
+
+ if( mpTag->npNodeChain ){
+
+ // determine if the index has been updated since the last time it was used
+ time_t tFileTs;
+ if(( iRc = GetFileMtime( tFileTs )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ if( mpTag->tNodeChainTs < tFileTs ){
+ mpTag->npNodeChain = FreeNodeChain( mpTag->npNodeChain );
+ mpTag->npCurNode = NULL;
+
+ } else {
+ // pop up the chain looking for appropriate starting point
+ xbBool bDone = false;
+ xbIxNode * TempIxNode;
+ while( mpTag->npCurNode && !bDone &&
+ (mpTag->npCurNode->ulBlockNo != ( mpTag->ulRootPage / (xbUInt32) iBlockFactor ))){ // not root node
+ //if no keys on the node, pop up one
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ if( ulNoOfKeys == 0 ){
+ TempIxNode = mpTag->npCurNode;
+ mpTag->npCurNode = mpTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+
+ } else {
+
+ iRc = CompareKey( cKeyType, vpKey, GetKeyData( mpTag->npCurNode, 0, mpTag->iKeyItemLen ), (size_t) lSearchKeyLen );
+ if( (!bDescending && iRc <= 0) || (bDescending && iRc >= 0 )){
+ TempIxNode = mpTag->npCurNode;
+ mpTag->npCurNode = mpTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+ } else {
+ // get the number of keys on the block and compare the key to the rightmost key
+ xbUInt32 ulKeyCtr = eGetUInt32( mpTag->npCurNode->cpBlockData ) - 1; // IsLeaf( vpTag, mpTag->npCurNode );
+ iRc = CompareKey( cKeyType, vpKey, GetKeyData( mpTag->npCurNode, ulKeyCtr, mpTag->iKeyItemLen), (size_t) lSearchKeyLen );
+
+ if( (!bDescending && iRc > 0) || (bDescending && iRc < 0 )){
+ TempIxNode = mpTag->npCurNode;
+ mpTag->npCurNode = mpTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+ } else {
+ bDone = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // either started empty, or cleared due to file time diff
+ if( !mpTag->npNodeChain ){
+ // Get the root
+ if(( iRc = LoadTagDetail( 2, mpTag )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ // lRootBlock is now available
+ if(( iRc = GetBlock( vpTag, (mpTag->ulRootPage / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ // if this is a leaf node and no keys on this node, then the index is empty
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ if( ulNoOfKeys == 0 && IsLeaf( vpTag, mpTag->npCurNode )){
+// iRc = XB_EMPTY;
+ iRc = XB_NOT_FOUND;
+ return iRc;
+ }
+ }
+
+ // should be in the appropriate position in the node chain to continue the search from here
+ // run down through the interior nodes
+ xbInt16 iSearchRc = 0;
+ xbUInt32 ulKeyPtr = 0;
+
+ while( vpTag && !IsLeaf( vpTag, mpTag->npCurNode ) ){
+ // get the number of keys on the block and compare the key to the rightmost key
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+
+ if( ulNoOfKeys == 0 ){
+ mpTag->npCurNode->iCurKeyNo = 0;
+
+ } else {
+
+ iRc = CompareKey( cKeyType, vpKey, GetKeyData( mpTag->npCurNode, ulNoOfKeys - 1, mpTag->iKeyItemLen), (size_t) lSearchKeyLen );
+ if( (!bDescending && iRc > 0) || (bDescending && iRc < 0)){
+ mpTag->npCurNode->iCurKeyNo = ulNoOfKeys;
+ }
+ else
+ {
+ mpTag->npCurNode->iCurKeyNo = (xbUInt32) BSearchBlock( cKeyType, mpTag->npCurNode,
+ (xbInt32) mpTag->iKeyItemLen, vpKey, (xbInt32) lSearchKeyLen, iSearchRc, bDescending );
+ }
+ }
+
+ if(( iRc = GetKeyPtr( vpTag, mpTag->npCurNode->iCurKeyNo, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+
+ if(( iRc = GetBlock( vpTag, (ulKeyPtr / (xbUInt32)iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+ }
+
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ xbInt16 iCompRc = 0;
+
+ if( ulNoOfKeys == 0 ){
+ // iCompRc = -1;
+ // iRc = XB_EMPTY;
+ iRc = XB_NOT_FOUND;
+ return iRc;
+
+ } else {
+
+ iRc = BSearchBlock( cKeyType, mpTag->npCurNode, mpTag->iKeyItemLen, vpKey, lSearchKeyLen, iCompRc, bDescending );
+ // iCompRc
+ // 0 found
+ // < 0 eof encountered, search key > last key in file
+ // > 0 not found, positioned to next key
+
+ if( iCompRc >= 0 ){
+ mpTag->npCurNode->iCurKeyNo = (xbUInt32) iRc;
+
+
+ if( iRetrieveSw ){
+
+ xbUInt32 ulKey = mpTag->npCurNode->iCurKeyNo;
+ if( ulKey >= ulNoOfKeys ) // if position past end of keys, need to go back one and position to last key
+ ulKey--;
+
+ // if(( iRc = GetKeyPtr( vpTag, mpTag->npCurNode->iCurKeyNo, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+
+ if(( iRc = GetKeyPtr( vpTag, ulKey, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 170;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 180;
+ throw iRc;
+ }
+ }
+ }
+ }
+
+ if( iCompRc == 0 )
+ return XB_NO_ERROR;
+ else if( iCompRc > 0 )
+ return XB_NOT_FOUND;
+ else
+ return XB_EOF;
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::FindKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+xbInt16 xbIxMdx::FindKeyForCurRec( void * vpTag )
+{
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 i = 0;
+
+ try{
+ if(( iRc = CreateKey( vpTag, 0 )) < XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::FindKeyForCurRec() Exception Caught. Error Stop = [%d] iRc = [%d] Tag=[%d]", iErrorStop, iRc, i );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return XB_NO_ERROR;
+}
+
+/***********************************************************************/
+//! @brief Get dbf record number for given key number.
+/*!
+ \param vpTag Tag to retrieve dbf rec number on.
+ \param iKeyNo Key number for retrieval
+ \param np Pointer to node
+ \param ulDbfPtr- Output dbf record number
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxMdx::GetDbfPtr( void *vpTag, xbInt16 iKeyNo, xbIxNode *np, xbUInt32 &ulDbfPtr ) const {
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ #ifdef XB_DEBUG_SUPPORT
+ // turn this off in production mode for better performance
+ xbUInt32 ulNoOfKeys = eGetUInt32 ( np->cpBlockData );
+ if( iKeyNo < 0 || iKeyNo > (xbInt16) --ulNoOfKeys ){
+ iErrorStop = 100;
+ throw XB_INVALID_KEYNO;
+ }
+ #endif
+
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+ char *p = ( np->cpBlockData);
+ p += (8 + (iKeyNo * mpTag->iKeyItemLen));
+ ulDbfPtr = eGetUInt32 ( p );
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::GetDbfPtr() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+/*!
+ \param vpTag Tag to retrieve first key on.
+ \param iRetrieveSw xbTrue - Retrieve the record on success.<br>
+ xbFalse - Don't retrieve record.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::GetFirstKey( void *vpTag, xbInt16 iRetrieveSw = 0 ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ // convert the tag pointer to mdx tag pointer
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+
+ try{
+ // clear out any history
+ if( mpTag->npNodeChain ){
+ mpTag->npNodeChain = FreeNodeChain( mpTag->npNodeChain );
+ mpTag->npCurNode = NULL;
+ }
+ // Get the root
+ if(( iRc = LoadTagDetail( 2, mpTag )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ // lRootPage is available
+ if(( iRc = GetBlock( vpTag, (mpTag->ulRootPage / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ // if no keys on this node, then the index is empty
+ // this is not true
+
+ xbUInt32 ulKeyPtr = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ if( ulKeyPtr == 0 && IsLeaf( vpTag, mpTag->npCurNode )){
+ iRc = XB_EMPTY;
+ return iRc;
+ }
+
+ while( !IsLeaf( vpTag, mpTag->npCurNode )) // go down the chain looking for a leaf node
+ {
+ if(( iRc = GetKeyPtr( vpTag, 0, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+
+ if(( iRc = GetBlock( vpTag, (ulKeyPtr / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ }
+
+ // retrieve record to data buf
+ if( iRetrieveSw ){
+ if(( iRc = GetKeyPtr( vpTag, 0, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ }
+ // else {
+ // throw iRc;
+ // }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::GetFirstKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//xbBool xbIxMdx::GetIndexUpdated() const {
+// std::cout << "xbIxMdx::GetIndexUpdate() FIX ME \n";
+// return xbFalse;
+//}
+
+/***********************************************************************/
+//! @brief Get the key expression for the given tag.
+/*!
+ \param vpTag Tag to retrieve key expression from tag.
+ \returns Key expression.
+*/
+
+xbString &xbIxMdx::GetKeyExpression( const void * vpTag ) const{
+ xbMdxTag *mpTag = (xbMdxTag *) vpTag;
+ return *mpTag->sKeyExp;
+}
+
+/***********************************************************************/
+//! @brief Get the key expression for the given tag.
+/*!
+ \param vpTag Tag to retrieve filter expression from tag (if it exists).
+ \returns Key filter.
+*/
+
+xbString &xbIxMdx::GetKeyFilter( const void * vpTag ) const{
+
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+
+ // std::cout << "GetKeyFilter() ";
+ if( mpTag->sFiltExp )
+ return *mpTag->sFiltExp;
+// std::cout << " not null\n";
+ else
+ return sNullString;
+ // std::cout << " null\n";
+
+// next line causes seg faults
+// return *mpTag->sFiltExp;
+
+}
+/**************************************************************************************************/
+xbInt16 xbIxMdx::GetKeyPtr( void *vpTag, xbInt16 iKeyNo, xbIxNode *np, xbUInt32 &ulKeyPtr ) const {
+
+ xbInt16 iRc = XB_NO_ERROR;
+
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ xbMdxTag *mdxTag = (xbMdxTag *) vpTag;
+ char *p = np->cpBlockData;
+ xbUInt32 ulKeyCnt = eGetUInt32( p );
+ if( iKeyNo < 0 || iKeyNo > (xbInt16) ulKeyCnt ){
+ iErrorStop = 100;
+ iRc = XB_INVALID_KEYNO;
+ throw iRc;
+ }
+ p+=8; // skip past first two four byte numeric fields
+ p+= (iKeyNo * mdxTag->iKeyItemLen);
+ ulKeyPtr = eGetUInt32( p );
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::GetKeyPtr() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Returns key update status.
+/*!
+ \param vpTag Tag to check status on.
+ \returns XB_UPD_KEY Key updated.<br>
+ XB_DEL_KEY Key deleted.<br>
+ XB_ADD_KEY Key added.<br>
+ 0 No key updates
+
+*/
+inline xbInt16 xbIxMdx::GetKeySts( void *vpTag ) const{
+
+ xbMdxTag *mpTag = (xbMdxTag *) vpTag;
+ return mpTag->iKeySts;
+}
+
+/***********************************************************************/
+char xbIxMdx::GetKeyType( const void *vpTag ) const {
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+ return mpTag->cKeyType;
+}
+
+/***********************************************************************/
+//! @brief Get the last key for the given tag.
+/*!
+ \param vpTag Tag to retrieve last key on.
+ \param iRetrieveSw xbTrue - Retrieve the record on success.<br>
+ xbFalse - Don't retrieve record.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::GetLastKey( void *vpTag, xbInt16 iRetrieveSw ){
+ return GetLastKey( 0, vpTag, iRetrieveSw );
+}
+
+/***********************************************************************/
+//! @brief Get the last key for the given tag and starting node.
+/*!
+ \param ulBlockNo Starting node
+ \param vpTag Tag to retrieve last key on.
+ \param iRetrieveSw xbTrue - Retrieve the record if key found.<br>
+ xbFalse - Don't retrieve record.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::GetLastKey( xbUInt32 ulBlockNo, void *vpTag, xbInt16 iRetrieveSw ){
+
+ // if UlNodeNo is zero, start at head node, otherwise start at ulNodeNo
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ // convert the tag pointer to mdx tag pointer
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+
+ try{
+ xbUInt32 ulNoOfKeys = 0;
+ // clear out any history
+ if( mpTag->npNodeChain ){
+ mpTag->npNodeChain = FreeNodeChain( mpTag->npNodeChain );
+ mpTag->npCurNode = NULL;
+ }
+ // Get the root
+ if( ulBlockNo == 0 ){
+ if(( iRc = LoadTagDetail( 2, mpTag )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ //if(( iRc = GetBlock( vpTag, (mpTag->ulRootPage / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ if(( iRc = GetBlock( vpTag, PageToBlock( mpTag->ulRootPage ), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ } else {
+ if(( iRc = GetBlock( vpTag, ulBlockNo, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ }
+
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+
+ if( ulNoOfKeys == 0 && IsLeaf( vpTag, mpTag->npCurNode )){
+ iRc = XB_EMPTY;
+ return iRc;
+ }
+
+ mpTag->npCurNode->iCurKeyNo = ulNoOfKeys;
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+
+ xbUInt32 ulKeyPtr = 0;
+ while( !IsLeaf( vpTag, mpTag->npCurNode )){ // go down the chain looking for a leaf node
+ // std::cout << "Considered an interior node\n";
+ if(( iRc = GetKeyPtr( vpTag, ulNoOfKeys, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ if(( iRc = GetBlock( vpTag, (ulKeyPtr / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ mpTag->npCurNode->iCurKeyNo = ulNoOfKeys;
+ }
+ // leaf node has one fewer keys than the interior node
+ mpTag->npCurNode->iCurKeyNo--;
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+
+ // retrieve record to data buf
+ if( iRetrieveSw ){
+ if(( iRc = GetKeyPtr( vpTag, (ulNoOfKeys-1), mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::GetLastKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Get the last key for a block number.
+/*!
+ \param vpTag Tag to retrieve first key on.
+ \param ulBlockNo Block number for key retrieval.
+ \param cpBuf output buffer for key placement
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::GetLastKeyForBlockNo( void *vpTag, xbUInt32 ulBlockNo, char *cpBuf ){
+
+ // returns the last key for a given block number
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ xbMdxTag * npTag = (xbMdxTag *) vpTag;
+
+ try{
+ xbIxNode * npSaveNodeChain = npTag->npNodeChain;
+ xbIxNode * npSaveCurNode = npTag->npCurNode;
+ npTag->npNodeChain = NULL;
+
+ if(( iRc = GetLastKey( ulBlockNo, npTag, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ memcpy( cpBuf, GetKeyData( npTag->npCurNode, GetKeyCount( npTag->npCurNode ) - 1, npTag->iKeyItemLen ), (size_t) npTag->iKeyLen );
+
+ // free memory
+ FreeNodeChain( npTag->npNodeChain );
+ npTag->npNodeChain = npSaveNodeChain;
+ npTag->npCurNode = npSaveCurNode;
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::GetLastKeyForBlockNo() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ) );
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Get the next key for the given tag.
+/*!
+ \param vpTag Tag to retrieve next key on.
+ \param iRetrieveSw xbTrue - Retrieve the record on success.<br>
+ xbFalse - Don't retrieve record.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::GetNextKey( void * vpTag, xbInt16 iRetrieveSw ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ // convert the tag pointer to mdx tag pointer
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+
+ try{
+ if( !mpTag->npCurNode )
+ return GetFirstKey( vpTag, iRetrieveSw );
+
+ // more keys on this node?
+ xbUInt32 ulKeyPtr;
+ if( (eGetUInt32( mpTag->npCurNode->cpBlockData ) - 1) > mpTag->npCurNode->iCurKeyNo ){
+ mpTag->npCurNode->iCurKeyNo++;
+
+ if(( iRc = GetKeyPtr( vpTag, mpTag->npCurNode->iCurKeyNo, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ if( iRetrieveSw ){
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ } else {
+ return iRc;
+ }
+ } else {
+ return iRc;
+ }
+ }
+
+ // if at end head node, then at eof
+ if( mpTag->npCurNode->ulBlockNo == ( mpTag->ulRootPage / (xbUInt32) iBlockFactor ))
+ return XB_EOF;
+
+ // This logic assumes that interior nodes have n+1 left node no's where n is the number of keys in the node
+ xbIxNode * TempIxNode = mpTag->npCurNode;
+ mpTag->npCurNode = mpTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+
+ // While no more right keys && not head node, pop up one node
+ while( mpTag->npCurNode->iCurKeyNo >= eGetUInt32( mpTag->npCurNode->cpBlockData ) &&
+ mpTag->npCurNode->ulBlockNo != ( mpTag->ulRootPage / (xbUInt32) iBlockFactor) ){
+
+ TempIxNode = mpTag->npCurNode;
+ mpTag->npCurNode = mpTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+ }
+
+ // if head node && right most key, return eof
+ if( mpTag->npCurNode->ulBlockNo == (mpTag->ulRootPage / (xbUInt32) iBlockFactor) &&
+ mpTag->npCurNode->iCurKeyNo == eGetUInt32( mpTag->npCurNode->cpBlockData ))
+ return XB_EOF;
+
+ // move one to the right
+ mpTag->npCurNode->iCurKeyNo++;
+ if(( iRc = GetKeyPtr( vpTag, mpTag->npCurNode->iCurKeyNo, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+
+ if(( iRc = GetBlock( vpTag, (ulKeyPtr / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+
+ // traverse down the left side of the tree
+ while( !IsLeaf( vpTag, mpTag->npCurNode )) // go down the chain looking for a leaf node
+ {
+ if(( iRc = GetKeyPtr( vpTag, 0, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ if(( iRc = GetBlock( vpTag, (ulKeyPtr / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ }
+ // retrieve record to data buf
+ if( iRetrieveSw ){
+ if(( iRc = GetKeyPtr( vpTag, 0, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 170;
+ throw iRc;
+ }
+ } else {
+ return iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::GetNextKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Get the previous key for the given tag.
+/*!
+ \param vpTag Tag to retrieve previous key on.
+ \param iRetrieveSw xbTrue - Retrieve the record on success.<br>
+ xbFalse - Don't retrieve record.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::GetPrevKey( void * vpTag, xbInt16 iRetrieveSw ){
+
+ xbString s;
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ // convert the tag pointer to mdx tag pointer
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+
+ try{
+ if( !mpTag->npCurNode ){
+ return GetLastKey( 0, vpTag, iRetrieveSw );
+ }
+
+ xbUInt32 ulKeyPtr = 0;
+ // more keys on this assumed-leaf node?
+
+ if( mpTag->npCurNode->iCurKeyNo > 0 ){
+ mpTag->npCurNode->iCurKeyNo--;
+
+ if(( iRc = GetKeyPtr( vpTag, mpTag->npCurNode->iCurKeyNo, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ if( iRetrieveSw ){
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ } else {
+ return iRc;
+ }
+ } else {
+ return iRc;
+ }
+ }
+
+ //if head node = start node, at eof
+ if( mpTag->npCurNode->ulBlockNo == ( mpTag->ulRootPage / (xbUInt32) iBlockFactor ))
+ return XB_BOF;
+
+ // This logic assumes that interior nodes have n+1 left node no's where n is the number of keys in the node
+ xbIxNode * TempIxNode = mpTag->npCurNode;
+ mpTag->npCurNode = mpTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+
+ // While no more left keys && not head node, pop up one node
+ while( mpTag->npCurNode->iCurKeyNo == 0 &&
+ mpTag->npCurNode->ulBlockNo != ( mpTag->ulRootPage / (xbUInt32) iBlockFactor) ){
+ TempIxNode = mpTag->npCurNode;
+ mpTag->npCurNode = mpTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+ }
+
+ //if head node && left most key, return bof
+ if( mpTag->npCurNode->ulBlockNo == ( mpTag->ulRootPage / (xbUInt32) iBlockFactor) && mpTag->npCurNode->iCurKeyNo == 0 )
+ return XB_BOF;
+
+ // move one to the left
+ mpTag->npCurNode->iCurKeyNo--;
+ if(( iRc = GetKeyPtr( vpTag, mpTag->npCurNode->iCurKeyNo, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+
+ if(( iRc = GetBlock( vpTag, (ulKeyPtr / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+
+ // traverse down the right side of the tree
+ xbUInt32 ulNoOfKeys;
+ while( !IsLeaf( vpTag, mpTag->npCurNode )) // go down the chain looking for a leaf node
+ {
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ mpTag->npCurNode->iCurKeyNo = ulNoOfKeys;
+
+ if(( iRc = GetKeyPtr( vpTag, ulNoOfKeys, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ if(( iRc = GetBlock( vpTag, (ulKeyPtr / (xbUInt32) iBlockFactor), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ }
+
+ // ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ mpTag->npCurNode->iCurKeyNo = eGetUInt32( mpTag->npCurNode->cpBlockData ) - 1;
+
+ // retrieve record to data buf
+ if( iRetrieveSw ){
+ if(( iRc = GetKeyPtr( vpTag, mpTag->npCurNode->iCurKeyNo, mpTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 170;
+ throw iRc;
+ }
+ } else {
+ return iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::GetPrevKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief GetReuseEmptyNode swuitch setting.
+/*!
+ \returns xbFalse - Do not reuse empty MDX index nodes (Dbase 6. behavior).
+ xbTrue - Reuse empty MDX index nodes.
+*/
+
+xbBool xbIxMdx::GetReuseEmptyNodesSw() const {
+ return bReuseEmptyNodes;
+}
+/***********************************************************************/
+xbBool xbIxMdx::GetSortOrder( void *vpTag ) const {
+
+ // return true if descending
+ xbMdxTag *mTag = (xbMdxTag *) vpTag;
+ if( mTag->cKeyFmt2 & 0x08 )
+ return 0x01;
+ else
+ return 0x00;
+}
+
+/***********************************************************************/
+//! @brief Get tag for tag number.
+/*!
+ \param iTagNo - Zero based, which tag to retrieve.
+ \returns Pointer to mdx tag for a given tag number.
+*/
+
+void * xbIxMdx::GetTag( xbInt16 iTagNo ) const {
+
+ xbMdxTag *tt = mdxTagTbl;
+ xbInt16 i = 0;
+
+ while( i < iTagNo && tt->next ){
+ tt = tt->next;
+ i++;
+ }
+ if( i == iTagNo )
+ return (void *) tt;
+ else
+ return NULL;
+}
+
+/***********************************************************************/
+//! @brief Get tag for tag name.
+/*!
+ \sTagName - Tag name to retrieve.
+ \returns Pointer to mdx tag for a given tag number.
+*/
+
+void * xbIxMdx::GetTag( xbString &sTagName ) const {
+
+ xbMdxTag *tt = mdxTagTbl;
+
+ while( sTagName != tt->cTagName && tt->next ){
+ tt = tt->next;
+ }
+
+ if( sTagName == tt->cTagName )
+ return (void *) tt;
+ else
+ return NULL;
+}
+/***********************************************************************/
+xbInt16 xbIxMdx::GetTagCount() const {
+ return iTagUseCnt;
+}
+
+/***********************************************************************/
+void xbIxMdx::GetTagName( void *vpTag, xbString &sTagName ){
+
+ xbMdxTag *mpTag = (xbMdxTag *) vpTag;
+ sTagName = mpTag->sTagName->Str();
+}
+
+/***********************************************************************/
+//const char *xbIxMdx::GetTagName( void *vpTag, xbInt16 iOpt ) const {
+
+const char *xbIxMdx::GetTagName( void *vpTag, xbInt16 ) const {
+ xbMdxTag *mpTag = (xbMdxTag *) vpTag;
+ return mpTag->cTagName;
+}
+
+/***********************************************************************/
+xbString &xbIxMdx::GetTagName( void *vpTag ) const {
+
+ xbMdxTag *mpTag = (xbMdxTag *) vpTag;
+ return *mpTag->sTagName;
+}
+
+/***********************************************************************/
+void *xbIxMdx::GetTagTblPtr() const {
+ return (void *) mdxTagTbl;
+}
+
+/***********************************************************************/
+xbBool xbIxMdx::GetUnique( void *vpTag ) const {
+//! @brief Determine unique setting for given tag.
+/*!
+ \param vpTag Tag to retrieve expression from.
+ \returns xbTrue if unique key.
+*/
+ xbMdxTag *mTag = (xbMdxTag *) vpTag;
+ return mTag->cUnique;
+}
+
+/***********************************************************************/
+//! @brief Harvest Empty Node.
+/*!
+ Harvest empty MDX node and add it to the chain of link nodes
+
+ \param mpTag Tag to harvest.
+ \param iOpt - 0 Don't write the node info to disk, handled elsewhere (don't write it twice)
+ 1 Write the update into to disk
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxMdx::HarvestEmptyNode( xbMdxTag *mpTag, xbIxNode *npNode, xbInt16 iOpt, xbBool bHarvestRoot ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbBool bRootPage = xbFalse;
+ xbInt32 iOffset = 0;
+
+ try{
+
+// std::cout << "xbIxMdx::HarvestEmptyNode() page= " << BlockToPage( npNode->ulBlockNo );
+// std::cout << " block = " << npNode->ulBlockNo << "\n";
+
+ if( mpTag->ulRootPage == BlockToPage( npNode->ulBlockNo ) && !bHarvestRoot ){
+ bRootPage = xbTrue;
+
+// std::cout << "special root page processing *****************\n";
+ }
+
+ memset( npNode->cpBlockData, 0x00, GetBlockSize());
+
+ char *pTrg = npNode->cpBlockData;
+ if( !bRootPage ){
+ pTrg += 4;
+ ePutUInt32( pTrg, ulFirstFreePage );
+ }
+
+
+ if( bRootPage ){
+ if( mpTag->cHasKeys ){
+
+ // std::cout << "setting has keys\n";
+
+ mpTag->cHasKeys = 0x00;
+ if(( iRc = xbFseek( ((mpTag->ulTagHdrPageNo * 512) + 246), SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( &mpTag->cHasKeys, 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ // might need to update left sibling and right sibling here.
+ // Fields don't seem to be updated consistently by other xbase tools,
+ // for now, not updating
+
+ }
+
+ } else {
+
+ // update header
+ // seek to position byte 13
+ ulFirstFreePage = BlockToPage( npNode->ulBlockNo );
+ if(( iRc = xbFseek( 36, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ // write it
+ char c4[4];
+ ePutUInt32( c4, ulFirstFreePage );
+ if(( iRc = xbFwrite( c4, 4, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+
+ }
+
+ if( iOpt == 1 ){
+ if(( iRc = xbFseek( (xbInt64) ((npNode->ulBlockNo * GetBlockSize() )) + iOffset, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ // write out the block
+ if(( iRc = xbFwrite( npNode->cpBlockData, GetBlockSize(), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ }
+ }
+
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::HarvestEmptyNodeI() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+
+
+/***********************************************************************/
+//! @brief Harvest Tag Nodes.
+/*!
+ Save all nodes for a given tag into the free node chain.
+ Used for reindexing or deleting a given tag.
+
+ \param mpTag Tag for harvesting nodes
+ \param bHarvestRoot Set to True when deleting tag
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::HarvestTagNodes( xbMdxTag *mpTag, xbBool bHarvestRoot ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ xbUInt32 ulBlkNo;
+ xbLinkListOrd<xbUInt32> ll;
+ xbLinkListNode<xbUInt32> * llN;
+ xbIxNode * n;
+
+ try{
+
+ ll.SetDupKeys( xbFalse );
+
+ // clear out any history
+ if( mpTag->npNodeChain ){
+ mpTag->npNodeChain = FreeNodeChain( mpTag->npNodeChain );
+ mpTag->npCurNode = NULL;
+ }
+
+ while( GetNextKey( mpTag, 0 ) == 0 ){
+ n = mpTag->npNodeChain;
+ while(n){
+ ll.InsertKey( n->ulBlockNo, (xbUInt32) n->iCurKeyNo );
+ n = n->npNext;
+ }
+ }
+
+ if( bHarvestRoot )
+ ll.InsertKey( PageToBlock( mpTag->ulTagHdrPageNo ), 0 );
+
+ llN = ll.GetHeadNode();
+ if(( n = xbIx::AllocateIxNode( GetBlockSize())) == NULL ){
+ iErrorStop = 100;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ while( llN ){
+ ulBlkNo = llN->GetKey();
+
+ // read in a block for the block number
+ if(( iRc = ReadBlock( ulBlkNo, GetBlockSize(), n->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ // harvest it
+ n->ulBlockNo = ulBlkNo;
+ if(( iRc = HarvestEmptyNode( mpTag, n, 1, bHarvestRoot )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ llN = llN->GetNextNode();
+ }
+ n = FreeNodeChain( n );
+ mpTag->npNodeChain = FreeNodeChain( mpTag->npNodeChain );
+ mpTag->npCurNode = NULL;
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::HarvestTagNodes() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Insert key into interior node.
+/*!
+ Insert key into non-full interior node.<br>
+ Assumes valid inputs
+
+ \param vpTag Tag in play.
+ \param npNode Node for insertion.
+ \param iSlotNo Slot number to insert key.
+ \param ulPtr Page number to insert.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::InsertNodeI( void *vpTag, xbIxNode *npNode, xbInt16 iSlotNo, xbUInt32 ulPtr ){
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char *pNewKeyPos;
+ char *pTrg;
+ char *pLastKey = NULL;
+ xbMdxTag * npTag;
+ npTag = (xbMdxTag *) vpTag;
+ xbInt16 iCopyLen;
+ xbInt16 iNewKeyPos = 8;
+
+
+ try{
+
+ xbInt32 lKeyCnt = GetKeyCount( npNode );
+ iNewKeyPos += (iSlotNo * npTag->iKeyItemLen);
+ char *pSrc = npNode->cpBlockData;
+
+ if( iSlotNo < lKeyCnt )
+ iCopyLen = ((lKeyCnt - iSlotNo) * npTag->iKeyItemLen) + 4;
+ else
+ iCopyLen = 0;
+
+ xbUInt32 ulRqdBufSize = (xbUInt32) ((lKeyCnt + 1) * npTag->iKeyItemLen) + 12;
+ if( ulRqdBufSize > npNode->ulBufSize ){
+ npNode->ulBufSize += (xbUInt32) npTag->iKeyItemLen;
+ npNode->cpBlockData = (char *) realloc( npNode->cpBlockData, (size_t) npNode->ulBufSize );
+ if( !npNode->cpBlockData ){
+ iErrorStop = 100;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ }
+
+ // if not appending to the end of the node, make some room, move things to the right
+ pNewKeyPos = npNode->cpBlockData;
+ pNewKeyPos += iNewKeyPos;
+
+ if( iSlotNo < lKeyCnt ){
+ pTrg = pNewKeyPos;
+ pTrg += npTag->iKeyItemLen;
+ memmove( pTrg, pNewKeyPos, (size_t) iCopyLen );
+ }
+
+ // get the right most key for the left part of the split node
+ xbUInt32 ulKeyPtr2;
+ if(( iRc = GetKeyPtr( vpTag, npNode->iCurKeyNo, npNode, ulKeyPtr2 )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ // get the new right key value for the freshly split node
+ pLastKey = (char *) malloc((size_t) npTag->iKeyLen);
+ if(( iRc = GetLastKeyForBlockNo( vpTag, PageToBlock( ulKeyPtr2 ), pLastKey )) != XB_NO_ERROR ){
+ iRc = 120;
+ throw iRc;
+ }
+
+ // write the key values
+ pTrg = pNewKeyPos;
+ pTrg += 4;
+ pSrc = pLastKey;
+ for( xbInt16 i = 0; i < npTag->iKeyLen; i++ )
+ *pTrg++ = *pSrc++;
+ ePutUInt32( pTrg, ulPtr);
+ ePutInt32( npNode->cpBlockData, ++lKeyCnt );
+
+ // write out the updated block to disk
+ if(( iRc = WriteBlock( npNode->ulBlockNo, GetBlockSize(), npNode->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ if( pLastKey )
+ free( pLastKey );
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::InsertNodeI() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( pLastKey )
+ free( pLastKey );
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Insert key into leaf node.
+/*!
+ Insert key into non-full leaf node.<br>
+ Assumes valid inputs
+
+ \param vpTag Tag in play.
+ \param npNode Node for insertion.
+ \param iSlotNo Slot number to insert key.
+ \param ulPtr Pointer number to insert.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxMdx::InsertNodeL( void *vpTag, xbIxNode *npNode, xbInt16 iSlotNo, char * cpKeyBuf, xbUInt32 ulPtr ){
+
+ // format of block data is
+ // 4 bytes number of keys on block
+ // 4 bytes - next free block or split block num
+ // repeating
+ // 4 bytes record number
+ // x bytes key data
+
+ // Special processing note: when splitting node, new key is first inserted into full left node before
+ // the node is split. This routine will make additional room in the buffer for that scenario
+
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char *pNewKeyPos; // pointer to position in record for new key composite
+ char *pTrg;
+
+ xbInt16 iNewKeyPos = 8; // position in data block where new key begins.
+ // is the position of the record number, where the fmt is
+ // [four byte rec number][actual key data] repeats
+
+ xbMdxTag * npTag = (xbMdxTag *) vpTag;
+ xbInt16 iCopyLen;
+
+ try{
+ xbInt32 lKeyCnt = GetKeyCount( npNode );
+
+// std::cout << "InsertNodeL Keycount = " << lKeyCnt << "\n";
+// next line is correct, this aligns with db7
+// "4" is the four byte record number stored to the left of the key
+// xbInt16 iKeyPos = 4 + iSlotNo * npTag->iKeyItemLen;
+
+ iNewKeyPos += (iSlotNo * npTag->iKeyItemLen);
+
+ // length of number of keys that need to be moved to the right
+ if( iSlotNo < lKeyCnt )
+ iCopyLen = (lKeyCnt - iSlotNo) * npTag->iKeyItemLen;
+ else
+ iCopyLen = 0;
+
+ // +8 is to include the first two 4 byte fields in the block
+ // xbUInt32 ulRqdBufSize = (xbUInt32) (iKeyPos + (npTag->iKeyItemLen * 2) + iCopyLen + 8);
+ xbUInt32 ulRqdBufSize = (xbUInt32) ((lKeyCnt + 1) * npTag->iKeyItemLen) + 8;
+
+/*
+ std::cout << "InsertNodeL CopyLen = " << iCopyLen << "\n";
+ std::cout << "InsertNodeL iNewKeyPos = " << iNewKeyPos << "\n";
+ std::cout << "InsertNodeL SlotNo = " << iSlotNo << "\n";
+ std::cout << "InsertNodeL lKeyCnt = " << lKeyCnt << "\n";
+ std::cout << "InsertNodeL node buf size = " << npNode->ulBufSize << "\n";
+ std::cout << "InsertNodeL key item len = " << npTag->iKeyItemLen << "\n";
+ std::cout << "InsertNodeL key len = " << npTag->iKeyLen << "\n";
+ std::cout << "required buf size = " << ulRqdBufSize << "\n";
+ std::cout << "InsertNodeL key buf strlen = " << strlen( npTag->cpKeyBuf ) << "\n";
+*/
+
+ if( ulRqdBufSize > npNode->ulBufSize ){
+ npNode->ulBufSize += (xbUInt32) npTag->iKeyItemLen;
+ npNode->cpBlockData = (char *) realloc( npNode->cpBlockData, (size_t) npNode->ulBufSize );
+ if( !npNode->cpBlockData ){
+ iErrorStop = 100;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ }
+
+ // if not appending to end, move things right
+
+ pNewKeyPos = npNode->cpBlockData;
+ pNewKeyPos += iNewKeyPos;
+
+ if( iSlotNo < lKeyCnt ) {
+ // pKeyPos = npNode->cpBlockData;
+ // pKeyPos += iKeyPos;
+ // pKeyPos += iNewKeyPos;
+ // pTrg = pKeyPos;
+ pTrg = pNewKeyPos;
+ pTrg += npTag->iKeyItemLen;
+ memmove( pTrg, pNewKeyPos, (size_t) iCopyLen );
+
+ }
+
+ // write rec number
+ ePutUInt32( pNewKeyPos, ulPtr );
+
+ // write the key value
+ pTrg = pNewKeyPos;
+ pTrg += 4;
+ char * pSrc = cpKeyBuf;
+ for( xbInt16 i = 0; i < npTag->iKeyLen; i++ )
+ *pTrg++ = *pSrc++;
+
+ // update number of keys on the node
+ ePutInt32( npNode->cpBlockData, ++lKeyCnt );
+// std::cout << "lKeyCntA = " << GetKeyCount( npNode ) << "\n";
+
+
+ // determine length of node, zap everything to the right of it
+ xbUInt32 iStartPos = 8 + ((xbUInt32) lKeyCnt * (xbUInt32) npTag->iKeyItemLen );
+ xbUInt32 iClearLen = npNode->ulBufSize - iStartPos;
+
+// std::cout << "InsertNodeL SP = " << iStartPos << " clear len = " << iClearLen << " ulBufsize = " << npNode->ulBufSize << "\n";
+ char *p = npNode->cpBlockData;
+ p += iStartPos;
+ memset( p, 0x00, iClearLen );
+
+ // write out the updated block to disk
+ if(( iRc = WriteBlock( npNode->ulBlockNo, GetBlockSize(), npNode->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+// std::cout << "lKeyCntB = " << GetKeyCount( npNode ) << "\n";
+
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::InsertNodeL() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+inline xbBool xbIxMdx::IsLeaf( void *vpTag, xbIxNode *npNode ) const{
+
+ // for performance reasons, does no data checking
+ // will result in potentially hard to find segfaults if passing invalid npNode
+
+ xbMdxTag *mTag = (xbMdxTag *) vpTag;
+ char *p = npNode->cpBlockData;
+
+ xbInt32 lNoOfKeys = eGetInt32( p );
+ // mdx interior nodes have a sibling number to the right of the right most key in the node
+ p+=8;
+ p+= mTag->iKeyItemLen * lNoOfKeys;
+
+ // printf( "IsLeaf p = [%d] b1 = [%x] keylen = [%d]\n", eGetUInt32( p ), *p, mTag->iKeyItemLen );
+
+ if( eGetUInt32( p ) == 0 ){
+ // std::cout << "leaf node\n";
+ return true;
+ } else {
+ // std::cout << "interior node\n";
+ return false;
+ }
+}
+
+/***********************************************************************/
+xbInt16 xbIxMdx::KeyExists( void * vpTag )
+{
+ // this method assumes the key has already been built
+
+ xbMdxTag *mpTag = (xbMdxTag *) vpTag;
+ xbInt16 iRc = FindKey( vpTag, mpTag->cpKeyBuf, mpTag->iKeyLen, 0 );
+
+ // iRc == 0 ? return 1 : return 0;
+
+ if( iRc == 0 )
+ return 1;
+ else
+ return 0;
+
+}
+
+/***********************************************************************/
+//! @brief Set position for key add.
+/*!
+ This routine is called by the AddKey() method and is used to position
+ the node chain to the position the new key should be added to the index.
+
+ \param npTag Pointer to npTag.
+ \param ulAddRecNo Record number to add.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxMdx::KeySetPosAdd( xbMdxTag *mpTag, xbUInt32 ulAddRecNo ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ iRc = FindKey( mpTag, mpTag->cpKeyBuf, mpTag->iKeyLen, 0 );
+ if( iRc == XB_NOT_FOUND || iRc == XB_EMPTY )
+ return XB_NO_ERROR; // good position
+ else if( iRc != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ // get here if key was found, get the right most instance of any non unique key for append, find correct spot for update
+ if( GetUnique( mpTag ) == 0 ){
+
+ xbUInt32 ulCurRecNo;
+ if(( iRc = GetDbfPtr( mpTag, mpTag->npCurNode->iCurKeyNo, mpTag->npCurNode, ulCurRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ xbBool bKeysMatch = xbTrue;
+
+ while( bKeysMatch && ulAddRecNo > ulCurRecNo && iRc == XB_NO_ERROR ){
+ if(( iRc = GetNextKey( mpTag, 0 )) == XB_NO_ERROR ){
+ if( memcmp( GetKeyData( mpTag->npCurNode, mpTag->npCurNode->iCurKeyNo, mpTag->iKeyItemLen ), mpTag->cpKeyBuf, (size_t) mpTag->iKeyLen ))
+ bKeysMatch = xbFalse;
+ else{
+ if(( iRc = GetDbfPtr( mpTag, mpTag->npCurNode->iCurKeyNo, mpTag->npCurNode, ulCurRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ }
+ }
+ }
+ }
+ if( iRc == XB_EOF ){ // eof condition
+ if(( iRc = GetLastKey( 0, mpTag, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ mpTag->npCurNode->iCurKeyNo++;
+ return XB_NO_ERROR;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::KeySetPosAdd() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Set position for key delete.
+/*!
+ This routine is called by the DeleteKey() method and is used to position
+ the node chain to the position the old key should be deleted from the index.
+
+ \param npTag Pointer to npTag.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::KeySetPosDel( xbMdxTag *npTag ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbString sMsg;
+
+ try{
+
+ iRc = FindKey( npTag, npTag->cpKeyBuf2, npTag->iKeyLen, 0 );
+ if( iRc == XB_NOT_FOUND || iRc == XB_EMPTY )
+ return XB_NO_ERROR; // good pos ition
+ else if( iRc != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ xbUInt32 ulIxRecNo;
+ if(( iRc = GetDbfPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulIxRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ if( ulIxRecNo == dbf->GetCurRecNo())
+ return XB_NO_ERROR;
+
+ if( GetUnique( npTag ) == 1 ){
+ iErrorStop = 120;
+ iRc = XB_NOT_FOUND;
+ throw iRc;
+ }
+
+ xbBool bFound = xbFalse;
+ xbBool bKeysMatch = xbTrue;
+ while( bKeysMatch && !bFound && iRc == XB_NO_ERROR ){
+
+ if(( iRc = GetNextKey( npTag, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ if( memcmp( GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->iKeyItemLen ), npTag->cpKeyBuf2, (size_t) npTag->iKeyLen )){
+ bKeysMatch = xbFalse;
+ } else {
+ if(( iRc = GetDbfPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulIxRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ if( ulIxRecNo == dbf->GetCurRecNo())
+ bFound = xbTrue;
+ }
+ }
+
+ if( bFound )
+ return XB_NO_ERROR;
+ else
+ return XB_NOT_FOUND;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::KeySetPosDel() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Returns key update status.
+/*!
+ \param vpTag Tag to check status on.
+ \returns xbtrue - Key was updated.<br>xbFalse - Key not updated.
+*/
+/*
+inline xbBool xbIxMdx::KeyFiltered( void *vpTag ) const{
+
+ xbMdxTag *mpTag = (xbMdxTag *) vpTag;
+ return mpTag->bKeyFiltered;
+}
+*/
+/***********************************************************************/
+xbInt16 xbIxMdx::LoadTagDetail( xbInt16 iOption, xbMdxTag *tte ){
+
+ // option 1 - Load the entire tag detail
+ // option 2 - Load the dynamic variables only
+
+ // std::cout << "LoadTagDetail() iOption = " << iOption << "\n";
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ size_t iReadSize;
+ char *buf = NULL;
+ char *p;
+
+ try{
+ // set the read length based on the option
+ if( iOption == 1 )
+ iReadSize = 1024;
+
+ else if( iOption == 2 )
+ // iReadSize = 4;
+ iReadSize = 260;
+ else{
+ iRc = XB_INVALID_OPTION;
+ iErrorStop = 100;
+ throw iRc;
+ }
+ if(( buf = (char *) calloc( 1, (size_t) iReadSize )) == NULL ){
+ iErrorStop = 110;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ if(( iRc = ReadBlock( tte->ulTagHdrPageNo,(xbUInt32) (GetBlockSize() / (xbUInt16) iBlockFactor),
+ iReadSize, buf )) != XB_NO_ERROR ){
+ free( buf );
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ p = buf;
+ tte->ulRootPage = eGetUInt32( p );
+
+ if( iOption == 1 ){
+ p+=4;
+ tte->ulTagSize = eGetUInt32( p );
+ p+=4;
+ tte->cKeyFmt2 = *p;
+ p++;
+ tte->cKeyType2 = *p;
+ p+=3;
+ tte->iKeyLen = eGetInt16( p );
+ p+=2;
+ tte->iKeysPerBlock = *p;
+ p+=2;
+ tte->iSecKeyType = eGetInt16( p );
+ p+=2;
+ tte->iKeyItemLen = eGetInt16( p );
+ p+=2;
+ tte->cSerialNo = *p;
+ p+=3;
+ tte->cUnique = *p;
+ p++;
+
+ // next line assumes expression is a null terminated string in the block
+ tte->sKeyExp = new xbString();
+ tte->sKeyExp->Sprintf( "%s", p );
+
+ p+=221;
+ tte->cHasFilter = *p;
+ p+=1;
+ tte->cHasKeys = *p;
+ p+=2;
+ tte->ulLeftChild = eGetUInt32( p );
+ p+=4;
+ tte->ulRightChild = eGetUInt32( p );
+ p+=5;
+ tte->cTagYY = *p;
+ p++;
+ tte->cTagMM = *p;
+ p++;
+ tte->cTagDD = *p;
+ // p+=223;
+
+ p+=221;
+ tte->cKeyFmt3 = *p;
+
+//for( int i = 0; i < 5; i++ )
+// printf( "%d [%x]\n", i, *p++ );
+// p+=2;
+
+ if( tte->cHasFilter ){
+ p+=282;
+ tte->sFiltExp = new xbString();
+ tte->sFiltExp->Sprintf( "%s", p );
+ tte->filter = new xbExp( xbase, dbf );
+ if(( iRc = tte->filter->ParseExpression( tte->sFiltExp->Str())) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ }
+ tte->npNodeChain = NULL;
+ tte->npCurNode = NULL;
+ tte->cpKeyBuf = (char *) malloc( (size_t) tte->iKeyLen + 1 );
+ tte->cpKeyBuf2 = (char *) malloc( (size_t) tte->iKeyLen + 1 );
+ tte->exp = new xbExp( xbase, dbf );
+ if(( iRc = tte->exp->ParseExpression( tte->sKeyExp->Str() )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ } else if( iOption == 2 ){
+ // refresh the dynamic tag variables
+ p+=4;
+ tte->ulTagSize = eGetUInt32( p );
+ p+= 16;
+ tte->cSerialNo = *p;
+ p+= 226;
+ tte->cHasKeys = *p;
+ p+=2;
+ tte->ulLeftChild = eGetUInt32( p );
+ p+=4;
+ tte->ulRightChild = eGetUInt32( p );
+ p+=5;
+ tte->cTagYY = *p;
+ p++;
+ tte->cTagMM = *p;
+ p++;
+ tte->cTagDD = *p;
+ }
+ if( buf )
+ free( buf );
+
+ }
+ catch (xbInt16 iRc ){
+ if( buf )
+ free( buf );
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::LoadTagDetail() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+xbInt16 xbIxMdx::LoadTagTable()
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char * buf = NULL;
+
+ //std::cout << "xbIxMdx::LoadTagTable() tag use cnt = " << iTagUseCnt << "\n";
+
+ try{
+
+ if( iTagUseCnt > 46 ){
+ iErrorStop = 100;
+ iRc = XB_INVALID_INDEX;
+ throw iRc;
+ }
+
+ xbInt16 iBufSize = (xbInt16) iTagLen * iTagUseCnt;
+
+ if(( buf = (char *) malloc( (size_t) iBufSize )) == NULL ){
+ iErrorStop = 110;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ if(( iRc = xbFseek( 544, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+
+ if(( iRc = xbFread( buf, (size_t) iBufSize, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+
+ xbInt16 iPos;
+ char *p;
+ xbMdxTag *tte;
+ xbMdxTag *ttel = NULL;
+
+ for( xbInt16 i = 0; i < iTagUseCnt; i++ ){
+ iPos = i * iTagLen;
+ p = buf + iPos;
+
+ if(( tte = (xbMdxTag *) calloc( 1, (size_t) sizeof( xbMdxTag ))) == NULL ){
+ iErrorStop = 140;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+
+ // set the current tag to the first tag in the table
+ if( !vpCurTag )
+ xbIx::SetCurTag( (void *) tte );
+
+ if( mdxTagTbl )
+ ttel->next = tte;
+ else
+ mdxTagTbl = tte;
+ // tte->sKeyExp = new xbString();
+
+ ttel = tte;
+ tte->next = NULL;
+ tte->ulTagHdrPageNo = eGetUInt32( p );
+
+ p += 4;
+ for( xbUInt32 i = 0; i < 11; i ++ )
+ tte->cTagName[i] = *p++;
+
+ tte->cTagName[11] = 0x00;
+ tte->cKeyFmt = *p++;
+ tte->cLeftChild = *p++;
+ tte->cRightChild = *p++;
+ tte->cParent = *p++;
+ tte->c2 = *p++;
+ tte->cKeyType = *p;
+ tte->sTagName = new xbString();
+ tte->sTagName->Set( tte->cTagName );
+ tte->sTagName->Trim();
+
+ if(( iRc = LoadTagDetail( 1, tte )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ }
+ if( buf )
+ free( buf );
+ }
+ catch (xbInt16 iRc ){
+ if( buf )
+ free( buf );
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::LoadTagTable() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ if( iErrorStop == 100 ){
+ sMsg.Sprintf( "xbIxMdx::LoadTagTable() Invalid Tag Count: %d", iTagUseCnt );
+ xbase->WriteLogMessage( sMsg.Str());
+ }
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/**************************************************************************************************************/
+//! @brief Calculate the block number for a given page.
+/*!
+ This routine is called by any function needing to calculate the block number for a given page.
+ Page numbers are stored internally in the physical file, and the library reads and writes in
+ blocks of one or more pages.
+
+ Assumes valid data input
+
+ \param ulPageNo Page Number
+ \returns Calculated block number.
+*/
+
+inline xbUInt32 xbIxMdx::PageToBlock( xbUInt32 ulPageNo ){
+ return ulPageNo / (xbUInt32) iBlockFactor;
+}
+
+
+
+/**************************************************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+xbInt16 xbIxMdx::PrintKey( void *vpTag, xbIxNode *npNode, xbInt16 iKeyNo, xbInt16 iDepth, char cType, xbInt16 iOutputOpt ){
+
+ xbString sPre;
+ sPre.Sprintf( "%c ", cType );
+ for( xbInt16 i = 0; i < iDepth; i++ )
+ sPre += "|";
+
+ xbString sPost;
+ sPost.Sprintf( "\tThisBlock=[%ld] KeyNo=[%d] Depth=[%d]", npNode->ulBlockNo, iKeyNo, iDepth );
+
+ xbMdxTag * mpTag = (xbMdxTag *) vpTag;
+ char *p = npNode->cpBlockData + (8 + (iKeyNo * mpTag->iKeyItemLen ));
+
+ xbString sKeyPtr;
+ xbUInt32 ulNoOfKeys = 0;
+ if( cType == 'I' ) { // interior
+ sKeyPtr.Sprintf( " ptr=[%ld]", eGetUInt32( p ));
+ ulNoOfKeys = eGetUInt32( mpTag->npCurNode->cpBlockData );
+ }
+ else if( cType == 'L' ) // leaf
+ sKeyPtr.Sprintf( " rec=[%ld]", eGetUInt32( p ));
+ p += 4;
+
+ xbString s;
+ if(( cType == 'I' && iKeyNo < (xbInt16) ulNoOfKeys) || cType == 'L' ){
+ if( mpTag->cKeyType2 == 'C' ){ //CHAR
+ for( xbInt32 l = 0; l < (mpTag->iKeyItemLen-4); l++ )
+ s += *p++;
+
+ } else if( mpTag->cKeyType2 == 'N' ){ // NUMERIC
+ xbBcd bcd( p );
+ xbString s2;
+ bcd.ToString( s2 );
+ s += s2;
+
+ } else if( mpTag->cKeyType2 == 'D' ){ // DATE
+ xbInt32 lDate = (xbInt32) eGetDouble( p );
+ xbDate d( lDate );
+ //xbString s2;
+ //d.JulToDate8( lDate, s2 );
+ s.Sprintf( "%s%s", s.Str(), d.Str());
+ }
+ } else {
+ s = "Rightmost InteriorNode Pointer";
+ }
+
+ xbString sOut( sPre );
+ sOut += s;
+ sOut += sPost;
+ sOut += sKeyPtr;
+
+ xbase->WriteLogMessage( sOut, iOutputOpt );
+ return XB_NO_ERROR;
+}
+#endif
+
+/***********************************************************************/
+//! @brief ReadHeadBlock.
+/*!
+ Read values off head block in MDX file
+ \param iOpt 0 - Read entire block, initialize as needed.<br>
+ 1 - Read in only dynamic section of block<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+*/
+
+xbInt16 xbIxMdx::ReadHeadBlock( xbInt16 iOpt )
+{
+
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+// std::cout << "ReadHeadBlock() option = " << iOpt << "\n";
+
+ try{
+ if( !FileIsOpen()){
+ iRc = XB_NOT_OPEN;
+ iErrorStop = 100;
+ throw iRc;
+ }
+ char sBuf[48];
+ memset( sBuf, 0x00, 48 );
+
+ if( iOpt == 0 ){
+ if(( iRc = xbFseek( 0, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ if(( iRc = xbFread( sBuf, 47, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ } else {
+
+ if(( iRc = xbFseek( 28, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+
+ if(( iRc = xbFread( sBuf, 19, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ }
+
+ char *p = sBuf;
+ if( iOpt == 0 ){
+ cVersion = *p++;
+ cCreateYY = *p++;
+ cCreateMM = *p++;
+ cCreateDD = *p++;
+ sFileName.Assign( p, 1, 16 );
+ p+=16;
+ iBlockFactor = eGetInt16( p );
+ p+=2;
+ SetBlockSize( (xbUInt32) eGetInt16( p ));
+ p+=2;
+ cProdIxFlag = *p++;
+ cTagEntryCnt = *p++;
+ iTagLen = *p;
+ p+=2;
+
+ iTagUseCnt = eGetInt16( p );
+ //lTagUseCnt = eGetInt32( p );
+ //p+=4;
+ p+=2;
+ cNextTag = *p++;
+ c1B = *p++;
+
+ ulPageCnt = eGetUInt32( p );
+ p+=4;
+ ulFirstFreePage = eGetUInt32( p );
+ p+=4;
+ ulNoOfBlockAvail = eGetUInt32( p );
+ p+=4;
+ cUpdateYY = *p++;
+ cUpdateMM = *p++;
+ cUpdateDD = *p;
+
+ if( cNodeBuf )
+ free( cNodeBuf );
+
+ if(( cNodeBuf = (char *) malloc( (size_t) GetBlockSize())) == NULL ){
+ iErrorStop = 40;
+ throw XB_NO_MEMORY;
+ }
+
+ if(( iRc = xbIxMdx::LoadTagTable()) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+
+ } else {
+ iTagUseCnt = eGetInt16( p );
+ p+=4;
+ ulPageCnt = eGetUInt32( p );
+ p+=4;
+ ulFirstFreePage = eGetUInt32( p );
+ p+=4;
+ ulNoOfBlockAvail = eGetUInt32( p );
+ p+=4;
+ cUpdateYY = *p++;
+ cUpdateMM = *p++;
+ cUpdateDD = *p;
+ }
+
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::ReadHeadBlock() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( cNodeBuf )
+ free( cNodeBuf );
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Reindex
+/*!
+ Reindex specifed tag or all tags
+ \param **vpTag &tag - Tag to reindex.<br>
+ NULL - Reindex all tags<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+
+ If this method fails, the index is left in an undefined state
+
+*/
+
+xbInt16 xbIxMdx::Reindex( void **vpTag ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbMdxTag * mpTag;
+ #ifdef XB_LOCKING_SUPPORT
+ xbInt16 iAutoLock = 0;
+ #endif
+
+ if( vpTag )
+ mpTag = (xbMdxTag *) *vpTag;
+ else
+ mpTag = NULL;
+
+ struct tagInfo{
+ xbBool bUnique;
+ xbBool bDesc;
+ char sTagName[11];
+ xbString *sKeyExp;
+ xbString *sFiltExp;
+ tagInfo *next;
+ };
+ tagInfo *ti = NULL;
+
+ try{
+
+ #ifdef XB_LOCKING_SUPPORT
+ iAutoLock = dbf->GetAutoLock();
+ if( iAutoLock && !dbf->GetTableLocked() ){
+ if(( iRc = dbf->LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+ #endif
+
+ if( mpTag == NULL ){
+ // do all tags
+ xbMdxTag *tt = mdxTagTbl;
+ tagInfo *pHead = NULL;
+ tagInfo *pEnd = NULL;
+
+ if( tt ){
+ while( tt ){
+ ti = (tagInfo *) calloc( 1, sizeof( tagInfo ));
+ ti->bUnique = tt->cUnique ? 1 : 0;
+ ti->bDesc = (((tt->cKeyFmt2 & 0x08) > 0) ? 1 : 0);
+ memcpy( ti->sTagName, tt->cTagName, 11 );
+ ti->sKeyExp = new xbString( tt->sKeyExp->Str());
+ if( tt->cHasFilter )
+ ti->sFiltExp = new xbString( tt->sFiltExp->Str());
+ else
+ ti->sFiltExp = new xbString( "" );
+ if( !pHead )
+ pHead = ti;
+ else
+ pEnd->next = ti;
+ pEnd = ti;
+ tt = tt->next;
+ }
+ }
+
+ // get the file name and save it
+ xbString sMdxFileName = GetFqFileName();
+
+ // close the mdx file
+ if(( iRc = xbIxMdx::Close()) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ // delete the file
+ xbRemove();
+
+ // init variables
+ Init();
+
+ tagInfo *p = pHead;
+ tagInfo *pDel;
+
+ // create new file & add the tags
+ while( p ){
+
+ //std::cout << "Reindex() linked list extract\n";
+ //std::cout << "Tag Name = [" << p->sTagName << "]\n";
+ //std::cout << "Key Exp = [" << p->sKeyExp->Str() << "]\n";
+ //std::cout << "Filt Exp = [" << p->sFiltExp->Str() << "]\n";
+ //std::cout << "bDesc = [" << p->bDesc << "]\n";
+ //std::cout << "bUnique = [" << p->bUnique << "]\n";
+
+ if(( iRc = CreateTag( p->sTagName, p->sKeyExp->Str(), p->sFiltExp->Str(), p->bDesc, p->bUnique, xbTrue, vpTag )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ delete p->sKeyExp;
+ delete p->sFiltExp;
+ pDel = p;
+ p = p->next;
+ free( pDel );
+ }
+ } else {
+ if(( iRc = HarvestTagNodes( mpTag )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ }
+
+ xbUInt32 ulRecCnt = 0;
+ if(( iRc = dbf->GetRecordCnt( ulRecCnt )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ xbInt16 iCurTag = 0;
+ xbBool bDone = xbFalse;
+
+ for( xbUInt32 ulRec = 1; ulRec <= ulRecCnt; ulRec++ ){
+ if(( iRc = dbf->GetRecord( ulRec )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+
+ bDone = xbFalse;
+ iCurTag = 0;
+ if( !vpTag )
+ mpTag = (xbMdxTag *) GetTag( iCurTag++ );
+
+ while( !bDone ){
+ // do the tag things
+ // CreateKey
+ if(( iRc = CreateKey( mpTag, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+ if( mpTag->iKeySts == XB_ADD_KEY ){
+ if( mpTag->cUnique ){
+ if(( iRc = CheckForDupKey( mpTag )) != XB_NO_ERROR ){
+ iErrorStop = 170;
+ throw iRc;
+ }
+ }
+ if(( iRc = AddKey( mpTag, ulRec )) != XB_NO_ERROR ){
+ iErrorStop = 180;
+ throw iRc;
+ }
+ }
+ if( vpTag || iCurTag >= GetTagCount())
+ bDone = xbTrue;
+ else
+ mpTag = (xbMdxTag *) GetTag( iCurTag++ );
+ }
+ }
+
+ // unlock as necessary
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && dbf->GetTableLocked() ){
+ if(( iRc = dbf->LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 190;
+ throw iRc;
+ }
+ }
+ #endif
+
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::ReIndex() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+
+ // unlock as necessary
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && dbf->GetTableLocked() ){
+ dbf->LockTable( XB_UNLOCK );
+ }
+ #endif
+ }
+ return iRc;
+
+}
+
+/***********************************************************************/
+xbInt16 xbIxMdx::SetCurTag( xbString &sTagName ) {
+
+ xbMdxTag *tt = (xbMdxTag *) GetTag( sTagName );
+ if( tt ){
+ xbIx::SetCurTag((void *) tt );
+ return XB_NO_ERROR;
+ } else
+ return XB_INVALID_TAG;
+}
+
+/***********************************************************************/
+xbInt16 xbIxMdx::SetCurTag( xbInt16 iTagNo ) {
+
+ xbMdxTag *tt = (xbMdxTag *) GetTag( iTagNo );
+ if( tt ){
+ xbIx::SetCurTag((void *) tt );
+ return XB_NO_ERROR;
+ } else
+ return XB_INVALID_TAG;
+}
+
+/***********************************************************************/
+//! @brief SetReuseEmptyNode switch setting.
+/*!
+ \param bEmptyNodeSw xbFalse - Do not reuse empty MDX index nodes (Dbase 6. behavior).
+ xbTrue - Reuse empty MDX index nodes.
+*/
+
+void xbIxMdx::SetReuseEmptyNodesSw( xbBool bEmptyNodesSw ) {
+ bReuseEmptyNodes = bEmptyNodesSw;
+}
+
+/***********************************************************************/
+//! @brief Set Tag Pointer.
+/*!
+ Set binary tree pointer value. The MDX tags are stored with binary
+ tree positions. This routine sets the value in memory.
+ \param cPtr L - Left child.<br>
+ R - Right child.<br>
+ P - Parent.
+ \param iWhich - Which tag to update
+ \param cVal - Value to set.
+ \returns void
+*/
+
+/*
+void xbIxMdx::SetTagPtr( char cPtr, xbInt16 iWhich, char cVal ){
+
+ xbMdxTag *mpTag = (xbMdxTag *) GetTag( iWhich );
+ if( mpTag ){
+ switch( cPtr ){
+ case 'L':
+ mpTag->cLeftChild = cVal;
+ break;
+ case 'R':
+ mpTag->cRightChild = cVal;
+ break;
+ case 'P':
+ mpTag->cParent = cVal;
+ break;
+ }
+ }
+}
+*/
+
+/***********************************************************************/
+//! @brief Split an interior node
+/*!
+
+ This routine splits an interior node into two nodes, divided by dSplitFactor.<br>
+ This behaves differently than V7 Dbase. V7 does not balance the nodes.<br>
+ For V7, if adding a key to the end of a node, it will create a right node
+ with only one key, and the left node is still full.<br><br>
+
+ Possible performance improvement options.<br>
+ Two modes when splitting:<br>
+ a) Split nodes in the middle - good for random access applications<br>
+ b) Split off right node with only one key - good for applications with
+ expectation of ascending keys added moving forward.<br>
+
+ This routine first inserts the key into the left node in the appropriate location
+ then splits the node based on the split factor setting.
+
+ \param vpTag Tag in play.
+ \param npLeft Left node to split.
+ \param npRight Right node to split.
+ \param iSlotNo Slot number for split.
+ \param ulPtr Pointer number to insert.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::SplitNodeI( void *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 ulPtr ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbMdxTag * npTag = (xbMdxTag *) vpTag;
+ xbDouble dSplitFactor = .5; // split the nodes 50/50
+ xbInt16 iLen;
+ char *pSrc;
+ char *pTrg;
+
+
+ try{
+ xbInt32 lKeyCnt = GetKeyCount( npLeft );
+ xbInt32 lNewLeftKeyCnt = (xbInt32) ((lKeyCnt + 1) * dSplitFactor);
+ xbInt32 lNewRightKeyCnt = lKeyCnt - lNewLeftKeyCnt;
+ if(( iRc = InsertNodeI( vpTag, npLeft, iSlotNo, ulPtr )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ // move the right half of the left node to the right node
+ pSrc = npLeft->cpBlockData;
+ pSrc += 8 + ((lNewLeftKeyCnt+1) * npTag->iKeyItemLen);
+ pTrg = npRight->cpBlockData;
+ pTrg += 8;
+ iLen = (lNewRightKeyCnt * npTag->iKeyItemLen) + 4;
+ memmove( pTrg, pSrc, (size_t) iLen );
+
+ // eliminate chattle on the right
+ iLen = 12 + (lNewLeftKeyCnt * npTag->iKeyItemLen);
+ pSrc = npLeft->cpBlockData;
+ pSrc += iLen;
+ memset( pSrc, 0x00, npLeft->ulBufSize - (xbUInt32) iLen );
+
+ // write the new key counts into the nodes
+ pTrg = npLeft->cpBlockData;
+ ePutInt32( pTrg, lNewLeftKeyCnt );
+ pTrg = npRight->cpBlockData;
+ ePutInt32( pTrg, lNewRightKeyCnt );
+
+ // write out the block
+ if(( iRc = WriteBlock( npLeft->ulBlockNo, GetBlockSize(), npLeft->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ // write out the block
+ if(( iRc = WriteBlock( npRight->ulBlockNo, GetBlockSize(), npRight->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::SplitNodeI() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Split a leaf node.
+/*!
+ This routine splits an index leaf into two nodes, divided by dSplitFactor.<br>
+
+ Possible performance improvement options.<br>
+ Two modes when splitting:<br>
+ a) Split nodes in the middle - good for random access applications<br>
+ b) Split off right node with only one key - good for applications with
+ expectation of ascending keys added moving forward.<br>
+
+ This routine first inserts the key into the left node in the appropriate location
+ then splits the node based on the split factor setting.
+
+ \param vpTag Tag in play.
+ \param npLeft Left node to split.
+ \param npRight Right node to split.
+ \param iSlotNo Slot number for split.
+ \param ulPtr Pointer number to insert.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::SplitNodeL( void *vpTag, xbIxNode * npLeft, xbIxNode *npRight,
+ xbInt16 iSlotNo, char * cpKeyBuf, xbUInt32 ulPtr ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbDouble dSplitFactor = .5; // can adjust performance with this number
+ xbMdxTag *mpTag = (xbMdxTag *) vpTag;
+ xbString sMsg;
+
+ xbInt16 iLen;
+ char *pSrc;
+ char *pTrg;
+
+ // std::cout << "In xbIxMdx::SplitNodeL()\n";
+ try{
+ xbInt32 lKeyCnt = GetKeyCount( npLeft );
+ xbInt32 lNewLeftKeyCnt = (xbInt32) ((lKeyCnt + 1) * dSplitFactor) + 1;
+ xbInt32 lNewRightKeyCnt = lKeyCnt + 1 - lNewLeftKeyCnt;
+
+ if(( iRc = InsertNodeL( vpTag, npLeft, iSlotNo, cpKeyBuf, ulPtr )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ // move right half off of left node to the right node
+ pSrc = npLeft->cpBlockData;
+ pSrc += 8 + (lNewLeftKeyCnt * mpTag->iKeyItemLen);
+ pTrg = npRight->cpBlockData;
+ pTrg += 8;
+ iLen = lNewRightKeyCnt * mpTag->iKeyItemLen;
+ memmove( pTrg, pSrc, (size_t) iLen );
+
+ // write the new key counts into the nodes
+ pTrg = npLeft->cpBlockData;
+ ePutInt32( pTrg, lNewLeftKeyCnt );
+ pTrg = npRight->cpBlockData;
+ ePutInt32( pTrg, lNewRightKeyCnt );
+
+ // zero out the next key number so this node is not confused with interior node
+ iLen = 8 + (lNewLeftKeyCnt * mpTag->iKeyItemLen);
+ pSrc = npLeft->cpBlockData;
+ pSrc += iLen;
+ memset( pSrc, 0x00, npLeft->ulBufSize - (xbUInt32) iLen );
+
+ // write out the left block
+ if(( iRc = WriteBlock( npLeft->ulBlockNo, GetBlockSize(), npLeft->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ // write out the right block
+ if(( iRc = WriteBlock( npRight->ulBlockNo, GetBlockSize(), npRight->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::SplitNodeL() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/**************************************************************************************************************/
+//! @brief TagSerialNo.
+/*!
+ This routine is used internally for reading or updating the serial number on a given tag when the tag.
+
+ \param iOption 1 - Read tag serial number off disk, save in structure<br>
+ 2 - Write serial number from memory to disk<br>
+ 3 - Read serial number off disk, increment, write updated number to disk<br>
+ mpTag - Pointer to tag for serial number update
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::TagSerialNo( xbInt16 iOption, xbMdxTag * mpTag ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ xbInt64 lPos = (mpTag->ulTagHdrPageNo * 512) + 20;
+
+// std::cout << "UpdateSerialNo offset = " << lPos << " option = " << iOption << "\n";
+
+ if( iOption != 2 ){
+ if(( iRc = xbFseek( lPos, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ if(( iRc = xbFgetc( mpTag->cSerialNo )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ }
+
+ if( iOption == 3 )
+ mpTag->cSerialNo++;
+
+ if( iOption != 1 ){
+ if(( iRc = xbFseek( lPos, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( &mpTag->cSerialNo, 1, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::UpdateSerialNo() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+
+/***********************************************************************/
+//! @brief UpdateTagKey
+/*!
+ This routine updates a key or a given tag.
+ The file header is considered to be the first 2048 bytes in the file.
+
+ \param cAction A - Add a key.<br>
+ D - Delete a key.<br>
+ R - Revise a key.<br>
+ \param vpTg - Pointer to tag.<br>
+ \param ulRecNo - Record number association with the action.<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxMdx::UpdateTagKey( char cAction, void *vpTag, xbUInt32 ulRecNo ){
+
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbMdxTag *npTag = (xbMdxTag *) vpTag;
+
+ try{
+ // save off any needed fields for updating
+ xbUInt32 ulTagSizeSave = npTag->ulTagSize;
+ // std::cout << "old size = " << ulTagSizeSave << " new size = " << npTag->ulTagSize << "\n";
+ //std::cout << "UpdateTagKey - tag size was updated need to do something here - test \n";
+
+
+ if( cAction == 'D' || cAction == 'R' ){
+ // std::cout << "UpdateTagKey-delete going to DeleteKey \n";
+ if(( iRc = DeleteKey( vpTag )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ //std::cout << "UpdateTagKey-delete back from DeleteKey \n";
+ }
+
+ if( cAction == 'A' || cAction == 'R' ){
+ if(( iRc = AddKey( vpTag, ulRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ }
+ if( ulTagSizeSave != npTag->ulTagSize ){
+ if(( iRc = UpdateTagSize( npTag, npTag->ulTagSize )) != XB_NO_ERROR) {
+ iErrorStop = 120;
+ throw iRc;
+ }
+ }
+ // update the serial number
+ if(( iRc = TagSerialNo( 3, npTag )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::UpdateTagKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/**************************************************************************************************************/
+//! @brief Write head block.
+/*!
+ This routine updates the MDX file header and commits changes to disk.
+ The file header is considered to be the first 2048 bytes in the file.
+
+ \param iOption 0 - Entire 2048 byte header, used for creating a new mdx file.<br>
+ 1 - Bytes 28 through 46, used when adding or deleting a tag.<br>
+ 2 - Bytes 32 through 46, used after updating keys in the file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbIxMdx::WriteHeadBlock( xbInt16 iOption ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ xbDate d; // default is system date, today
+ cUpdateYY = (char) d.YearOf() - 1900;
+ cUpdateMM = (char) d.MonthOf();
+ cUpdateDD = (char) d.DayOf( XB_FMT_MONTH );
+
+ if( iOption > 0 ){
+ char buf[48];
+ memset( buf, 0x00, 48 );
+ xbUInt32 ulStartPos = 0;
+ xbUInt32 ulLen = 0;
+
+ if( iOption == 1 ){
+ ePutInt16( &buf[28], iTagUseCnt );
+ buf[30] = cNextTag;
+ buf[31] = 0x1b;
+ ulStartPos = 28;
+ ulLen = 19;
+ } else {
+ ulStartPos = 32;
+ ulLen = 16;
+ }
+
+ ePutUInt32( &buf[32], ulPageCnt );
+ ePutUInt32( &buf[36], ulFirstFreePage );
+ ePutUInt32( &buf[40], ulNoOfBlockAvail );
+ buf[44] = cUpdateYY;
+ buf[45] = cUpdateMM;
+ buf[46] = cUpdateDD;
+
+ if(( iRc = xbFseek( ulStartPos, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ if(( iRc = xbFwrite( &buf[ulStartPos], ulLen, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ } else if( iOption == 0 ){
+ char buf[2048];
+ memset( buf, 0x00, 2048 );
+
+ buf[0] = cVersion;
+ cCreateYY = cUpdateYY;
+ cCreateMM = cUpdateMM;
+ cCreateDD = cUpdateDD;
+ buf[1] = cCreateYY;
+ buf[2] = cCreateMM;
+ buf[3] = cCreateDD;
+
+
+ for( xbUInt32 l = 0; l < sFileName.Len() && l < 10; l++ ){
+ buf[l+4] = sFileName[l+1];
+ }
+
+ ePutInt16( &buf[20], iBlockFactor );
+ ePutInt16( &buf[22], (xbInt16) GetBlockSize() );
+
+ buf[24] = cProdIxFlag;
+ buf[25] = cTagEntryCnt;
+ ePutInt16 ( &buf[26], iTagLen );
+ ePutInt16 ( &buf[28], iTagUseCnt );
+ buf[30] = cNextTag;
+ buf[31] = c1B;
+ ePutUInt32( &buf[32], ulPageCnt );
+ ePutUInt32( &buf[36], ulFirstFreePage );
+ ePutUInt32( &buf[40], ulNoOfBlockAvail );
+ buf[44] = cUpdateYY;
+ buf[45] = cUpdateMM;
+ buf[46] = cUpdateDD;
+
+ // not sure what the following "1" is for in a sea of zeroes....
+ // maybe it's current tag or default tag or something along those lines?
+ buf[529] = 0x01;
+
+ xbRewind();
+ if(( iRc = xbFwrite( buf, 2048, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ } else {
+ iErrorStop = 130;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::WriteHeadBlock() Exception Caught. Error Stop = [%d] iRc = [%d] option = [%d]", iErrorStop, iRc, iOption );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+xbInt16 xbIxMdx::UpdateTagSize( xbMdxTag *mpTag, xbUInt32 ulTagSz ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char buf[4];
+ try{
+ ePutUInt32( &buf[0], ulTagSz );
+ if(( iRc = xbFseek( (xbInt64) ((mpTag->ulTagHdrPageNo *512 )+ 4), SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( &buf[0], 4, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxMdx::UpdateTagSize() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+
+/***********************************************************************/
+//void xbIxMdx::TestStub( char *s, void *vpTag ){
+void xbIxMdx::TestStub( char *, void * ){
+}
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_MDX_SUPPORT */
+
diff --git a/src/core/xbixndx.cpp b/src/core/xbixndx.cpp
new file mode 100755
index 0000000..097bd22
--- /dev/null
+++ b/src/core/xbixndx.cpp
@@ -0,0 +1,2840 @@
+/* xbixndx.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_NDX_SUPPORT
+
+namespace xb{
+
+
+/***********************************************************************/
+//! @brief Class constructor.
+/*!
+ \param dbf Pointer to dbf instance.
+*/
+
+xbIxNdx::xbIxNdx( xbDbf *dbf ) : xbIx( dbf ){
+ ndxTag = (xbNdxTag *) calloc( 1, sizeof( xbNdxTag ));
+ SetBlockSize( XB_NDX_BLOCK_SIZE );
+ cNodeBuf = (char *) malloc( XB_NDX_BLOCK_SIZE );
+}
+/***********************************************************************/
+//! @brief Class Destructor.
+xbIxNdx::~xbIxNdx(){
+ if( ndxTag ){
+ ndxTag->npNodeChain = FreeNodeChain( ndxTag->npNodeChain );
+ if( ndxTag->cpKeyBuf )
+ free( ndxTag->cpKeyBuf );
+ if( ndxTag->cpKeyBuf2 )
+ free( ndxTag->cpKeyBuf2 );
+ if( ndxTag->exp ){
+ delete ndxTag->exp;
+ ndxTag->exp = NULL;
+ }
+ ndxTag->sKeyExpression.Set( NULL );
+ ndxTag->sTagName.Set( NULL );
+ free( ndxTag );
+ ndxTag = NULL;
+ }
+ if( cNodeBuf )
+ free( cNodeBuf );
+}
+/***********************************************************************/
+//! @brief Add key.
+/*!
+ Add key. If this is a unique index, this logic assumes the duplicate
+ check logic was already done.
+
+ \param vpTag Tag to update.
+ \param ulRecNo Record number to add key for.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::AddKey( void * vpTag, xbUInt32 ulRecNo ){
+
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ if( GetUniqueKeyOpt() == XB_EMULATE_DBASE && npTag->bFoundSts )
+ return XB_NO_ERROR;
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbInt16 iHeadNodeUpdateOpt = 2;
+
+
+ try{
+
+ if(( iRc = xbIxNdx::KeySetPosAdd( npTag, ulRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ xbInt32 lKeyCnt = GetKeyCount( npTag->npCurNode );
+ if( lKeyCnt < npTag->iKeysPerBlock ){
+ // Section A - add key to appropriate position if space available
+ if(( iRc = InsertNodeL( npTag, npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->cpKeyBuf, ulRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+
+ } else {
+ // land here with a full leaf node
+ iHeadNodeUpdateOpt = 1;
+ // section B - split the leaf node
+ xbIxNode * npRightNode = AllocateIxNode( GetBlockSize() + (xbUInt32) npTag->iKeyItemLen, 1 );
+ if( !npRightNode ){
+ iErrorStop = 100;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ if(( iRc = SplitNodeL( npTag, npTag->npCurNode, npRightNode, npTag->npCurNode->iCurKeyNo, npTag->cpKeyBuf, ulRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ xbUInt32 ulTempBlockNo = npRightNode->ulBlockNo;
+
+ // section C - go up the tree, splitting nodes as necessary
+ xbIxNode * npParent = npTag->npCurNode->npPrev;
+ while( npParent && GetKeyCount( npParent ) >= npTag->iKeysPerBlock ){
+ npRightNode = FreeNodeChain( npRightNode );
+ npRightNode = AllocateIxNode( GetBlockSize() + (xbUInt32) npTag->iKeyItemLen, 1 );
+ if( !npRightNode ){
+ iErrorStop = 200;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ if(( iRc = SplitNodeI( npTag, npParent, npRightNode, npParent->iCurKeyNo, ulTempBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+ ulTempBlockNo = npRightNode->ulBlockNo;
+ npTag->npCurNode = npParent;
+ npParent = npParent->npPrev;
+ }
+
+ // section D - if cur node is split root, create new root
+ if( npTag->npCurNode->ulBlockNo == npTag->ulRootBlock ){
+ // xbase->WriteLogMessage( "Section d" );
+ if(( iRc = AddKeyNewRoot( npTag, npTag->npCurNode, npRightNode )) != XB_NO_ERROR ){
+ iErrorStop = 300;
+ throw iRc;
+ }
+ npRightNode = FreeNodeChain( npRightNode );
+
+ } else {
+ // else section E, put key in parent
+ if(( iRc = InsertNodeI( vpTag, npParent, npParent->iCurKeyNo, npRightNode->ulBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 400;
+ throw iRc;
+ }
+ npRightNode = FreeNodeChain( npRightNode );
+ }
+ }
+
+ // update the header
+ if(( iRc = WriteHeadBlock( iHeadNodeUpdateOpt )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+
+ // ---- free whatever is left of the node chain here, this might not be right, might need to restore it to
+ // the point right after SetKeyPosAdd
+ npTag->npNodeChain = FreeNodeChain( ndxTag->npNodeChain );
+ npTag->npCurNode = NULL;
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::AddKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Add new root node.
+/*!
+ \param npTag Tag to update.
+ \param npLeft Left node.
+ \param npRight Right node.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxNdx::AddKeyNewRoot( xbNdxTag *npTag, xbIxNode *npLeft, xbIxNode *npRight ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbString sMsg;
+ char *pLastKey = NULL;
+
+ try{
+ xbIxNode *npRoot = AllocateIxNode( GetBlockSize() + (xbUInt32) npTag->iKeyItemLen, 1 );
+ if( !npRoot ){
+ iErrorStop = 100;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ npTag->ulRootBlock = npRoot->ulBlockNo;
+ pLastKey = (char *) malloc( (size_t) ndxTag->iKeyLen );
+ if(( iRc = GetLastKeyForBlockNo( npTag, npLeft->ulBlockNo, pLastKey )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ char * pTrg = npRoot->cpBlockData;
+
+ // set no of keys to 1
+ ePutUInt32( pTrg, 1 );
+
+ // set the left node number
+ pTrg += 4;
+ ePutUInt32( pTrg, npLeft->ulBlockNo );
+
+ // set the key
+ pTrg+= 8;
+ memcpy( pTrg, pLastKey, (size_t) npTag->iKeyLen );
+
+ // set the right node number
+ pTrg+= (npTag->iKeyItemLen - 8);
+ ePutUInt32( pTrg, npRight->ulBlockNo );
+
+ // write out the block
+ if(( iRc = WriteBlock( npRoot->ulBlockNo, GetBlockSize(), npRoot->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ if( pLastKey )
+ free( pLastKey );
+ NodeFree( npRoot );
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::AddKeyNewRoot() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( pLastKey )
+ free( pLastKey );
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Append node to node chain.
+/*!
+ Append a node to the current node chain for a given tag.
+
+ \param vpTag Tag to update.
+ \param npNode Node to add to node chain.
+ \returns void
+*/
+void xbIxNdx::AppendNodeChain( void *vpTag, xbIxNode * npNode ){
+
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ if( npTag->npNodeChain == NULL ){
+ npTag->npNodeChain = npNode;
+ npTag->npCurNode = npNode;
+ } else {
+ npNode->npPrev = npTag->npCurNode;
+ npTag->npCurNode->npNext = npNode;
+ npTag->npCurNode = npNode;
+ }
+ // time stamp the node chain
+ GetFileMtime( npTag->tNodeChainTs );
+}
+
+/***********************************************************************/
+//! @brief Allocate a node.
+/*!
+ \param ulBufSize Buffer size.
+ \param iOpt 0 - Don't update the node block number on the node.
+ 1 - Set node block number to the next available block number.
+ \returns Pointer to new node.
+*/
+
+xbIxNode * xbIxNdx::AllocateIxNode( xbUInt32 ulBufSize, xbInt16 iOpt ){
+ xbIxNode *n = xbIx::AllocateIxNode( ulBufSize );
+ if( n && iOpt == 1 ) n->ulBlockNo = ndxTag->ulTotalBlocks++;
+ return n;
+}
+/***********************************************************************/
+//! @brief Check for duplicate key.
+/*!
+ \param vpTag Tag to check.
+ \returns XB_KEY_NOT_UNIQUE<br>XB_NO_ERROR
+*/
+xbInt16 xbIxNdx::CheckForDupKey( void *vpTag )
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbNdxTag *npTag = (xbNdxTag *) vpTag;
+ npTag->bFoundSts = xbFalse;
+ try{
+ if( GetUnique()){
+ if( npTag->iKeySts == XB_ADD_KEY || npTag->iKeySts == XB_UPD_KEY )
+ if( KeyExists( vpTag )){
+ if( GetUniqueKeyOpt() == XB_EMULATE_DBASE ){
+ npTag->bFoundSts = xbTrue;
+ return 0;
+ } else {
+ return XB_KEY_NOT_UNIQUE;
+ }
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::CheckForDupKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Check tag integrity.
+/*!
+ Check a tag for accuracy.
+
+ \param vpTag Tag to create key for.
+ \param iOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxNdx::CheckTagIntegrity( void *vpTag, xbInt16 iOpt ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iRc2;
+ xbInt16 iRc3;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulIxCnt = 0;
+ xbUInt32 ulThisRecNo = 0;
+ xbUInt32 ulPrevRecNo = 0;
+ xbBool bDone = false;
+ xbString sMsg;
+ char cKeyType;
+ char *pPrevKeyBuf = NULL;
+ xbInt16 iAutoLock = xbFalse;
+
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+// xbase->WriteLogMessage( "xbIxNdx::CheckTagIntegrity()", iOpt );
+
+ #ifdef XB_LOCKING_SUPPORT
+ iAutoLock = dbf->GetAutoLock();
+ if( iAutoLock && !dbf->GetTableLocked() ){
+ if(( iRc = dbf->LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+ #endif
+
+ memset( npTag->cpKeyBuf2, 0x00, (size_t) npTag->iKeyLen );
+ cKeyType = GetKeyType( vpTag );
+
+ sMsg.Sprintf( "Checking index type [%c]", cKeyType );
+ xbase->WriteLogMessage( sMsg, iOpt );
+
+ pPrevKeyBuf = (char *) calloc( 1, (size_t) ndxTag->iKeyLen );
+
+ // for each key in the index, make sure it is trending in the right direction
+ iRc = GetFirstKey( vpTag, 0 );
+ while( iRc == XB_NO_ERROR && !bDone ){
+ ulIxCnt++;
+ iRc = GetNextKey( vpTag, 0 );
+ if( iRc == XB_NO_ERROR ){
+ // compare this key to prev key
+ iRc2 = CompareKey( cKeyType, GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->iKeyItemLen ),
+ pPrevKeyBuf, (size_t) npTag->iKeyLen );
+
+ if( iRc2 < 0 ){
+ sMsg.Sprintf( "Key sequence error at key number [%ld].", ulIxCnt );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ iErrorStop = 100;
+ iRc = XB_INVALID_INDEX;
+ throw iRc;
+ }
+
+ ulThisRecNo = 0;
+ if(( iRc3 = GetDbfPtr( vpTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulThisRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc3;
+ }
+
+ if( iRc2 == 0 && (ulThisRecNo <= ulPrevRecNo )){
+ sMsg.Sprintf( "Dbf record number sequence error at key number [%ld].", iOpt );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ iErrorStop = 120;
+ iRc = XB_INVALID_INDEX;
+ throw iRc;
+ }
+ // save this key info to prev key
+ memcpy( pPrevKeyBuf, GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->iKeyItemLen ), (size_t) npTag->iKeyLen );
+ ulPrevRecNo = ulThisRecNo;
+ }
+ }
+
+ // verify the index count matches the tag count
+ xbUInt32 ulDbfCnt = 0;
+ if(( iRc = dbf->GetRecordCnt( ulDbfCnt )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+
+ if( GetUniqueKeyOpt() == XB_EMULATE_DBASE && GetUnique( vpTag )){
+ // Can't compare counts if using XB_EMULATE_DBASE and it's a unique index
+ } else {
+ if( ulDbfCnt != ulIxCnt ){
+ sMsg.Sprintf( "CheckTagIntegrity() Index entry count [%ld] does not match dbf record count [%ld]", ulIxCnt, ulDbfCnt );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ iErrorStop = 140;
+ iRc = XB_INVALID_INDEX;
+ throw iRc;
+ }
+
+ // verify each record in the dbf file has a corresponding index entry
+ xbUInt32 j = 0;
+ while( j < ulDbfCnt ){
+ if(( iRc = dbf->GetRecord( ++j )) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ if(( iRc = FindKeyForCurRec( vpTag )) != XB_NO_ERROR ){
+ ulThisRecNo = j;
+ iErrorStop = 160;
+ throw iRc;
+ }
+ }
+ sMsg.Sprintf( "CheckTagIntegrity() Index entry count [%ld] matches dbf record count [%ld]", ulIxCnt, ulDbfCnt );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && !dbf->GetTableLocked() ){
+ if(( iRc = dbf->LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ }
+ #endif
+
+
+ if( pPrevKeyBuf )
+ free( pPrevKeyBuf );
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::CheckTagIntegrity() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ), iOpt );
+ if( pPrevKeyBuf )
+ free( pPrevKeyBuf );
+
+ if( iErrorStop == 160 ){
+ sMsg.Sprintf( "xbIxNdx::CheckTagIntegrity() Missing index entry for record [%d]", ulThisRecNo );
+ xbase->WriteLogMessage( sMsg, iOpt );
+ }
+ }
+ return iRc;
+
+}
+/***********************************************************************/
+//! @brief Create key for tag.
+/*!
+ Append a node to the current node chain for a given tag.
+
+ \param vpTag Tag to create key for.
+ \param iOpt 0 = Build a key for FindKey usage, only rec buf 0.<br>
+ 1 = Append Mode, Create key for an append, only use rec buf 0, set updated switch.<br>
+ 2 = Update Mode, Create old version and new version keys, check if different, set update switch appropriately.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::CreateKey( void * vpTag, xbInt16 iOpt ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ if(( iRc = npTag->exp->ProcessExpression( 0 )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ if( npTag->exp->GetReturnType() == XB_EXP_CHAR ){
+ npTag->exp->GetStringResult( npTag->cpKeyBuf, (xbUInt32) npTag->iKeyLen );
+ }
+ else if( npTag->exp->GetReturnType() == XB_EXP_NUMERIC ){
+ xbDouble d;
+ npTag->exp->GetNumericResult( d );
+ memcpy( npTag->cpKeyBuf, &d, 8 );
+ }
+ else if( npTag->exp->GetReturnType() == XB_EXP_DATE ){
+ xbDouble d;
+ npTag->exp->GetNumericResult( d );
+ memcpy( npTag->cpKeyBuf, &d, 8 );
+ }
+
+ npTag->iKeySts = 0;
+ if( iOpt == 1 )
+ npTag->iKeySts = XB_ADD_KEY;
+
+ else if( iOpt == 2 ){
+ if(( iRc = npTag->exp->ProcessExpression( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ if( npTag->exp->GetReturnType() == XB_EXP_CHAR ){
+ npTag->exp->GetStringResult( npTag->cpKeyBuf2, (xbUInt32) npTag->iKeyLen );
+ } else if( npTag->exp->GetReturnType() == XB_EXP_NUMERIC || npTag->exp->GetReturnType() == XB_EXP_DATE ){
+ xbDouble d;
+ npTag->exp->GetNumericResult( d );
+ memcpy( npTag->cpKeyBuf2, &d, 8 );
+ }
+ if( memcmp( npTag->cpKeyBuf, npTag->cpKeyBuf2, (size_t) npTag->iKeyLen ))
+ npTag->iKeySts = XB_UPD_KEY;
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::CreateKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Create new tag.
+/*!
+ This routine creates a new tag. Since NDX files have only one tag,
+ this creates a new NDX file.
+
+ \param sName Tag Name, including .NDX suffix
+ \param sKey Key Expression
+ \param sFilter Filter expression. Not supported by NDX indices.
+ \param iDescending Not supported by NDX indices.
+ \param iUnique xbtrue - Unique.<br>xbFalse - Not unique.
+ \param iOverLay xbTrue - Overlay if file already exists.<br>xbFalse - Don't overlay.
+ \param vpTag Output from method Pointer to vptag pointer.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::CreateTag( const xbString &sName, const xbString &sKey,
+ const xbString &, xbInt16, xbInt16 iUnique, xbInt16 iOverLay, void **vpTag ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbNdxTag *npTag = ndxTag;
+ *vpTag = ndxTag;
+
+ try{
+ //xbString sMsg;
+ SetFileName( sName );
+
+ if( FileExists() && !iOverLay )
+ return XB_FILE_EXISTS;
+
+ if( FileIsOpen()){
+ if(( iRc = xbTruncate(0)) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ if(( iRc = xbFclose()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ npTag->npNodeChain = FreeNodeChain( npTag->npNodeChain );
+ npTag->npCurNode = NULL;
+ npTag->sKeyExpression.Set( "" );
+
+ if( npTag->cpKeyBuf ){
+ free( npTag->cpKeyBuf );
+ npTag->cpKeyBuf = NULL;
+ }
+ if( npTag->cpKeyBuf2 ){
+ free( npTag->cpKeyBuf2 );
+ npTag->cpKeyBuf2 = NULL;
+ }
+ }
+
+ if(( iRc = xbFopen( "w+b", dbf->GetShareMode())) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ //set up the key expression
+ npTag->exp = new xbExp( dbf->GetXbasePtr());
+ if(( iRc = npTag->exp->ParseExpression( dbf, sKey )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ switch( npTag->exp->GetReturnType()){
+ case XB_EXP_CHAR:
+ npTag->cKeyType = 'C';
+ npTag->iKeyType = 0;
+ npTag->iKeyLen = npTag->exp->GetResultLen();
+ break;
+
+ case XB_EXP_NUMERIC:
+ npTag->cKeyType = 'F';
+ npTag->iKeyType = 1;
+ npTag->iKeyLen = 8;
+ break;
+
+ case XB_EXP_DATE:
+ npTag->cKeyType = 'D';
+ npTag->iKeyType = 1;
+ npTag->iKeyLen = 8;
+ break;
+
+ default:
+ iErrorStop = 50;
+ iRc = XB_INVALID_INDEX;
+ throw iRc;
+ }
+
+ npTag->iUnique = iUnique;
+ npTag->ulRootBlock = 1L;
+ npTag->ulTotalBlocks = 2l;
+ npTag->sKeyExpression = sKey;
+
+ GetFileNamePart( npTag->sTagName );
+
+ if( npTag->iKeyLen > 100 ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+
+ npTag->iKeyItemLen = npTag->iKeyLen + 8;
+ while(( npTag->iKeyItemLen % 4 )!= 0 ) npTag->iKeyItemLen++;
+
+ npTag->iKeysPerBlock = (xbInt16) (GetBlockSize() - 8 ) / npTag->iKeyItemLen;
+ ndxTag->cpKeyBuf = (char *) malloc( (size_t) ndxTag->iKeyLen );
+ ndxTag->cpKeyBuf2 = (char *) malloc( (size_t) ndxTag->iKeyLen );
+
+ if(( iRc = WriteHeadBlock(0)) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+
+ //write out block binary zeroes
+ char buf[512];
+ memset( buf, 0x00, 512 );
+ if(( iRc = xbFwrite( buf, 1, 512 )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw iRc;
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::CreateTag() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Delete a key.
+/*!
+ This routine deletes a key from a supplied node.
+ \param vpTag Tag to delete key on.
+ \param npNode Node to delete key on.
+ \param iSlotNo Slot number of key to delete.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::DeleteFromNode( void *vpTag, xbIxNode * npNode, xbInt16 iSlotNo )
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+
+ xbInt32 lKeyCnt = GetKeyCount( npNode );
+ xbInt16 iLen = (lKeyCnt - iSlotNo - 1) * npTag->iKeyItemLen;
+ if( !IsLeaf( vpTag, npNode ))
+ iLen += 4;
+
+ if( iLen > 0 ){
+ char *pTrg = npNode->cpBlockData;
+ pTrg += (4 + (npTag->iKeyItemLen * (iSlotNo)) ); //lTrgPos;
+ char *pSrc = pTrg;
+ pSrc += npTag->iKeyItemLen;
+ memmove( pTrg, pSrc, (size_t) iLen );
+ }
+
+ // set the new number of keys
+ ePutUInt32( npNode->cpBlockData, (xbUInt32) lKeyCnt - 1 );
+
+ // write out the block
+ if(( iRc = WriteBlock( npNode->ulBlockNo, GetBlockSize(), npNode->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::DeleteFromNode() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return XB_NO_ERROR;
+}
+
+/***********************************************************************/
+//! @brief Delete a key.
+/*!
+ This routine deletes a key. It assumes the key to delete
+ is the current key in the node chain.
+
+ \param vpTag Tag to delete key on.
+
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::DeleteKey( void *vpTag ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ // save copy of node chain to reset to after delete completed
+ xbIxNode *npSaveNodeChain = npTag->npNodeChain;
+ npTag->npNodeChain = NULL;
+ xbIxNode * npSaveCurNode = npTag->npCurNode;
+
+ try{
+
+ xbString sMsg;
+
+ if(( iRc = xbIxNdx::KeySetPosDel( npTag )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ // Delete key needs to handle two scenarios
+ // 1 - if the delete is on the only key of a leaf node, then traverse up the tree, trimming as needed
+ // 2 - if the last key on a node is deleted, and the key value is not the same as the prev key value
+ // go up the tree looking for an interior node needing updated key value
+
+
+ xbInt32 lOrigKeyCnt = GetKeyCount( npTag->npCurNode );
+ if(( iRc = DeleteFromNode( npTag, npTag->npCurNode, npTag->npCurNode->iCurKeyNo )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ if( lOrigKeyCnt == 1 ){
+ // scenario 1
+ xbBool bDone = xbFalse;
+ xbBool bIsLeaf = xbFalse;
+ xbInt32 lKeyCnt;
+ npTag->npCurNode = npTag->npCurNode->npPrev;
+
+ while( npTag->npCurNode && !bDone ){
+ lKeyCnt = GetKeyCount( npTag->npCurNode );
+ bIsLeaf = IsLeaf( npTag, npTag->npCurNode );
+ if( lKeyCnt > 0 ){
+ if(( iRc = DeleteFromNode( npTag, npTag->npCurNode, npTag->npCurNode->iCurKeyNo )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ }
+ if( (bIsLeaf && lKeyCnt > 1) || (!bIsLeaf && lKeyCnt > 0) )
+ bDone = xbTrue;
+ else
+ npTag->npCurNode = npTag->npCurNode->npPrev;
+ }
+ } else if( npTag->npCurNode->iCurKeyNo == (xbUInt32) lOrigKeyCnt - 1 ){
+
+ // scenario 2
+ // if last two keys identical, then nothing to do, else go up looking for a key to change
+ if( memcmp( GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->iKeyItemLen ),
+ GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo-1, npTag->iKeyItemLen ),
+ (size_t) npTag->iKeyLen )){
+
+ xbIxNode *pNode = npTag->npCurNode->npPrev;
+ char *pSrc = GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo-1, npTag->iKeyItemLen );
+
+ while( pNode && pNode->ulBlockNo != npTag->ulRootBlock && pNode->iCurKeyNo == (xbUInt32) GetKeyCount( pNode ) )
+ pNode = pNode->npPrev;
+ if( pNode ){
+ if( pNode->iCurKeyNo < (xbUInt32) GetKeyCount( pNode )){
+ char *pTrg = pNode->cpBlockData;
+ pTrg += 12 + (pNode->iCurKeyNo * (xbUInt32) npTag->iKeyItemLen);
+ for( xbInt16 i = 0; i < npTag->iKeyLen; i++ )
+ *pTrg++ = *pSrc++;
+
+ // write out the block
+ if(( iRc = WriteBlock( pNode->ulBlockNo, GetBlockSize(), pNode->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ }
+ }
+ }
+ }
+
+ // restore node chain to pre delete status (which should be post add status)
+ npTag->npNodeChain = FreeNodeChain( npTag->npNodeChain );
+ npTag->npNodeChain = npSaveNodeChain;
+ npTag->npCurNode = npSaveCurNode;
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::DeleteKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( npSaveNodeChain ){
+ npTag->npNodeChain = npSaveNodeChain;
+ npSaveNodeChain = FreeNodeChain( npSaveNodeChain );
+ npTag->npCurNode = npSaveCurNode;
+ }
+ }
+ return iRc;
+}
+
+
+/***********************************************************************/
+//! @brief Delete tag.
+/*!
+ In the case of an ndx tag, it deletes the ndx file as it contains
+ only one tag.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::DeleteTag( void * ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ //xbNdxTag * npTag;
+ //vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+
+ // if open, close it
+ if( FileIsOpen()){
+ if(( iRc = Close()) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+ // delete file
+ if(( iRc = xbRemove()) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::DeleteTag() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+
+//! @brief Dump a block for a given tag.
+/*!
+ Dump blocks for given tag for debugging purposes.
+ \param iOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \param vpTag - Not required for single tag NDX files.
+ \returns void
+*/
+
+//xbInt16 xbIxNdx::DumpTagBlocks( xbInt16 iOpt, void *vpTag ){
+
+xbInt16 xbIxNdx::DumpTagBlocks( xbInt16 iOpt, void * ){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 lNoOfKeys;
+ char *p;
+ xbString s;
+ xbBool bIsLeaf = false;
+
+ try{
+ if( !FileIsOpen()){
+ iRc = XB_NOT_OPEN;
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ xbUInt32 ulStartBlock;
+ xbUInt32 ulEndBlock;
+ ulStartBlock = 1;
+ ulEndBlock = ndxTag->ulTotalBlocks;
+
+ for( xbUInt32 lBlk = ulStartBlock; lBlk < ulEndBlock; lBlk++ ){
+
+ memset( cNodeBuf, 0x00, XB_NDX_BLOCK_SIZE );
+ if(( iRc = ReadBlock( lBlk, XB_NDX_BLOCK_SIZE, cNodeBuf )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ p = cNodeBuf;
+ lNoOfKeys = eGetUInt32( p );
+
+ if( eGetUInt32( p + 4 ) > 0 ){
+ bIsLeaf = false;
+ s.Sprintf( "Node # %ld - Interior Node - Key Type [%c] Key Count [%ld]", lBlk, ndxTag->cKeyType, lNoOfKeys );
+ } else {
+ bIsLeaf = true;
+ s.Sprintf( "Node # %ld - Leaf Node - Key Type [%c] Key count [%ld]", lBlk, ndxTag->cKeyType, lNoOfKeys );
+ }
+ xbase->WriteLogMessage( s, iOpt );
+ xbase->WriteLogMessage( "Key Child Dbf Rec Key", iOpt );
+ p += 4;
+ xbUInt32 ulLeftBranch;
+ xbUInt32 ulRecNo;
+ xbString sKey;
+ xbDouble d;
+
+ xbUInt32 l;
+ for( l = 0; l < lNoOfKeys; l++ ){
+ ulLeftBranch = eGetUInt32( p );
+ p+= 4;
+ ulRecNo = eGetUInt32( p );
+ p+= 4;
+ if( ndxTag->cKeyType == 'C' ){
+ sKey.Assign( p, 1, (xbUInt32) ndxTag->iKeyLen );
+ } else if( ndxTag->cKeyType == 'D' ){
+ xbInt32 lDate = (xbInt32) eGetDouble( p );
+ xbDate dt( lDate );
+ //xbString s2;
+ //dt.JulToDate8( lDate, s2 );
+ sKey.Sprintf( "%ld - %s", lDate, dt.Str());
+ } else {
+ d = eGetDouble( p );
+ sKey.Sprintf( "%f", d );
+ }
+ p+= (ndxTag->iKeyItemLen-8);
+
+ s.Sprintf( "%3d %9d %9d %s", l+1, ulLeftBranch, ulRecNo, sKey.Str() );
+ xbase->WriteLogMessage( s, iOpt );
+ }
+ if( !bIsLeaf ){
+ ulLeftBranch = eGetUInt32( p );
+ s.Sprintf( "%3d %9d", l+1, ulLeftBranch );
+ xbase->WriteLogMessage( s, iOpt );
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::DumpTagBlocks() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Dump index file header.
+/*!
+ Dump a index file header for debugging purposes.
+ \param iOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::DumpHeader( xbInt16 iOpt, xbInt16 ){
+ xbString s;
+ xbInt16 iRc;
+
+ if(( iRc = ReadHeadBlock( 1 )) != XB_NO_ERROR )
+ return iRc;
+
+ s.Sprintf( "Index Header Node for %s", GetFileName().Str());
+ xbase->WriteLogMessage( s, iOpt );
+ s.Sprintf( "--------------------------------" );
+ xbase->WriteLogMessage( s, iOpt );
+ s.Sprintf( "Root block = %ld", ndxTag->ulRootBlock );
+ xbase->WriteLogMessage( s, iOpt );
+ s.Sprintf( "Total blocks = %ld", ndxTag->ulTotalBlocks );
+ xbase->WriteLogMessage( s, iOpt );
+ s.Sprintf( "Key types = %c,%d", ndxTag->cKeyType, ndxTag->iKeyType );
+ xbase->WriteLogMessage( s, iOpt );
+ s.Sprintf( "Key Length = %d", ndxTag->iKeyLen );
+ xbase->WriteLogMessage( s, iOpt );
+ s.Sprintf( "Keys Per Block = %d", ndxTag->iKeysPerBlock );
+ xbase->WriteLogMessage( s, iOpt );
+ s.Sprintf( "Key Item Len = %ld", ndxTag->iKeyItemLen );
+ xbase->WriteLogMessage( s, iOpt);
+ s.Sprintf( "Serial No = %d", ndxTag->cSerNo );
+ xbase->WriteLogMessage( s, iOpt);
+ s.Sprintf( "Unique = %d", ndxTag->iUnique );
+ xbase->WriteLogMessage( s, iOpt );
+ s.Sprintf( "KeyExpression = %s", ndxTag->sKeyExpression.Str() );
+ xbase->WriteLogMessage( s, iOpt );
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+//! @brief Dump the index for a tag.
+/*!
+ Stub.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbIxNdx::DumpIxForTag( void *, xbInt16 )
+{
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+//! @brief Dump the index node chain.
+/*!
+ Dump the index node chain for debugging purposes.
+ \param vpTag Tag of node chain to dump.
+ \param iOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \returns void
+*/
+void xbIxNdx::DumpIxNodeChain( void *vpTag, xbInt16 iOpt ) const
+{
+
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ xbString s( "Dump Node Chain" );
+ xbase->WriteLogMessage( s, iOpt );
+
+ if( npTag->npNodeChain ){
+ xbIxNode *n = npTag->npNodeChain;
+ xbInt16 iCtr = 0;
+ char cLeaf;
+ s.Sprintf( "Cnt\tThis Prev Next CurKeyNo BlockNo NoOfKeys Type" );
+ xbase->WriteLogMessage( s, iOpt );
+ while( n ){
+ IsLeaf( vpTag, n ) ? cLeaf = 'L' : cLeaf = 'I';
+ s.Sprintf( "%d\t%08x %08x %08x %08d %08d %08d %c",
+ iCtr++, n, n->npPrev, n->npNext, n->iCurKeyNo,
+ n->ulBlockNo, eGetUInt32( n->cpBlockData ), cLeaf );
+ xbase->WriteLogMessage( s, iOpt );
+ n = n->npNext;
+ }
+ } else {
+ s = "Empty Node Chain";
+ xbase->WriteLogMessage( s, iOpt );
+ }
+}
+/***********************************************************************/
+//! @brief Dump node.
+/*!
+ Dump a node for debugging purposes.
+ \param vpTag Tag of node chain to dump.
+ \param pNode Node to dump.
+ \param iOpt Output message destination<br>
+ 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \returns XB_NVALID_OBJECT<br>XB_NO_ERROR
+*/
+
+xbInt16 xbIxNdx::DumpNode( void *vpTag, xbIxNode *pNode, xbInt16 iOpt ) const
+{
+ xbString s;
+ xbString sKey;
+ xbUInt32 lLeftBranch;
+ xbUInt32 lRecNo;
+ xbDouble d;
+
+ if( !pNode )
+ return XB_INVALID_OBJECT;
+
+ xbIx::DumpNode( vpTag, pNode, iOpt );
+
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ xbUInt32 lNoOfKeys = eGetUInt32( pNode->cpBlockData );
+ xbBool bIsLeaf = IsLeaf( vpTag, pNode );
+
+ if( bIsLeaf )
+ xbase->WriteLogMessage( "Leaf node", iOpt );
+ else
+ xbase->WriteLogMessage( "Interior node", iOpt );
+
+ s.Sprintf( "Key type = [%c] No Of Keys =[%d] Prev =[%x] Next =[%x]", npTag->cKeyType, lNoOfKeys, pNode->npPrev, pNode->npNext );
+ xbase->WriteLogMessage( s, iOpt );
+
+ char *p = pNode->cpBlockData;
+ p += 4;
+
+ xbUInt32 l;
+ for( l = 0; l < lNoOfKeys; l++ ){
+
+ lLeftBranch = eGetUInt32( p );
+ p+= 4;
+ lRecNo = eGetUInt32( p );
+ p+= 4;
+
+ if( npTag->cKeyType == 'C' ){
+ sKey.Assign( p, 1, (xbUInt32) npTag->iKeyLen );
+ } else if( npTag->cKeyType == 'D' ){
+ xbInt32 lDate = (xbInt32) eGetDouble( p );
+ xbDate dt( lDate );
+ sKey.Sprintf( "%ld - %s", lDate, dt.Str());
+ } else {
+ d = eGetDouble( p );
+ sKey.Sprintf( "%f", d );
+ }
+ p+= (npTag->iKeyItemLen-8);
+ s.Sprintf( "%3d %9d %9d %s", l+1, lLeftBranch, lRecNo, sKey.Str() );
+ xbase->WriteLogMessage( s, iOpt );
+ }
+ if( !bIsLeaf ){
+ lLeftBranch = eGetUInt32( p );
+ s.Sprintf( "%3d %9d", l+1, lLeftBranch );
+ xbase->WriteLogMessage( s.Str(), iOpt );
+ }
+ return XB_NO_ERROR;
+}
+#endif
+/***********************************************************************/
+//! @brief Find key
+/*!
+ \param vpTag Pointer to tag to search.
+ \param vpKey Void pointer to key data to search on.
+ \param lSearchKeyLen Length of key to search for.
+ \param iRetrieveSw xbTrue - Retrieve the record if key found.<br>
+ xbFalse - Don't retrieve record, check for key existence only.
+ \returns XB_NO_ERROR - Key found.<br>
+ XB_NOT_FOUND - Key not found.<br>
+ <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxNdx::FindKey( void *vpTag, const void *vpKey, xbInt32 lSearchKeyLen,
+ xbInt16 iRetrieveSw ){
+
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbString sMsg;
+ // xbInt16 iFindSts;
+ try{
+ // clean up any previous table updates before moving on
+ if( iRetrieveSw ){
+ if( dbf->GetDbfStatus() == XB_UPDATED ){
+ if( dbf->GetAutoCommit() == 1 ){
+ if(( iRc = dbf->Commit()) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ } else {
+ if(( iRc = dbf->Abort()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ }
+ }
+
+ xbUInt32 ulNoOfKeys;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ char cKeyType = npTag->cKeyType;
+
+ if( npTag->npNodeChain ){
+
+ // determine if the index has been updated since the last time it was used
+ time_t tFileTs;
+ if(( iRc = GetFileMtime( tFileTs )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if( npTag->tNodeChainTs < tFileTs ){
+ npTag->npNodeChain = FreeNodeChain( npTag->npNodeChain );
+ npTag->npCurNode = NULL;
+ if(( iRc = ReadHeadBlock( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if(( iRc = GetBlock( npTag, (npTag->ulRootBlock ), 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ } else {
+ // pop up the chain looking for appropriate starting point
+ xbBool bDone = false;
+ xbIxNode * TempIxNode;
+ while( npTag->npCurNode && !bDone && npTag->npCurNode->ulBlockNo != npTag->ulRootBlock ){ // not root node
+ iRc = CompareKey( cKeyType, vpKey, GetKeyData( npTag->npCurNode, 0, npTag->iKeyItemLen ), (size_t) lSearchKeyLen );
+ if( iRc <= 0 ){
+ TempIxNode = npTag->npCurNode;
+ npTag->npCurNode = npTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+ } else {
+ // get the number of keys on the block and compare the key to the rightmost key
+ xbUInt32 ulKeyCtr = eGetUInt32( npTag->npCurNode->cpBlockData ) - 1;
+ iRc = CompareKey( cKeyType, vpKey, GetKeyData( npTag->npCurNode, ulKeyCtr, npTag->iKeyItemLen), (size_t) lSearchKeyLen );
+
+ if( iRc > 0 ){
+ TempIxNode = npTag->npCurNode;
+ npTag->npCurNode = npTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+ } else {
+ bDone = true;
+ }
+ }
+ }
+ }
+ } else {
+ if(( iRc = GetBlock( npTag, (npTag->ulRootBlock ), 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ }
+
+
+ // if cur node is the base node and no keys on this node, then the index is empty
+ if( npTag->ulRootBlock == npTag->npCurNode->ulBlockNo ){
+ ulNoOfKeys = eGetUInt32( npTag->npCurNode->cpBlockData );
+ if( ulNoOfKeys == 0 && IsLeaf( npTag, npTag->npCurNode )){
+ // iRc = XB_EMPTY;
+
+ iRc = XB_NOT_FOUND;
+ return iRc;
+ }
+ }
+
+ // should be in the appropriate position in the node chain to continue the search from here
+ // run down through the interior nodes
+ xbInt16 iSearchRc = 0;
+ xbUInt32 ulKeyPtr = 0;
+
+ while( !IsLeaf( npTag, npTag->npCurNode ) ){
+
+ // get the number of keys on the block and compare the key to the rightmost key
+ ulNoOfKeys = eGetUInt32( npTag->npCurNode->cpBlockData );
+ if( ulNoOfKeys == 0 ) // interior nodes can have zero keys, just a link to the next lower node
+ npTag->npCurNode->iCurKeyNo = 0;
+ else
+ {
+ iRc = CompareKey( cKeyType, vpKey, GetKeyData( npTag->npCurNode, ulNoOfKeys - 1, npTag->iKeyItemLen), (size_t) lSearchKeyLen );
+ if( iRc > 0 ){
+ npTag->npCurNode->iCurKeyNo = ulNoOfKeys;
+ } else {
+ npTag->npCurNode->iCurKeyNo = (xbUInt32) BSearchBlock( cKeyType, npTag->npCurNode,
+ (xbInt32) npTag->iKeyItemLen, vpKey, (xbInt32) lSearchKeyLen, iSearchRc );
+ }
+ }
+
+ if(( iRc = GetKeyPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw iRc;
+ }
+
+ if(( iRc = GetBlock( npTag, ulKeyPtr, 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 90;
+ throw iRc;
+ }
+ }
+
+ // should be on a the correct leaf node, it may or may not contain the actual key
+ ulNoOfKeys = eGetUInt32( npTag->npCurNode->cpBlockData );
+ xbInt16 iCompRc = 0;
+
+ if( ulNoOfKeys == 0 ){
+ iRc = XB_NOT_FOUND;
+ return iRc;
+ } else {
+
+ iRc = BSearchBlock( cKeyType, npTag->npCurNode, npTag->iKeyItemLen, vpKey, lSearchKeyLen, iCompRc );
+
+ // iCompRc
+ // 0 found
+ // < 0 eof encountered, search key > last key in file
+ // > 0 not found, positioned to next key
+
+
+ // std::cout << "xbIxNdx::FindKey -Rc = " << iRc << " CompRc = " << iCompRc << " NoOfKeys = " << ulNoOfKeys << " blk no = " << npTag->npCurNode->ulBlockNo << "\n";
+
+ if( iCompRc >= 0 ){
+ npTag->npCurNode->iCurKeyNo = (xbUInt32) iRc;
+ if( iRetrieveSw ){
+ xbUInt32 ulKey = npTag->npCurNode->iCurKeyNo;
+ if( ulKey >= ulNoOfKeys ) // if position past end of keys, need to go back one and position to last key
+ ulKey--;
+
+ if(( iRc = GetDbfPtr( vpTag, ulKey, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ }
+ }
+ }
+
+ if( iCompRc == 0 )
+ return XB_NO_ERROR;
+ else if( iCompRc > 0 )
+ return XB_NOT_FOUND;
+ else
+ return XB_EOF;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::FindKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Find key for current record
+/*!
+ This routine is called when updating a key.
+
+ \param vpTag Pointer to tag to search.
+ XB_NOT_FOUND Key not found.<br>
+ <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::FindKeyForCurRec( void * vpTag )
+{
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+ if(( iRc = CreateKey( vpTag, 0 )) < XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ // find key
+ iRc = FindKey( vpTag, npTag->cpKeyBuf, npTag->iKeyLen, 0 );
+ if( iRc == XB_NOT_FOUND || iRc == XB_EMPTY || iRc == XB_EOF )
+ return iRc;
+
+ if( iRc != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+
+ // if keys are unique, and the recrd number matches, then we are good
+ if( GetUnique() )
+ return XB_NO_ERROR;
+
+ // get here if key found and not unique, need to move forward looking for correct rec no
+ xbUInt32 ulDbfRecNo = dbf->GetCurRecNo();
+ xbBool bKeysMatch = true; // keys match?
+ xbBool bCurRecsMatch = false; // cur recod number matches?
+ xbUInt32 ulIxRecNo = 0;
+ char cKeyType = GetKeyType( vpTag );
+
+ if(( iRc = GetDbfPtr( vpTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulIxRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if( ulIxRecNo == ulDbfRecNo )
+ bCurRecsMatch = true;
+
+ xbInt16 iCompRc;
+ while( !bCurRecsMatch && bKeysMatch ){
+
+ if(( iRc = GetNextKey( vpTag, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ // do compare key here
+ iCompRc = CompareKey( cKeyType, npTag->cpKeyBuf, GetKeyData( npTag->npCurNode, 0, npTag->iKeyItemLen ), (size_t) npTag->iKeyLen );
+ if( iCompRc != 0 )
+ bKeysMatch = false;
+ else{
+ if(( iRc = GetDbfPtr( vpTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulIxRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ if( ulIxRecNo == ulDbfRecNo )
+ bCurRecsMatch = true;
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::FindKeyForCurRec() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return XB_NO_ERROR;
+}
+
+/***********************************************************************/
+//! @brief Get dbf record number for given key number.
+/*!
+ \param vpTag Tag to retrieve dbf rec number on.
+ \param iKeyNo Key number for retrieval
+ \param np Pointer to node
+ \param ulDbfPtr- Output dbf record number
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxNdx::GetDbfPtr( void *vpTag, xbInt16 iKeyNo, xbIxNode *np, xbUInt32 &ulDbfPtr ) const {
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ #ifdef XB_DEBUG_SUPPORT
+ // turn this off in production mode for better performance
+ xbUInt32 ulNoOfKeys = eGetUInt32 ( np->cpBlockData );
+ if( iKeyNo < 0 || iKeyNo > (xbInt16) --ulNoOfKeys ){
+ iErrorStop = 10;
+ throw XB_INVALID_KEYNO;
+ }
+ #endif
+
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ char *p = ( np->cpBlockData);
+ p += (8 + (iKeyNo * npTag->iKeyItemLen));
+ ulDbfPtr = eGetUInt32 ( p );
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::GetDbfPtr() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Get the first key for the given tag.
+/*!
+ \param vpTag Tag to retrieve first key on.
+ \param iRetrieveSw xbTrue - Retrieve the record on success.<br>
+ xbFalse - Don't retrieve record.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::GetFirstKey( void *vpTag, xbInt16 iRetrieveSw ){
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+ // clear out any history
+ if( npTag->npNodeChain ){
+ npTag->npNodeChain = FreeNodeChain( npTag->npNodeChain );
+ npTag->npCurNode = NULL;
+ }
+ if(( iRc = ReadHeadBlock( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ // lRootBlock is now available
+ if(( iRc = GetBlock( npTag, npTag->ulRootBlock, 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ // if no keys on this node, and it's a leaf node then the index is empty
+ xbUInt32 ulKeyPtr = eGetUInt32( npTag->npCurNode->cpBlockData );
+ if( ulKeyPtr == 0 && IsLeaf( npTag, npTag->npCurNode )){
+ iRc = XB_EMPTY;
+ return iRc;
+ }
+ while( !IsLeaf( npTag, npTag->npCurNode )) // go down the chain looking for a leaf node
+ {
+ if(( iRc = GetKeyPtr( npTag, 0, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if(( iRc = GetBlock( npTag, ulKeyPtr, 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ }
+ if( iRetrieveSw ){
+ if(( iRc = GetDbfPtr( npTag, 0, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ }
+ }
+ catch( xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::GetFirstKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Get the key expression for the given tag.
+/*!
+ \param vpTag Tag to retrieve expression from.
+ \returns Key expression.
+*/
+
+xbString &xbIxNdx::GetKeyExpression( const void * vpTag ) const{
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ return npTag->sKeyExpression;
+}
+
+
+/***********************************************************************/
+//! @brief Get the key filter for the given tag.
+/*!
+ NDX index files do not support filters. This returns NULL.
+ \returns NULL.
+*/
+
+xbString &xbIxNdx::GetKeyFilter( const void * ) const{
+ return sNullString;
+}
+/***********************************************************************/
+//! @brief Get the key length for the given tag.
+/*!
+ \param vpTag Tag to retrieve key length for.
+ \returns Length of key.
+*/
+xbInt32 xbIxNdx::GetKeyLen( const void * vpTag ) const{
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ return npTag->iKeyLen;
+}
+/***********************************************************************/
+//! @brief Get child node number for given key number.
+/*!
+ \param vpTag Tag to retrieve dbf rec number on.
+ \param iKeyNo Key number for retrieval
+ \param np Pointer to node
+ \param ulKeyPtr Output node number
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::GetKeyPtr( void *vpTag, xbInt16 iKeyNo, xbIxNode *np, xbUInt32 &ulKeyPtr ) const {
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ try{
+ #ifdef XB_DEBUG_SUPPORT
+ // turn this off in production mode for better performance
+ xbUInt32 ulNoOfKeys = eGetUInt32 ( np->cpBlockData );
+ if( iKeyNo < 0 || iKeyNo > (xbInt16) ulNoOfKeys ){
+ iErrorStop = 10;
+ throw XB_INVALID_KEYNO;
+ }
+ #endif
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ char *p = ( np->cpBlockData);
+ p += (4 + (iKeyNo * npTag->iKeyItemLen));
+ ulKeyPtr = eGetUInt32 ( p );
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::GetKeyPtr() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Returns key update status.
+/*!
+ \param vpTag Tag to check status on.
+ \returns XB_UPD_KEY Key updated.<br>
+ XB_DEL_KEY Key deleted.<br>
+ XB_ADD_KEY Key added.<br>
+ 0 No key updates
+
+*/
+xbInt16 xbIxNdx::GetKeySts( void *vpTag ) const{
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ return npTag->iKeySts;
+}
+/***********************************************************************/
+//! @brief Get character key type for given tag.
+/*!
+ \param vpTag Tag to retrieve key type for.
+ \returns Char key type.
+*/
+
+char xbIxNdx::GetKeyType( const void * vpTag ) const{
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ return npTag->cKeyType;
+}
+
+/***********************************************************************/
+//! @brief Get numeric key type for given tag.
+/*!
+ \param vpTag Tag to retrieve first key for.
+ \returns Numeric key type.
+*/
+xbInt16 xbIxNdx::GetKeyTypeN( const void * vpTag ) const{
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ return npTag->iKeyType;
+}
+/***********************************************************************/
+//! @brief Get the last key for the given tag.
+/*!
+ \param vpTag Tag to retrieve last key on.
+ \param iRetrieveSw xbTrue - Retrieve the record on success.<br>
+ xbFalse - Don't retrieve record.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxNdx::GetLastKey( void *vpTag, xbInt16 iRetrieveSw ){
+ return GetLastKey( 0, vpTag, iRetrieveSw );
+// return GetLastKey( 0, vpTag, 1 );
+
+}
+/***********************************************************************/
+//! @brief Get the last key for the given tag and starting node.
+/*!
+ \param ulNodeNo Starting node
+ \param vpTag Tag to retrieve last key on.
+ \param iRetrieveSw xbTrue - Retrieve the record if key found.<br>
+ xbFalse - Don't retrieve record.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxNdx::GetLastKey( xbUInt32 ulNodeNo, void *vpTag, xbInt16 iRetrieveSw ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulKeyPtr = 0;
+ xbUInt32 ulNoOfKeys = 0;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+ // clear out any history
+ if( npTag->npNodeChain ){
+ npTag->npNodeChain = FreeNodeChain( npTag->npNodeChain );
+ npTag->npCurNode = NULL;
+ }
+ if( ulNodeNo == 0 ){
+ if(( iRc = ReadHeadBlock( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ // lRootBlock is now available
+ if(( iRc = GetBlock( npTag, npTag->ulRootBlock, 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ } else {
+ if(( iRc = GetBlock( npTag, ulNodeNo, 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ // if no keys on this node, then the index is empty
+ ulNoOfKeys = eGetUInt32( npTag->npCurNode->cpBlockData );
+ if( ulNoOfKeys == 0 && IsLeaf( npTag, npTag->npCurNode )){
+ iRc = XB_EMPTY;
+ return iRc;
+ }
+ npTag->npCurNode->iCurKeyNo = ulNoOfKeys;
+ while( !IsLeaf( npTag, npTag->npCurNode ) ){ // go down the chain looking for a leaf node
+ npTag->npCurNode->iCurKeyNo = eGetUInt32( npTag->npCurNode->cpBlockData );
+ if(( iRc = GetKeyPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if(( iRc = GetBlock( npTag, ulKeyPtr, 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ ulNoOfKeys = eGetUInt32( npTag->npCurNode->cpBlockData );
+ npTag->npCurNode->iCurKeyNo = ulNoOfKeys;
+ }
+ // get here on a leaf node, it has one fewer iCurKeyNo
+ npTag->npCurNode->iCurKeyNo--;
+ if( iRetrieveSw ){
+ ulNoOfKeys = eGetUInt32( npTag->npCurNode->cpBlockData );
+ if(( iRc = GetDbfPtr( npTag, ulNoOfKeys - 1, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::GetLastKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Get the last key for a block number.
+/*!
+ \param vpTag Tag to retrieve first key on.
+ \param ulBlockNo Block number for key retrieval.
+ \param cpBuf output buffer for key placement
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::GetLastKeyForBlockNo( void *vpTag, xbUInt32 ulBlockNo, char *cpBuf ){
+
+ // returns the last key for a given block number
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+ xbIxNode * npSaveNodeChain = npTag->npNodeChain;
+ xbIxNode * npSaveCurNode = npTag->npCurNode;
+ npTag->npNodeChain = NULL;
+
+ if(( iRc = GetLastKey( ulBlockNo, npTag, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ // set the key
+ memcpy( cpBuf, GetKeyData( npTag->npCurNode, GetKeyCount( npTag->npCurNode ) - 1, npTag->iKeyItemLen ), (size_t) npTag->iKeyLen );
+
+ // free memory
+ npTag->npNodeChain = FreeNodeChain( npTag->npNodeChain );
+ npTag->npNodeChain = npSaveNodeChain;
+ npTag->npCurNode = npSaveCurNode;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::GetLastKeyForBlockNo() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ) );
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Get the next key for the given tag.
+/*!
+ \param vpTag Tag to retrieve next key on.
+ \param iRetrieveSw xbTrue - Retrieve the record on success.<br>
+ xbFalse - Don't retrieve record.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::GetNextKey( void * vpTag, xbInt16 iRetrieveSw ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+ if( !npTag->npNodeChain )
+ return GetFirstKey( vpTag, iRetrieveSw );
+
+ // more keys on this node? if yes, get the next one to the right
+ xbUInt32 ulKeyPtr;
+ if((eGetUInt32( npTag->npCurNode->cpBlockData ) -1) > npTag->npCurNode->iCurKeyNo ){
+ npTag->npCurNode->iCurKeyNo++;
+ if(( iRc = GetDbfPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ if( iRetrieveSw ){
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ } else {
+ return iRc;
+ }
+ } else {
+ return iRc;
+ }
+ }
+ // if at end of head node, then eof
+ if( npTag->npCurNode->ulBlockNo == npTag->ulRootBlock )
+ return XB_EOF;
+
+ // This logic assumes that interior nodes have n+1 left node no's where n is he the number of keys in the node
+ xbIxNode * TempIxNode = npTag->npCurNode;
+ npTag->npCurNode = npTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+
+ while( npTag->npCurNode->iCurKeyNo >= eGetUInt32( npTag->npCurNode->cpBlockData ) &&
+ (npTag->npCurNode->ulBlockNo != npTag->ulRootBlock )){
+ TempIxNode = npTag->npCurNode;
+ npTag->npCurNode = npTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+ }
+
+ // head node and at end of head node, then eof
+ if( npTag->npCurNode->ulBlockNo == npTag->ulRootBlock &&
+ npTag->npCurNode->iCurKeyNo == eGetUInt32( npTag->npCurNode->cpBlockData ))
+ return XB_EOF;
+
+ // move one to the right
+ npTag->npCurNode->iCurKeyNo++;
+
+ if(( iRc = GetKeyPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ if(( iRc = GetBlock( npTag, ulKeyPtr, 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ while( !IsLeaf( npTag, npTag->npCurNode )) // go down the chain looking for a leaf node
+ {
+ if(( iRc = GetKeyPtr( npTag, 0, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ if(( iRc = GetBlock( npTag, ulKeyPtr, 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ }
+ if( iRetrieveSw ){
+ if(( iRc = GetDbfPtr( npTag, 0, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 90;
+ throw iRc;
+ }
+ }
+ }
+ catch( xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::GetNextKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Get the previous key for the given tag.
+/*!
+ \param vpTag Tag to retrieve previous key on.
+ \param iRetrieveSw xbTrue - Retrieve the record on success.<br>
+ xbFalse - Don't retrieve record.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxNdx::GetPrevKey( void * vpTag, xbInt16 iRetrieveSw ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ // This method assumes last index call landed on a valid key.
+ // If last call resulted in an error, this method will returns XB_BOF
+
+ try{
+ if( !npTag->npNodeChain )
+ return GetLastKey( 0, vpTag, iRetrieveSw );
+
+ xbUInt32 ulKeyPtr;
+ if( npTag->npCurNode->iCurKeyNo > 0 ){
+ npTag->npCurNode->iCurKeyNo--;
+
+ if(( iRc = GetDbfPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ if( iRetrieveSw ){
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ } else {
+ return iRc;
+ }
+ }
+ }
+
+ // next two lines might have been an issue
+ if( npTag->npCurNode->ulBlockNo == npTag->ulRootBlock && GetKeyCount( npTag->npCurNode ) == 0 && IsLeaf( npTag, npTag->npCurNode ))
+ return XB_EMPTY;
+
+ if( npTag->npCurNode->ulBlockNo == npTag->ulRootBlock )
+ return XB_BOF;
+
+ // This logic assumes that interior nodes have n+1 left node no's where n is he the number of keys in the node
+ xbIxNode * TempIxNode = npTag->npCurNode;
+ npTag->npCurNode = npTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+
+ while( npTag->npCurNode->iCurKeyNo == 0 &&
+ (npTag->npCurNode->ulBlockNo != npTag->ulRootBlock )){
+ TempIxNode = npTag->npCurNode;
+ npTag->npCurNode = npTag->npCurNode->npPrev;
+ TempIxNode = FreeNodeChain( TempIxNode );
+ }
+
+ // head node and at end of head node, then bof
+ if( npTag->npCurNode->ulBlockNo == npTag->ulRootBlock &&
+ npTag->npCurNode->iCurKeyNo == 0 )
+ return XB_BOF;
+
+ // move one to the left
+ npTag->npCurNode->iCurKeyNo--;
+
+ if(( iRc = GetKeyPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ if(( iRc = GetBlock( npTag, ulKeyPtr, 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ while( !IsLeaf( npTag, npTag->npCurNode )){ // go down the chain looking for a leaf node
+ npTag->npCurNode->iCurKeyNo = eGetUInt32( npTag->npCurNode->cpBlockData );
+ if(( iRc = GetKeyPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ if(( iRc = GetBlock( npTag, ulKeyPtr, 1, (xbUInt32) npTag->iKeyItemLen )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ }
+
+ npTag->npCurNode->iCurKeyNo = eGetUInt32( npTag->npCurNode->cpBlockData ) - 1;
+ if( iRetrieveSw ){
+ if(( iRc = GetDbfPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetRecord( ulKeyPtr )) != XB_NO_ERROR ){
+ iErrorStop = 90;
+ throw iRc;
+ }
+ }
+ }
+
+ catch( xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::GetPrevKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Get the sort order for given tag.
+/*!
+ Ndx indices only support ascending keys.
+ \returns 0
+*/
+xbBool xbIxNdx::GetSortOrder( void * ) const{
+ return 0;
+}
+/***********************************************************************/
+//! @brief Get tag for tag number.
+/*!
+ \returns Pointer to ndx tag.
+*/
+void * xbIxNdx::GetTag( xbInt16 ) const{
+ return ndxTag;
+}
+/***********************************************************************/
+//! @brief Get tag for tag name.
+/*!
+ \returns Pointer to ndx tag.
+*/
+void * xbIxNdx::GetTag( xbString & ) const{
+ return ndxTag;
+}
+
+/***********************************************************************/
+//! @brief Get tag count.
+/*!
+ NDX index files contain one tag.
+ \returns 1
+*/
+
+xbInt16 xbIxNdx::GetTagCount() const{
+ return 1;
+}
+/***********************************************************************/
+//! @brief Get tag name.
+/*!
+ \returns Tag name.
+*/
+xbString &xbIxNdx::GetTagName( void * ) const {
+// char * xbIxNdx::GetTagName( void * ) const {
+
+ return ndxTag->sTagName;
+
+}
+/***********************************************************************/
+//! @brief Get tag name.
+/*!
+ \returns Tag name.
+*/
+const char * xbIxNdx::GetTagName( void *, xbInt16 ) const {
+ return ndxTag->sTagName;
+}
+
+/***********************************************************************/
+//! @brief Get the unique setting for given tag.
+/*!
+ \param vpTag Tag to unique setting on.
+ \returns xbTrue - Unique index.<br> xbFalse - Not unique index.
+*/
+xbBool xbIxNdx::GetUnique( void * vpTag ) const{
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ return npTag->iUnique;
+}
+
+/***********************************************************************/
+//! @brief Insert key into interior node.
+/*!
+ Insert key into non-full interior node.<br>
+ Assumes valid inputs
+
+ \param vpTag Tag in play.
+ \param npNode Node for insertion.
+ \param iSlotNo Slot number to insert key.
+ \param ulPtr Pointer number to insert.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::InsertNodeI( void *vpTag, xbIxNode *npNode, xbInt16 iSlotNo, xbUInt32 ulPtr ){
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char *pTrg;
+ xbInt16 iSrcPos;
+ char *pLastKey = NULL;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+ // update number of keys on the node
+ xbInt32 lKeyCnt = GetKeyCount( npNode );
+ iSrcPos = 12 + (iSlotNo * npTag->iKeyItemLen);
+
+ char *pSrc = npNode->cpBlockData;
+ pSrc += iSrcPos;
+
+ // if not appending to the end of the node, make some room, move things to the right
+ if( iSlotNo < lKeyCnt ) {
+ xbInt16 iCopyLen = ((lKeyCnt - iSlotNo) * npTag->iKeyItemLen) - 4;
+ pTrg = pSrc;
+ pTrg += npTag->iKeyItemLen;
+ memmove( pTrg, pSrc, (size_t) iCopyLen );
+ }
+
+ // get the right most key for the left part of the split node
+ xbUInt32 ulKeyPtr2;
+ if(( iRc = GetKeyPtr( vpTag, npNode->iCurKeyNo, npNode, ulKeyPtr2 )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ // get the new right key value for the freshly split node
+ pLastKey = (char *) malloc((size_t) ndxTag->iKeyLen);
+ if(( iRc = GetLastKeyForBlockNo( vpTag, ulKeyPtr2, pLastKey )) != XB_NO_ERROR ){
+ iRc = 110;
+ throw iRc;
+ }
+ // write the key value
+ pTrg = pSrc;
+ char *pTrg2 = pSrc;
+ pSrc = pLastKey;
+ for( xbInt16 i = 0; i < npTag->iKeyLen; i++ )
+ *pTrg++ = *pSrc++;
+
+ pTrg2 += (npTag->iKeyItemLen - 8);
+ ePutUInt32( pTrg2, ulPtr );
+ ePutInt32( npNode->cpBlockData, ++lKeyCnt );
+
+ // write out the updated block to disk
+ if(( iRc = WriteBlock( npNode->ulBlockNo, GetBlockSize(), npNode->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ if( pLastKey )
+ free( pLastKey );
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::InsertNodeI() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( pLastKey )
+ free( pLastKey );
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Insert key into leaf node.
+/*!
+ Insert key into non-full leaf node.<br>
+ Assumes valid inputs
+
+ \param vpTag Tag in play.
+ \param npNode Node for insertion.
+ \param iSlotNo Slot number to insert key.
+ \param ulPtr Pointer number to insert.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxNdx::InsertNodeL( void *vpTag, xbIxNode *npNode, xbInt16 iSlotNo,
+ char * cpKeyBuf, xbUInt32 ulPtr ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char *pSrc;
+ char *pTrg;
+ char *pKeyPos;
+ xbString sMsg;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+ xbInt32 lKeyCnt = GetKeyCount( npNode );
+ xbInt16 iKeyPos = 4 + iSlotNo * npTag->iKeyItemLen;
+ pKeyPos = npNode->cpBlockData;
+ pKeyPos += iKeyPos;
+
+ // if not appending to end, make space, move things right
+ if( iSlotNo < lKeyCnt ) {
+ xbInt16 iCopyLen = (lKeyCnt - iSlotNo) * npTag->iKeyItemLen;
+ pTrg = pKeyPos;
+ pTrg += npTag->iKeyItemLen;
+ memmove( pTrg, pKeyPos, (size_t) iCopyLen );
+ }
+ // if leaf, write rec number
+ pTrg = pKeyPos;
+ memset( pTrg, 0x00, 4 );
+ pTrg += 4;
+ ePutUInt32( pTrg, ulPtr );
+ pTrg += 4;
+
+ // write the key value
+ pSrc = cpKeyBuf;
+ for( xbInt16 i = 0; i < npTag->iKeyLen; i++ )
+ *pTrg++ = *pSrc++;
+
+ // update number of keys on the node
+ ePutInt32( npNode->cpBlockData, ++lKeyCnt );
+
+ // write out the updated block to disk
+ if(( iRc = WriteBlock( npNode->ulBlockNo, GetBlockSize(), npNode->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::InsertNodeL() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Determine node leaf status
+/*!
+ \param npNode Node to examine.
+ \returns xbTrue - Leaf node.<br> xbFalse - Interior node.
+*/
+xbBool xbIxNdx::IsLeaf( void *, xbIxNode *npNode ) const {
+ xbUInt32 ulBlock = eGetUInt32 ( npNode->cpBlockData+4 );
+ if( ulBlock > 0 ) // if the second four bytes are a number, it's an interior node
+ return false;
+ else
+ return true;
+}
+/***********************************************************************/
+//! @brief Determine if key exists.
+/*!
+ This method assumes the key has already been built and is in either
+ cpKeyBuf or dKey.
+
+ \param vpTag - Pointer to tag.
+ \returns xbTrue - Key exists.<br> xbFalse - Key does not exist.
+*/
+xbInt16 xbIxNdx::KeyExists( void * vpTag ){
+
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ xbInt16 iRc = FindKey( vpTag, npTag->cpKeyBuf, npTag->iKeyLen, 0 );
+ if( iRc == 0 )
+ return 1;
+ else
+ return 0;
+}
+
+/***********************************************************************/
+//! @brief Set position for key add.
+/*!
+ This routine is called by the AddKey() method and is used to position
+ the node chain to the position the new key should be added to the index.
+
+ \param npTag Pointer to npTag.
+ \param ulAddRecNo Record number to add.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxNdx::KeySetPosAdd( xbNdxTag *npTag, xbUInt32 ulAddRecNo ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+
+ iRc = FindKey( npTag, npTag->cpKeyBuf, npTag->iKeyLen, 0 );
+ if( iRc == XB_NOT_FOUND || iRc == XB_EMPTY )
+ return XB_NO_ERROR; // good position
+
+ else if( iRc != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ // get here if key was found, get the right most instance of any non unique key for append, find correct spot for update
+ if( GetUnique() == 0 ){
+ xbUInt32 ulCurRecNo;
+ if(( iRc = GetDbfPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulCurRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ xbBool bKeysMatch = xbTrue;
+ while( bKeysMatch && ulAddRecNo > ulCurRecNo && iRc == XB_NO_ERROR ){
+ if(( iRc = GetNextKey( npTag, 0 )) == XB_NO_ERROR ){
+ if( memcmp( GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->iKeyItemLen ), npTag->cpKeyBuf, (size_t) npTag->iKeyLen ))
+ bKeysMatch = xbFalse;
+ else{
+ if(( iRc = GetDbfPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulCurRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+ }
+ }
+ }
+ if( iRc == XB_EOF ){ // eof condition
+ if(( iRc = GetLastKey( 0, npTag, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ npTag->npCurNode->iCurKeyNo++;
+ return XB_NO_ERROR;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::KeySetPos() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Set position for key add.
+/*!
+ This routine is called by the DeleteKey() method and is used to position
+ the node chain to the position the old key should be deleted from the index.
+
+ \param npTag Pointer to npTag.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::KeySetPosDel( xbNdxTag *npTag ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbString sMsg;
+
+ try{
+ iRc = FindKey( NULL, npTag->cpKeyBuf2, npTag->iKeyLen, 0 );
+ if( iRc == XB_NOT_FOUND || iRc == XB_EMPTY )
+ return XB_NO_ERROR; // good position
+ else if( iRc != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ xbUInt32 ulIxRecNo;
+ if(( iRc = GetDbfPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulIxRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ if( ulIxRecNo == dbf->GetCurRecNo())
+ return XB_NO_ERROR;
+ if( GetUnique() == 1 ){
+ iErrorStop = 40;
+ iRc = XB_NOT_FOUND;
+ throw iRc;
+ }
+ xbBool bFound = xbFalse;
+ xbBool bKeysMatch = xbTrue;
+ while( bKeysMatch && !bFound && iRc == XB_NO_ERROR ){
+ if(( iRc = GetNextKey( npTag, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ if( memcmp( GetKeyData( npTag->npCurNode, npTag->npCurNode->iCurKeyNo, npTag->iKeyItemLen ), npTag->cpKeyBuf2, (size_t) npTag->iKeyLen )){
+ bKeysMatch = xbFalse;
+ } else {
+ if(( iRc = GetDbfPtr( npTag, npTag->npCurNode->iCurKeyNo, npTag->npCurNode, ulIxRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ if( ulIxRecNo == dbf->GetCurRecNo())
+ bFound = xbTrue;
+ }
+ }
+ if( bFound )
+ return XB_NO_ERROR;
+ else
+ return XB_NOT_FOUND;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::KeySetPosDel() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Returns key filter status.
+/*!
+ \param vpTag Tag to check status on.
+ \returns xbtrue - Key was updated.<br>xbFalse - Key not updated.
+
+ Always true for NDX style indices.
+*/
+//inline xbBool xbIxNdx::KeyFiltered( void *vpTag ) const{
+// return xbTrue;
+//}
+
+/***********************************************************************/
+//! @brief Read head block of index file.
+/*!
+ \param iOpt 0 - Read in entire block
+ 1 - Read in only dynamic section of block
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbIxNdx::ReadHeadBlock( xbInt16 iOpt = 0 ) {
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ try{
+ if( !FileIsOpen()){
+ iRc = XB_NOT_OPEN;
+ iErrorStop = 10;
+ throw iRc;
+ }
+ xbInt16 iLen;
+ iOpt == 0 ? iLen = 512 : iLen = 21;
+
+ if(( iRc = ReadBlock( (xbUInt32) 0, (size_t) iLen, cNodeBuf )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ char *p = cNodeBuf;
+ ndxTag->ulRootBlock = eGetUInt32( p ); p+=4;
+ ndxTag->ulTotalBlocks = eGetUInt32( p ); p+=5;
+ if( iOpt == 0 ){
+ ndxTag->cKeyType = *p; p+=3;
+ ndxTag->iKeyLen = eGetInt16( p ); p+=2;
+ ndxTag->iKeysPerBlock = eGetInt16( p ); p+=2;
+ ndxTag->iKeyType = eGetInt16( p ); p+=2;
+ ndxTag->iKeyItemLen = eGetInt16( p ); p+=2;
+ ndxTag->cSerNo = *p; p+=3;
+ ndxTag->iUnique = *p; p++;
+ ndxTag->sKeyExpression.Set( p );
+
+ if( ndxTag->exp )
+ delete ndxTag->exp;
+
+ ndxTag->exp = new xbExp( xbase, dbf );
+ if(( iRc = ndxTag->exp->ParseExpression( ndxTag->sKeyExpression.Str() )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ if( ndxTag->cpKeyBuf )
+ free( ndxTag->cpKeyBuf );
+ if( ndxTag->cpKeyBuf2 )
+ free( ndxTag->cpKeyBuf2 );
+
+ ndxTag->cpKeyBuf = (char *) malloc( (size_t) ndxTag->iKeyLen );
+ ndxTag->cpKeyBuf2 = (char *) malloc( (size_t) ndxTag->iKeyLen );
+
+ if( ndxTag->sTagName == "" )
+ GetFileNamePart( ndxTag->sTagName );
+
+ } else {
+ p+= 11;
+ ndxTag->cSerNo = *p;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::ReadHeadBlock() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Reindex a tag.
+/*!
+ \param vpTag Pointer to tag pointer.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::Reindex( void **vpTag ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ //xbNdxTag * npTag;
+ //vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ try{
+ xbString sFileName = GetFqFileName();
+ xbString sKey; // = GetKeyExpression( vpTag );
+ sKey.Set( GetKeyExpression( *vpTag ));
+ xbInt16 iUnique = GetUnique( *vpTag );
+ xbString sFilter = "";
+
+ void *vpTag2;
+ if(( iRc = CreateTag( sFileName, sKey, sFilter, 0, iUnique, xbTrue, &vpTag2 )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ xbUInt32 ulRecCnt = 0;
+ if(( iRc = dbf->GetRecordCnt( ulRecCnt )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+
+ for( xbUInt32 l = 1; l <= ulRecCnt; l++ ){
+ if(( iRc = dbf->GetRecord( l )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ if(( iRc = CreateKey( vpTag2, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ if( iUnique ){
+ iRc = CheckForDupKey( vpTag2 );
+ if( iRc != 0 ){
+ if( iRc < 0 ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ return XB_KEY_NOT_UNIQUE;
+ }
+ }
+
+ if(( iRc = AddKey( vpTag2, l )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ }
+ *vpTag = vpTag2;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::Reindex() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ return iRc;
+}
+
+
+/***********************************************************************/
+//! @brief Set current tag.
+/*!
+ For ndx indices, there is only one tag.
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbIxNdx::SetCurTag( xbInt16 ) {
+ xbIx::SetCurTag( ndxTag );
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+//! @brief Set current tag.
+/*!
+ For ndx indices, there is only one tag.
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbIxNdx::SetCurTag( xbString & ) {
+ xbIx::SetCurTag( ndxTag );
+ dbf->SetCurTag( "NDX", this, GetTag(0) );
+ return XB_NO_ERROR;
+}
+
+/***********************************************************************/
+//! @brief Split an interior node
+/*!
+
+ This routine splits an interior node into two nodes, divided by dSplitFactor.<br>
+ This behaves differently than V7 Dbase. V7 does not balance the nodes.<br>
+ For V7, if adding a key to the end of a node, it will create a right node
+ with only one key, and the left node is still full.<br><br>
+
+ Possible performance improvement options.<br>
+ Two modes when splitting:<br>
+ a) Split nodes in the middle - good for random access applications<br>
+ b) Split off right node with only one key - good for applications with
+ expectation of ascending keys added moving forward.<br>
+
+ This routine first inserts the key into the left node in the appropriate location
+ then splits the node based on the split factor setting.
+
+ \param vpTag Tag in play.
+ \param npLeft Left node to split.
+ \param npRight Right node to split.
+ \param iSlotNo Slot number for split.
+ \param ulPtr Pointer number to insert.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::SplitNodeI( void *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 ulPtr ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbNdxTag * npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+ xbDouble dSplitFactor = .5; // split the nodes 50/50
+ xbString sMsg;
+
+ try{
+ xbInt32 lKeyCnt = GetKeyCount( npLeft );
+ xbInt32 lNewLeftKeyCnt = (xbInt32) ((lKeyCnt + 1) * dSplitFactor) + 1;
+ xbInt32 lNewRightKeyCnt = lKeyCnt - lNewLeftKeyCnt;
+ xbInt16 iSrcPos;
+ xbInt16 iCopyLen;
+ char *pSrc;
+ char *pTrg;
+
+ // insert the key into the left node
+ if(( iRc = InsertNodeI( vpTag, npLeft, iSlotNo, ulPtr )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ // move the right half of the left node to the right node
+ iSrcPos = ((lNewLeftKeyCnt + 1) * npTag->iKeyItemLen) + 4;
+ iCopyLen = (lNewRightKeyCnt * npTag->iKeyItemLen) + 4;
+ pSrc = npLeft->cpBlockData;
+ pSrc += iSrcPos;
+ pTrg = npRight->cpBlockData;
+ pTrg += 4;
+ memmove( pTrg, pSrc, (size_t) iCopyLen );
+
+ // write the new key counts into the nodes
+ pTrg = npLeft->cpBlockData;
+ ePutInt32( pTrg, lNewLeftKeyCnt );
+ pTrg = npRight->cpBlockData;
+ ePutInt32( pTrg, lNewRightKeyCnt );
+
+ // write the new key counts into the nodes
+ pTrg = npLeft->cpBlockData;
+ ePutInt32( pTrg, lNewLeftKeyCnt );
+ pTrg = npRight->cpBlockData;
+ ePutInt32( pTrg, lNewRightKeyCnt );
+
+ // write out the block
+ if(( iRc = WriteBlock( npLeft->ulBlockNo, GetBlockSize(), npLeft->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ // write out the block
+ if(( iRc = WriteBlock( npRight->ulBlockNo, GetBlockSize(), npRight->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::SplitNodeI() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Split a leaf node.
+/*!
+ This routine splits an index leaf into two nodes, divided by dSplitFactor.<br>
+ This behaves differently than V7 Dbase. V7 does not balance the nodes.<br>
+ For V7, if adding a key to the end of a node, it will create a right node
+ with only one key, and the left node is still full.<br><br>
+
+ Possible performance improvement options.<br>
+ Two modes when splitting:<br>
+ a) Split nodes in the middle - good for random access applications<br>
+ b) Split off right node with only one key - good for applications with
+ expectation of ascending keys added moving forward.<br>
+
+ This routine first inserts the key into the left node in the appropriate location
+ then splits the node based on the split factor setting.
+
+ \param vpTag Tag in play.
+ \param npLeft Left node to split.
+ \param npRight Right node to split.
+ \param iSlotNo Slot number for split.
+ \param ulPtr Pointer number to insert.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::SplitNodeL( void *vpTag, xbIxNode * npLeft, xbIxNode *npRight,
+ xbInt16 iSlotNo, char * cpKeyBuf, xbUInt32 ulPtr ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbDouble dSplitFactor = .5;
+ xbNdxTag *npTag;
+ vpTag ? npTag = (xbNdxTag *) vpTag : npTag = ndxTag;
+
+ xbString sMsg;
+ try{
+ xbInt32 lKeyCnt = GetKeyCount( npLeft );
+ xbInt32 lNewLeftKeyCnt = (xbInt32) ((lKeyCnt + 1) * dSplitFactor) + 1;
+ xbInt32 lNewRightKeyCnt = lKeyCnt + 1 - lNewLeftKeyCnt;
+
+ // xbInt16 iSrcPos;
+ xbInt16 iLen;
+ char *pSrc = npLeft->cpBlockData;
+ char *pTrg;
+
+ if(( iRc = InsertNodeL( vpTag, npLeft, iSlotNo, cpKeyBuf, ulPtr )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ // move right half off of left node to the right node
+ pSrc = npLeft->cpBlockData;
+ pSrc += ((lNewLeftKeyCnt * npTag->iKeyItemLen)+4);
+ pTrg = npRight->cpBlockData;
+ pTrg += 4;
+ iLen = lNewRightKeyCnt * npTag->iKeyItemLen;
+ memmove( pTrg, pSrc, (size_t) iLen );
+
+ // write the new key counts into the nodes
+ pTrg = npLeft->cpBlockData;
+ ePutInt32( pTrg, lNewLeftKeyCnt );
+ pTrg = npRight->cpBlockData;
+ ePutInt32( pTrg, lNewRightKeyCnt );
+
+ // write out the block
+ if(( iRc = WriteBlock( npLeft->ulBlockNo, GetBlockSize(), npLeft->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ // write out the block
+ if(( iRc = WriteBlock( npRight->ulBlockNo, GetBlockSize(), npRight->cpBlockData )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::SplitNodeL() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief UpdateTagKey
+/*!
+ This routine updates a key or a given tag.
+ The file header is considered to be the first 2048 bytes in the file.
+
+ \param cAction A - Add a key.<br>
+ D - Delete a key.<br>
+ R - Revise a key.<br>
+ \param vpTg - Pointer to tag.<br>
+ \param ulRecNo - Record number association with the action.<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbIxNdx::UpdateTagKey( char cAction, void *vpTag, xbUInt32 ulRecNo ){
+
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ // ..xbNdxTag *npTag = (xbMdxTag *) vpTag;
+
+ try{
+ // save off any needed fileds for updating
+ // xbUInt32 ulTagSizeSave = mpTag->ulTagSize;
+ //xbUInt32 ulLeftChildSave = mpTag->ulLeftChild;
+ //xbUInt32 ulRightChildSave = mpTag->ulRightChild;
+
+
+ if( cAction == 'D' || cAction == 'R' ){
+// std::cout << "UpdateTagKey delete\n";
+ if(( iRc = DeleteKey( vpTag )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+
+ if( cAction == 'A' || cAction == 'R' ){
+// std::cout << "UpdateTagKey add\n";
+ if(( iRc = AddKey( vpTag, ulRecNo )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ }
+
+// if( ulTagSizeSave != mpTag->ulTagSize ){
+// std::cout << "UpdateTagKey - tag size was updated need to do something here\n";
+// }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::UpdateTagKey() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Write head block.
+/*!
+ Commit the index head node to disk.
+ \param iOpt 0 - Entire header.<br>
+ 1 - Update root block, number of blocks and seq number.<br>
+ 2 - Update sequence number only<br>
+ \returns <a href="xbretcod_8h.html">
+*/
+
+xbInt16 xbIxNdx::WriteHeadBlock( xbInt16 iOpt ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ if( iOpt == 2 ){
+
+ // increment the serial number
+ if( ndxTag->cSerNo >= 0 && ndxTag->cSerNo < 127 )
+ ndxTag->cSerNo++;
+ else
+ ndxTag->cSerNo = 0;
+
+ if(( iRc = xbFseek( 20, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ if(( iRc = xbFputc( ndxTag->cSerNo )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+ } else if( iOpt == 1 ){
+ xbRewind();
+ char buf[8];
+ ePutUInt32( &buf[0], ndxTag->ulRootBlock );
+ ePutUInt32( &buf[4], ndxTag->ulTotalBlocks );
+ if(( iRc = xbFwrite( buf, 8, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ return WriteHeadBlock( 2 );
+
+ } else if ( iOpt == 0 ){
+
+ char buf[512];
+ memset( buf, 0x00, 512 );
+ ePutUInt32( &buf[0], ndxTag->ulRootBlock );
+ ePutUInt32( &buf[4], ndxTag->ulTotalBlocks );
+ buf[9] = ndxTag->cKeyType;
+ buf[11] = 0x1B;
+ ePutInt16( &buf[12], ndxTag->iKeyLen );
+ ePutInt16( &buf[14], ndxTag->iKeysPerBlock );
+ ePutInt16( &buf[16], ndxTag->iKeyType );
+ ePutInt16( &buf[18], ndxTag->iKeyItemLen );
+ if( ndxTag-> iUnique ) buf[23] = 0x01;
+
+ for( xbUInt32 i = 0; i < ndxTag->sKeyExpression.Len(); i++ )
+ buf[i+24] = ndxTag->sKeyExpression.GetCharacter(i+1);
+
+ xbRewind();
+ if(( iRc = xbFwrite( buf, 512, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 300;
+ throw iRc;
+ }
+ } else {
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbIxNdx::WriteHeadBlock() Exception Caught. Error Stop = [%d] iRc = [%d] option = [%d] ser=[%d]", iErrorStop, iRc, iOpt, ndxTag->cSerNo );
+ xbase->WriteLogMessage( sMsg );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_NDX_SUPPORT */
+
+
+
diff --git a/src/core/xblog.cpp b/src/core/xblog.cpp
new file mode 100755
index 0000000..ea7c9d6
--- /dev/null
+++ b/src/core/xblog.cpp
@@ -0,0 +1,208 @@
+/* xblog.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#include "xbase.h"
+//#include <time.h>
+
+#ifdef XB_LOGGING_SUPPORT
+
+namespace xb{
+
+/******************************************************************************/
+//! @brief Constructor.
+xbLog::xbLog() : xbFile( NULL ){
+
+ SetDirectory( GetDefaultLogDirectory());
+ SetFileName ( GetDefaultLogFileName());
+
+ bLoggingStatus = xbFalse;
+ lLogSize = 50000;
+
+ #ifdef XB_LOCKING_SUPPORT
+ iShareMode = XB_MULTI_USER;
+ #else
+ iShareMode = XB_SINGLE_USER;
+ #endif
+}
+/******************************************************************************/
+//! @brief Constructor.
+/*!
+ \param sLogFileName - Log file name.
+*/
+xbLog::xbLog( const xbString & sLogFileName ) : xbFile( NULL ){
+ if( sLogFileName.GetPathSeparator())
+ SetFqFileName( sLogFileName ); // file name includes a path
+ else
+ SetFileName( sLogFileName ); // no file path
+
+ bLoggingStatus = xbFalse;
+ lLogSize = 50000;
+
+ #ifdef XB_LOCKING_SUPPORT
+ iShareMode = XB_MULTI_USER;
+ #else
+ iShareMode = XB_SINGLE_USER;
+ #endif
+
+}
+/******************************************************************************/
+//! @brief Deconstructor.
+xbLog::~xbLog(){
+ xbFclose();
+}
+/******************************************************************************/
+//! @brief Get the current log status
+/*!
+ \returns xbTrue - Logging turned on.<br>xbFalse - Logging turned off.
+*/
+xbBool xbLog::LogGetStatus(){
+ return bLoggingStatus;
+}
+/******************************************************************************/
+//! @brief Close the logfile.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbLog::LogClose(){
+ return xbFclose();
+}
+/******************************************************************************/
+//! @brief Set maximum log file size.
+/*!
+ \param lSize - New maximum log file size.
+ \returns void
+*/
+void xbLog::LogSetLogSize( size_t lSize ){
+ lLogSize = lSize;
+}
+/******************************************************************************/
+//! @brief Set log status.
+/*!
+ \param bStatus xbTrue - Turn logging on.<br>xbFalse - Turn logging off.
+ \returns void
+*/
+void xbLog::LogSetStatus( xbBool bStatus ){
+ bLoggingStatus = bStatus;
+}
+/******************************************************************************/
+//! @brief Open the logfile.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbLog::LogOpen(){
+ xbInt16 rc;
+ if(( rc = xbFopen( "a", iShareMode )) != XB_NO_ERROR )
+ return rc;
+ xbFTurnOffFileBuffering();
+ return XB_NO_ERROR;
+}
+/******************************************************************************/
+//! @brief Write a logfile message.
+/*!
+ \param sLogEntryData - Message to write to the logfile.
+ \param iOutputOption 0 - Write to logfile.<br>
+ 1 - Write to stdout.<br>
+ 2 - Write to both logfile and stdout.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbLog::LogWrite( const xbString &sLogEntryData, xbInt16 iOutputOption ){
+
+ if( bLoggingStatus == xbFalse ){ // logging turned off
+ return XB_NO_ERROR;
+ }
+ xbInt16 rc = 0;
+ if( iOutputOption != 1 && !FileIsOpen() ){
+ if(( rc = LogOpen()) != XB_NO_ERROR ){
+ fprintf( stderr, "Error - cant write to logfile\n" );
+ return rc;
+ }
+ }
+ if( iOutputOption != 1 && lLogSize < xbFtell()){
+ xbFputs( "Swapping to next log file" );
+ xbFclose();
+ xbString sBackupName;
+ sBackupName.Sprintf( "%s.bak", GetFqFileName().Str());
+ if( FileExists( sBackupName ))
+ xbRemove( sBackupName );
+
+ xbRename( GetFqFileName(), sBackupName );
+ xbFopen( "a", iShareMode );
+ }
+ xbString sTimeStamp;
+ xbString sFled; // formatted log entry data
+
+ if( iOutputOption != 1 ){
+ #ifdef HAVE__LOCALTIME64_S_F
+ __time64_t timer;
+ struct tm tb;
+ _time64( &timer );
+ _localtime64_s( &tb, &timer );
+ tb.tm_year += 1900;
+ tb.tm_mon++;
+ sTimeStamp.Sprintf( "%4d-%02d-%02d %02d:%02d:%02d", tb.tm_year, tb.tm_mon, tb.tm_mday, tb.tm_hour, tb.tm_min, tb.tm_sec );
+ #else
+ time_t timer;
+ struct tm *tb;
+ timer = time( NULL );
+ tb = localtime( &timer );
+ tb->tm_year += 1900;
+ tb->tm_mon++;
+ sTimeStamp.Sprintf( "%4d-%02d-%02d %02d:%02d:%02d", tb->tm_year, tb->tm_mon, tb->tm_mday, tb->tm_hour, tb->tm_min, tb->tm_sec );
+ #endif
+ sFled.Sprintf( "%s - %s\n", sTimeStamp.Str(), sLogEntryData.Str() );
+ }
+
+ switch( iOutputOption ){
+ case 0:
+ xbFputs( sFled );
+ break;
+ case 1:
+ std::cout << sLogEntryData << std::endl;
+ break;
+ case 2:
+ xbFputs( sFled );
+ std::cout << sLogEntryData << std::endl;
+ break;
+ }
+ return XB_NO_ERROR;
+}
+/******************************************************************************/
+//! @brief Write bytes to logfile.
+/*!
+ \param ulByteCnt - Number of bytes to write to logfile.
+ \param p - Pointer to data to write to logfile.
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbLog::LogWriteBytes( xbUInt32 ulByteCnt, const char *p ){
+
+ if( bLoggingStatus == xbFalse ) // logging turned off
+ return XB_NO_ERROR;
+ const char *p2 = p;
+ xbFputc( '[' );
+ for( xbUInt32 l = 0; l < ulByteCnt; l++ )
+ xbFputc( *p2++ );
+ xbFputc( ']' );
+ return XB_NO_ERROR;
+}
+/******************************************************************************/
+} // namespace
+#endif // XB_LOGGING_ON
+
+
+
+
diff --git a/src/core/xbmemo.cpp b/src/core/xbmemo.cpp
new file mode 100755
index 0000000..02bdbbf
--- /dev/null
+++ b/src/core/xbmemo.cpp
@@ -0,0 +1,219 @@
+/* xbmemo.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+ Base memo class
+*/
+
+#include "xbase.h"
+
+#ifdef XB_MEMO_SUPPORT
+
+namespace xb{
+
+/***********************************************************************/
+//! @brief Class Constructor.
+/*!
+ \param dbf Pointer to dbf construct.
+ \param sFileName Memo file name.
+*/
+
+xbMemo::xbMemo( xbDbf * dbf, xbString const &sFileName ) : xbFile( dbf->GetXbasePtr() ) {
+ this->dbf = dbf; /* pointer to the associated dbf class instance */
+ // xbase = dbf->GetXbasePtr(); /* pointer to the engine */
+ SetDirectory( dbf->GetDirectory());
+ SetFileName( sFileName );
+ mbb = NULL;
+ #ifdef XB_LOCKING_SUPPORT
+ bFileLocked = xbFalse;
+ #endif
+}
+/***********************************************************************/
+//! @brief Class Destructor.
+xbMemo::~xbMemo(){
+ if( mbb )
+ free( mbb );
+}
+/***********************************************************************/
+//! @brief Calculate the last data block number.
+/*!
+ \param ulLastDataBlock Output - Last used block number in the file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemo::CalcLastDataBlock( xbUInt32 & ulLastDataBlock ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ if(( iRc = xbFseek( 0, SEEK_END )) != XB_NO_ERROR )
+ return iRc;
+
+ ulLastDataBlock = (xbUInt32) xbFtell() / (xbUInt32) GetBlockSize();
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+//! @brief Close the memo file.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemo::CloseMemoFile(){
+
+ if( mbb ){
+ free( mbb );
+ mbb = NULL;
+ }
+ return xbFclose();
+}
+
+
+/***********************************************************************/
+//! @brief Get memo file type.
+/*!
+ \returns 3 - Version 3 memo file.<br>
+ 4 - Version 4 memo file.
+*/
+xbInt16 xbMemo::GetMemoFileType(){
+ return iMemoFileType;
+}
+
+/***********************************************************************/
+//! @brief Get next block available from file header.
+/*!
+ \param ulBlockNo Output - Next block number for appending data to memo file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemo::GetHdrNextBlock( xbUInt32 & ulBlockNo ){
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+ if(( iRc = ReadDbtHeader( 0 )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ ulBlockNo = ulHdrNextBlock;
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbmemo::GetNextAvailableBlock() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+#ifdef XB_LOCKING_SUPPORT
+//! @brief Lock memo file
+/*!
+
+ \param iLockFunction XB_LOCK<br>XB_UNLOCK
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemo::LockMemo( xbInt16 iLockFunction ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ if( iLockFunction == XB_LOCK ){
+
+ if( bFileLocked ) // already locked
+ return XB_NO_ERROR;
+
+ if( dbf->GetLockFlavor() == LK_DBASE ){
+ iRc = xbLock( XB_LOCK, LK4026531838, 1 );
+ if( iRc != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED )
+ return iRc;
+ else {
+ iErrorStop = 120;
+ throw iRc;
+ }
+ } else {
+ bFileLocked = xbTrue;
+ }
+ }
+ } else if( iLockFunction == XB_UNLOCK ){
+
+ if( !bFileLocked ) // already unlocked
+ return XB_NO_ERROR;
+
+ if( dbf->GetLockFlavor() == LK_DBASE ){
+ iRc = xbLock( XB_UNLOCK, LK4026531838, 1 );
+ if( iRc != XB_NO_ERROR ){
+ if( iRc == XB_LOCK_FAILED )
+ return iRc;
+ else {
+ iErrorStop = 140;
+ throw iRc;
+ }
+ } else {
+ bFileLocked = xbFalse;
+ }
+ }
+ } else {
+ iErrorStop = 300;
+ iRc = XB_INVALID_OPTION;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbmemo::LockMemoFile() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Get memo file lock status.
+/*!
+ \returns xbTrue - Memo file is locked.<br>
+ xbFalse - Memo file is not locked.
+*/
+xbBool xbMemo::GetMemoLocked() const {
+ return bFileLocked;
+}
+#endif
+
+/***********************************************************************/
+//! @brief Update Next Node number in file header
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemo::UpdateHeadNextNode(){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ try{
+ char buf[4];
+ ePutUInt32( buf, ulHdrNextBlock );
+ if(( iRc = xbFseek( 0, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ if(( iRc = xbFwrite( &buf, 4, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbmemo::UpdateHeadeNextNode() Exception Caught. Error Stop = [%d] iRc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_MEMO_SUPPORT */
+
diff --git a/src/core/xbmemo3.cpp b/src/core/xbmemo3.cpp
new file mode 100755
index 0000000..b5494fb
--- /dev/null
+++ b/src/core/xbmemo3.cpp
@@ -0,0 +1,590 @@
+/* xbmemo3.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+ This class is used for support dBASE V3 memo files
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_MEMO_SUPPORT
+#ifdef XB_DBF3_SUPPORT
+
+namespace xb{
+
+/***********************************************************************/
+//! @brief Class Constructor.
+/*!
+ \param dbf Pointer to dbf instance.
+ \param sFileName Memo file name.
+*/
+xbMemoDbt3::xbMemoDbt3( xbDbf * dbf, xbString const & sFileName ) : xbMemo( dbf, sFileName ){
+ iMemoFileType = 3;
+ SetBlockSize( 512 );
+}
+
+/***********************************************************************/
+//! @brief Class Deconstructor.
+xbMemoDbt3::~xbMemoDbt3(){}
+
+/***********************************************************************/
+//! @brief Abort.
+/*!
+ Abort any pending updates to the memo file.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbMemoDbt3::Abort(){
+ return XB_NO_ERROR;
+}/***********************************************************************/
+//! @brief Commit changes to memo file.
+/*!
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbMemoDbt3::Commit(){
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+//! @brief Create memo file.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt3::CreateMemoFile(){
+
+ xbInt16 rc = XB_NO_ERROR;
+ char cBuf[4];
+ if(( rc = xbFopen( "w+b", dbf->GetShareMode())) != XB_NO_ERROR )
+ return rc;
+ ulHdrNextBlock = 1L;
+ ePutUInt32( cBuf, ulHdrNextBlock );
+ if(( rc = xbFwrite( cBuf, 4, 1 ))!= XB_NO_ERROR ){
+ xbFclose();
+ return rc;
+ }
+ for(int i = 0; i < 12; i++ )
+ xbFputc( 0x00 );
+ xbFputc( 0x03 );
+ for(int i = 0; i < 495; i++ )
+ xbFputc( 0x00 );
+ if(( mbb = (void *) malloc( 512 )) == NULL ){
+ xbFclose();
+ return XB_NO_MEMORY;
+ }
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+//! @brief Dump memo file header.
+/*!
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbMemoDbt3::DumpMemoFreeChain() {
+ std::cout << "Xbase version 3 file - no free block chain" << std::endl;
+ return XB_NO_ERROR;
+}
+
+//! @brief Dump memo file header.
+/*!
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbMemoDbt3::DumpMemoHeader(){
+ xbInt16 rc = XB_NO_ERROR;
+ xbUInt64 stFileSize;
+ if(( rc = ReadDbtHeader( 1 )) != XB_NO_ERROR )
+ return rc;
+ GetFileSize( stFileSize );
+ std::cout << "Version 3 Memo Header Info" << std::endl;
+ std::cout << "Memo File Name = " << GetFqFileName() << std::endl;
+ std::cout << "Next Available Block = " << ulHdrNextBlock << std::endl;
+ std::cout << "Memo File Version = " << (xbInt16) cVersion << " (";
+ BitDump( cVersion );
+ std::cout << ")" << std::endl;
+ std::cout << "Block Size = " << GetBlockSize() << std::endl;
+ std::cout << "File Size = " << stFileSize << std::endl;
+ std::cout << "Block Count = " << stFileSize / GetBlockSize() << std::endl;
+ return XB_NO_ERROR;
+}
+#endif // XB_DEBUG_SUPPORT
+/***********************************************************************/
+//! @brief Get a memo field for a given field number.
+/*!
+ \param iFieldNo Field number to retrieve data for.
+ \param sMemoData Output - string containing memo field data.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt3::GetMemoField( xbInt16 iFieldNo, xbString & sMemoData ){
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 rc = XB_NO_ERROR;
+ xbUInt32 ulScnt;
+ char *sp, *spp;
+ xbUInt32 ulBlockNo;
+ xbBool bDone = xbFalse;
+ sMemoData = "";
+ try{
+ if(( rc = dbf->GetULongField( iFieldNo, ulBlockNo )) < XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+ if( ulBlockNo == 0L ){
+ sMemoData = "";
+ return XB_NO_ERROR;
+ }
+ spp = NULL;
+ while( !bDone ){
+ if(( rc = ReadBlock( ulBlockNo++, GetBlockSize(), mbb )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+ ulScnt = 0;
+ sp = (char *) mbb;
+ while( ulScnt < 512 && !bDone ){
+ if( *sp == 0x1a && *spp == 0x1a )
+ bDone = xbTrue;
+ else{
+ ulScnt++; spp = sp; sp++;
+ }
+ }
+ sMemoData.Append( (char *) mbb, ulScnt );
+ }
+ sMemoData.ZapTrailingChar( 0x1a );
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt3::GetMemoField() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+/***********************************************************************/
+//! @brief Get a memo field length for a given field number.
+/*!
+ \param iFieldNo Field number to retrieve data for.
+ \param ulFieldLen Output - length of memo field data.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemoDbt3::GetMemoFieldLen( xbInt16 iFieldNo, xbUInt32 & ulFieldLen ){
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iScnt;
+ char *sp, *spp;
+ xbUInt32 ulBlockNo;
+ xbInt16 iNotDone;
+ try{
+ if(( rc = dbf->GetULongField( iFieldNo, ulBlockNo )) < XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+ if( ulBlockNo == 0 ){
+ ulFieldLen = 0;
+ return XB_NO_ERROR;
+ }
+ ulFieldLen = 0L;
+ spp = NULL;
+ iNotDone = 1;
+ while( iNotDone ){
+ if(( rc = ReadBlock( ulBlockNo++, GetBlockSize(), mbb )) != XB_NO_ERROR ){
+ iErrorStop = 1;
+ throw rc;
+ }
+ iScnt = 0;
+ sp = (char *) mbb;
+ while( iScnt < 512 && iNotDone ){
+ if( *sp == 0x1a && *spp == 0x1a )
+ iNotDone = 0;
+ else{
+ ulFieldLen++; iScnt++; spp = sp; sp++;
+ }
+ }
+ }
+ if( ulFieldLen > 0 ) ulFieldLen--;
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt3::GetMemoFieldLen() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+/***********************************************************************/
+//! @brief Open memo file.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt3::OpenMemoFile() {
+ xbInt16 rc = XB_NO_ERROR;
+ if(( rc = xbFopen( dbf->GetOpenMode(), dbf->GetShareMode())) != XB_NO_ERROR )
+ return rc;
+ if(( mbb = (void *) malloc( 512 )) == NULL ){
+ xbFclose();
+ return XB_NO_MEMORY;
+ }
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+//! @brief Pack memo file.
+/*!
+ This routine frees up any unused blocks in the file resulting from field updates.
+ Version 3 memo files do not reclaim unused space (Version 4 files do).
+ This routine cleans up the unused space.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemoDbt3::PackMemo( void (*memoStatusFunc ) ( xbUInt32 ulItemNum, xbUInt32 ulNumItems ))
+{
+ xbInt16 iRc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char * cBlock = NULL;
+
+ #ifdef XB_LOCKING_SUPPORT
+ xbInt16 iAutoLock = dbf->GetAutoLock();
+ xbBool bTableLocked = xbFalse;
+ xbBool bMemoLocked = xbFalse;
+ #endif
+
+ try{
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && !dbf->GetTableLocked() ){
+ if(( iRc = dbf->LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ } else {
+ bTableLocked = xbTrue;
+ }
+ if(( iRc = LockMemo( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ } else {
+ bMemoLocked = xbTrue;
+ }
+ }
+ #endif
+
+ // create temp file
+ xbString sTempMemoName;
+ if(( iRc = CreateUniqueFileName( GetDirectory(), "dbt", sTempMemoName )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ xbMemoDbt3 *pMemo = new xbMemoDbt3( dbf, sTempMemoName );
+ if(( iRc = pMemo->CreateMemoFile()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ // for dbase III, block size is always 512, don't need to reset it
+ // for each record in dbf
+ xbUInt32 ulRecCnt;
+ if(( iRc = dbf->GetRecordCnt( ulRecCnt )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ xbInt32 lFldCnt = dbf->GetFieldCnt();
+ char cFldType;
+ xbString sMemoFldData;
+
+ for( xbUInt32 ulI = 1; ulI <= ulRecCnt; ulI++ ){
+ if(( iRc = dbf->GetRecord( ulI )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if( (void *) memoStatusFunc )
+ (*memoStatusFunc) ( ulI, ulRecCnt );
+
+ // for each memo field
+ for( xbInt32 lFc = 0; lFc < lFldCnt; lFc++ ){
+ if(( iRc = dbf->GetFieldType( lFc, cFldType )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ if( cFldType == 'M' ){
+ // copy it to work field
+ if(( iRc = dbf->GetMemoField( lFc, sMemoFldData )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ // write it to new field
+ if(( iRc = pMemo->UpdateMemoField( lFc, sMemoFldData )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ }
+ }
+ }
+
+ //copy target back to source
+ xbUInt32 ulBlkSize = GetBlockSize();
+ xbUInt64 ullFileSize;
+ if(( iRc = pMemo->GetFileSize( ullFileSize )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw iRc;
+ }
+ // file size should be evenly divisible by block size
+ xbUInt32 ulBlkCnt;
+
+ if( ullFileSize % ulBlkSize ){
+ iErrorStop = 90;
+ throw iRc;
+ } else {
+ ulBlkCnt = (xbUInt32) (ullFileSize / ulBlkSize);
+ }
+ if(( iRc = xbTruncate( 0 )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ if(( cBlock = (char *) malloc( (size_t) ulBlkSize )) == NULL ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ // can't rename files in a multiuser, cross platform environment, causes issues
+ // copy work table back to source table
+ for( xbUInt32 ulBc = 0; ulBc < ulBlkCnt; ulBc++ ){
+ if(( iRc = pMemo->ReadBlock( ulBc, ulBlkSize, cBlock )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ if(( iRc = WriteBlock( ulBc, ulBlkSize, cBlock )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ }
+ //close and delete target
+ if(( iRc = pMemo->xbFclose()) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ if(( iRc = pMemo->xbRemove()) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ free( cBlock );
+ delete pMemo;
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && !dbf->GetTableLocked() ){
+ if(( iRc = dbf->LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ if(( iRc = LockMemo( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+ }
+ #endif
+ }
+ catch (xbInt16 iRc ){
+ free( cBlock );
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( bTableLocked )
+ dbf->LockTable( XB_UNLOCK );
+ if( bMemoLocked )
+ LockMemo( XB_UNLOCK );
+ #endif
+
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt3::PackMemo() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+//! @brief Read dbt header file.
+/*!
+ \param iOption 0 --> read only first four bytes<br>
+ 1 --> read the entire thing
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt3::ReadDbtHeader( xbInt16 iOption ){
+ char *p;
+ char MemoBlock[20];
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulReadSize;
+
+ try{
+ if( !FileIsOpen() ){
+ iErrorStop = 10;
+ rc = XB_NOT_OPEN;
+ throw rc;
+ }
+ if( iOption == 0 )
+ ulReadSize = 4;
+ else{
+ xbUInt64 stFileSize = 0;
+ if(( rc = GetFileSize( stFileSize )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+ if( stFileSize < 4 ){
+ iErrorStop = 30;
+ rc = XB_INVALID_BLOCK_NO;
+ throw rc;
+ }
+ else if( stFileSize > 20 )
+ ulReadSize = 40;
+ else
+ ulReadSize = 4;
+ }
+ if( xbFseek( 0, SEEK_SET )){
+ iErrorStop = 50;
+ rc = XB_SEEK_ERROR;
+ throw rc;
+ }
+ if(( xbFread( &MemoBlock, ulReadSize, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ rc = XB_READ_ERROR;
+ throw rc;
+ }
+ p = MemoBlock;
+ ulHdrNextBlock = eGetUInt32( p );
+
+ if( iOption == 0)
+ return XB_NO_ERROR;
+
+ if( ulReadSize >= 20 ){
+ p+=16;
+ cVersion = *p;
+ }
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt3::ReadDbtHeader() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+/***********************************************************************/
+//! @brief Update header name.
+/*!
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbMemoDbt3::UpdateHeaderName(){
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+//! @brief Update a memo field for a given field number.
+/*!
+ \param iFieldNo Field number to update data for.
+ \param sMemoData Data to update memo field data with.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt3::UpdateMemoField( xbInt16 iFieldNo, const xbString & sMemoData ) {
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 rc = XB_NO_ERROR;
+ try{
+ if( sMemoData == "" ){
+ if(( rc = dbf->PutField( iFieldNo, "" )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+ } else {
+ xbUInt32 ulDataLen = sMemoData.Len() + 2;
+ xbUInt32 ulBlocksNeeded = (ulDataLen / 512) + 1;
+ xbUInt32 ulLastDataBlock;
+ if(( rc = CalcLastDataBlock( ulLastDataBlock )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+ if(( rc = xbFseek( ((xbInt64) ulLastDataBlock * 512), SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw rc;
+ }
+ if(( rc = xbFwrite( sMemoData.Str(), sMemoData.Len(), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw rc;
+ }
+ if(( rc = xbFputc( 0x1a, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw rc;
+ }
+ if(( rc = xbFputc( 0x00, (xbInt32) ( ulBlocksNeeded * 512 ) - (xbInt32) ulDataLen )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw rc;
+ }
+ if(( rc = dbf->PutULongField( iFieldNo, ulLastDataBlock )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw rc;
+ }
+ ulHdrNextBlock = ulLastDataBlock + ulBlocksNeeded;
+ if(( rc = UpdateHeadNextNode()) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw rc;
+ }
+ }
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt3::UpdateMemoField() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+
+/***********************************************************************/
+//! @brief Empty the memo file.
+/*!
+ This routine clears everything out of the file. It does not address the
+ block pointers on the dbf file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemoDbt3::Zap(){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ char cBuf[4];
+
+ try{
+ ulHdrNextBlock = 1L;
+ ePutUInt32( cBuf, ulHdrNextBlock );
+
+ if(( iRc != xbFseek( 0, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ if(( iRc != xbFwrite( cBuf, 4, 1 ))!= XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ if(( iRc != xbTruncate( 512 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt3::Zap() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_DBF3_SUPPORT */
+#endif /* XB_MEMO_SUPPORT */
diff --git a/src/core/xbmemo4.cpp b/src/core/xbmemo4.cpp
new file mode 100755
index 0000000..4f92d2b
--- /dev/null
+++ b/src/core/xbmemo4.cpp
@@ -0,0 +1,1372 @@
+/* xbmemo4.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+ This class is used for support dBASE V4 memo files
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_MEMO_SUPPORT
+#ifdef XB_DBF4_SUPPORT
+
+namespace xb{
+
+/***********************************************************************/
+//! @brief Class Constructor.
+/*!
+ \param dbf Pointer to dbf instance.
+ \param sFileName Memo file name.
+*/
+xbMemoDbt4::xbMemoDbt4( xbDbf * dbf, xbString const & sFileName ) : xbMemo( dbf, sFileName ){
+ iMemoFileType = 4;
+ SetBlockSize( dbf->GetCreateMemoBlockSize() );
+}
+
+/***********************************************************************/
+//! @brief Class Deconstructor.
+xbMemoDbt4::~xbMemoDbt4(){}
+
+/***********************************************************************/
+//! @brief Abort.
+/*!
+ Abort any pending updates to the memo file.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbMemoDbt4::Abort(){
+
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulBlockNo;
+
+ try{
+ xbUInt32 ulNodeCnt = llNewBlocks.GetNodeCnt();
+ for( xbUInt32 l = 0; l < ulNodeCnt; l++ ){
+ if(( rc = llNewBlocks.RemoveFromFront( ulBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+ if(( rc = FreeMemoBlockChain( ulBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+ }
+ llOldBlocks.Clear();
+ }
+
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::Abort() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+
+/***********************************************************************/
+//! @brief Commit changes to memo file.
+/*!
+ Commit any pending updates to the memo file.
+ \returns XB_NO_ERROR.
+*/
+xbInt16 xbMemoDbt4::Commit(){
+
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulBlockNo;
+
+ try{
+ xbUInt32 ulNodeCnt = llOldBlocks.GetNodeCnt();
+ for( xbUInt32 l = 0; l < ulNodeCnt; l++ ){
+ if(( rc = llOldBlocks.RemoveFromFront( ulBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+ if(( rc = FreeMemoBlockChain( ulBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+ }
+ llNewBlocks.Clear();
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::Commit() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+/***********************************************************************/
+//! @brief Create memo file.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt4::CreateMemoFile(){
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 rc = XB_NO_ERROR;
+ char cBuf[4];
+
+ try{
+ if(( rc = xbFopen( "w+b", dbf->GetShareMode() )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+
+ ulHdrNextBlock = 1L;
+ ePutUInt32( cBuf, ulHdrNextBlock );
+ if(( rc = xbFwrite( cBuf, 4, 1 ))!= XB_NO_ERROR ){
+ iErrorStop = 20;
+ xbFclose();
+ throw rc;
+ }
+ for(int i = 0; i < 4; i++ )
+ xbFputc( 0x00 );
+ GetFileNamePart( sDbfFileNameWoExt );
+ sDbfFileNameWoExt.PadRight( ' ', 8 ); // need at least eight bytes of name
+ sDbfFileNameWoExt = sDbfFileNameWoExt.Mid( 1, 8 ); // need no more than eight bytes of name
+ for( int i = 1; i < 9; i++ )
+ xbFputc( sDbfFileNameWoExt[i] );
+
+ for(int i = 0; i < 4; i++ )
+ xbFputc( 0x00 );
+
+ ePutInt16( cBuf, GetBlockSize());
+ if(( rc = xbFwrite( cBuf, 2, 1 ))!= XB_NO_ERROR ){
+ iErrorStop = 60;
+ xbFclose();
+ throw rc;
+ }
+ for( xbUInt32 i = 0; i < (GetBlockSize() - 22); i++ )
+ xbFputc( 0x00 );
+ if(( mbb = (void *) malloc( GetBlockSize())) == NULL ){
+ rc = XB_NO_MEMORY;
+ iErrorStop = 80;
+ return XB_NO_MEMORY;
+ }
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::CreateMemoFile() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ xbFclose();
+ }
+ return rc;
+}
+/***********************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+//! @brief Dump memo file header.
+/*!
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbMemoDbt4::DumpMemoFreeChain()
+{
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulCurBlock, ulLastDataBlock;
+
+ try{
+ if(( rc = ReadDbtHeader(1)) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+ if(( rc = CalcLastDataBlock( ulLastDataBlock )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+
+ ulCurBlock = ulHdrNextBlock;
+ std::cout << "**********************************" << std::endl;
+ std::cout << "Head Node Next Block = " << ulCurBlock << std::endl;;
+ std::cout << "Total blocks in file = " << ulLastDataBlock << std::endl;
+
+ while( ulCurBlock < ulLastDataBlock ){
+ if(( rc = ReadBlockHeader( ulCurBlock, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw rc;
+ }
+ std::cout << "**********************************" << std::endl;
+ std::cout << "This Free Block = [" << ulCurBlock << "] contains [" << ulFreeBlockCnt << "] block(s)" << std::endl;
+ std::cout << "Next Free Block = [" << ulNextFreeBlock << "]" << std::endl;
+ ulCurBlock = ulNextFreeBlock;
+ }
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::UpdateMemoField() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return XB_NO_ERROR;
+}
+
+//! @brief Dump memo internals.
+/*!
+ \returns XB_NO_ERROR
+*/
+
+xbInt16 xbMemoDbt4::DumpMemoInternals() {
+
+ xbLinkListNode<xbUInt32> *llPtr;
+ xbInt16 iNodeCnt;
+
+ llPtr = llOldBlocks.GetHeadNode();
+ iNodeCnt = llOldBlocks.GetNodeCnt();
+
+ std::cout << "Link List Old Blocks - " << iNodeCnt << " nodes" << std::endl;
+ for( xbInt16 i = 0; i < iNodeCnt; i++ ){
+ std::cout << llPtr->GetKey() << ",";
+ llPtr = llPtr->GetNextNode();
+ }
+ std::cout << std::endl;
+
+ llPtr = llNewBlocks.GetHeadNode();
+ iNodeCnt = llNewBlocks.GetNodeCnt();
+ std::cout << "Link List New Blocks - " << iNodeCnt << " nodes" << std::endl;
+ for( xbInt16 i = 0; i < iNodeCnt; i++ ){
+ std::cout << llPtr->GetKey() << ",";
+ llPtr = llPtr->GetNextNode();
+ }
+ std::cout << std::endl;
+
+ return XB_NO_ERROR;
+}
+/***********************************************************************/
+//! @brief Dump memo file header.
+/*!
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbMemoDbt4::DumpMemoHeader(){
+
+ xbInt16 rc = XB_NO_ERROR;
+ xbUInt32 ulLastDataBlock;
+ CalcLastDataBlock( ulLastDataBlock );
+
+ if(( rc = ReadDbtHeader( 1 )) != XB_NO_ERROR )
+ return rc;
+ std::cout << "Version 4 Memo Header Info" << std::endl;
+ std::cout << "Memo File Name = " << GetFqFileName() << std::endl;
+ std::cout << "Hdr Next Avail Block = " << ulHdrNextBlock << std::endl;
+ std::cout << "Block Size = " << GetBlockSize() << std::endl;
+ std::cout << "Dbf File Name wo Ext = " << sDbfFileNameWoExt.Str() << std::endl;
+ std::cout << "Last Data Block = " << ulLastDataBlock << std::endl;
+ return rc;
+}
+#endif // XB_DEBUG_SUPPORT
+
+/************************************************************************/
+//! @brief Find an empty set of blocks in the free block chain
+/*!
+ This routine searches thruugh the free node chain in a dbase IV type
+ memo file searching for a place to grab some free blocks for reuse
+
+ \param ulBlocksNeeded The size to look in the chain for.
+ \param ulLastDataBlock is the last data block in the file, enter 0
+ for the routine to calculate it.
+ \param ulLocation The location it finds.
+ \param ulPreviousNode Block number of the node immediately previous to this node in the chain.<br>
+ 0 if header node
+ \param bFound Output xbFalse - Spot not found in chain.<br>
+ xbTrue - Spot found in chain.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemoDbt4::FindBlockSetInChain( xbUInt32 ulBlocksNeeded,
+ xbUInt32 &ulLastDataBlock, xbUInt32 &ulLocation, xbUInt32 &ulPrevNode, xbBool &bFound ){
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulCurNode;
+
+ try{
+ ulPrevNode = 0L;
+ if( ulLastDataBlock == 0 ){
+ /* Determine last good data block */
+ if(( rc = CalcLastDataBlock( ulLastDataBlock )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+ }
+ if( ulHdrNextBlock < ulLastDataBlock ){
+ ulCurNode = ulHdrNextBlock;
+
+ if(( rc = ReadBlockHeader( ulHdrNextBlock, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+ while( ulBlocksNeeded > ulFreeBlockCnt && ulNextFreeBlock < ulLastDataBlock ){
+ ulPrevNode = ulCurNode;
+ ulCurNode = ulNextFreeBlock;
+ if(( rc = ReadBlockHeader( ulNextFreeBlock, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw rc;
+ }
+ }
+ if( ulBlocksNeeded <= ulFreeBlockCnt ){
+ ulLocation = ulCurNode;
+ // PreviousNode = lPrevNode;
+ bFound = xbTrue;
+ } else { // no data found and at end of chain
+ ulPrevNode = ulCurNode;
+ bFound = xbFalse;
+ }
+ } else {
+ bFound = xbFalse;
+ }
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::FindBlockSetInChain() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+/***********************************************************************/
+//! @brief Free a block.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt4::FreeMemoBlockChain( xbUInt32 ulBlockNo ){
+ xbUInt32 ulLastDataBlock;
+ return FreeMemoBlockChain( ulBlockNo, ulLastDataBlock );
+}
+
+/***********************************************************************/
+//! @brief Free a block.
+/*!
+ \param ulBlockNo The block number being deleted.
+ \param ulLastDataBlock Output - Last free block number,prior to this block.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemoDbt4::FreeMemoBlockChain( xbUInt32 ulBlockNo, xbUInt32 &ulLastDataBlock )
+{
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulNoOfFreedBlocks;
+ xbUInt32 ulLastFreeBlock = 0;
+ xbUInt32 ulLastFreeBlockCnt = 0;
+ xbUInt32 ulSaveNextFreeBlock;
+
+ // iFieldNo - The field no m\bing deleted
+ // iBlockNo - The block number being deleted
+ // iNoOfFreeBlocks - The number of blocks being freed with this delete
+ // iLastDataBlock - The next block number to allocate if more blocks needed
+ // iHdrNextBlock - The head pointer in the main header block
+ // iNextFreeBlock - The block that is immediately following the current free block to be added
+ // iLastFreeBlock - Last free block number,prior to this block
+ // iLastFreeBlockCnt - Last free block number of blocks
+
+ try{
+
+ if( ulBlockNo <= 0 ){
+ iErrorStop = 10;
+ rc =XB_INVALID_BLOCK_NO;
+ throw rc;
+ }
+
+ /* Load the first block */
+ if(( rc = ReadBlockHeader( ulBlockNo, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+
+ if( (ulFieldLen) % GetBlockSize() )
+ ulNoOfFreedBlocks = ((ulFieldLen) / GetBlockSize()) + 1L;
+ else
+ ulNoOfFreedBlocks = (ulFieldLen) / GetBlockSize();
+
+ /* Determine last good data block */
+ if(( rc = CalcLastDataBlock( ulLastDataBlock )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw rc;
+ }
+
+ if(( rc = ReadDbtHeader( 0 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw rc;
+ }
+
+ // Not an empty node chain, position to correct location in chain
+ ulNextFreeBlock = ulHdrNextBlock;
+ while( ulBlockNo > ulNextFreeBlock && ulBlockNo < ulLastDataBlock ){
+ ulLastFreeBlock = ulNextFreeBlock;
+
+ if(( rc = ReadBlockHeader( ulNextFreeBlock, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ return rc;
+ }
+ ulLastFreeBlockCnt = ulFreeBlockCnt;
+ }
+
+ // One of two outcomes at this point
+ // A) This block is combined with the next free block chain, and points to the free chain after the next free block
+ // B) This block is not combined with the next free block chain, and points to the next block
+ // (which could be the last block
+
+ // should next block should be concatonated onto the end of this set?
+ ulSaveNextFreeBlock = ulNextFreeBlock;
+ if(( ulBlockNo + ulNoOfFreedBlocks ) == ulNextFreeBlock && ulNextFreeBlock < ulLastDataBlock ){
+ if(( rc = ReadBlockHeader( ulNextFreeBlock, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw rc;
+ }
+ ulNoOfFreedBlocks += ulFreeBlockCnt;
+ ulSaveNextFreeBlock = ulNextFreeBlock;
+ }
+
+ // if this is the first set of free blocks
+ if( ulLastFreeBlock == 0 ){
+ // 1 - write out the current block
+ // 2 - update header block
+ // 3 - write header block
+ // 4 - update data field
+
+ ePutUInt32( (char *) mbb, ulSaveNextFreeBlock );
+ ePutUInt32( (char *) mbb+4, ulNoOfFreedBlocks );
+ if(( rc = WriteBlock( ulBlockNo, 8, mbb )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw rc;
+ }
+
+ ulHdrNextBlock = ulBlockNo;
+ if(( rc = UpdateHeadNextNode()) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw rc;
+ }
+ return XB_NO_ERROR;
+ }
+
+ /* determine if this block set should be added to the previous set */
+ if(( ulLastFreeBlockCnt + ulLastFreeBlock ) == ulBlockNo ){
+
+ if(( rc = ReadBlockHeader( ulLastFreeBlock, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 90;
+ throw rc;
+ }
+ ulFreeBlockCnt += ulNoOfFreedBlocks;
+
+ ePutUInt32( (char *) mbb, ulSaveNextFreeBlock );
+ ePutUInt32( (char *) mbb+4, ulFreeBlockCnt );
+ if(( rc = WriteBlock( ulLastFreeBlock, 8, mbb )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw rc;
+ }
+ return XB_NO_ERROR;
+ }
+
+ /* insert into the chain */
+ /* 1 - set the next bucket on the current node */
+ /* 2 - write this node */
+ /* 3 - go to the previous node */
+ /* 4 - insert this nodes id into the previous node set */
+ /* 5 - write previous node */
+
+ ePutUInt32( (char *) mbb, ulSaveNextFreeBlock );
+ ePutUInt32( (char *) mbb+4, ulNoOfFreedBlocks );
+ if(( rc = WriteBlock( ulBlockNo, 8, mbb )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw rc;
+ }
+
+ if(( rc = ReadBlockHeader( ulLastFreeBlock, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw rc;
+ }
+
+ ePutUInt32( (char *) mbb, ulBlockNo );
+ if(( rc = WriteBlock( ulLastFreeBlock, 8, mbb )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw rc;
+ }
+
+ }
+
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::DeleteMemoField() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+
+ return rc;
+}
+
+
+/************************************************************************/
+//! @brief Get a set of blocks from the free block chain.
+/*!
+ This routine grabs a set of blocks out of the free block chain.
+
+ \param ulBlocksNeeded The number of blocks requested.
+ \param ulLocation
+ \param ulPrevNode
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+
+xbInt16 xbMemoDbt4::GetBlockSetFromChain( xbUInt32 ulBlocksNeeded,
+ xbUInt32 ulLocation, xbUInt32 ulPrevNode )
+
+{
+
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulNextFreeBlock2;
+ xbUInt32 ulNewFreeBlocks;
+ xbUInt32 ulSaveNextFreeBlock;
+
+ try{
+ if(( rc = ReadBlockHeader( ulLocation, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+
+ if( ulBlocksNeeded == ulFreeBlockCnt ){ // grab this whole set of blocks
+ if( ulPrevNode == 0 ){ // first in the chain
+ ulHdrNextBlock = ulNextFreeBlock;
+ if(( rc = UpdateHeadNextNode()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+ }
+ else // remove out of the middle or end
+ {
+ ulNextFreeBlock2 = ulNextFreeBlock;
+ if(( rc = ReadBlockHeader( ulPrevNode, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw rc;
+ }
+ ulNextFreeBlock = ulNextFreeBlock2;
+ if(( rc = WriteBlockHeader( ulPrevNode, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw rc;
+ }
+ }
+ } else { // only take a portion of this set
+ if( ulPrevNode == 0 ){ // first in the set
+ ulHdrNextBlock = ulLocation + ulBlocksNeeded;
+ if(( rc = UpdateHeadNextNode()) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw rc;
+ }
+ ulFreeBlockCnt -= ulBlocksNeeded;
+ if(( rc = WriteBlockHeader( ulHdrNextBlock, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw rc;
+ }
+
+ }
+ else { // remove out of the middle or end
+
+ ulNewFreeBlocks = ulFreeBlockCnt - ulBlocksNeeded;
+ ulSaveNextFreeBlock = ulNextFreeBlock;
+ ulNextFreeBlock2 = ulLocation + ulBlocksNeeded;
+
+ if(( rc = ReadBlockHeader( ulPrevNode, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw rc;
+ }
+
+ ulNextFreeBlock = ulNextFreeBlock2;
+ if(( rc = WriteBlockHeader( ulPrevNode, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw rc;
+ }
+ ulFreeBlockCnt = ulNewFreeBlocks;
+ ulNextFreeBlock = ulSaveNextFreeBlock;
+ if(( rc = WriteBlockHeader( ulNextFreeBlock2, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 90;
+ throw rc;
+ }
+ }
+ }
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::GetBlockSetFromChain() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+
+/***********************************************************************/
+//! @brief Get a memo field for a given field number.
+/*!
+ \param iFieldNo Field number to retrieve data for.
+ \param sMemoData Output - string containing memo field data.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt4::GetMemoField( xbInt16 iFieldNo, xbString & sMemoData ){
+
+ xbUInt32 ulBlockNo;
+ xbUInt32 ulMemoFieldLen;
+ xbUInt32 ulMemoFieldDataLen;
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char *p = NULL;
+
+ try{
+
+ if(( rc = GetMemoFieldLen( iFieldNo, ulMemoFieldLen, ulBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+
+ if( ulBlockNo == 0L || ulMemoFieldLen == 0L )
+ sMemoData = "";
+ else{
+ ulMemoFieldDataLen = ulMemoFieldLen - 8;
+
+ if(( p = (char *)calloc(1, ulMemoFieldDataLen+1)) == NULL ){
+ iErrorStop = 20;
+ rc = XB_NO_MEMORY;
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::GetMemoField() lBlockNo = %ld Data Len = [%ld]", ulBlockNo, ulMemoFieldDataLen + 1 );
+ xbase->WriteLogMessage( sMsg.Str() );
+ throw rc;
+ }
+
+ // go to the first block of the memo field, skip past the first 8 bytes
+ if(( xbFseek( ( ulBlockNo * GetBlockSize() + 8 ), SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ rc = XB_SEEK_ERROR;
+ throw rc;
+ }
+
+ // read the memo file data into buffer pointed to by "p"
+ if(( rc = xbFread( p, ulMemoFieldDataLen, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ rc = XB_READ_ERROR;
+ throw rc;
+ }
+
+ // null terminate the string
+ char *p2;
+ p2 = p + ulMemoFieldDataLen;
+ *p2 = 0x00;
+
+ // save it to the string
+ sMemoData.Set( p, ulMemoFieldDataLen + 1 );
+ free( p );
+ }
+
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::GetMemoField() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ if( p )
+ free( p );
+ }
+ return rc;
+}
+
+/***********************************************************************/
+//! @brief Get a memo field length for a given field number.
+/*!
+ \param iFieldNo Field number to retrieve data for.
+ \param ulMemoFieldLen Output - length of memo field data.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemoDbt4::GetMemoFieldLen( xbInt16 iFieldNo, xbUInt32 &ulMemoFieldLen ){
+ xbUInt32 ulBlockNo;
+ return GetMemoFieldLen( iFieldNo, ulMemoFieldLen, ulBlockNo );
+}
+
+/***********************************************************************/
+//! @brief Get a memo field length for a given field number.
+/*!
+ \param iFieldNo Field number to retrieve data for.
+ \param ulMemoFieldLen Output - length of memo field data.
+ \param ulBlockNo Output - Starting block number.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt4::GetMemoFieldLen( xbInt16 iFieldNo, xbUInt32 &ulMemoFieldLen, xbUInt32 &ulBlockNo ){
+
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+ char cFieldType;
+
+ try{
+
+ if(( rc = dbf->GetFieldType( iFieldNo, cFieldType )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+ if( cFieldType != 'M' ){
+ iErrorStop = 20;
+ rc = XB_INVALID_MEMO_FIELD;
+ throw rc;
+ }
+ if(( rc = dbf->GetULongField( iFieldNo, ulBlockNo )) < XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw rc;
+ }
+
+ if( ulBlockNo < 1 ){
+ ulMemoFieldLen = 0;
+ return XB_NO_ERROR;
+ }
+
+ if(( rc = ReadBlockHeader( ulBlockNo, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw rc;
+ }
+ ulMemoFieldLen = ulFieldLen;
+
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::GetMemoFieldLen() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+
+/***********************************************************************/
+//! @brief Open memo file.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt4::OpenMemoFile() {
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 rc = XB_NO_ERROR;
+
+ try{
+ if(( rc = xbFopen( dbf->GetOpenMode(), dbf->GetShareMode())) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+ if(( rc = ReadDbtHeader( 1 )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+ if(( mbb = (void *) malloc( GetBlockSize())) == NULL ){
+ xbFclose();
+ iErrorStop = 30;
+ rc = XB_NO_MEMORY;
+ throw rc;
+ }
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::OpenMemoFile() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+/***********************************************************************/
+//! @brief Pack memo file.
+/*!
+ This routine frees up any unused blocks in the file resulting from field updates.
+ Version 3 memo files do not reclaim unused space (Version 4 files do).
+ This routine cleans up the unused space.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt4::PackMemo( void (*memoStatusFunc ) ( xbUInt32 ulItemNum, xbUInt32 ulNumItems )){
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ char * cBlock = NULL;
+
+ #ifdef XB_LOCKING_SUPPORT
+ xbInt16 iAutoLock = dbf->GetAutoLock();
+ xbBool bTableLocked = xbFalse;
+ xbBool bMemoLocked = xbFalse;
+ #endif
+
+ try{
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && !dbf->GetTableLocked() ){
+ if(( iRc = dbf->LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ } else {
+ bTableLocked = xbTrue;
+ }
+ if(( iRc = LockMemo( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ } else {
+ bMemoLocked = xbTrue;
+ }
+ }
+ #endif
+
+ // create temp file
+ xbString sTempMemoName;
+ if(( iRc = CreateUniqueFileName( GetDirectory(), "dbt", sTempMemoName )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ xbMemoDbt4 *pMemo = new xbMemoDbt4( dbf, sTempMemoName );
+ if(( iRc = pMemo->CreateMemoFile()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ // for dbase III, block size is always 512, don't need to reset it
+ // for each record in dbf
+ xbUInt32 ulRecCnt;
+ if(( iRc = dbf->GetRecordCnt( ulRecCnt)) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ xbInt32 lFldCnt = dbf->GetFieldCnt();
+ char cFldType;
+ xbString sMemoFldData;
+
+ for( xbUInt32 ulI = 1; ulI <= ulRecCnt; ulI++ ){
+ if(( iRc = dbf->GetRecord( ulI )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+
+ if( (void *) memoStatusFunc)
+ (*memoStatusFunc)(ulI, ulRecCnt );
+
+ // for each memo field
+ for( xbInt32 lFc = 0; lFc < lFldCnt; lFc++ ){
+ if(( iRc = dbf->GetFieldType( lFc, cFldType )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ if( cFldType == 'M' ){
+ // copy it to work field
+ if(( iRc = dbf->GetMemoField( lFc, sMemoFldData )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ // write it to new field
+ if(( iRc = pMemo->UpdateMemoField( lFc, sMemoFldData )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ }
+ }
+ }
+
+ //copy target back to source
+ xbUInt32 ulBlkSize = GetBlockSize();
+ xbUInt64 ullFileSize;
+ if(( iRc = pMemo->GetFileSize( ullFileSize )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw iRc;
+ }
+ // file size should be evenly divisible by block size
+ xbUInt32 ulBlkCnt;
+
+ if( ullFileSize % ulBlkSize ){
+ iErrorStop = 90;
+ throw iRc;
+ } else {
+ ulBlkCnt = (xbUInt32) (ullFileSize / ulBlkSize);
+ }
+ if(( iRc = xbTruncate( 0 )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+
+ if(( cBlock = (char *) malloc( ulBlkSize )) == NULL ){
+ iErrorStop = 110;
+ throw iRc;
+ }
+
+ // can't rename files in a multiuser, cross platform environment, causes issues
+ // copy work table back to source table
+
+ for( xbUInt32 ulBc = 0; ulBc < ulBlkCnt; ulBc++ ){
+ if(( iRc = pMemo->ReadBlock( ulBc, ulBlkSize, cBlock )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ if(( iRc = WriteBlock( ulBc, ulBlkSize, cBlock )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw iRc;
+ }
+ }
+
+ if(( xbFseek( 8, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ iRc = XB_SEEK_ERROR;
+ throw iRc;
+ }
+
+ for( int i = 1; i < 9; i++ )
+ xbFputc( sDbfFileNameWoExt[i] );
+
+ //close and delete target
+ if(( iRc = pMemo->xbFclose()) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw iRc;
+ }
+ if(( iRc = pMemo->xbRemove()) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc;
+ }
+ free( cBlock );
+ delete pMemo;
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( iAutoLock && !dbf->GetTableLocked() ){
+ if(( iRc = dbf->LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 200;
+ throw iRc;
+ }
+ if(( iRc = LockMemo( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc;
+ }
+ }
+ #endif
+ }
+ catch (xbInt16 iRc ){
+ free( cBlock );
+
+ #ifdef XB_LOCKING_SUPPORT
+ if( bTableLocked )
+ dbf->LockTable( XB_UNLOCK );
+ if( bMemoLocked )
+ LockMemo( XB_UNLOCK );
+ #endif
+
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::PackMemo() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/***********************************************************************/
+//! @brief Read block header.
+/*!
+ \param ulBlockNo Block to read
+ \param iOption 1 - Read fields option 1
+ 2 - Read fields option 2
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt4::ReadBlockHeader( xbUInt32 ulBlockNo, xbInt16 iOption ) {
+
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ if(( rc = ReadBlock( ulBlockNo, 8, mbb )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ rc = XB_READ_ERROR;
+ }
+ if( iOption == 1 ){
+ iField1 = eGetInt16((char *) mbb );
+ iStartPos = eGetInt16((char *) mbb+2);
+ ulFieldLen = eGetUInt32((char *) mbb+4);
+ }
+ else if( iOption == 2 ){
+ ulNextFreeBlock = eGetUInt32((char *) mbb );
+ ulFreeBlockCnt = eGetUInt32((char *) mbb+4 );
+ }
+ else{
+ iErrorStop = 20;
+ rc = XB_INVALID_OPTION;
+ throw rc;
+ }
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::ReadBlockHeader() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+/***********************************************************************/
+//! @brief Read dbt header file.
+/*!
+ \param iOption 0 --> read only first four bytes<br>
+ 1 --> read the entire thing
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt4::ReadDbtHeader( xbInt16 iOption ) {
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iReadLen = 0;
+ char *p;
+ char MemoBlock[22];
+
+ try{
+ if( !FileIsOpen() ){
+ iErrorStop = 10;
+ rc = XB_NOT_OPEN;
+ throw rc;
+ }
+ if( xbFseek( 0, SEEK_SET )){
+ iErrorStop = 20;
+ rc = XB_SEEK_ERROR;
+ throw rc;
+ }
+ if( iOption )
+ iReadLen = 22;
+ else
+ iReadLen = 4;
+
+ if(( xbFread( &MemoBlock, (size_t) iReadLen, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ rc = XB_READ_ERROR;
+ throw rc;
+ }
+
+ p = MemoBlock;
+ ulHdrNextBlock = eGetUInt32( p );
+ if( iOption == 0)
+ return XB_NO_ERROR;
+
+ p += 8;
+ sDbfFileNameWoExt = "";
+ for( int i = 0; i < 8; i++ )
+ sDbfFileNameWoExt += *p++;
+
+ p += 4;
+ SetBlockSize( (xbUInt32) eGetInt16( p ));
+
+ cVersion = MemoBlock[16];
+
+ }
+ catch (xbInt16 rc ){
+
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::ReadDbtHeader() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+
+/***********************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+//! @brief Read free block information from header.
+/*!
+ This routing pulls any reusable block information for file header.
+ Not used with version 3 memo files - stub.
+
+ \param ulBlockNo
+ \param ulNextBlock
+ \param ulFreeBlockCnt
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbMemoDbt4::ReadFreeBlockHeader( xbUInt32 ulBlockNo, xbUInt32 &ulNextBlock, xbUInt32 &ulFreeBlockCount ){
+
+ xbInt16 rc = XB_NO_ERROR;
+ rc = ReadBlockHeader( ulBlockNo, 2 );
+ ulNextBlock = ulNextFreeBlock;
+ ulFreeBlockCount = ulFreeBlockCnt;
+ return rc;
+}
+#endif
+/***********************************************************************/
+//! @brief Update header name.
+/*!
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbMemoDbt4::UpdateHeaderName() {
+
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ GetFileNamePart( sDbfFileNameWoExt );
+ sDbfFileNameWoExt.PadRight( ' ', 8 ); // need at least eight bytes of name
+ sDbfFileNameWoExt = sDbfFileNameWoExt.Mid( 1, 8 ); // need no more than eight bytes of name
+
+ try{
+ if(( rc = xbFseek( 8, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+
+ for( int i = 1; i < 9; i++ ){
+ if(( rc = xbFputc( sDbfFileNameWoExt[i] )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+ }
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::UpdateHeaderName() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+/***********************************************************************/
+//! @brief Update a memo field length for a given field number.
+/*!
+ \param iFieldNo Field number to update data for.
+ \param sMemoData Data to update memo field data with.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt4::UpdateMemoField( xbInt16 iFieldNo, const xbString & sMemoData ) {
+
+ xbInt16 iErrorStop = 0;
+ xbInt16 rc = XB_NO_ERROR;
+ xbUInt32 ulBlockNo;
+
+ try{
+
+ if(( rc = dbf->GetULongField( iFieldNo, ulBlockNo )) < XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw rc;
+ }
+
+ if( sMemoData == "" ){
+ if( ulBlockNo == 0 ){
+ /* if nothing to do, return */
+ return XB_NO_ERROR;
+ } else {
+
+ // if this is in the new blocks link list already, then this is not the first update for this memo field
+ // this would be second or third update on the field since the original change and not commited
+ // Since it won't be needed in either a Commmit() or Abort(), can be freed immediately
+ if( llNewBlocks.SearchFor( ulBlockNo ) > 0 ){
+ if(( rc = FreeMemoBlockChain( ulBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw rc;
+ }
+ if(( llNewBlocks.RemoveByVal( ulBlockNo )) < XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw rc;
+ }
+ } else {
+ // first revision, save what it was in case of Abort() command
+ if(( llOldBlocks.InsertAtFront( ulBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw rc;
+ }
+ }
+
+ if(( rc = dbf->PutField( iFieldNo, "" )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw rc;
+ }
+
+ }
+ } else {
+ // free up the old space
+ xbUInt32 ulLastDataBlock = 0L;
+
+ if( ulBlockNo > 0 ){
+ if( llNewBlocks.SearchFor( ulBlockNo ) > 0 ){
+
+ if(( rc = FreeMemoBlockChain( ulBlockNo, ulLastDataBlock )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw rc;
+ }
+ } else {
+ // first revision, save what it was in case of Abort() command
+ if(( rc = llOldBlocks.InsertAtFront( ulBlockNo )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw rc;
+ }
+ }
+ }
+ // should next line be unsigned 32 bit int?
+ xbUInt32 ulTotalLen = 8 + sMemoData.Len();
+ xbUInt32 ulBlocksNeeded;
+ if( ulTotalLen % GetBlockSize())
+ ulBlocksNeeded = ulTotalLen / GetBlockSize() + 1;
+ else
+ ulBlocksNeeded = ulTotalLen / GetBlockSize();
+
+ xbBool bUsedBlockFound;
+ xbUInt32 ulHeadBlock;
+ xbUInt32 ulPrevNode;
+ if(( rc = FindBlockSetInChain( ulBlocksNeeded, ulLastDataBlock, ulHeadBlock, ulPrevNode, bUsedBlockFound )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw rc;
+ }
+ iField1 = -1;
+ iStartPos = 8;
+ ulFieldLen = sMemoData.Len() + 8;
+
+ if( bUsedBlockFound ){
+
+ if(( rc = GetBlockSetFromChain( ulBlocksNeeded, ulHeadBlock, ulPrevNode )) != XB_NO_ERROR ){
+ iErrorStop = 90;
+ throw rc;
+ }
+
+ if(( rc = WriteBlockHeader( ulHeadBlock, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw rc;
+ }
+
+ if(( rc = xbFwrite( sMemoData.Str(), sMemoData.Len(), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw rc;
+ }
+
+ } else { // append to the end
+
+ if(( rc = WriteBlockHeader( ulLastDataBlock, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw rc;
+ }
+
+ if(( rc = xbFwrite( sMemoData.Str(), sMemoData.Len(), 1 )) != XB_NO_ERROR ){
+ iErrorStop = 130;
+ throw rc;
+ }
+
+ if(( rc = xbFputc( 0x00, (xbInt32)((ulBlocksNeeded * GetBlockSize()) - (sMemoData.Len() + 8)))) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw rc;
+ }
+
+ if( ulLastDataBlock == ulHdrNextBlock ){ // this is first node to be added to the node chain
+ ulHdrNextBlock += ulBlocksNeeded;
+ ulHeadBlock = ulLastDataBlock;
+ if(( rc = UpdateHeadNextNode()) != XB_NO_ERROR ){
+ iErrorStop = 150;
+ throw rc;
+ }
+
+ } else { // adding memo data to the end of the file, but chain exists
+
+ ulNextFreeBlock = ulLastDataBlock + ulBlocksNeeded;
+ ulHeadBlock = ulLastDataBlock;
+ if(( rc = WriteBlockHeader( ulPrevNode, 2 )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw rc;
+ }
+ }
+ }
+
+ if(( rc = llNewBlocks.InsertAtFront( ulHeadBlock )) != XB_NO_ERROR ){ // In case of Abort(), this block needs to be freed
+ iErrorStop = 170;
+ throw rc;
+ }
+ if(( rc = dbf->PutLongField( iFieldNo, (xbInt32) ulHeadBlock )) != XB_NO_ERROR ){
+ iErrorStop = 180;
+ throw rc;
+ }
+ }
+ }
+
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::UpdateMemoField() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+
+ return rc;
+}
+/***********************************************************************/
+//! @brief Write block header.
+/*!
+ \param ulBlockNo Block to read
+ \param iOption 1 - Read fields option 1
+ 2 - Read fields option 2
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbMemoDbt4::WriteBlockHeader( xbUInt32 ulBlockNo, xbInt16 iOption ) {
+
+ xbInt16 rc = XB_NO_ERROR;
+ xbInt16 iErrorStop = 0;
+
+ try{
+ if( iOption == 1 ){
+ ePutInt16 ((char *) mbb, iField1 );
+ ePutInt16 ((char *) mbb+2, iStartPos );
+ ePutUInt32((char *) mbb+4, ulFieldLen );
+ }
+ else if( iOption == 2 ){
+ ePutUInt32((char *) mbb, ulNextFreeBlock );
+ ePutUInt32((char *) mbb+4, ulFreeBlockCnt );
+ }
+ else{
+ iErrorStop = 10;
+ rc = XB_INVALID_OPTION;
+ throw rc;
+ }
+
+ if(( rc = WriteBlock( ulBlockNo, 8, mbb )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ rc = XB_READ_ERROR;
+ }
+ }
+ catch (xbInt16 rc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::WriteHeader() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, rc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( rc ));
+ }
+ return rc;
+}
+/***********************************************************************/
+//! @brief Empty the memo file.
+/*!
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbMemoDbt4::Zap(){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ char cBuf[4];
+ try{
+ ulHdrNextBlock = 1L;
+ ePutUInt32( cBuf, ulHdrNextBlock );
+
+ if(( iRc != xbFseek( 0, SEEK_SET )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ if(( iRc != xbFwrite( cBuf, 4, 1 ))!= XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ if(( iRc != xbTruncate( GetBlockSize())) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ }
+
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbMemoDbt4::Zap() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}/***********************************************************************/
+} /* namespace */
+#endif /* XB_DBF4_SUPPORT */
+#endif /* XB_MEMO_SUPPORT */
+
diff --git a/src/core/xbssv.cpp b/src/core/xbssv.cpp
new file mode 100755
index 0000000..c595f6b
--- /dev/null
+++ b/src/core/xbssv.cpp
@@ -0,0 +1,550 @@
+/* xbssv.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+
+
+namespace xb{
+
+const xbErrorMessage xbErrorMessages[] = {
+ { XB_NO_ERROR, "No Error" },
+ { XB_NO_MEMORY, "No Memory" },
+ { XB_INVALID_OPTION, "Invalid Option" },
+ { XB_DUP_TABLE_OR_ALIAS, "Duplicate Alias/Table Name" },
+ { XB_INVALID_NODELINK, "Invalid Node Link" },
+ { XB_KEY_NOT_UNIQUE, "Key Not Unique" },
+ { XB_FILE_EXISTS, "File Already Exists" },
+ { XB_ALREADY_OPEN, "Database already open" },
+ { XB_DBF_FILE_NOT_OPEN, "DBF File Not Open" },
+ { XB_FILE_NOT_FOUND, "File not found" },
+ { XB_FILE_TYPE_NOT_SUPPORTED, "Not an Xbase type database" },
+ { XB_RENAME_ERROR, "Unable to rename file" },
+ { XB_INVALID_OBJECT, "Invalid Object" },
+ { XB_NOT_OPEN, "Database not open" },
+ { XB_NOT_FOUND, "Not Found" },
+ { XB_OPEN_ERROR, "Open Error" },
+ { XB_CLOSE_ERROR, "Close Error" },
+ { XB_SEEK_ERROR, "Seek Error" },
+ { XB_READ_ERROR, "Read Error" },
+ { XB_WRITE_ERROR, "Error writing to disk drive" },
+ { XB_EOF, "End Of File" },
+ { XB_BOF, "Beginning Of File" },
+ { XB_INVALID_BLOCK_SIZE, "Invalid Block Size" },
+ { XB_INVALID_BLOCK_NO, "Invalid Block Number" },
+ { XB_INVALID_RECORD, "Invalid Record Number" },
+ { XB_DELETE_FAILED, "Delete Failed" },
+ { XB_INVALID_TABLE_NAME, "Invalid Table Name" },
+ { XB_EMPTY, "Empty Table or Index" },
+ { XB_LIMIT_REACHED, "Limit Reached" },
+ { XB_INVALID_FIELD_TYPE, "Unknown Field Type" },
+ { XB_INVALID_FIELD_NO, "Invalid Field Number" },
+ { XB_INVALID_DATA, "Invalid Data" },
+ { XB_INVALID_FIELD_NAME, "Invalid Field Name" },
+ { XB_INVALID_MEMO_FIELD, "Not a Memo field" },
+ { XB_INVALID_FIELD, "Invalid Field" },
+ { XB_INVALID_FIELD_LEN, "Invalid Field Length" },
+ { XB_INVALID_DATE, "Invalid Date" },
+ { XB_INVALID_LOCK_OPTION, "Invalid Lock Option" },
+ { XB_LOCK_FAILED, "Lock Failed" },
+ { XB_TABLE_NOT_LOCKED, "Table Not Locked" },
+ { XB_PARSE_ERROR, "Parse Error" },
+ { XB_INVALID_FUNCTION, "Invalid or Undefined Function" },
+ { XB_INVALID_PARM, "Invalid Parm" },
+ { XB_INCONSISTENT_PARM_LENS, "Inconsistent parm lengths" },
+ { XB_INCOMPATIBLE_OPERANDS, "Incompatible operands" },
+ { XB_UNBALANCED_PARENS, "Unbalanced Parens" },
+ { XB_UNBALANCED_QUOTES, "Unbalanced Quotes" },
+ { XB_INVALID_EXPRESSION, "Invalid expression" },
+ { XB_INVALID_KEYNO, "Invalid Key Number" },
+ { XB_INVALID_INDEX, "Index File Error" },
+ { XB_INVALID_TAG, "Invalid index tag" },
+ { XB_SYNTAX_ERROR, "Invalid SQL Syntax" },
+ { XB_MAX_ERROR_NO, "End of Error List" }
+};
+// see also xbretcod.h
+
+
+xbInt16 xbSsv::iEndianType = 0;
+xbString xbSsv::sDefaultDateFormat = "MM/DD/YY";
+
+xbInt16 xbSsv::iDefaultFileVersion = 4;
+xbString xbSsv::sNullString = "";
+xbBool xbSsv::bDefaultAutoCommit = xbTrue;
+
+
+#ifdef WIN32
+xbString xbSsv::sDataDirectory = PROJECT_DATA_DIR;
+#else
+xbString xbSsv::sDataDirectory = PROJECT_DATA_DIR;
+#endif
+
+#ifdef XB_LOGGING_SUPPORT
+xbString xbSsv::sDefaultLogDirectory = PROJECT_LOG_DIR;
+xbString xbSsv::sDefaultLogFileName = PROJECT_DFLT_LOGFILE;
+#endif
+
+#ifdef XB_LOCKING_SUPPORT
+xbInt32 xbSsv::lDefaultLockWait = 100;
+xbInt16 xbSsv::iDefaultLockRetries = 3;
+xbBool xbSsv::bDefaultAutoLock = xbTrue;
+xbInt16 xbSsv::iDefaultLockFlavor = 1;
+xbBool xbSsv::bMultiUser = xbTrue;
+#else
+xbBool xbSsv::bMultiUser = xbFalse;
+#endif
+
+#if defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)
+xbInt16 xbSsv::iUniqueKeyOpt = XB_HALT_ON_DUPKEY;
+ // is one of XB_HALT_ON_DUPKEY || XB_EMULATE_DBASE
+#endif
+
+
+#ifdef XB_MDX_SUPPORT
+xbInt16 xbSsv::iCreateMdxBlockSize = 1024; // 1024 is DBase 7 default size for MDX index blocks
+#endif
+
+
+/*************************************************************************/
+//! @brief Class Constructor.
+xbSsv::xbSsv(){}
+/*************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+void xbSsv::BitDump( unsigned char c ) const {
+ for( int i = 7; i >= 0; i-- )
+ std::cout << (BitSet( c, i ) ? 1 : 0);
+}
+void xbSsv::BitDump( char c ) const {
+ BitDump( (unsigned char) c );
+}
+#endif
+/*************************************************************************/
+//! @brief Check a bit in a one byte field and see if it is set.
+/*!
+ \param c One byte char field to examine.
+ \param iBitNo which bit to examine.
+ \returns xbTrue Bit is set<br>
+ xbFalse Bit is not set
+*/
+xbBool xbSsv::BitSet( unsigned char c, xbInt16 iBitNo ) const {
+ return c & 1 << iBitNo;
+}
+
+/*************************************************************************/
+//! @brief Display error message on console for a given error number.
+/*!
+ \param iErrorCode Error number to reference
+*/
+void xbSsv::DisplayError( xbInt16 iErrorCode ) const {
+ std::cout << (const char *) GetErrorMessage( iErrorCode ) << std::endl;
+}
+/*************************************************************************/
+//! @brief Get the default auto commit setting.
+/*!
+
+ When auto commit is enabled, the library will automatically post any updates
+ when moving off an updated record or closing files.
+ If auto commit is disabled, the application program will need to explicitly
+ update the tables using using dbf->Put() and dbf->AppendRecord().
+
+ \returns xbTrue if auto commit is turned on<br>
+ xbFalse is auto commit is turned off
+*/
+
+xbBool xbSsv::GetDefaultAutoCommit() const {
+ return bDefaultAutoCommit;
+}
+
+/*************************************************************************/
+//! @brief Get the current data directory.
+/*!
+ \returns xbString containing the current data directory
+ where the database files are stored.
+*/
+
+xbString &xbSsv::GetDataDirectory() const {
+ return sDataDirectory;
+}
+/*************************************************************************/
+//! @brief Get the default date format.
+/*!
+ \returns xbString containing the default date format.
+*/
+
+xbString & xbSsv::GetDefaultDateFormat() const {
+ return sDefaultDateFormat;
+}
+
+/*************************************************************************/
+// @brief Get the default file format version.
+/*
+ \returns 3 - Dbase III file format<br>
+ 4 - Dbase IV file format<br>
+*/
+
+/*
+xbInt16 xbSsv::GetDefaultFileVersion() const {
+ return iDefaultFileVersion;
+}
+*/
+/*************************************************************************/
+//! @brief Get the Endian type.
+/*!
+ \returns B - Big endian<br>
+ L - Little endian<br>
+*/
+xbInt16 xbSsv::GetEndianType() const {
+ return iEndianType;
+}
+
+/*************************************************************************/
+//! @brief Get an error message.
+/*!
+ \param iErrorCode ErrorCode is the error number of description to be returned.
+ \returns Returns a pointer to a string containing a text description for the error code.
+*/
+
+const char * xbSsv::GetErrorMessage( xbInt16 iErrorCode ) const{
+
+ if( iErrorCode > 0 || iErrorCode <= XB_MAX_ERROR_NO )
+ return "";
+
+ xbBool bFound = xbFalse;
+ xbInt16 iCtr = 0;
+ while( !bFound ){
+ if( xbErrorMessages[iCtr].iErrorNo == XB_MAX_ERROR_NO )
+ return "Unknown Error";
+ if( xbErrorMessages[iCtr].iErrorNo == iErrorCode )
+ return xbErrorMessages[iCtr].sErrorText;
+ iCtr++;
+ }
+ return "";
+}
+
+/*************************************************************************/
+//! @brief Set the data directory.
+/*!
+ \param sDataDirectory Set the data direcroty.
+*/
+
+void xbSsv::SetDataDirectory( const xbString &sDataDirectory ){
+ this->sDataDirectory = sDataDirectory;
+
+
+ #ifdef WIN32
+ this->sDataDirectory.SwapChars( '/', '\\' );
+ #else
+ this->sDataDirectory.SwapChars( '\\', '/' );
+ #endif
+
+}
+
+/*************************************************************************/
+//! @brief Set the default date format.
+/*!
+ \param sDefaultDateFormat Set the default date format.
+*/
+
+void xbSsv::SetDefaultDateFormat( const xbString &sDefaultDateFormat ) {
+ this->sDefaultDateFormat = sDefaultDateFormat;
+}
+
+/*************************************************************************/
+//! @brief Set the default auto commit.
+/*!
+
+ Disabling auto commit requires the application execute explicit updates
+ using dbf->Put() and dbf->AppendRecord(). With auto commit on, the library
+ posts updates automatically when moving off the current record or closing
+ a file.
+
+ \param bDefaultAutoCommit xbTrue - Enable default auto commit.<br>
+ xbFalse - Disable default auto commit.<br>
+*/
+
+void xbSsv::SetDefaultAutoCommit( xbBool bDefaultAutoCommit ) {
+ this->bDefaultAutoCommit = bDefaultAutoCommit;
+}
+/*************************************************************************/
+//! @brief Set the endian type
+/*!
+ This routine determines the Endian-ness at run time instead of
+ compile time as some processers (ie; Sparc,ARM) can be switched either way.
+ This routine is called automatically by the library at startup and does not
+ need to be called in an application program.
+
+*/
+
+void xbSsv::SetEndianType() {
+ xbInt16 e = 1;
+ iEndianType = *(char *) &e;
+ if( iEndianType )
+ iEndianType = 'L';
+ else
+ iEndianType = 'B';
+ return;
+}
+
+/*************************************************************************/
+#ifdef XB_LOGGING_SUPPORT
+
+//! @brief Get the default log file name.
+/*!
+ \returns Returns the log file name.
+*/
+xbString & xbSsv::GetDefaultLogFileName() const {
+ return sDefaultLogFileName;
+}
+
+
+/*************************************************************************/
+//! @brief Get the default log directory.
+/*!
+ \returns Returns the log directory.
+*/
+xbString & xbSsv::GetDefaultLogDirectory() const {
+ return sDefaultLogDirectory;
+}
+
+
+/*************************************************************************/
+//! @brief Set the default log directory name.
+/*!
+ \param sDefaultLogDirectory Name of desired log directory.
+
+*/
+void xbSsv::SetDefaultLogDirectory( const xbString &sDefaultLogDirectory ){
+
+ this->sDefaultLogDirectory = sDefaultLogDirectory;
+
+ #ifdef WIN32
+ this->sDefaultLogDirectory.SwapChars( '/', '\\' );
+ #else
+ this->sDefaultLogDirectory.SwapChars( '\\', '/' );
+ #endif
+
+
+}
+
+#else
+
+xbString & xbSsv::GetDefaultLogFileName() const {
+ return sNullString;
+}
+
+xbString & xbSsv::GetDefaultLogDirectory() const {
+ return sNullString;
+}
+
+void xbSsv::SetDefaultLogDirectory( const xbString &sDefaultLogDirectory ){
+ return;
+}
+
+#endif
+
+
+/*************************************************************************/
+
+#ifdef XB_LOCKING_SUPPORT
+
+//! @brief Get the default lock retries.
+/*!
+ This is the number of lock attempts the libary will make before returning
+ failure if the file can not be locked.
+ \returns Default lock retry count.
+*/
+xbInt16 xbSsv::GetDefaultLockRetries() const {
+ return iDefaultLockRetries;
+}
+
+//! @brief Set the default lock retries.
+/*!
+ \param iDefaultLockRetries - Number of lock attempts before returning failure.
+*/
+void xbSsv::SetDefaultLockRetries( xbInt16 iDefaultLockRetries ) {
+ this->iDefaultLockRetries = iDefaultLockRetries;
+}
+
+//! @brief Get the default auto lock setting.
+/*!
+ When auto locking is turned on, the library automatically locks and unlocks
+ files and indices as needed in a multi user environment.
+ \returns Number of lock attempt settings.
+*/
+xbBool xbSsv::GetDefaultAutoLock() const {
+ return bDefaultAutoLock;
+}
+
+
+//! @brief Set the default auto lock setting.
+/*!
+ When auto locking is turned on, the library automatically locks and unlocks
+ files and indices as needed in a multi user environment. Locking is not required
+ in single a single user environment.
+
+ \param bDefaultAutoLock xbTrue - Turn autolocking on<br>
+ xbFalse - Turn autolocking off<br>
+*/
+void xbSsv::SetDefaultAutoLock( xbBool bDefaultAutoLock ) {
+ this->bDefaultAutoLock = bDefaultAutoLock;
+}
+
+//! @brief Enable default auto locking.
+/*!
+ When auto locking is turned on, the library automatically locks and unlocks
+ files and indices as needed in a multi user environment.
+*/
+void xbSsv::EnableDefaultAutoLock() {
+ this->bDefaultAutoLock = xbTrue;
+}
+
+//! @brief Disable defalt auto locking.
+/*!
+ When auto locking is turned off, the library does not automatically lock
+ and unlock files and indices as needed in a multi user environment.
+ Locking is not needed in a single user environment.
+
+*/
+void xbSsv::DisableDefaultAutoLock() {
+ this->bDefaultAutoLock = xbFalse;
+}
+/***************************************************************************/
+//! @brief Get default lock flavor
+/*!
+ Currently one flavor. This routine is part of the structure to support
+ future additional locking scenarios for Clipper and Foxpro.
+ \returns 1
+*/
+xbInt16 xbSsv::GetDefaultLockFlavor() const {
+ return iDefaultLockFlavor;
+}
+
+/***************************************************************************/
+//! @brief Set default lock flavor
+/*!
+ Currently one flavor. This routine is part of the structure to support
+ future additional locking scenarios for Clipper and Foxpro.
+*/
+void xbSsv::SetDefaultLockFlavor( xbInt16 iDefaultLockFlavor ) {
+ this->iDefaultLockFlavor = iDefaultLockFlavor;
+}
+
+/***************************************************************************/
+//! @brief Set default lock wait
+/*!
+ \param lLockWait Set default lock wait in milliseconds.
+*/
+void xbSsv::SetDefaultLockWait( xbInt32 lLockWait ) {
+ this->lDefaultLockWait = lLockWait;
+}
+
+/***************************************************************************/
+//! @brief Get default lock wait
+/*!
+ \returns Lock wait time in milliseconds.
+
+*/
+xbInt32 xbSsv::GetDefaultLockWait() const {
+ return lDefaultLockWait;
+}
+#endif
+
+/***************************************************************************/
+//! @brief Get the multi user setting.
+/*!
+ \returns xbTrue - Multi user mode turned on.<br>
+ xbFalse - Multi user mode turned off.<br>
+*/
+xbBool xbSsv::GetMultiUser() const {
+ return bMultiUser;
+}
+
+//! @brief Get the multi user setting.
+/*!
+ \param bMultiUser xbTrue - Turn on Multi user mode.<br>
+ xbFalse - Turn off Multi user mode.<br>
+*/
+void xbSsv::SetMultiUser( xbBool bMultiUser ) {
+ this->bMultiUser = bMultiUser;
+}
+
+
+
+/************************************************************************/
+#ifdef XB_MDX_SUPPORT
+//! @brief Get the mdx file block size used when creating a memo file.
+/*!
+ \returns system default setting for MDX block size.
+*/
+xbInt16 xbSsv::GetCreateMdxBlockSize() const {
+ return iCreateMdxBlockSize;
+}
+
+/************************************************************************/
+//! @brief Create mdx block size.
+/*!
+ This routine sets the mdx file block size at the system level. This value is
+ used when the mdx index file is initially created so if you want to change it,
+ this must be called before creating the table.
+
+ \param iBlockSize - Block size, must be evenly divisible by 512 and <= 16384
+ \returns XB_INVALID_BLOCK_SIZE<br>XB_NO_ERROR
+*/
+
+xbInt16 xbSsv::SetCreateMdxBlockSize( xbInt16 iBlockSize ){
+
+ if( iBlockSize < 512 || iBlockSize > 16384 || iBlockSize % 512 )
+ return XB_INVALID_BLOCK_SIZE;
+ else
+ iCreateMdxBlockSize = iBlockSize;
+
+ return XB_NO_ERROR;
+}
+#endif
+
+/************************************************************************/
+#if defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)
+//! @brief Get Unique Key Opt
+/*!
+ This routine returns the Unique Key Processing Option which is one of:
+ XB_HALT_ON_DUPKEY
+ XB_EMULATE_DBASE
+*/
+
+xbInt16 xbSsv::GetUniqueKeyOpt() const {
+ return iUniqueKeyOpt;
+}
+
+//! @brief Set Unique Key Opt
+/*! @brief Set Unique Key Opt
+ This routine Sets the Unique Key Processing Option which is one of:
+ XB_HALT_ON_DUPKEY
+ XB_EMULATE_DBASE
+*/
+xbInt16 xbSsv::SetUniqueKeyOpt( xbInt16 iOpt ){
+ if( iOpt == XB_HALT_ON_DUPKEY || iOpt == XB_EMULATE_DBASE ){
+ iUniqueKeyOpt = iOpt;
+ return XB_NO_ERROR;
+ } else {
+ return XB_INVALID_OPTION;
+ }
+}
+#endif
+/************************************************************************/
+
+
+
+
+} /* namespace */ \ No newline at end of file
diff --git a/src/core/xbstring.cpp b/src/core/xbstring.cpp
new file mode 100755
index 0000000..872062f
--- /dev/null
+++ b/src/core/xbstring.cpp
@@ -0,0 +1,1839 @@
+/* xbstring.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2021,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+//#ifdef __GNU LesserG__
+// #pragma implementation "xbstring.h"
+//#endif
+
+#include "xbase.h"
+
+
+namespace xb{
+
+XBDLLEXPORT const char * xbString::NullString = "";
+XBDLLEXPORT char xbString::cJunkBuf;
+
+/************************************************************************/
+//! @brief Destructor
+
+xbString::~xbString(){
+ if (data != NULL)
+ free(data);
+
+}
+
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param ulSize - Allocation size. The allocation size is normally handled internally
+ by the class, but it can be set in this constructor.
+*/
+xbString::xbString(xbUInt32 ulSize) {
+ data = (char *)calloc(1, ulSize);
+ this->size = ulSize;
+// memset( data, 0x00, ulSize ); - redundant, initialized by calloc
+}
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param c - Initialize string to c.
+*/
+xbString::xbString(char c) {
+ data = (char *)calloc(1, 2);
+ data[0] = c;
+ data[1] = 0;
+ size = 2;
+}
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param s - Initialize string to s.
+*/
+xbString::xbString( const char *s ) {
+
+ if( s == NULL ){
+ size = 0;
+ data = NULL;
+ } else {
+ size = (xbUInt32) (strlen(s) + 1 );
+ data = (char *) calloc( 1, size );
+ xb_strcpy( data, s );
+ }
+ // ctor(s);
+}
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param d - Initiailize string to d.
+*/
+xbString::xbString( xbDouble d ) {
+ data = NULL;
+ size = 0;
+ Sprintf("%f", d);
+}
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param s Initialize string to s.
+ \param ulMaxLen Maximum length of string. Truncate any characters greater than ulMaxLen.
+*/
+xbString::xbString( const char *s, xbUInt32 ulMaxLen ) {
+ xbUInt32 sSize = (xbUInt32) strlen( s );
+ if( sSize < ulMaxLen )
+ size = sSize;
+ else
+ size = ulMaxLen;
+ data = (char *)calloc(1, size+1);
+ for( xbUInt32 i = 0; i < size; i++ )
+ data[i] = s[i];
+ data[size] = '\0';
+ size++; // account for null trailing byte
+ return;
+}
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param s Initialize string to s.
+*/
+xbString::xbString( const xbString &s ) {
+ ctor(s.Str());
+}
+
+/************************************************************************/
+//! @brief Operator const char *
+/*!
+ \returns Pointer to string data.
+*/
+xbString::operator const char *() const {
+ return data ? data : NullString;
+}
+
+/************************************************************************/
+//! @brief Set operator =
+/*!
+ \param s - Set the string to the string on the right of the equal sign.
+*/
+xbString &xbString::operator=( const xbString &s ) {
+ return Set(s);
+}
+/************************************************************************/
+//! @brief Set operator =
+/*!
+ \param s - Set the string to the string on the right of the equal sign.
+*/
+xbString &xbString::operator=( const char *s ) {
+ return Set(s);
+}
+
+/************************************************************************/
+//! @brief Stream insertion operator <<
+/*!
+ std::cout << MyString << std::endl;
+
+ \param os Output stream
+ \param s String to send to output stream
+*/
+std::ostream& operator<< ( std::ostream& os, const xbString & s ) {
+ return os << s.Str();
+}
+/************************************************************************/
+//! @brief Append operator +=
+/*!
+ \param s - Append s to the string.
+*/
+xbString &xbString::operator+=( const xbString &s ) {
+
+ if (s.IsNull())
+ return (*this);
+
+ xbUInt32 Len = s.Len();
+ xbUInt32 oldLen = this->Len();
+ xbUInt32 newLen = Len + oldLen;
+
+ data = (char *)realloc(data, newLen+1);
+ if( !data )
+ return (*this);
+
+ if(oldLen == 0)
+ data[0] = 0;
+
+ char *t = data;
+ t+= oldLen;
+ for( xbUInt32 i = 0; i < Len; i++ )
+ *t++ = s.GetCharacter(i+1);
+
+ data[newLen] = '\0';
+ size += Len;
+
+ return (*this);
+}
+/************************************************************************/
+//! @brief Append operator +=
+/*!
+ \param s - Append s to the string.
+*/
+xbString &xbString::operator+=( const char *s ) {
+
+ if (s == NULL)
+ return (*this);
+ xbUInt32 Len = (xbUInt32) strlen(s);
+ xbUInt32 oldLen = this->Len();
+ xbUInt32 newLen = Len + oldLen;
+ data = (char *)realloc(data, newLen+1);
+ if(oldLen == 0)
+ data[0] = 0;
+ for( xbUInt32 i = 0; i < Len; i++ )
+ data[i+oldLen] = s[i];
+ data[newLen] = '\0';
+ size += Len;
+ return (*this);
+}
+/************************************************************************/
+//! @brief Append operator +=
+/*!
+ \param c - Append c to the string.
+*/
+xbString &xbString::operator+=( char c ) {
+ xbUInt32 Len = 1;
+ xbUInt32 oldLen = this->Len();
+ data = (char *)realloc(data, oldLen+Len+1);
+ data[oldLen] = c;
+ data[oldLen+1] = 0;
+ size++;
+ return (*this);
+}
+/************************************************************************/
+//! @brief Append operator -=
+/*!
+ Append s to the right of this string, right trimming both strings.
+ \param s - Append s to the right of the string value.
+*/
+xbString &xbString::operator-=( const xbString &s ) {
+
+ Rtrim();
+ if (s.IsNull())
+ return (*this);
+ xbUInt32 Len = s.Len();
+ xbUInt32 oldLen = this->Len();
+ xbUInt32 newLen = Len + oldLen;
+
+ data = (char *)realloc(data, newLen+1);
+ if(oldLen == 0)
+ data[0] = 0;
+
+ for( xbUInt32 i = 0; i < Len; i++ )
+ data[i+oldLen] = s.GetCharacter(i+1);
+
+ data[newLen] = '\0';
+ size += Len;
+ Rtrim();
+ return (*this);
+}
+/************************************************************************/
+//! @brief Append operator -=
+/*!
+ Append s to the right of this string, right trimming both strings.
+ \param s - Append s to the right of the string value.
+*/
+xbString &xbString::operator-=(const char *s) {
+
+ Rtrim();
+ if (s == NULL)
+ return (*this);
+ xbUInt32 Len = (xbUInt32) strlen(s);
+ xbUInt32 oldLen = this->Len();
+ xbUInt32 newLen = Len + oldLen;
+
+ data = (char *)realloc(data, newLen+1);
+
+ if(oldLen == 0)
+ data[0] = 0;
+
+ for( xbUInt32 i = 0; i < Len; i++ )
+ data[i+oldLen] = s[i];
+ data[newLen] = '\0';
+
+ size += Len;
+ Rtrim();
+ return (*this);
+}
+/************************************************************************/
+//! @brief Append operator -=
+/*!
+ Append c to the right of this string, trimming right space on this string first.
+ \param c - Append s to the right of the string value.
+*/
+xbString &xbString::operator-=(const char c) {
+ Rtrim();
+ xbUInt32 oldSize = size;
+ size += 1;
+ data = (char *)realloc( data, size );
+ if( oldSize == 0 ) data[0] = 0;
+ data[size-2] = c;
+ data[size-1] = 0;
+ Trim();
+ return (*this);
+}
+/************************************************************************/
+//! @brief Concatonate operator -
+/*!
+ Concatonate left string with right string returning reference to new string.
+ Both strings are trimmed.
+
+ \param s1 Right string operator.
+*/
+xbString xbString::operator-(const xbString &s1) {
+ xbString tmp( data );
+ tmp -= s1;
+ return tmp;
+}
+/************************************************************************/
+//! @brief Concatonate operator +
+/*!
+ Concatonate left string with right string returning reference to new string.
+
+ \param s1 Right string operator.
+*/
+xbString xbString::operator+( const char *s1) {
+ xbString tmp( data );
+ tmp += s1;
+ return tmp;
+}
+/************************************************************************/
+//! @brief Concatonate operator +
+/*!
+ Concatonate left string with right string returning reference to new string.
+
+ \param s1 Right string operator.
+*/
+xbString xbString::operator+( const xbString &s1) {
+ xbString tmp( data );
+ tmp += s1;
+ return tmp;
+}
+/************************************************************************/
+//! @brief Concatonate operator +
+/*!
+ Concatonate left string with right string returning reference to new string.
+
+ \param c Right string operator.
+*/
+
+xbString xbString::operator+( const char c) {
+ xbString tmp( data );
+ tmp += c;
+ return tmp;
+}
+/************************************************************************/
+//! @brief operator []
+/*!
+ \param n - Offset into the string of the byte to retrieve.
+ \returns c - The character to return from the offset within the [] brackets.
+*/
+char &xbString::operator[]( xbUInt32 n ) const {
+ if( n > 0 && n <= size )
+ return data[n-1];
+ else
+ return cJunkBuf;
+}
+/************************************************************************/
+//! @brief operator []
+/*!
+ \param n - Offset into the string of the byte to retrieve.
+ \returns c - The character to return from the offset within the [] brackets.
+*/
+char &xbString::operator[]( xbInt32 n ) const {
+ if( n > 0 && n <= (xbInt32) size )
+ return data[n-1];
+ else
+ return cJunkBuf;
+}
+/************************************************************************/
+//! @brief operator ==
+/*!
+ \param s String to compare
+ \returns xbTrue - Strings match.<br>
+ zbFalse - Strings don't match.<br>
+
+*/
+xbBool xbString::operator==( const xbString &s ) const {
+
+ if( data == NULL || data[0] == 0 ) {
+ if( s.data == NULL || s.data[0] == 0 )
+ return true;
+ return false;
+ } else {
+ if( s.data == NULL || s.data[0] == 0 )
+ return false;
+ return( strcmp(data,s.data) == 0 ? xbTrue : xbFalse );
+ }
+}
+/************************************************************************/
+//! @brief operator ==
+/*!
+ \param s String to compare
+ \returns xbTrue - Strings match.<br>
+ zbFalse - Strings don't match.<br>
+*/
+xbBool xbString::operator==( const char *s ) const {
+
+ if (s == NULL) {
+ if ( data == NULL)
+ return true;
+ return false;
+ }
+ if ((s[0] == 0) && data == NULL)
+ return true;
+ if ( data == NULL)
+ return false;
+ return( strcmp( data, s) == 0 ? xbTrue : xbFalse );
+}
+/************************************************************************/
+//! @brief operator !=
+/*!
+ \param s String to compare
+ \returns xbTrue - Strings don't match.<br>
+ xbFalse - Strings match.<br>
+*/
+xbBool xbString::operator!=( const xbString &s ) const {
+ if( data == NULL || data[0] == 0 ) {
+ if( s.data == NULL || s.data[0] == 0 )
+ return xbFalse; // NULL != NULL
+ return xbTrue; // NULL != !NULL
+ } else {
+ if( s.data == NULL || s.data[0] == 0 )
+ return xbTrue; // !NULL != NULL
+ return( strcmp( data, s.data ) != 0 ? xbTrue : xbFalse ); // !NULL != !NULL
+ }
+}
+/************************************************************************/
+//! @brief operator !=
+/*!
+ \param s String to compare
+ \returns xbTrue - Strings don't match.<br>
+ zbFalse - Strings match.<br>
+*/
+xbBool xbString::operator!=( const char *s ) const {
+ if( s == NULL || s[0] == 0 ) {
+ if( data == NULL || data[0] == 0 )
+ return xbFalse; // NULL != NULL
+ return xbTrue; // NULL != !NULL
+ } else {
+ if( s == NULL || s[0] == 0 )
+ return xbTrue; // !NULL != NULL
+ return( strcmp( data, s ) != 0 ? xbTrue : xbFalse ); // !NULL != !NULL
+ }
+}
+/************************************************************************/
+//! @brief operator <
+/*!
+ \param s String to compare
+ \returns xbTrue - Left string is less than the right string.<br>
+ zbFalse - Left string is not less than the right string.<br>
+*/
+xbBool xbString::operator< ( const xbString &s ) const {
+
+ if( data == NULL || data[0] == 0 ) {
+ if( s.data == NULL || s.data[0] == 0 )
+ return false;
+ return true;
+ } else {
+ if( s.data == NULL || s.data[0] == 0 )
+ return false;
+ return ( strcmp(data, s.data) < 0 ? xbTrue : xbFalse );
+ }
+}
+/************************************************************************/
+//! @brief operator >
+/*!
+ \param s String to compare
+ \returns xbTrue - Left string is greater than the right string.<br>
+ zbFalse - Left string is not greater than the right string.<br>
+*/
+xbBool xbString::operator> ( const xbString &s ) const {
+ if( data == NULL || data[0] == 0 ) {
+ if( s.data == NULL || s.data[0] == 0 )
+ return false;
+ return false;
+ } else {
+ if( s.data == NULL || s.data[0] == 0 )
+ return true;
+ return( strcmp(data,s.data) > 0 ? xbTrue : xbFalse );
+ }
+}
+/************************************************************************/
+//! @brief operator <=
+/*!
+ \param s String to compare
+ \returns xbTrue - Left string is less than or equal to the right string.<br>
+ zbFalse - Left string is not less than or equal to the right string.<br>
+*/
+xbBool xbString::operator<=( const xbString &s ) const {
+ if( data == NULL || data[0] == 0 ) {
+ if( s.data == NULL || s.data[0] == 0 )
+ return true;
+ return true;
+ } else {
+ if( s.data == NULL || s.data[0] == 0 )
+ return false;
+ return( strcmp(data,s.data) <= 0 ? xbTrue : xbFalse );
+ }
+}
+/************************************************************************/
+//! @brief operator >=
+/*!
+ \param s String to compare
+ \returns xbTrue - Left string is greater than or equal to the right string.<br>
+ zbFalse - Left string is not greater than or equal to the right string.<br>
+*/
+xbBool xbString::operator>=( const xbString &s ) const {
+ if( data == NULL || data[0] == 0 ) {
+ if( s.data == NULL || s.data[0] == 0 )
+ return true;
+ return false;
+ } else {
+ if( s.data == NULL || s.data[0] == 0 )
+ return true;
+ return( strcmp(data, s.data) >= 0 ? xbTrue : xbFalse );
+ }
+}
+
+/************************************************************************/
+//! @brief Add a prefixing back slash to specified characters in the string.
+/*!
+ \param c Character to prefix with a backslash.
+ \returns Reference to this string.
+*/
+xbString &xbString::AddBackSlash( char c ) {
+
+ xbUInt32 lCnt = CountChar( c );
+ if( lCnt == 0 )
+ return *this;
+ char *p;
+ if(( p = (char *)calloc( 1, size + lCnt )) == NULL )
+ return *this;
+
+ char *p2 = p;
+ for( xbUInt32 lS = 0; lS < size; lS++ ){
+ if( data[lS] == c )
+ *p2++ = '\\';
+ *p2++ = data[lS];
+ }
+ if( data )
+ free( data );
+ data = p;
+ size += lCnt;
+ return *this;
+}
+/************************************************************************/
+//! @brief Append data to string.
+/*!
+ \param s String data to append.
+ \returns Reference to this string.
+*/
+xbString &xbString::Append( const xbString &s ) {
+ *this += s;
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Append data to string.
+/*!
+ \param s String data to append.
+ \returns Reference to this string.
+*/
+xbString &xbString::Append( const char *s ) {
+ *this += s;
+ return *this;
+}
+/************************************************************************/
+//! @brief Append data to string.
+/*!
+ \param c String data to append.
+ \returns Reference to this string.
+*/
+xbString &xbString::Append( char c ) {
+ *this += c;
+ return *this;
+}
+/************************************************************************/
+//! @brief Append data to string.
+/*!
+ \param s String data to append.
+ \param ulByteCount Maximum number of bytes to append.
+ \returns Reference to this string.
+*/
+xbString &xbString::Append( const char *s, xbUInt32 ulByteCount ) {
+
+ if (s == NULL) return (*this);
+ xbUInt32 oldLen = this->Len();
+ xbUInt32 newLen = ulByteCount + oldLen;
+
+ data = (char *)realloc(data, newLen+1);
+
+ if(oldLen == 0)
+ data[0] = 0;
+
+ for( xbUInt32 i = 0; i < ulByteCount; i++ )
+ data[i+oldLen] = s[i];
+
+ data[newLen] = '\0';
+ size += ulByteCount;
+ return (*this);
+}
+
+/************************************************************************/
+//! @brief Assign portion of string.
+/*!
+ \param sStr - Source string for copy operation. sStr needs to be a Null terminated string.
+ \param ulStartPos - Starting position within source string.
+ \param ulCopyLen - Length of data to copy.
+ \returns Reference to this string.
+*/
+xbString &xbString::Assign(const char * sStr, xbUInt32 ulStartPos, xbUInt32 ulCopyLen){
+ if(data){
+ free(data);
+ data = 0;
+ size = 0;
+ }
+ xbUInt32 lLen = (xbUInt32) strlen( sStr );
+ if( ulStartPos > lLen ){
+ size = 0;
+ return( *this );
+ }
+ if((( ulCopyLen - 1) + ulStartPos ) > lLen )
+ ulCopyLen = lLen - ulStartPos + 1;
+ data = (char *)calloc(1, ulCopyLen + 1);
+ size = ulCopyLen;
+ for( xbUInt32 i = 0; i < ulCopyLen; i++ )
+ data[i] = sStr[i + ulStartPos - ((xbUInt32) 1)];
+ data[ulCopyLen] = '\0';
+ return (*this);
+}
+/************************************************************************/
+//! @brief Assign portion of string.
+/*!
+ \param sStr - Source string for copy operation. sStr needs to be a Null terminated string.
+ \param ulStartPos - Starting position within source string.
+ \returns Reference to this string.
+*/
+xbString &xbString::Assign(const char * sStr, xbUInt32 ulStartPos){
+ if(data){
+ free(data);
+ data = 0;
+ size = 0;
+ }
+ xbUInt32 ulSrcLen = (xbUInt32) strlen( sStr );
+ if( ulStartPos > ulSrcLen ){
+ size = 0;
+ return( *this );
+ }
+ xbUInt32 ulCopyLen;
+ ulCopyLen = ulSrcLen - ulStartPos + 1;
+ data = (char *)calloc(1, ulCopyLen + 1);
+ size = ulCopyLen;
+ for( xbUInt32 i = 0; i < ulCopyLen; i++ )
+ data[i] = sStr[i + ulStartPos - ((xbUInt32) 1)];
+ data[ulCopyLen] = '\0';
+ return (*this);
+}
+
+/************************************************************************/
+//! @brief Assign portion of string.
+/*!
+ \param sStr - Source string for copy operation. sStr needs to be a Null terminated string.
+ \param ulStartPos - Starting position within source string.
+ \param ulCopyLen - Length of data to copy.
+ \returns Reference to this string.
+*/
+xbString &xbString::Assign(const xbString& sStr, xbUInt32 ulStartPos, xbUInt32 ulCopyLen){
+ if(data){
+ free(data);
+ data = 0;
+ size = 0;
+ }
+ xbUInt32 ulSrcLen = sStr.Len();
+ if( ulStartPos > ulSrcLen ){
+ size = 0;
+ return( *this );
+ }
+ if((( ulCopyLen - 1) + ulStartPos ) > ulSrcLen )
+ ulCopyLen = ulSrcLen - ulStartPos + 1;
+ data = (char *)calloc(1, ulCopyLen + 1);
+ size = ulCopyLen;
+ for( xbUInt32 i = 0; i < ulCopyLen; i++ )
+ data[i] = sStr[i + ulStartPos];
+ data[ulCopyLen] = '\0';
+ return (*this);
+}
+/************************************************************************/
+//! @brief Assign portion of string.
+/*!
+ \param sStr - Source string for copy operation. sStr needs to be a Null terminated string.
+ \param ulStartPos - Starting position within source string.
+ \returns Reference to this string.
+*/
+xbString &xbString::Assign(const xbString& sStr, xbUInt32 ulStartPos){
+ if(data){
+ free(data);
+ data = 0;
+ size = 0;
+ }
+ xbUInt32 ulSrcLen = sStr.Len();
+ if( ulStartPos > ulSrcLen ){
+ size = 0;
+ return( *this );
+ }
+ xbUInt32 ulCopyLen;
+ ulCopyLen = ulSrcLen - ulStartPos + 1;
+ data = (char *)calloc(1, ulCopyLen + 1);
+ size = ulCopyLen;
+ for( xbUInt32 i = 0; i < ulCopyLen; i++ )
+ data[i] = sStr[i + ulStartPos];
+ data[ulCopyLen] = '\0';
+ return (*this);
+}
+/************************************************************************/
+//! @brief Copy a string
+/*!
+ \returns xbString.
+*/
+xbString xbString::Copy() const {
+ return( *this );
+}
+/************************************************************************/
+//! @brief Count the number of characters in the string.
+/*!
+ \param c Character to count.
+ \param iOpt 0 - Count the number of characters.<br>
+ 1 - Count the number of characters not between single or double quotes.
+ \returns The number of characters.
+*/
+xbUInt32 xbString::CountChar( char c, xbInt16 iOpt ) const {
+ if( iOpt == 0 )
+ return CountChar( c );
+ else{
+ xbBool bSingleQuote = xbFalse;
+ xbBool bDoubleQuote = xbFalse;
+ char cPrevChar = 0x00;
+ xbUInt32 i,j;
+ for( i = 0, j = 0; i < size; i++ ){
+ if( bSingleQuote && data[i] == '\'' && cPrevChar != '\\' ){
+ bSingleQuote = xbFalse;
+ }
+ else if( bDoubleQuote && data[i] == '"' && cPrevChar != '\\' ){
+ bDoubleQuote = xbFalse;
+ }
+ else if( data[i] == '\'' && cPrevChar != '\\' && !bDoubleQuote ){
+ bSingleQuote = xbTrue;
+ }
+ else if( data[i] == '"' && cPrevChar != '\\' && !bSingleQuote ){
+ bDoubleQuote = xbTrue;
+ }
+ else if( !bDoubleQuote && !bSingleQuote && data[i] == c ){
+ j++;
+ }
+ cPrevChar = data[i];
+ }
+ return j;
+ }
+}
+/************************************************************************/
+//! @brief Count the number of characters in the string.
+/*!
+ \param c Character to count.
+ \returns The number of characters.
+*/
+xbUInt32 xbString::CountChar( char c ) const {
+ xbUInt32 i,j;
+ for( i = 0,j = 0; i < size; i++ )
+ if( data[i] == c )
+ j++;
+ return j;
+}
+/************************************************************************/
+void xbString::ctor( const char *s ) {
+
+ // this routine assumes it was called by one of the constructors.
+
+ if (s == NULL) {
+ data = NULL;
+ size = 0;
+ return;
+ }
+
+ size = (xbUInt32) (strlen(s) + 1);
+ data = (char *) calloc( 1, size);
+
+ xb_strcpy(data, s);
+}
+/************************************************************************/
+//! @brief Convert hex character to string.
+/*!
+ This routine converts a four byte string in the format of 0x00 to a one byte char value.
+ The first four bytes of the string must be in the format 0x00.
+ Anything past the first four bytes is disregarded.
+
+ \param cOut Output character.
+ \returns XB_INVALID_PARM on error<br>
+ XB_NO_ERROR on success.
+*/
+xbInt16 xbString::CvtHexChar( char &cOut ){
+
+ int j, k;
+ char c;
+
+ if( Len() < 4 || data[0] != '0' || (data[1]!='X' && data[1]!='x' ))
+ return XB_INVALID_PARM;
+
+ c = (char) toupper( data[2] );
+ j = ( c > '9' ? c - 'A' + 10 : c - '0' );
+ c = (char)toupper( data[3] );
+ k = ( c > '9' ? c - 'A' + 10 : c - '0' );
+ j = ( j << 4 ) + k;
+
+ cOut = ( char ) j;
+ return XB_NO_ERROR;
+}
+/************************************************************************/
+//! @brief Convert string of hex characters to string.
+/*!
+
+ This routine converts a string of four byte format of 0x00 to a string of one byte chars.
+
+ \param sOut Output string of converted characters.
+ \returns XB_INVALID_PARM on error<br>
+ XB_NO_ERROR on success.
+*/
+xbInt16 xbString::CvtHexString( xbString &sOut ){
+ char c;
+ xbString ws;
+ ws = data;
+ sOut = "";
+ xbInt16 iRc;
+ while( ws.Len()){
+ if(( iRc= ws.CvtHexChar( c )) != XB_NO_ERROR )
+ return iRc;
+ sOut += c;
+ ws.Ltrunc( 4 );
+ }
+ return XB_NO_ERROR;
+}
+/************************************************************************/
+//! @brief Convert string to xbUInt64 number
+/*!
+ \param ullOut - output unsigned long long.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbString::CvtULongLong( xbUInt64 &ullOut ){
+
+ // version 1 - fast, but no data checking
+ ullOut = 0;
+ char *s = data;
+ int i = 0;
+ while( *s ){
+ ullOut *= 10;
+ ullOut += (xbUInt64) *s - '0';
+ s++;
+ i++;
+ }
+ return XB_NO_ERROR;
+}
+/************************************************************************/
+//! @brief Convert string to xbInt64 number
+/*!
+ \param llOut - output long long.
+ \returns XB_NO_ERROR
+*/
+xbInt16 xbString::CvtLongLong( xbInt64 &llOut ){
+
+ // version 1 - fast, but no data checking
+ llOut = 0;
+ char *s = data;
+ int i = 0;
+ while( *s ){
+ llOut *= 10;
+ llOut += (xbInt64) *s - '0';
+ s++;
+ i++;
+ }
+ return XB_NO_ERROR;
+}
+
+/************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+void xbString::Dump( const char * title, xbInt16 iHexOption ) const {
+ fprintf(stdout, "%s StringSize[%d] DataLen=[%d] data=[%s]\n", title, size, Len(), data );
+ if( iHexOption ){
+ std::cout << "Hex values" << std::endl;
+ for( xbUInt32 i = 0; i < strlen( data ); i++ )
+ printf( " %x", data[i] );
+ std::cout << std::endl;
+ }
+}
+void xbString::Dump( const char * title ) const {
+ Dump( title, 0 );
+}
+
+void xbString::DumpHex( const char * title ) const {
+ Dump( title, 1 );
+}
+#endif
+
+/************************************************************************/
+//! @brief Extract an element out of a delimited string.
+/*!
+ \param pSrc Source string.
+ \param cDelim Delimiter.
+ \param lSkipCnt Number of delimiters to skip.
+ \param iOpt 0 - ignore single and double quotes.<br>
+ 1 - ignore delimiters between single or double quotes.
+ \returns Reference to string extracted from element.
+*/
+xbString &xbString::ExtractElement( const char *pSrc, char cDelim, xbUInt32 lSkipCnt, xbInt16 iOpt )
+{
+ /* opt values
+ 0 - ignore single and double quotes
+ 1 - ignore delimiters between single or double quotes
+ */
+
+ xbUInt32 lLen;
+ xbUInt32 lCurCnt = 0;
+ xbBool bInSingleQuotes = xbFalse;
+ xbBool bInDoubleQuotes = xbFalse;
+ char cPrevChar = 0x00;
+ const char *s = pSrc;
+ const char *pAnchor;
+
+ /* skip past skipcnt delimiters */
+ while( *s && lCurCnt < (lSkipCnt-1) ){
+ if( iOpt == 0 ){
+ if( *s == cDelim )
+ lCurCnt++;
+ } else {
+ if( *s == cDelim && !bInSingleQuotes && !bInDoubleQuotes ){
+ lCurCnt++;
+ } else if( *s == '\'' && !bInDoubleQuotes && cPrevChar != '\\' ){
+ if( bInSingleQuotes == xbTrue )
+ bInSingleQuotes = xbFalse;
+ else
+ bInSingleQuotes = xbTrue;
+ } else if( *s == '"' && !bInSingleQuotes && cPrevChar != '\\' ){
+ if( bInDoubleQuotes == xbTrue )
+ bInDoubleQuotes = xbFalse;
+ else
+ bInDoubleQuotes = xbTrue;
+ }
+ }
+ cPrevChar = *s;
+ s++;
+ }
+
+ /* at the beginning of the field */
+ pAnchor = s;
+ xbBool bDone = xbFalse;
+ while( *s && !bDone ){
+ if( iOpt == 0 ){
+ if( *s == cDelim )
+ bDone = xbTrue;
+ } else {
+ if( *s == cDelim && !bInSingleQuotes && !bInDoubleQuotes ){
+ bDone = xbTrue;
+ } else if( *s == '\'' && !bInDoubleQuotes && cPrevChar != '\\' ){
+ if( bInSingleQuotes == xbTrue )
+ bInSingleQuotes = xbFalse;
+ else
+ bInSingleQuotes = xbTrue;
+ } else if( *s == '"' && !bInSingleQuotes && cPrevChar != '\\' ){
+ if( bInDoubleQuotes == xbTrue )
+ bInDoubleQuotes = xbFalse;
+ else
+ bInDoubleQuotes = xbTrue;
+ }
+ }
+ cPrevChar = *s;
+ s++;
+ }
+
+ // if at end of string, go back one and drop the delimiter
+ if( *s ) s--;
+
+ lLen = (xbUInt32)(s - pAnchor);
+
+ /* copy data */
+ data = (char *) realloc( data, lLen+1 );
+ memcpy( data, pAnchor, lLen );
+ data[lLen] = 0;
+ this->size = lLen+1;
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Get a character by position
+/*!
+ \param n - Position in string to extract. First position is 1 (not 0).
+ \returns Character from position n, or null.
+*/
+char xbString::GetCharacter( xbUInt32 n ) const {
+ if( n > 0 && n <= size )
+ return data[n-1];
+ else
+ return 0x00;
+}
+/************************************************************************/
+//! @brief Get the position of the last occurrence of a given character.
+/*!
+ \param c - Character to search for.
+ \returns Last position of character in the string.
+*/
+xbUInt32 xbString::GetLastPos(char c) const {
+
+ if (data == NULL)
+ return 0;
+
+ char *p = data;
+ xbUInt32 iPos = 0;
+ xbUInt32 hPos = 0;
+ while( *p && iPos++ < ( size - 1 )){
+ if( *p == c )
+ hPos = iPos;
+ p++;
+ }
+ if( hPos )
+ return hPos;
+ else
+ return 0;
+}
+/************************************************************************/
+//! @brief Get the position of the last occurrence of a given string.
+/*!
+ \param s - String to search for.
+ \returns Last position of character in the string.
+*/
+xbUInt32 xbString::GetLastPos(const char* s) const{
+
+ if (data == NULL)
+ return 0;
+
+ char *p = data;
+ char *saveP = NULL;
+ while( p ){
+ p = strstr( p, s);
+ if( p ){
+ saveP = p;
+ p++;
+ }
+ }
+ if (saveP == NULL)
+ return 0;
+ return (xbUInt32)(saveP - data) + 1;
+}
+/************************************************************************/
+//! @brief Get the path separator out of the string.
+/*!
+ \returns Char value containing either / or \ depending on OS.
+*/
+char xbString::GetPathSeparator() const {
+
+ if (data == NULL)
+ return 0x00;
+ char *p = data;
+ while( *p ){
+ if( *p == '\\' || *p == '/' )
+ return *p;
+ else
+ p++;
+ }
+ return 0x00;
+}
+
+/************************************************************************/
+//! @brief Retrieve the size of the string buffer.
+/*!
+ \returns Size of string buffer including the null terminating byte.
+*/
+xbUInt32 xbString::GetSize() const {
+ return size;
+}
+
+/************************************************************************/
+//! @brief Determine if the string has any alpha characters
+/*!
+ \returns xbTrue - String contains one or more aloha characters.<br>
+ xbFalse - String contains no alpha characters.
+*/
+xbBool xbString::HasAlphaChars() const {
+ for( xbUInt32 i = 0; i < size; i++ )
+ if( isalpha( data[i] ))
+ return xbTrue;
+ return xbFalse;
+}
+
+
+/************************************************************************/
+//! @brief Determine if string is empty
+/*!
+ \returns xbTrue if string is empty.<br>
+ xbFalse if string is not empty.
+*/
+xbBool xbString::IsEmpty() const {
+ if( data == NULL )
+ return true;
+ if( data[0] == 0 )
+ return xbTrue;
+ return xbFalse;
+}
+
+/************************************************************************/
+//! @brief Determine if string is NULL
+/*!
+ \returns xbTrue if string is NULL.<br>
+ xbFalse if string is not NULL.
+*/
+xbBool xbString::IsNull() const {
+ return( data == NULL );
+}
+
+
+/************************************************************************/
+//! @brief Retain left part of string, drop rightmost characters.
+/*!
+ \param ulLen New string length, truncate rightmost excess.
+ \returns Reference to string.
+*/
+xbString &xbString::Left( xbUInt32 ulLen ) {
+ return Mid( 1, ulLen );
+}
+
+/************************************************************************/
+//! @brief Retrieve length of current string.
+/*!
+ \returns String length, excluding the terminating null byte.
+*/
+// return length of string
+xbUInt32 xbString::Len() const {
+ return( data ? (xbUInt32) strlen(data) : 0 );
+}
+
+/************************************************************************/
+//! @brief Left trim white space from string.
+/*!
+ \returns Reference to this string.
+*/
+xbString &xbString::Ltrim(){
+
+ if( !data )
+ return *this;
+
+ char *p = data;
+ if( !*p || (*p && *p != ' ') )
+ return *this; /* nothing to do */
+
+ xbUInt32 s = 0;
+ while( *p && *p == ' ' ){
+ p++;
+ s++;
+ size--;
+ }
+ xbUInt32 i;
+ for( i = 0; i < size; i++ )
+ data[i] = data[i+s];
+ data[i] = 0x00;
+ data = (char *) realloc( data, size );
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Left truncate string
+/*!
+ \param ulCnt Number of bytes to remove from the left.
+ \returns Reference to this string.
+*/
+xbString &xbString::Ltrunc( xbUInt32 ulCnt ){
+ // left truncate cnt bytes
+
+ char * ndata;
+ char * p;
+ if( ulCnt >= size ){
+ if( size > 0 ){
+ free( data );
+ data = NULL;
+ size = 0;
+ }
+ return *this;
+ }
+ ndata = (char *) calloc( 1, size - ulCnt );
+ p = data;
+ p += ulCnt;
+ xb_strcpy( ndata, p );
+ free( data );
+ data = ndata;
+ size = size - ulCnt;
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Extract portion of data from string
+/*!
+ \param ulStartPos Starting position
+ \param ulTargLen Length
+ \returns Reference to string
+*/
+xbString &xbString::Mid( xbUInt32 ulStartPos, xbUInt32 ulTargLen ){
+
+ // this is a 1 based routine
+ if( ulStartPos == 0 )
+ return *this;
+
+ if( data == NULL )
+ return( *this );
+ if( data[0] == 0 )
+ return( *this );
+ if( ulStartPos > Len() )
+ return( *this );
+ char *pTarg = data;
+ char *pSrc = data + ulStartPos - 1;
+ for( xbUInt32 l = 0; l < ulTargLen; l++ )
+ *pTarg++ = *pSrc++;
+ *pTarg = 0x00;
+ Resize( ulTargLen + 1 );
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Left pad string
+/*!
+ \param c Padding character.
+ \param ulNewLen New string length.
+ \returns Reference to this string.
+*/
+xbString &xbString::PadLeft( char c, xbUInt32 ulNewLen ){
+
+ xbUInt32 srcLen;
+ if( data )
+ srcLen = (xbUInt32) strlen( data );
+ else
+ srcLen = 0;
+
+ if( srcLen >= ulNewLen )
+ return *this;
+
+ char * newData = (char *) calloc( 1, ulNewLen + 1 );
+ xbUInt32 i;
+ for( i = 0; i < ulNewLen - srcLen; i++ )
+ newData[i] = c;
+
+ char *targ = &newData[i];
+ xb_strcpy( targ, data );
+ free( data );
+ data = newData;
+ size = ulNewLen + 1;
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Right pad string
+/*!
+ \param c Padding character.
+ \param ulNewLen New string length.
+ \returns Reference to this string.
+*/
+xbString &xbString::PadRight( char c, xbUInt32 ulNewLen ){
+ xbUInt32 srcLen = (xbUInt32) strlen( data );
+ if( srcLen >= ulNewLen )
+ return *this;
+ data = (char *) realloc( data, ulNewLen + 1 );
+ xbUInt32 i;
+ for( i = srcLen; i < ulNewLen; i++ )
+ data[i] = c;
+ data[i] = 0x00;
+ size = ulNewLen + 1;
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Determine position of a given character
+/*!
+ \param c Seek character
+ \returns Position within string. Returns 0 if not found.
+*/
+xbUInt32 xbString::Pos(char c) const {
+
+ if (data == NULL)
+ return 0;
+ char *p = data;
+ xbUInt32 iPos = 0;
+ int iFound = 0;
+ while( *p && !iFound && iPos < ( size - 1 )){
+ if( *p == c )
+ iFound = 1;
+ else {
+ iPos++;
+ p++;
+ }
+ }
+
+ if( iFound )
+ return iPos + 1;
+ else
+ return 0;
+}
+
+/************************************************************************/
+//! @brief Determine position of a given substring
+/*!
+ \param s Substring
+ \returns Position within string. Returns 0 if not found.
+*/
+xbUInt32 xbString::Pos(const char* s) const{
+
+ if (data == NULL)
+ return 0;
+
+ char *p = strstr(data, s);
+ if ( p == NULL)
+ return 0;
+
+ return (xbUInt32)(p - data + 1);
+}
+
+/************************************************************************/
+//! @brief Insert character into string
+/*!
+ \param ulPos Insertion position.
+ \param c Character to insert.
+ \returns Reference to this string.
+*/
+xbString &xbString::PutAt(xbUInt32 ulPos, char c){
+ if((ulPos-1) > Len() )
+ return *this;
+ data[ulPos-1] = c;
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Remove portion of string.
+/*!
+ \param ulStartPos Starting position for removal operation.
+ \param ulDelSize Size of deletion.
+ \returns Reference to string.
+*/
+xbString &xbString::Remove(xbUInt32 ulStartPos, xbUInt32 ulDelSize ) {
+ if( data == NULL )
+ return( *this );
+ if( data[0] == 0 )
+ return( *this );
+ xbUInt32 srcLen = Len();
+
+ if( ulStartPos > srcLen || ulStartPos < 1 || ulDelSize < 1 )
+ return( *this );
+
+ if(( ulStartPos + ulDelSize - 1) >= size ){
+ data[ulStartPos-1] = 0x00;
+ size = ulStartPos;
+ return( *this );
+ }
+
+ char *t;
+ char *s;
+ t = data + (ulStartPos - 1);
+ s = t + ulDelSize;
+ size -= ulDelSize;
+ while( *s )
+ *t++ = *s++;
+ *t = 0x00;
+ return( *this );
+}
+
+
+/************************************************************************/
+//! @brief Resize a string
+/*!
+ \param ulSize - New string size, including null termination byte.
+ \returns Reference to this string.
+*/
+//the new size includes the null termination byte
+xbString &xbString::Resize(xbUInt32 ulSize) {
+
+// data = (char *) realloc((void *) data, ulSize );
+
+
+// original
+ data = (char *)realloc(data, ulSize);
+
+
+ if( ulSize > 0 )
+ data[ulSize-1] = 0;
+ this->size = ulSize;
+ return *this;
+}
+/************************************************************************/
+//! @brief Right trim the string.
+/*!
+ This routine removes any trailing white space on the string.
+
+ \returns Reference to string.
+*/
+xbString &xbString::Rtrim(){
+
+ xbUInt32 l = Len();
+ if( l == 0 )
+ return *this;
+ l--;
+
+ for(;;) {
+ if( data[l] != ' ' )
+ break;
+ data[l] = 0;
+ size--;
+ if( l == 0 )
+ break;
+ l--;
+ }
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Set the value of the string.
+/*!
+
+ Note: This routine fails if you try to set the string to itself or some part of itself.
+
+ \param s Value to set the string.
+ \returns Reference to string.
+
+*/
+xbString &xbString::Set( const char *s ) {
+
+ if(data != NULL){
+ free(data);
+ data = NULL;
+ }
+ if(s == NULL ) {
+ if( data )
+ free( data );
+ data = NULL;
+ size = 0;
+ } else {
+ //data = (char *)calloc(1, strlen(s) + 1 );
+ data = (char *) realloc( data, strlen(s) + 1 );
+ xb_strcpy(data, s);
+ size = (xbUInt32) (strlen(data) + 1);
+ }
+ return (*this);
+}
+/************************************************************************/
+//! @brief Set the value of the string.
+/*!
+ \param s Value to set the string.
+ \returns Reference to string.
+*/
+xbString &xbString::Set( const xbString &s ) {
+
+ if( s.Str() == NULL ){
+ if( data ) free( data );
+ data = NULL;
+ size = 0;
+ } else {
+ char *p = (char *) calloc( 1, s.Len() + 1 );
+ xb_strcpy( p, s.Str());
+ size = s.Len() + 1;
+ if( data ) free( data );
+ data = p;
+ }
+ return (*this );
+}
+
+/************************************************************************/
+//! @brief Set the value of the string.
+/*!
+
+ Note: This routine fails if you try to set the string to itself or some part of itself.
+
+ \param s Value to set the string.
+ \param ulSize Maximum size of resultant string.
+ \returns Reference to string.
+*/
+
+xbString &xbString::Set(const char *s, xbUInt32 ulSize) {
+
+ if( data != NULL )
+ free( data );
+
+ if(s == NULL) {
+ data = NULL;
+ size = 0;
+ return (*this);
+ }
+
+ data = (char *) calloc( 1, ulSize+1 );
+ char *pTarget = data;
+ for( xbUInt32 i = 0; i < ulSize; i++ ){
+ *pTarget = *s;
+ pTarget++;
+ s++;
+ }
+ this->size = ulSize + 1;
+ return *this;
+}
+
+
+/************************************************************************/
+//! @brief Set the string to long integer numeric value.
+/*!
+ \param lNum Value to set the string
+ \returns Reference to this string.
+*/
+xbString &xbString::SetNum(xbInt32 lNum) {
+ Sprintf("%ld", lNum);
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Printf routine for formatting a string.
+/*!
+ See documentation on the standard C printf function for how to use this.
+
+ MyString.Sprintf( "a number %d some text %s", 100, "test text data" );
+
+ \param sFormat A format specifier
+ \returns Reference to a formatted string
+*/
+xbString &xbString::Sprintf( const char *sFormat, ...) {
+
+ xbInt32 iRc;
+ va_list ap;
+
+ char *t;
+
+// if( data )
+// free( data );
+
+#ifdef HAVE__VSNPRINTF_S_F
+
+ va_start( ap, sFormat );
+ size = (xbUInt32) _vsnprintf_s( NULL, 0, sFormat, ap ) + 1;
+ va_end( ap );
+
+ t = (char *) malloc( size );
+ if( !t ){
+ size = 0;
+ return( *this );
+ }
+
+ va_start( ap, sFormat );
+ iRc = _vsnprintf_s( t, size, sFormat, ap );
+ va_end( ap );
+
+#else
+#ifdef HAVE_VSPRINTF_S_F
+
+ va_start( ap, sFormat );
+ // size = (xbUInt32) vsprintf_s( NULL, 0, sFormat, ap ) + 1;
+ size = _vscprintf( sFormat, ap ) + 1;
+ va_end( ap );
+
+ t = (char *) malloc( size );
+ if( !t ){
+ size = 0;
+ return( *this );
+ }
+
+ va_start( ap, sFormat );
+ iRc = vsprintf_s( t, size, sFormat, ap );
+ va_end( ap );
+
+#else
+#ifdef HAVE_VSNPRINTF_F
+
+ va_start( ap, sFormat );
+ size = (xbUInt32) vsnprintf( NULL, 0, sFormat, ap) + 1;
+ va_end( ap );
+
+ t = (char *) calloc( 1, size );
+ if( !t ){
+ size = 0;
+ return( *this );
+ }
+ va_start( ap, sFormat );
+ iRc = vsnprintf( t, size, sFormat, ap );
+ va_end( ap );
+
+# else
+# error "Fatal error building [xbstring.cpp] - You have neither _vsnprintf_s nor vsnprintf_s."
+# endif
+#endif
+#endif
+
+ if( iRc < 0 ){
+ if( data )
+ free( data );
+ data = NULL;
+ size = 0;
+ } else {
+ if( data )
+ free( data );
+ data = t;
+ }
+ return( *this );
+}
+
+/************************************************************************/
+//! @brief Return string data
+/*!
+ \returns char * to string data or NULL if string is empty
+*/
+const char *xbString::Str() const {
+ return data ? data : NullString;
+}
+
+/************************************************************************/
+//! @brief Copy all or part of string to character array
+/*!
+ \param cDest pointer to destination buffer.
+ \param n Number of bytest to copy. It is the responsibility of the application
+ to verify the buffer is large enough to hold the string contents.
+ \returns char * to result
+
+*/
+char *xbString::strncpy( char * cDest, xbUInt32 n ) const {
+ xbUInt32 i;
+ xbUInt32 ulLen;
+ n > (size-1) ? ulLen = size-1 : ulLen = n;
+ memset( cDest, 0x00, ulLen );
+ for( i = 0; i < ulLen; i++ )
+ cDest[i] = data[i];
+// cDest[i] = 0x00;
+ return cDest;
+}
+/************************************************************************/
+//! @brief Swap characters
+/*!
+ \param cFrom character to replace.
+ \param cTo character to replace with.
+ \returns Reference to this string.
+*/
+xbString &xbString::SwapChars( char cFrom, char cTo ){
+ xbUInt32 i;
+ for( i = 0; i < size; i++ )
+ if( data[i] == cFrom )
+ data[i] = cTo;
+ return *this;
+}
+
+
+/************************************************************************/
+//! @brief Replace all upper case charaters with lower case characters
+/*!
+ \returns Reference to this string.
+*/
+xbString &xbString::ToLowerCase(){
+ xbUInt32 Len = this->Len();
+ for (xbUInt32 i=0; i<Len; i++)
+ data[i] = (char)tolower(data[i]);
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Replace all lower case charaters with lower case characters
+/*!
+ \returns Reference to this string.
+*/
+xbString &xbString::ToUpperCase(){
+ xbUInt32 Len = this->Len();
+ for (xbUInt32 i=0;i<Len;i++)
+ data[i] = (char)toupper(data[i]);
+ return *this;
+}
+/************************************************************************/
+//! @brief Trim all leading and trailing white space from string.
+/*!
+ \returns Reference to string.
+*/
+xbString &xbString::Trim(){
+ Rtrim();
+ Ltrim();
+ return *this;
+}
+
+
+/************************************************************************/
+//! @brief Private function used for reallocateing memory
+/*!
+ This function is designed to be a drop in replacement for the realloc
+ function call.
+*/
+/*
+char * xbString::xb_realloc( char * pIn, xbUInt32 iLen ){
+
+ if( iLen == 0 ){
+ if( pIn ){
+ free( pIn );
+ return NULL;
+ }
+ }
+
+ char *pNew = (char *) calloc( 1, (size_t) iLen );
+ if( !pNew ) return NULL;
+ char *s = pIn;
+ char *t = pNew;
+ xbUInt32 iCnt = 0;
+ while( *s && iCnt++ < iLen )
+ *t++ = *s++;
+ return pNew;
+}
+*/
+/************************************************************************/
+//! @brief Private function used for copying a string
+/*!
+ For performance reasons, this is an internal function that does no
+ memory checking and assumes a valid buffer area is available to be copied.
+
+ This function is marked as private because of the above reason and
+ is used by "stronger" calling functions.
+
+ \param sTarget Target destination of copied string
+ \param sSource Source string to copy
+ \returns Reference to string.
+*/
+
+char * xbString::xb_strcpy( char *sTarget, const char *sSource ){
+
+ char *temp = sTarget;
+ while( *sSource != '\0'){
+ *sTarget++ = *sSource++;
+// sTarget++;
+// sSource++;
+ }
+ *sTarget= '\0';
+ return temp;
+}
+
+/************************************************************************/
+//! @brief Check for valid logical field data
+/*!
+ Valid logical data is one 'T', 'F', 'N' or 'Y'.<br>
+
+ \returns xbTrue if the data is valid logical data.<br>
+ xbFalse if not valid logical data.
+*/
+
+xbBool xbString::ValidLogicalValue() const {
+ if( Len() == 1 )
+ if( data[0] == 'T' || data[0] == 'F' || data[0] == 'Y' || data[0] == 'N' || data[0] == '?' )
+ return xbTrue;
+ return xbFalse;
+}
+/************************************************************************/
+//! @brief This function returns true if the data is valid numeric data
+/*!
+ \returns xbTrue if valid numeric data.<br>
+ xbFalse if not valid numeric daata.
+*/
+
+xbBool xbString::ValidNumericValue() const {
+ const char *p;
+ p = data;
+ while( *p ){
+ if( *p != '+' && *p != '-' && *p != '.' && *p != '0' && *p != '1' &&
+ *p != '2' && *p != '3' && *p != '4' && *p != '5' && *p != '6' &&
+ *p != '7' && *p != '8' && *p != '9' )
+ return xbFalse;
+ else
+ p++;
+ }
+ return xbTrue;
+}
+
+
+/************************************************************************/
+//! @brief Remove every instance of a character from a string.
+/*!
+ \param c character to remove from string.
+ \returns Reference to this stirng.void
+*/
+
+xbString &xbString::ZapChar( char c ){
+
+ if( data == NULL )
+ return *this;
+ if( data[0] == 0 )
+ return *this;
+
+ char *s;
+ char *t;
+
+ s = data;
+ t = data;
+ while( *s ){
+ if( *s == c ){
+ s++;
+ size--;
+ } else {
+ *t++ = *s++;
+ }
+ }
+ *t = 0x00;
+ Resize( size );
+ return *this;
+}
+
+/************************************************************************/
+//! @brief Remove leading character from a string.
+/*!
+ \param c character to remove from beginning of string.
+ \returns Reference to this string.
+*/
+xbString &xbString::ZapLeadingChar( char c ){
+ /* left truncate all of character c */
+ xbUInt32 iLen = 0;
+ char *p;
+ p = data;
+ while( *p && *p == c ){
+ iLen++;
+ p++;
+ }
+ if( iLen )
+ Ltrunc( iLen );
+ return *this;
+}
+
+
+/************************************************************************/
+//! @brief Remove trailing character from a string.
+/*!
+ \param c character to remove from ending of string.
+ \returns Reference to this string.
+*/
+xbString &xbString::ZapTrailingChar( char c ){
+
+ xbUInt32 l = Len();
+ if( l == 0 )
+ return *this;
+
+ l--;
+ for(;;) {
+ if( data[l] != c )
+ break;
+ data[l] = 0;
+ size--;
+ if( l == 0 )
+ break;
+ l--;
+ }
+ return *this;
+}
+
+} /* namespace */ \ No newline at end of file
diff --git a/src/core/xbtag.cpp b/src/core/xbtag.cpp
new file mode 100755
index 0000000..a71880b
--- /dev/null
+++ b/src/core/xbtag.cpp
@@ -0,0 +1,121 @@
+/* xbtag.cpp
+
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_INDEX_SUPPORT
+
+
+namespace xb{
+
+/************************************************************************/
+//! @brief Constructor
+/*!
+ \param pIx Pointer to index file instance.
+ \param vpTag Pointer to tag structure within file instance.
+ \param sType NDX or MDX
+ \param sTagName Name of tag.
+ \param sExpression Tag key definition.
+ \param sFilter MDX only - tag qualification expression.
+ \param bUnique xbTrue - Index is unique.<br>xbFalse - Index is not unique.
+ \param bSort MDX only<br>xbTrue - Descending.<br>xbFalse - Ascending.
+*/
+
+xbTag::xbTag( xbIx *pIx, void *vpTag, xbString &sType, xbString &sTagName, xbString &sExpression, xbString &sFilter,
+xbBool bUnique, xbBool bSort )
+{
+ this->pIx = pIx;
+ this->vpTag = vpTag;
+ this->sType = sType;
+ this->sTagName = sTagName;
+ this->sExpression = sExpression;
+ this->sFilter = sFilter;
+ this->bUnique = bUnique;
+ this->bSort = bSort;
+}
+
+
+/************************************************************************/
+//! @brief Get tag key expression.
+/*!
+ \returns Tag key expression.
+*/
+const xbString &xbTag::GetExpression() const {
+ return sExpression;
+}
+/************************************************************************/
+//! @brief Get tag filter expression.
+/*!
+ \returns Tag filter expression (mdx only).
+*/
+
+const xbString &xbTag::GetFilter() const {
+ return sFilter;
+}
+/************************************************************************/
+//! @brief Get index file pointer.
+/*!
+ \returns Pointer to index file instance.
+*/
+xbIx *xbTag::GetIx() const {
+ return pIx;
+}
+/************************************************************************/
+//! @brief Get tag ascending setting.
+/*!
+ \returns Tag sort setting - MDX only.<br>xbTrue - Descending.<br>xbFalse - Ascending.
+*/
+xbBool xbTag::GetSort() const {
+ return bSort;
+}
+/************************************************************************/
+//! @brief Get tag name.
+/*!
+ \returns Tag name.
+*/
+
+const xbString &xbTag::GetTagName() const {
+ return sTagName;
+}
+/************************************************************************/
+//! @brief Get tag type.
+/*!
+ \returns Tag type.
+*/
+const xbString &xbTag::GetType() const {
+ return sType;
+}
+
+/************************************************************************/
+//! @brief Get tag unique setting.
+/*!
+ \returns Tag unique setting.<br>xbTrue - Unique.<br>xbFalse - Not unique.
+*/
+
+xbBool xbTag::GetUnique() const {
+ return bUnique;
+}
+/************************************************************************/
+//! @brief Get tag pointer for tag within index file.
+/*!
+ \returns Pointer to tag within index file instance.
+*/
+void *xbTag::GetVpTag() const {
+ return vpTag;
+}
+/************************************************************************/
+} /* namespace */
+#endif /* XB_INDEX_SUPPORT */ \ No newline at end of file
diff --git a/src/core/xbtblmgr.cpp b/src/core/xbtblmgr.cpp
new file mode 100755
index 0000000..e1bf496
--- /dev/null
+++ b/src/core/xbtblmgr.cpp
@@ -0,0 +1,257 @@
+/* xbtblmgr.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+//#ifdef HAVE_STRING_H
+//#include <string.h>
+//#endif
+
+namespace xb{
+
+/*************************************************************************/
+
+xbTblMgr::xbTblMgr(){
+ TblList = NULL;
+ iOpenTableCount = 0;
+}
+
+/*************************************************************************/
+
+xbTblMgr::~xbTblMgr(){
+ xbTblList *l;
+ if( TblList ){
+ while( TblList ){
+ l = TblList;
+ TblList = TblList->pNext;
+ delete l->psTblName;
+ delete l->psTblAlias;
+ free( l );
+ }
+ }
+}
+
+/*************************************************************************/
+
+xbInt16 xbTblMgr::AddTblToTblList( xbDbf *d, const xbString & sTblName ){
+ return AddTblToTblList( d, sTblName, "" );
+}
+
+/*************************************************************************/
+
+xbInt16 xbTblMgr::AddTblToTblList( xbDbf *d, const xbString & sTblName, const xbString & sTblAlias ) {
+
+ xbTblList *i, *s, *t;
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbString sAlias;
+
+ try{
+
+ if( sTblName.Len() == 0 ){
+ iErrorStop = 10;
+ iRc = XB_INVALID_TABLE_NAME;
+ throw iRc;
+ }
+
+ if( sTblAlias.Len() == 0 ){
+ sAlias = sTblName;
+ sAlias.SwapChars( '\\', '/' );
+ xbUInt32 iPos = sAlias.GetLastPos( '/' );
+ if( iPos > 0 ) /* get rid of the directory part of the name */
+ sAlias.Ltrunc( iPos );
+ } else {
+ sAlias = sTblAlias;
+ }
+
+ if((i = (xbTblList *) calloc(1, sizeof(xbTblList))) == NULL){
+ iErrorStop = 20;
+ iRc = XB_NO_MEMORY;
+ throw iRc;
+ }
+ i->psTblName = new xbString( sTblName );
+ i->psTblAlias = new xbString( sAlias );
+ i->pDbf = d;
+ i->pNext = NULL;
+
+ // insert new table into the list of open tables, sorted by table name
+ s = NULL;
+ t = TblList;
+
+ while(t && (strcmp( t->psTblAlias->Str(), sAlias.Str()) < 0 )){
+ s = t;
+ t = t->pNext;
+ }
+
+ if( t && (strcmp( t->psTblAlias->Str(), sAlias.Str()) == 0 )){
+ iErrorStop = 30;
+ delete i->psTblName;
+ delete i->psTblAlias;
+ free( i );
+ iRc = XB_DUP_TABLE_OR_ALIAS;
+ throw iRc;
+ }
+ i->pNext = t;
+ if (s == NULL)
+ TblList = i;
+ else
+ s->pNext = i;
+ }
+ catch (xbInt16 iRc ){
+ if( iErrorStop != 30 ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbTblMgr::AddTblToTblList() Exception Caught. Error Stop = [%d] iRc = [%d] Tbl Name = [%s] Alias = [%s]", iErrorStop, iRc, sTblName.Str(), sTblAlias.Str() );
+ std::cout << sMsg << std::endl;
+ }
+ }
+ if( iRc == XB_NO_ERROR )
+ iOpenTableCount++;
+ return iRc;
+}
+
+/*************************************************************************/
+xbInt16 xbTblMgr::DisplayTableList() const {
+ xbInt16 iTblCnt = 0;
+ xbTblList * l = TblList;
+ std::cout << "-- Open Table List --" << std::endl;
+ if( l == NULL )
+ std::cout << "Table list is empty" << std::endl;
+ else{
+ while( l ){
+ iTblCnt++;
+ std::cout << iTblCnt << " Table=[" << l->psTblName->Str() << "] Alias=[" << l->psTblAlias->Str() << "]" << std::endl;
+ l = l->pNext;
+ }
+ }
+ return iTblCnt;
+}
+
+/*************************************************************************/
+/* Get pointer to named dbf.
+ Looks up an open DBF file by Name.
+
+ returns A pointer to the xbDbf class instance if found or NULL if not found.
+
+ // looks for a match as an alias first, if not found as an alias, looks at the name
+
+*/
+
+xbDbf *xbTblMgr::GetDbfPtr(const xbString& sTblAlias) const {
+
+ xbTblList *t;
+ t = TblList;
+ while( t ){
+ if( sTblAlias == t->psTblAlias->Str())
+ return t->pDbf;
+ t = t->pNext;
+ }
+
+ t = TblList;
+ while( t ){
+ if( sTblAlias == t->psTblName->Str())
+ return t->pDbf;
+ t = t->pNext;
+ }
+ return NULL;
+}
+
+/*************************************************************************/
+/* Get pointer to named dbf.
+ Looks up an open DBF file by Name.
+
+ returns pointer to the xbDbf class instance if found or NULL if not found.
+*/
+
+xbDbf *xbTblMgr::GetDbfPtr(xbInt16 iItemNo ) const {
+
+ xbTblList *t;
+ t = TblList;
+ xbInt16 iCnt = 1;
+
+ if( iItemNo < 1 || iItemNo > iOpenTableCount )
+ return NULL;
+
+ while( t && iCnt < iItemNo ){
+ t = t->pNext;
+ iCnt++;
+ }
+ if( t )
+ return t->pDbf;
+ else
+ return NULL;
+}
+
+/*************************************************************************/
+xbInt16 xbTblMgr::GetOpenTableCount() const {
+ return iOpenTableCount;
+}
+
+/*************************************************************************/
+xbInt16 xbTblMgr::RemoveTblFromTblList( const xbString & sTblAlias ) {
+ xbTblList *i, *s;
+
+ i = TblList;
+ s = NULL;
+
+ while( i ){
+
+ if( strcmp( i->psTblAlias->Str(), sTblAlias.Str()) == 0 ) {
+ if(s)
+ s->pNext = i->pNext;
+ else
+ TblList = i->pNext;
+
+ delete i->psTblName;
+ delete i->psTblAlias;
+ free( i );
+ iOpenTableCount--;
+ return XB_NO_ERROR;
+ } else {
+ s = i;
+ i = i->pNext;
+ }
+ }
+ return XB_NOT_FOUND;
+}
+/*************************************************************************/
+xbInt16 xbTblMgr::RemoveTblFromTblList( xbDbf *pTbl ) {
+ xbTblList *i, *s;
+
+ i = TblList;
+ s = NULL;
+
+ while( i ){
+
+ if( i->pDbf == pTbl ) {
+ if(s)
+ s->pNext = i->pNext;
+ else
+ TblList = i->pNext;
+
+ delete i->psTblName;
+ delete i->psTblAlias;
+ free( i );
+ iOpenTableCount--;
+ return XB_NO_ERROR;
+ } else {
+ s = i;
+ i = i->pNext;
+ }
+ }
+ return XB_NOT_FOUND;
+}
+
+/*************************************************************************/
+} /* namespace */
diff --git a/src/core/xbuda.cpp b/src/core/xbuda.cpp
new file mode 100755
index 0000000..0a9c2e7
--- /dev/null
+++ b/src/core/xbuda.cpp
@@ -0,0 +1,78 @@
+/* xbuda.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+This module handles uda (user data area) methods
+
+*/
+
+#include "xbase.h"
+
+
+// might need to change thisto XB_EXPRESSION_SUPPORT
+#ifdef XB_EXPRESSION_SUPPORT
+
+
+namespace xb{
+
+/************************************************************************/
+xbUda::xbUda() {
+ llOrd. SetDupKeys( xbFalse );
+}
+/************************************************************************/
+xbUda::~xbUda() {}
+/************************************************************************/
+void xbUda::Clear() {
+ llOrd.Clear();
+}
+/************************************************************************/
+xbInt16 xbUda::GetTokenCnt() const {
+ return llOrd.GetNodeCnt();
+}
+/************************************************************************/
+
+xbInt16 xbUda::GetTokenForKey( const xbString &sKey, xbString &sToken ) {
+ return llOrd.GetDataForKey( sKey, sToken );
+}
+
+/************************************************************************/
+xbInt16 xbUda::AddTokenForKey( const xbString &sKey, const xbString &sToken ) {
+ return llOrd.InsertKey( sKey, sToken );
+}
+/************************************************************************/
+
+xbInt16 xbUda::UpdTokenForKey( const xbString &sKey, const xbString &sData ) {
+ return llOrd.UpdateForKey( sKey, sData );
+}
+
+/************************************************************************/
+xbInt16 xbUda::DelTokenForKey( const xbString &sKey ) {
+ return llOrd.RemoveKey( sKey ); //, sToken );
+}
+
+
+/************************************************************************/
+
+void xbUda::DumpUda() const{
+
+ xbLinkListNode<xbString> *lln = llOrd.GetHeadNode();
+
+ xbInt32 l = 0;
+ while( lln ){
+ std::cout << ++l << " Key=[" << lln->GetKey() << "] Data=[" << lln->GetData() << "]" << std::endl;
+ lln = lln->GetNextNode();
+ }
+}
+
+/************************************************************************/
+} /* namespace */
+#endif /* XB_EXPRESSION_SUPPORT */ \ No newline at end of file
diff --git a/src/core/xbxbase.cpp b/src/core/xbxbase.cpp
new file mode 100755
index 0000000..7dd3ac7
--- /dev/null
+++ b/src/core/xbxbase.cpp
@@ -0,0 +1,712 @@
+/* xbxbase.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+namespace xb{
+
+/*************************************************************************/
+//! @brief Class Constructor.
+xbXBase::xbXBase() {
+ SetEndianType();
+ #ifdef XB_LOGGING_SUPPORT
+ xLog = new xbLog();
+ #endif
+}
+/*************************************************************************/
+//! @brief Class Deconstructor.
+xbXBase::~xbXBase(){
+ CloseAllTables();
+ #ifdef XB_LOGGING_SUPPORT
+ delete xLog;
+ #endif
+}
+
+/*************************************************************************/
+//! @brief Close all tables / files.
+/*!
+ This closes everything.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::CloseAllTables(){
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbInt16 iOpenTableCnt = GetOpenTableCount();
+ try{
+ xbDbf *d;
+ for( xbInt16 i = 0; i < iOpenTableCnt; i++ ){
+ d = (xbDbf *) GetDbfPtr( 1 );
+ if( d ){
+ if(( iRc = d->Close()) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ } else {
+ iRc = XB_INVALID_OBJECT;
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbxbase::CloseAllTables() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, iRc );
+ WriteLogMessage( sMsg.Str() );
+ WriteLogMessage( GetErrorMessage( iRc ));
+ }
+ return iRc;
+}
+/*************************************************************************/
+#ifdef XB_LOGGING_SUPPORT
+//! @brief Get fully qualified log file name.
+/*!
+ \returns Returns the fully qualified log file name.
+*/
+const xbString & xbXBase::GetLogFqFileName() const {
+ return xLog->GetFqFileName();
+}
+
+//! @brief Get the log file name.
+/*!
+ \returns Returns the log file name.
+*/
+const xbString & xbXBase::GetLogFileName() const {
+ return xLog->GetFileName();
+}
+
+//! @brief Get the log directory.
+/*!
+ \returns Returns the log directory.
+*/
+const xbString & xbXBase::GetLogDirectory() const {
+ return xLog->GetDirectory();
+}
+
+//! @brief Get the log directory.
+/*!
+ \returns xbTrue - Logging enabled.<br>xbFalse - Logging disables.
+*/
+xbBool xbXBase::GetLogStatus() const {
+ return xLog->LogGetStatus();
+}
+
+//! @brief Set the log file name.
+/*!
+ \param sLogFileName - Log File Name.
+ \return void
+*/
+void xbXBase::SetLogFileName( const xbString & sLogFileName ){
+ xLog->SetFileName( sLogFileName );
+}
+
+//! @brief Set the log directory.
+/*!
+ \param sLogDirectory - Log File Directory.
+ \return void
+*/
+void xbXBase::SetLogDirectory( const xbString & sLogDirectory ){
+ xLog->SetDirectory( sLogDirectory );
+}
+
+//! @brief Set the logfile size.
+/*!
+ \param lSize - Log File Size.
+ \return void
+*/
+void xbXBase::SetLogSize( size_t lSize ) {
+ xLog->LogSetLogSize( lSize );
+}
+
+
+//! @brief Write message to logfile.
+/*!
+ \param sLogMessage - Message to write.
+ \param iOpt 0 = stdout<br>
+ 1 = Syslog<br>
+ 2 = Both<br>
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbXBase::WriteLogMessage( const xbString & sLogMessage, xbInt16 iOpt ){
+ return xLog->LogWrite( sLogMessage, iOpt );
+}
+
+//! @brief Write message to logfile.
+/*!
+ \param lCnt - Number of bytes to write.
+ \param p - Pointer to bytes to write to log file.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+xbInt16 xbXBase::WriteLogBytes( xbUInt32 lCnt, const char *p ){
+ return xLog->LogWriteBytes( lCnt, p );
+}
+
+//! @brief Enable message logging.
+void xbXBase::EnableMsgLogging() {
+ xLog->LogSetStatus( xbTrue );
+}
+
+//! @brief Disable message logging.
+void xbXBase::DisableMsgLogging() {
+ xLog->LogSetStatus( xbFalse );
+}
+
+//! @brief Flush log file updates to disk.
+xbInt16 xbXBase::FlushLog() {
+ return xLog->xbFflush();
+}
+#else
+
+// if logging not compiled in, these stubs are called with no effect
+const xbString & xbXBase::GetLogFqFileName() const {
+ return sNullString;
+}
+const xbString & xbXBase::GetLogFileName() const {
+ return sNullString;
+}
+const xbString & xbXBase::GetLogDirectory() const {
+ return sNullString;
+}
+void xbXBase::SetLogFileName( const xbString & sLogFileName ){
+ return;
+}
+void xbXBase::SetLogDirectory( const xbString & sLogDirectory ){
+ return;
+}
+xbBool xbXBase::GetLogStatus() const {
+ return xbFalse;
+}
+xbInt16 xbXBase::WriteLogMessage( const xbString & sLogMessage ){
+ return XB_NO_ERROR;
+}
+xbInt16 xbXBase::WriteLogBytes( xbUInt32 lCnt, const char *p ){
+ return XB_NO_ERROR;
+}
+void xbXBase::EnableMsgLogging() {
+ return;
+}
+void xbXBase::DisableMsgLogging() {
+ return;
+}
+xbInt16 xbXBase::FlushLog() {
+ return;
+}
+void xbXBase::SetLogSize( size_t lSize ) {
+ return;
+}
+#endif // XB_LOGGING_SUPPORT
+
+/*************************************************************************/
+#ifdef XB_FUNCTION_SUPPORT
+
+//! @brief Get information regarding expression functions.
+/*!
+ \param sExpLine An expression beginning with function name.
+ \param cReturnType Output - return type of function.
+ \param iCalc Used to calculate the function return value is<br>
+ 1 = use value specified in lReturnLenVal<br>
+ 2 = use length of operand specified in col 4<br>
+ 3 = use valued of numeric operand specified in col 4<br>
+ 4 = length of parm 1 * numeric value parm<br>
+ 5 = larger length of parm 2 or length of parm 3<br>
+ 6 = if two or more parms, use numeric value from second parm, otherwise use col4 value
+ \param lReturnLenVal Used in combination with iReturnLenCalc.
+ \returns <a href="xbretcod_8h.html">Return Codes</a>
+*/
+
+xbInt16 xbXBase::GetFunctionInfo( const xbString &sExpLine, char &cReturnType, xbInt16 &iCalc, xbInt32 &lReturnLenVal ) const{
+
+ xbUInt32 iLen;
+ const char *s;
+ if( sExpLine.Len() == 0 )
+ return XB_INVALID_FUNCTION;
+
+ s = sExpLine;
+ iLen = 0;
+ while( *s && *s != '(' && *s != ' ' ) { s++; iLen++; }
+ xbString sFunction( sExpLine, iLen );
+ cReturnType = 0x00;
+ char cFunc1 = sFunction[1];
+
+ if( cFunc1 < 'L' ){
+ // std::cout << "less than L\n";
+ if( cFunc1 < 'D' ){
+ // std::cout << "less than D\n";
+ if( sFunction == "ABS" ){
+ // { "ABS", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "ALLTRIM" ){
+ // { "ALLTRIM", 'C', 2, 1 },
+ cReturnType = 'C';
+ iCalc = 2;
+ lReturnLenVal = 1;
+ } else if( sFunction == "ASC" ){
+ // { "ASC", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "AT" ){
+ // { "AT", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "CDOW" ){
+ // { "CDOW", 'C', 1, 9 },
+ cReturnType = 'C';
+ iCalc = 1;
+ lReturnLenVal = 9;
+ } else if( sFunction == "CHR" ){
+ // { "CHR", 'C', 1, 1 },
+ cReturnType = 'C';
+ iCalc = 1;
+ lReturnLenVal = 1;
+ } else if( sFunction == "CMONTH" ){
+ // { "CMONTH", 'C', 1, 9 },
+ cReturnType = 'C';
+ iCalc = 1;
+ lReturnLenVal = 9;
+ } else if( sFunction == "CTOD" ){
+ // { "CTOD", 'D', 1, 8 },
+ cReturnType = 'D';
+ iCalc = 1;
+ lReturnLenVal = 8;
+ }
+ } else {
+ // std::cout << ">= D\n";
+ if( sFunction == "DATE" ){
+ // { "DATE", 'D', 1, 8 },
+ cReturnType = 'D';
+ iCalc = 1;
+ lReturnLenVal = 8;
+ } else if( sFunction == "DAY" ){
+ // { "DAY", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "DEL" ){
+ // { "DEL", 'C', 1, 1 },
+ cReturnType = 'C';
+ iCalc = 1;
+ lReturnLenVal = 1;
+ } else if( sFunction == "DELETED" ){
+ // { "DELETED", 'L', 1, 1 },
+ cReturnType = 'L';
+ iCalc = 1;
+ lReturnLenVal = 1;
+ } else if( sFunction == "DESCEND" ){
+ // { "DESCEND", '1', 2, 1 },
+ cReturnType = '1';
+ iCalc = 2;
+ lReturnLenVal = 1;
+ } else if( sFunction == "DOW" ){
+ // { "DOW", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "DTOC" ){
+ // { "DTOC", 'C', 1, 8 },
+ cReturnType = 'C';
+ iCalc = 1;
+ lReturnLenVal = 8;
+ } else if( sFunction == "DTOS" ){
+ // { "DTOS", 'C', 1, 8 },
+ cReturnType = 'C';
+ iCalc = 1;
+ lReturnLenVal = 8;
+ } else if( sFunction == "EXP" ){
+ // { "EXP", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "IIF" ){
+ // { "IIF", 'C', 5, 0 },
+ cReturnType = 'C';
+ iCalc = 5;
+ lReturnLenVal = 0;
+ } else if( sFunction == "INT" ){
+ // { "INT", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "ISALPHA" ){
+ // { "ISALPHA", 'L', 1, 1 },
+ cReturnType = 'L';
+ iCalc = 1;
+ lReturnLenVal = 1;
+ } else if( sFunction == "ISLOWER" ){
+ // { "ISLOWER", 'L', 1, 1 },
+ cReturnType = 'L';
+ iCalc = 1;
+ lReturnLenVal = 1;
+ } else if( sFunction == "ISUPPER" ){
+ // { "ISUPPER", 'L', 1, 1 },
+ cReturnType = 'L';
+ iCalc = 1;
+ lReturnLenVal = 1;
+ }
+ }
+ } else {
+ // std::cout << ">= L\n";
+ if( cFunc1 < 'R' ) {
+ // std::cout << " < R\n";
+ if( sFunction == "LEFT" ){
+ // { "LEFT", 'C', 3, 2 },
+ cReturnType = 'C';
+ iCalc = 3;
+ lReturnLenVal = 2;
+ } else if( sFunction == "LEN" ){
+ // { "LEN", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 3;
+ } else if( sFunction == "LOG" ){
+ // { "LOG", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "LOWER" ){
+ // { "LOWER", 'C', 2, 1 },
+ cReturnType = 'C';
+ iCalc = 2;
+ lReturnLenVal = 1;
+ } else if( sFunction == "LTRIM" ){
+ // { "LTRIM", 'C', 2, 1 },
+ cReturnType = 'C';
+ iCalc = 2;
+ lReturnLenVal = 1;
+ } else if( sFunction == "MAX" ){
+ // { "MAX", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "MIN" ){
+ // { "MIN", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "MONTH" ){
+ // { "MONTH", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ }
+ } else if( cFunc1 == 'R' ){
+ // std::cout << "==R\n";
+ if( sFunction == "RECNO" ){
+ // { "RECNO", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "RECCOUNT" ){
+ // { "RECCOUNT", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "REPLICATE" ){
+ // { "REPLICATE", 'C', 4, 0 },
+ cReturnType = 'C';
+ iCalc = 4;
+ lReturnLenVal = 0;
+ } else if( sFunction == "RIGHT" ){
+ // { "RIGHT", 'C', 3, 2 },
+ cReturnType = 'C';
+ iCalc = 3;
+ lReturnLenVal = 2;
+ } else if( sFunction == "RTRIM" ){
+ // { "RTRIM", 'C', 2, 1 },
+ cReturnType = 'C';
+ iCalc = 2;
+ lReturnLenVal = 1;
+ }
+ } else if( cFunc1 == 'S' ){
+ // std::cout << "==S\n";
+ if( sFunction == "SPACE" ){
+ // { "SPACE", 'C', 3, 1 },
+ cReturnType = 'C';
+ iCalc = 3;
+ lReturnLenVal = 1;
+ } else if( sFunction == "SQRT" ){
+ // { "SQRT", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ } else if( sFunction == "STOD" ){
+ // { "STOD", 'D', 1, 8 },
+ cReturnType = 'D';
+ iCalc = 1;
+ lReturnLenVal = 8;
+ } else if( sFunction == "STR" ){
+ // { "STR", 'C', 6, 10 },
+ cReturnType = 'C';
+ iCalc = 6;
+ lReturnLenVal = 10;
+ } else if( sFunction == "STRZERO" ){
+ // { "STRZERO", 'C', 3, 2 },
+ cReturnType = 'C';
+ iCalc = 3;
+ lReturnLenVal = 2;
+ } else if( sFunction == "SUBSTR" ){
+ // { "SUBSTR", 'C', 3, 3 },
+ cReturnType = 'C';
+ iCalc = 3;
+ lReturnLenVal = 3;
+ }
+ } else {
+ // std::cout << ">S\n";
+ if( sFunction == "TRIM" ){
+ // { "TRIM", 'C', 2, 1 },
+ cReturnType = 'C';
+ iCalc = 2;
+ lReturnLenVal = 1;
+ } else if( sFunction == "UPPER" ){
+ // { "UPPER", 'C', 2, 1 },
+ cReturnType = 'C';
+ iCalc = 2;
+ lReturnLenVal = 1;
+ } else if( sFunction == "VAL" ){
+ // { "VAL", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 3;
+ } else if( sFunction == "YEAR" ){
+ // { "YEAR", 'N', 1, 4 },
+ cReturnType = 'N';
+ iCalc = 1;
+ lReturnLenVal = 4;
+ }
+ }
+ }
+ if( cReturnType == 0x00 )
+ return XB_INVALID_FUNCTION;
+ else
+ return XB_NO_ERROR;
+}
+#endif
+/*************************************************************************/
+//! @brief Cross platform sleep function.
+/*!
+ \param lMillisecs Milliseconds to sleep.
+*/
+void xbXBase::xbSleep( xbInt32 lMillisecs ){
+ #ifdef WIN32
+ Sleep( lMillisecs );
+ #else
+ usleep( (xbInt64) lMillisecs * 1000 );
+ #endif
+
+}
+/***********************************************************************/
+//! @brief Cross memcmp function.
+/*!
+ \param s1 Left operand to compare.
+ \param s2 Right operand to compare.
+ \param n Number of bytes to compare.
+ \returns 1 s1 > s2<br>
+ 0 s1 == s2<br>
+ -1 s1 < s2
+*/
+xbInt16 xbXBase::xbMemcmp( const unsigned char *s1, const unsigned char *s2, size_t n ){
+ // The standard memcmp function was found not to behave the same across all platforms
+ for( size_t i = 0; i < n; i++ ){
+ if( s1[i] > s2[i] )
+ return 1;
+ else if( s1[i] < s2[i] )
+ return -1;
+ }
+ return 0;
+}
+
+/***********************************************************************/
+//! @brief Open highest qualified class available for dbf file.
+/*!
+ This routine opens the highest available version of the dbf file.
+ Defaults to XB_READ_WRITE and XB_MULTI_USER mode.
+ \returns param dbf - Output pointer to dbf file opened or null if error
+*/
+xbDbf* xbXBase::Open( const xbString &sTableName, xbInt16 &iRc ){
+ return Open( sTableName, "", XB_READ_WRITE, XB_MULTI_USER, 0, iRc );
+}
+/***********************************************************************/
+//! @brief Open highest qualified class available for dbf file.
+/*!
+ This routine can open various versions of the dbf file dependent on the iVersion field
+
+ \param sTableName - Table name to open.
+ \param sAlias - Optional alias name.
+ \param iOpenMode - XB_READ_WRITE or XB_READ
+ \param iShareMode - XB_SINGLE_USER or XB_MULTI_USER
+ \param iRequestVersion 0 - Highest available
+ 4 - Version four dbf
+ 3 - Version three dbf
+ \param iRc - Return code from open request
+ \returns param dbf - Output pointer to dbf file opened or null if error
+*/
+
+
+xbDbf* xbXBase::Open( const xbString &sTableName, const xbString &sAlias, xbInt16 iOpenMode,
+ xbInt16 iShareMode, xbInt16 iRequestVersion, xbInt16 &iRc ){
+
+ xbInt16 iErrorStop = 0;
+ xbDbf * pDbf = 0;
+ iRc = 0;
+ xbString sFqFileName;
+
+ try{
+
+ if( sTableName.Len() == 0 ){
+ iErrorStop = 10;
+ iRc = XB_FILE_NOT_FOUND;
+ throw iRc;
+ }
+ xbFile *f = new xbFile(this);
+ f->SetFileName( sTableName );
+ if(( iRc = f->FileExists( f->GetFqFileName())) != xbTrue ){
+ iErrorStop = 20;
+ iRc = XB_FILE_NOT_FOUND;
+ throw iRc;
+ }
+ unsigned char cFileTypeByte;
+ if(( iRc = f->GetXbaseFileTypeByte( f->GetFqFileName(), cFileTypeByte )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ xbInt16 iTblVsn = f->DetermineXbaseTableVersion( cFileTypeByte );
+ f->xbFclose();
+ sFqFileName.Set( f->GetFqFileName() );
+ delete f;
+
+ if( iTblVsn == 4 && ( iRequestVersion == 0 || iRequestVersion == 4 )){
+ #ifdef XB_DBF4_SUPPORT
+ pDbf = new xbDbf4( this );
+ iRc = pDbf->Open( sFqFileName, sAlias, iOpenMode, iShareMode );
+ #else
+ // std::cout << "Dbase IV file support not build into library. See XB_DBF4_SUPPORT" << std::endl;
+ iErrorStop = 40;
+ iRc = XB_FILE_TYPE_NOT_SUPPORTED;
+ throw iRc;
+ #endif
+ }
+ else if( iTblVsn == 3 && ( iRequestVersion == 0 || iRequestVersion == 3 )){
+
+ #ifdef XB_DBF3_SUPPORT
+ pDbf = new xbDbf3( this );
+ iRc = pDbf->Open( sFqFileName, sAlias, iOpenMode, iShareMode );
+ #else
+ //std::cout << "Dbase III file support not build into library. See XB_DBF3_SUPPORT" << std::endl;
+ iErrorStop = 50;
+ iRc = XB_FILE_TYPE_NOT_SUPPORTED;
+ throw iRc;
+ #endif
+
+ } else {
+ iErrorStop = 60;
+ iRc = XB_FILE_TYPE_NOT_SUPPORTED;
+ throw iRc;
+ }
+
+ if( iRc != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+
+ std::cout << "Openerror\n";
+
+ xbString sMsg;
+ sMsg.Sprintf( "xbxbase::Open() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, iRc );
+ WriteLogMessage( sMsg.Str() );
+ WriteLogMessage( GetErrorMessage( iRc ));
+
+ }
+ return pDbf;
+
+}
+
+xbInt16 xbXBase::OpenHighestVersion( const xbString &sTableName, const xbString &sAlias,
+ xbDbf **dbf )
+{
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ xbDbf * pwDbf;
+
+ try{
+ xbFile f(this);
+ if( sTableName.Len() == 0 ){
+ iErrorStop = 10;
+ iRc = XB_FILE_NOT_FOUND;
+ throw iRc;
+ }
+ f.SetFileName( sTableName );
+ if(( iRc = f.FileExists( f.GetFqFileName() )) != xbTrue ){
+ iErrorStop = 20;
+ iRc = XB_FILE_NOT_FOUND;
+ throw iRc;
+ }
+ unsigned char cFileTypeByte;
+ if(( iRc = f.GetXbaseFileTypeByte( f.GetFqFileName(), cFileTypeByte )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ return iRc;
+ }
+ if( f.DetermineXbaseTableVersion( cFileTypeByte ) == 4 ){
+ #ifdef XB_DBF4_SUPPORT
+ pwDbf = new xbDbf4( this );
+ pwDbf->Open( f.GetFqFileName(), sAlias );
+ *dbf = pwDbf;
+ pwDbf = 0;
+ #else
+ // std::cout << "Dbase IV file support not build into library. See XB_DBF4_SUPPORT" << std::endl;
+ iErrorStop = 40;
+ iRc = XB_FILE_TYPE_NOT_SUPPORTED;
+ throw iRc;
+ #endif
+
+ } else if( f.DetermineXbaseTableVersion( cFileTypeByte ) == 3 ){
+ #ifdef XB_DBF3_SUPPORT
+ *dbf = new xbDbf3( this );
+ #else
+ //std::cout << "Dbase III file support not build into library. See XB_DBF3_SUPPORT" << std::endl;
+ iErrorStop = 50;
+ iRc = XB_FILE_TYPE_NOT_SUPPORTED;
+ throw iRc;
+ #endif
+
+ } else {
+ iErrorStop = 60;
+ iRc = XB_FILE_TYPE_NOT_SUPPORTED;
+ throw iRc;
+ }
+
+ }
+ catch (xbInt16 iRc ){
+
+ std::cout << "OpenHighestVersion error\n";
+
+ xbString sMsg;
+ sMsg.Sprintf( "xbxbase::OpenHighestVersion() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, iRc );
+ WriteLogMessage( sMsg.Str() );
+ WriteLogMessage( GetErrorMessage( iRc ));
+
+ }
+ return iRc;
+}
+/***********************************************************************/
+} /* namespace */
diff --git a/src/examples/xb_ex_date.cpp b/src/examples/xb_ex_date.cpp
new file mode 100755
index 0000000..fc038b5
--- /dev/null
+++ b/src/examples/xb_ex_date.cpp
@@ -0,0 +1,210 @@
+/* xb_ex_date.cpp
+
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2021,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+This program demonstrates using the xbDate class
+
+*/
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+int main()
+{
+
+ xbString StringDate( "19601007" ); /* oct 7 1960 */
+ char CharDate[9] = "19611109"; /* nov 9 1961 */
+
+ xbDate d1; /* today is default */
+ xbDate d2( StringDate ); /* from string data */
+ xbDate d3( CharDate ); /* from char data */
+ xbDate d4; /* another date class */
+ xbString s;
+
+ std::cout << "This program demonstrates usage of the xbDate class" << std::endl;
+ std::cout << "Date 1 (Sysdate) is " << d1.Str() << std::endl;
+ std::cout << "Date 2 (StringDate) is " << d2.Str() << std::endl;
+ std::cout << "Date 3 (CharDate) is " << d3.Str() << std::endl;
+
+ std::cout << "This year is " << d1.YearOf() << std::endl;
+ std::cout << "Year of xbString Date is " << d2.YearOf()
+ << std::endl;
+ std::cout << "Year of char Date is " << d3.YearOf()
+ << std::endl;
+
+ std::cout << "This Month is " << d1.MonthOf() << std::endl;
+ std::cout << "Month of xbString Date is " << d2.MonthOf()
+ << std::endl;
+ std::cout << "Month of char Date is " << d3.MonthOf()
+ << std::endl;
+
+ std::cout << "Today is day " << d1.DayOf( XB_FMT_WEEK ) << " of the week" << std::endl;
+ std::cout << "StringDate is day " << d2.DayOf( XB_FMT_MONTH ) << " of the month" << std::endl;
+ std::cout << "CharDate is day " << d3.DayOf( XB_FMT_YEAR ) << " of the year" << std::endl;
+
+ if( d1.IsLeapYear())
+ std::cout << "This is a leap year" << std::endl;
+ else
+ std::cout << "This is not a leap year." << std::endl;
+
+ if( d2.IsLeapYear())
+ std::cout << "StringDate is a leap year" << std::endl;
+ else
+ std::cout << "StringDate is not a leap year." << std::endl;
+
+ if( d3.IsLeapYear())
+ std::cout << "CharDate is a leap year" << std::endl;
+ else
+ std::cout << "CharDate is not a leap year." << std::endl;
+
+ std::cout << "Today is " << d1.Sysdate() << std::endl;
+
+ if( d1.DateIsValid( "19951301" ))
+ std::cout << "19951301 is a valid date" << std::endl;
+ else
+ std::cout << "19951301 is not a valid date" << std::endl;
+
+ if( d1.DateIsValid( "19920229" ))
+ std::cout << "19920229 is a valid date" << std::endl;
+ else
+ std::cout << "19920229 is not a valid date" << std::endl;
+
+ if( d2.DateIsValid( StringDate ))
+ std::cout << StringDate.Str() << " is a valid date" << std::endl;
+ else
+ std::cout << StringDate.Str() << " is not a valid date" << std::endl;
+
+ std::cout << "Today's Julian date " << d1.JulianDays() << std::endl;
+ std::cout << "Julian date of Jan 01, 1970 " << d2.JulianDays() << std::endl;
+ std::cout << "StringDate Julian date " << d2.JulianDays() << std::endl;
+
+ std::cout << "There are " << (d1.JulianDays() - d2.JulianDays()) << " days between " << d1.Str() << " and " << d2.Str() << std::endl;
+
+ std::cout << "Todays Julian date (Number of days since Jan 1 0100):" << d1.JulianDays() << std::endl;
+
+ d4 = d1; // set d4 class = to sysdate
+ std::cout << "Object d4 initialized to " << d4.Str() << std::endl;
+ std::cout << "This should be todays date: "
+ << d4.JulToDate8(d4.JulianDays()) << std::endl;
+ std::cout << "In 7 days it will be "
+ << d4.JulToDate8(d4.JulianDays() + 7L ) << std::endl;
+
+ d1.CharDayOf( s );
+ std::cout << "Today is " << s.Str() << std::endl;
+
+ d2.CharDayOf( s );
+ std::cout << "StringDate day is " << s.Str() << std::endl;
+ d1.CharMonthOf( s );
+ std::cout << "This month is " << s.Str() << std::endl;
+ d2.CharMonthOf( s );
+ std::cout << "StringDate month is " << s.Str() << std::endl;
+
+
+ /* various format routines using different formats, strings and chars */
+ xbString sOutDate;
+
+ d1.FormatDate( "YYDDD", sOutDate );
+ std::cout << "Format (YYDDD) = " << sOutDate.Str() << std::endl;
+
+ d1.FormatDate( "MM/DD/YY", sOutDate );
+ std::cout << "Format (MM/DD/YY) = " << sOutDate.Str() << std::endl;
+
+ d1.FormatDate( "YY-MM-DD", sOutDate );
+ std::cout << "Format (YY-MM-DD) = " << sOutDate.Str() << std::endl;
+
+ d1.FormatDate( "DDDDDDDDD, MMMMMMMMMM DD YYYY", sOutDate );
+ std::cout << "Format (DDDDDDDDD, MMMMMMMMMM DD YYYY) = " << sOutDate.Str() << std::endl;
+
+ std::cout << "Last day this month " << d1.LastDayOfMonth() << std::endl;
+ std::cout << "Last day of month for StringDate is " << d2.LastDayOfMonth() << std::endl;
+
+ std::cout << "Overloaded operators test..." << std::endl;
+
+ if( d1 == d2 )
+ std::cout << d1.Str() << " is equal to " << d2.Str()
+ << std::endl;
+ else
+ std::cout << d1.Str() << " is not equal to " << d2.Str()
+ << std::endl;
+
+ if( d1 != d3 )
+ std::cout << d1.Str() << " is not equal to " << d3.Str()
+ << std::endl;
+ else
+ std::cout << d1.Str() << " is equal to " << d3.Str()
+ << std::endl;
+
+ if( d1 < d2 )
+ std::cout << d1.Str() << " is less than " << d2.Str()
+ << std::endl;
+ else
+ std::cout << d1.Str() << " is not less than " << d2.Str()
+ << std::endl;
+
+ if( d1 > d2 )
+ std::cout << d1.Str() << " is greater than " << d2.Str()
+ << std::endl;
+ else
+ std::cout << d1.Str() << " is not greater than " << d2.Str()
+ << std::endl;
+
+ if( d1 <= d2 )
+ std::cout << d1.Str() << " is less than or equal to " << d2.Str()
+ << std::endl;
+ else
+ std::cout << d1.Str() << " is not less than or equal to "
+ << d2.Str() << std::endl;
+
+ if( d1 >= d2 )
+ std::cout << d1.Str() << " is greater than or equal to "
+ << d2.Str() << std::endl;
+ else
+ std::cout << d1.Str() << " is not greater than or equal to "
+ << d2.Str() << std::endl;
+
+ d1.Sysdate();
+ d1++;
+ std::cout << "Tomorrow is " << d1.Str() << std::endl;
+ d1-=2;
+ std::cout << "Yesterday was " << d1.Str() << std::endl;
+ std::cout << "There are " << d1 - d2 << " days between " << d1.Str()
+ << " and " << d2.Str() << std::endl;
+
+ d1="20140701";
+ std::cout << "Operator = example " << d1.Str() << std::endl;
+
+ d1+=5;
+ std::cout << "Operator += 5 example " << d1.Str() << std::endl;
+
+ d1--;
+ std::cout << "Operator -- example " << d1.Str() << std::endl;
+
+ d1-4;
+ std::cout << "Operator -4 example " << d1.Str() << std::endl;
+
+ d1+10;
+ std::cout << "Operator +10 example " << d1.Str() << std::endl;
+ std::cout << "CenturyOf() " << d1.CenturyOf() << std::endl;
+
+ xbString sWorkDate;
+ d1.CTOD( "10/07/60" );
+ std::cout << "CTOD( '10/07/60' ) " << d1.Str() << std::endl;
+
+ d1.Set( "19590118" );
+ std::cout << "Set( '19590118' ) " << d1.Str() << std::endl;
+
+ std::cout << "CalcRollingCenturyForYear( 95 ) = " << d1.CalcRollingCenturyForYear( 95 ) << std::endl;
+ return 0;
+}
diff --git a/src/examples/xb_ex_sql.cpp b/src/examples/xb_ex_sql.cpp
new file mode 100755
index 0000000..695baa2
--- /dev/null
+++ b/src/examples/xb_ex_sql.cpp
@@ -0,0 +1,111 @@
+/* xb_ex_sql.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+ This example demonstrates the implementation of initial sql functions into the library
+
+*/
+
+#include <xbase.h>
+using namespace xb;
+
+int main( int argCnt, char **av )
+{
+ xbInt16 iRc;
+ xbXBase x; /* initialize xbase */
+
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ xbSql sql( &x );
+ xbString sSql;
+
+
+ sSql.Sprintf( "USE %s", PROJECT_DATA_DIR);
+ iRc = sql.ExecuteNonQuery( sSql );
+ if( iRc != XB_NO_ERROR ){
+ std::cout << "USE PROJECT_DATA_DIR error" << std::endl;
+ x.DisplayError( iRc );
+ return 1;
+ } else {
+ std::cout << sSql << " successful" << std::endl;
+ }
+
+ sSql = "DROP TABLE IF EXISTS TESTTBL.DBF";
+ iRc = sql.ExecuteNonQuery( sSql );
+ if( iRc != XB_NO_ERROR ){
+ std::cout << "DROP TABLE error" << std::endl;
+ x.DisplayError( iRc );
+ return 1;
+ } else {
+ std::cout << "DROP TABLE successful" << std::endl;
+ }
+
+ std::cout << "Drop table completed\n";
+
+ sSql = "CREATE TABLE TESTTBL.DBF( CHRFLD CHAR(60), DTFLD DATE, INTFLD INTEGER, SMINTFLD SMALLINT, NUMFLD NUMERIC(9,4), DECFLD DECIMAL(9,4), FLTFLD FLOAT(9,4) VCHARFLD VARCHAR, LGFLD LOGICAL)";
+ iRc = sql.ExecuteNonQuery( sSql );
+ if( iRc != XB_NO_ERROR ){
+ std::cout << "CREATE TABLE error" << std::endl;
+ x.DisplayError( iRc );
+ return 1;
+ } else {
+ std::cout << "CREATE TABLE successful" << std::endl;
+ }
+
+ sSql = "CREATE INDEX TAG1 ON TESTTBL.DBF( CHRFLD )";
+ iRc = sql.ExecuteNonQuery( sSql );
+ if( iRc != XB_NO_ERROR ){
+ std::cout << "CREATE INDEX error" << std::endl;
+ x.DisplayError( iRc );
+ return 1;
+ } else {
+ std::cout << "CREATE INDEX successful" << std::endl;
+ }
+
+
+ sSql = "INSERT INTO TESTTBL.DBF ( CHRFLD ) VALUES ( 'z' )";
+ iRc = sql.ExecuteNonQuery( sSql );
+ if( iRc != XB_NO_ERROR ){
+ std::cout << "INSERT error" << std::endl;
+ x.DisplayError( iRc );
+ return 1;
+ } else {
+ std::cout << "INSERT successful" << std::endl;
+ }
+
+ char c;
+ xbString s;
+ for( xbUInt16 i = 0; i < 3 && iRc == XB_NO_ERROR; i++ ){
+ for( xbUInt16 j = 0; j < 5 && iRc == XB_NO_ERROR; j++ ){
+ c = j + 65;
+ s = c;
+ s.PadRight( c, (xbUInt32) i + 1 );
+ sSql.Sprintf( "INSERT INTO TESTTBL.DBF ( CHRFLD ) VALUES ( '%s' )", s.Str());
+ std::cout << sSql.Str() << std::endl;
+ iRc = sql.ExecuteNonQuery( sSql );
+ if( iRc != XB_NO_ERROR ){
+ std::cout << "INSERT error" << std::endl;
+ x.DisplayError( iRc );
+ return 1;
+ }
+ }
+ }
+
+ x.CloseAllTables();
+ return 0;
+}
diff --git a/src/examples/xb_ex_string.cpp b/src/examples/xb_ex_string.cpp
new file mode 100755
index 0000000..3d582a1
--- /dev/null
+++ b/src/examples/xb_ex_string.cpp
@@ -0,0 +1,385 @@
+/* xb_ex_string.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2021,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This demonstrates the string class
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+int main()
+{
+
+ // create a string, assign a value, print it
+ xbString s1;
+ s1 = "Test String 1";
+ fprintf( stdout, "s1 = [%s]\n", s1.Str());
+
+ // create another string, copy the value from s1 into it, print it
+ xbString s2;
+ s2 = s1;
+ std::cout << "s2 = [" << s2.Str() << "]" << std::endl;
+
+ // create another string with and print it
+ xbString s3( 'X' );
+ std::cout << "s3 = [" << s3.Str() << "]" << std::endl;
+
+ // create another string with and print it and print it out yet another way
+ xbString s4( "Class constructor test 4" );
+ printf( "s4 = [%s]\n", s4.Str() );
+
+ // create another string with a size limit and print it out
+ xbString s5( "Class constructor test 4", 7 );
+ printf( "s5 = [%s]\n", s5.Str() );
+
+ // create another string from a string
+ xbString s6( s5 );
+ printf( "s6 = [%s]\n", s6.Str() );
+
+ // create 100 byte string with nothing in it
+ xbString s7( (xbUInt32) 100 );
+ printf( "s7 = [%s]\n", s7.Str() );
+
+ // Extract character from a particular position in the string
+ printf( "[] test -- Position 7 (starts from 1) from String 1 = [%c]\n", s1[7] );
+ // or use the getCharacter method
+ printf( "getCharacter() test -- Position 7 (starts from 1) from String 1 = [%c]\n", s1.GetCharacter(7) );
+
+ // set string 7 to a character
+ s7 = 'Z';
+ printf( "updated s7 = [%s]\n", s7.Str() );
+
+ // trim methods
+ s3 = " abc ";
+ s3.Ltrim();
+ s3.Dump( "LTrim test" );
+
+
+ s3 = " abc ";
+ s3.Rtrim();
+ s3.Dump( "RTrim test" );
+
+ s3.Trim();
+ s3.Dump( "Trim test" );
+ printf( "s3 Len = [%d]\n", s3.Len() );
+
+ // Concatenation tests - I
+ s1 = "Concatenation test1 part 1 ";
+ s1 += "Concatenation test1 part 2 ";
+ s2 = " s2 data ";
+ s1 += s2;
+ s1 += 'z';
+
+ // Concatenation tests - II
+ s1 = "Concatenation test1 part 1 ";
+ s1 -= "Concatenation test1 part 2 ";
+ s1 -= 'X';
+ s1 -= s2;
+ s1.Dump( "Concatenation test 2 " );
+
+
+ // Concatenation tests - III
+ s1 = "s1data ";
+ s2 = "s2data ";
+
+ s3 = s1 - s2;
+ s3.Dump( "Concatenation test 3a" );
+
+ s3 = s1 + s2;
+ s3.Dump( "Concatenation test 3b" );
+
+ s3 = s1 + " char * data ";
+ s3.Dump( "Concatenation test 3c" );
+
+ // s3 = " char * data " + s2;
+ // s3.Dump( "Concatenation test 3d" );
+
+ s3 = s1 + 'Z';
+ s3.Dump( "Concatenation test 3e" );
+
+// s3 = 'A' + s1;
+ s3 = 'A';
+
+ std::cout << s3.Str() << std::endl;
+ s3 += s1;
+
+ std::cout << s3.Str() << std::endl;
+
+
+ s3 = 'A' + s1;
+
+
+ return 0;
+
+ // s3.Dump( "Concatenation test 3f" );
+
+ std::cout << std::endl << "== operator tests" << std::endl;
+ if( s1 == s2 )
+ std::cout << s1.Str() << " == " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " != " << s2.Str() << std::endl;
+
+ s1 = s2;
+ if( s1 == s2 )
+ std::cout << s1.Str() << " == " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " != " << s2.Str() << std::endl;
+
+ if( s1 == "sometestdata" )
+ std::cout << s1.Str() << " == sometestdata" << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " != sometestdata" << s2.Str() << std::endl;
+
+ std::cout << std::endl << "!= operator tests" << std::endl;
+ s2 = "abc123";
+ s1.Dump( "s1" );
+ s2.Dump( "s2" );
+ if( s1 != s2 )
+ std::cout << s1.Str() << " != " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " == " << s2.Str() << std::endl;
+
+ s1 = s2;
+ if( s1 != s2 )
+ std::cout << s1.Str() << " != " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " == " << s2.Str() << std::endl;
+
+ if( s1 != "sometestdata" )
+ std::cout << s1.Str() << " != [sometestdata]" << std::endl;
+ else
+ std::cout << s1.Str() << " == [sometestdata]" << std::endl;
+
+ std::cout << std::endl << "< operator tests" << std::endl;
+ s1 = "AAA";
+ s2 = "BBB";
+
+ if( s1 < s2 )
+ std::cout << s1.Str() << " < " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " >= " << s2.Str() << std::endl;
+
+ s1 = "BBB";
+ if( s1 < s2 )
+ std::cout << s1.Str() << " < " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " >= " << s2.Str() << std::endl;
+
+ s1 = "CCC";
+ if( s1 < s2 )
+ std::cout << s1.Str() << " < " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " >= " << s2.Str() << std::endl;
+
+ std::cout << std::endl << "> operator tests" << std::endl;
+ s1 = "AAA";
+ s2 = "BBB";
+
+ if( s1 > s2 )
+ std::cout << s1.Str() << " > " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " <= " << s2.Str() << std::endl;
+
+ s1 = "BBB";
+ if( s1 > s2 )
+ std::cout << s1.Str() << " > " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " <= " << s2.Str() << std::endl;
+
+ s1 = "CCC";
+ if( s1 > s2 )
+ std::cout << s1.Str() << " > " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " <= " << s2.Str() << std::endl;
+
+ std::cout << std::endl << "<= operator tests" << std::endl;
+ s1 = "AAA";
+ s2 = "BBB";
+
+ if( s1 <= s2 )
+ std::cout << s1.Str() << " <= " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " > " << s2.Str() << std::endl;
+
+ s1 = "BBB";
+ if( s1 <= s2 )
+ std::cout << s1.Str() << " <= " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " > " << s2.Str() << std::endl;
+
+ s1 = "CCC";
+ if( s1 <= s2 )
+ std::cout << s1.Str() << " <= " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " > " << s2.Str() << std::endl;
+
+ std::cout << std::endl << ">= operator tests" << std::endl;
+ s1 = "AAA";
+ s2 = "BBB";
+
+ if( s1 >= s2 )
+ std::cout << s1.Str() << " >= " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " < " << s2.Str() << std::endl;
+
+ s1 = "BBB";
+ if( s1 >= s2 )
+ std::cout << s1.Str() << " >= " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " < " << s2.Str() << std::endl;
+
+ s1 = "CCC";
+ if( s1 >= s2 )
+ std::cout << s1.Str() << " >= " << s2.Str() << std::endl;
+ else
+ std::cout << s1.Str() << " < " << s2.Str() << std::endl;
+
+ std::cout << "(const char *) " << (const char *) s2.Str() << std::endl;
+
+ std::cout << std::endl << "CountChar() test" << std::endl;
+ s1 = "ABADFDSGA";
+ xbUInt32 i = s1.CountChar( 'A' );
+ std::cout << "There are " << i << " 'A's in " << s1.Str() << std::endl;
+
+ s1.Ltrunc( 4 );
+ std::cout << "lTunc(4) test s1 = [" << s1.Str() << "]" << std::endl;
+
+ std::cout << std::endl << "PutAt() test" << std::endl;
+ s1.PutAt( 3, 'Z' );
+ std::cout << "Third char should be a 'Z' = " << s1.Str() << std::endl;
+
+ std::cout << std::endl << "AddBackSlash() test" << std::endl;
+ s1.AddBackSlash( 'Z' );
+ std::cout << "Should be a backslash before the 'Z' = " << s1.Str() << std::endl;
+
+ std::cout << std::endl << "Assign() test" << std::endl;
+ s2 = "1234567890";
+ std::cout << "s2 = " << s2.Str() << std::endl;
+ s1.Assign( s2, 4, 5 );
+ std::cout << "assign( s2, 4, 5 ) results = " << s1.Str() << std::endl;
+ s1.Assign( s2, 4, 15 );
+ std::cout << "assign( s2, 4, 15 ) results = " << s1.Str() << std::endl;
+
+ s1.Assign( s2, 5 );
+ std::cout << "Assign( s2, 5 ) results = " << s1.Str() << std::endl;
+ s1.Assign( s2, 15 );
+ std::cout << "Assign( s2, 15 ) results = " << s1.Str() << std::endl;
+
+ std::cout << std::endl << "s1.copy() test" << std::endl;
+ s1 = "ABC";
+ std::cout << "s1 = " << s1.Str() << std::endl;
+ std::cout << "s2 = " << s2.Str() << std::endl;
+
+ s1 = s2.Copy();
+ s1.Dump( "s1.Copy() results" );
+
+ s1 = "0x35";
+ char hexChar;
+ s1.CvtHexChar( hexChar );
+ std::cout << "CvtHexChar test [" << s1.Str() << "] converts to [" << hexChar << "]" << std::endl;
+ s1 = "0x65";
+ s1.CvtHexChar( hexChar );
+ std::cout << "cvHexChar test [" << s1.Str() << "] converts to [" << hexChar << "]" << std::endl;
+
+ s1 = "0x610x620x630x640x65";
+ s1.CvtHexString( s2 );
+ std::cout << "CvtHexString [" << s1.Str() << "] converts to [" << s2.Str() << "]" << std::endl;
+
+ s1.ExtractElement( "aaaa|bbbb|cccc|dddd", '|', 2, 0 );
+ s1.Dump( "ExtractElement() " );
+
+ s1 = "123";
+ s2 = "ABC";
+ std::cout << "HasAlphaChars( " << s1.Str() << " ) = " << s1.HasAlphaChars() << std::endl;
+ std::cout << "HasAlphaChars( " << s2.Str() << " ) = " << s2.HasAlphaChars() << std::endl;
+
+ s2 = "";
+ std::cout << "IsEmpty( " << s1.Str() << " ) = " << s1.IsEmpty() << std::endl;
+ std::cout << "IsEmpty( " << s2.Str() << " ) = " << s2.IsEmpty() << std::endl;
+
+ s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ std::cout << s1.Str() << " s1.Mid( 3,5 ) = [" << s1.Mid( 3, 5 ).Str() << "]" << std::endl;
+ std::cout << s1.Str() << " s1.Mid( 25, 10 ) = [" << s1.Mid( 25, 10 ).Str() << "]" << std::endl;
+
+ std::cout << s1.Str() << " s1.Pos('G') = " << s1.Pos( 'G' ) << std::endl;
+ std::cout << s1.Str() << " s1.Pos(\"JKL\") = " << s1.Pos( "JKL" ) << std::endl;
+
+ s1.Dump( "Remove( 3, 5 ) before " );
+ std::cout << s1.Str() << " s1.Remove( 3, 5 ) = [" << s1.Remove( 3, 5 ).Str() << "]" << std::endl;
+ s1.Dump( "Remove( 3, 5 ) after " );
+ s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+ std::cout << "s1.Remove( 20, 10 ) = [" << s1.Remove( 20, 10 ).Str() << "]" << std::endl;
+ s1.Dump( "Remove( 20, 10 ) " );
+
+ s1.Sprintf( "%d", 12345 );
+ s1.Dump( "Sprintf( %d, 12345 ) " );
+
+ s1.SetNum( (long) 123456 );
+ std::cout << "s1.SetNum( 123456 ) = " << s1.Str() << std::endl;
+
+ s1.Set( "Yet another way to set a string value" );
+ s1.Dump( "Set" );
+
+ s1 = "ABCABCABZ";
+ s1.Dump( "SwapChars( 'A', '9' ) before" );
+ s1.SwapChars( 'A', '9' );
+ s1.Dump( "SwapChars( 'A', '9' ) after");
+
+ s1.ToLowerCase();
+ s1.Dump( "ToLowerCase" );
+
+ s1.ToUpperCase();
+ s1.Dump( "ToUpperCase" );
+
+ s1.ZapChar( '9' );
+ s1.Dump( "ZapChar( '9' )" );
+
+ s1.ZapLeadingChar( 'B' );
+ s1.Dump( "ZapLeadingChar( 'B' )" );
+
+ s1.ZapTrailingChar( 'Z' );
+ s1.Dump( "ZapLeadingChar( 'Z' )" );
+
+ s1 = "123";
+ s1.PadLeft( '0', 9 );
+ s1.Dump( "s1.PadLeft('0', 9 ) ");
+
+ s1 = "abc";
+ s1.PadRight( 'Z', 9 );
+ s1.Dump( "s1.PadRight('Z', 9 ) ");
+
+ xbString sNullString;
+ if( sNullString.IsNull())
+ std::cout << "sNullString is null" << std::endl;
+ else
+ std::cout << "sNullString is not null" << std::endl;
+
+ xbString tstS( "ZZZZZZZZZ" );
+ tstS = s1.Left( 5 );
+
+ std::cout << "tstS = " << tstS.Str() << "\n";
+ std::cout << "s1 = " << s1.Str() << "\n";
+
+ tstS = "1234567890";
+ std::cout << "mid result = " << tstS.Mid( 3, 3 ).Str() << std::endl;
+
+ tstS = "1234567890";
+ std::cout << "left result = " << tstS.Left( 3 ).Str() << std::endl;
+
+
+ return 0;
+}
diff --git a/src/examples/xb_ex_v3_create_dbf.cpp b/src/examples/xb_ex_v3_create_dbf.cpp
new file mode 100755
index 0000000..ecfcd72
--- /dev/null
+++ b/src/examples/xb_ex_v3_create_dbf.cpp
@@ -0,0 +1,102 @@
+/* xb_ex_v3_create_dbf.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+ This example demonstrates the creation of a Version III file and and indices
+
+*/
+
+#include <xbase.h>
+
+using namespace xb;
+
+int main()
+{
+
+#ifdef XB_DBF3_SUPPORT
+
+ xbSchema MyRecord[] =
+ {
+ { "FIRSTNAME", XB_CHAR_FLD, 15, 0 },
+ { "LASTNAME", XB_CHAR_FLD, 20, 0 },
+ { "BIRTHDATE", XB_DATE_FLD, 8, 0 },
+ { "AMOUNT", XB_NUMERIC_FLD, 9, 2 },
+ { "RETIRED?", XB_LOGICAL_FLD, 1, 0 },
+ { "ZIPCODE", XB_NUMERIC_FLD, 5, 0 },
+#ifdef XB_MEMO_SUPPORT
+ { "MEMO1", XB_MEMO_FLD, 10, 0 },
+#endif
+ { "",0,0,0 }
+ };
+
+ /* define the classes */
+ xbXBase x; /* initialize xbase */
+ x.SetDataDirectory( PROJECT_DATA_DIR ); /* where all the tables live */
+
+ xbDbf *MyDbfFile; /* Pointer to dbf class */
+ MyDbfFile = new xbDbf3(&x); /* Create Version 3 instance */
+
+
+// Create Dbase3 NDX style indices if support compiled in
+#ifdef XB_NDX_SUPPORT
+ xbIxNdx MyIndex1( MyDbfFile ); /* class for index 1 */
+ xbIxNdx MyIndex2( MyDbfFile ); /* class for index 2 */
+ xbIxNdx MyIndex3( MyDbfFile ); /* class for index 3 */
+#endif
+
+
+// fixme
+// Create Clipper NTX style indices if support compiled in - bring this back to life in a future release
+#ifdef XB_INDEX_NTX
+ xbNtx MyIndex4( &MyDbfFile ); /* class for index 4 */
+ xbNtx MyIndex5( &MyDbfFile ); /* class for index 5 */
+#endif
+
+ xbInt16 rc;
+
+ if(( rc = MyDbfFile->CreateTable( "MyV3Table1", "MyV3ExampleTableAlias", MyRecord, XB_OVERLAY, XB_MULTI_USER )) != XB_NO_ERROR )
+ x.DisplayError( rc );
+ else
+ {
+
+#ifdef XB_NDX_SUPPORT
+
+ xbIx *pIx;
+ void *pTag;
+
+ /*
+ Create a few index tags
+ CreateTag( const xbString &sIxType, const xbString &sName, const xbString &sKey, const xbString &sFilter,
+ xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverLay, xbIx **xbIxOut, void **vpTagOut );
+ */
+
+ /* define a simple index */
+ if(( rc = MyDbfFile->CreateTag ( "NDX", "MYINDEX1.NDX", "LASTNAME", "", 0, 1, XB_OVERLAY, &pIx, &pTag )) != XB_NO_ERROR )
+ x.DisplayError( rc );
+
+ /* define a multi-field index "LASTNAME FIRSTNAME" */
+ if(( rc = MyDbfFile->CreateTag( "NDX", "MYINDEX2.NDX", "LASTNAME+FIRSTNAME", "", 0, 1, XB_OVERLAY, &pIx, &pTag )) != XB_NO_ERROR )
+ x.DisplayError( rc );
+
+ /* define a numeric index "ZIPCODE" */
+ if(( rc = MyDbfFile->CreateTag( "NDX", "MYINDEX3.NDX", "ZIPCODE", "", 0, 0, XB_OVERLAY, &pIx, &pTag )) != XB_NO_ERROR )
+ x.DisplayError( rc );
+
+#endif
+
+ }
+
+ MyDbfFile->Close(); /* Close database and associated indexes */
+
+#endif // XB_DBF3_SUPPORT
+ return 0;
+}
diff --git a/src/examples/xb_ex_v3_upd_dbf.cpp b/src/examples/xb_ex_v3_upd_dbf.cpp
new file mode 100755
index 0000000..aa6ec49
--- /dev/null
+++ b/src/examples/xb_ex_v3_upd_dbf.cpp
@@ -0,0 +1,282 @@
+/* xb_ex_v3_upd_dbf.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2021,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+ This example demonstrates how to open the DBase III table created by xb_ex_v3_create_dbf
+ and apply various updates to the table.
+
+*/
+
+#include <xbase.h>
+
+using namespace xb;
+
+int main()
+{
+
+#ifdef XB_DBF3_SUPPORT
+
+ xbInt16 fld_FIRSTNAME;
+ xbInt16 fld_LASTNAME;
+ xbInt16 fld_BIRTHDATE;
+ xbInt16 fld_AMOUNT;
+ xbInt16 fld_RETIRED;
+ xbInt16 fld_ZIPCODE;
+
+ #ifdef XB_MEMO_SUPPORT
+ xbInt16 fld_MEMO1;
+ xbString sMemoData;
+ #endif
+
+
+ /* define the classes */
+ xbXBase x; /* initialize xbase */
+ x.SetDataDirectory( PROJECT_DATA_DIR ); /* where all the tables live */
+ x.EnableMsgLogging();
+ x.WriteLogMessage( "Program [xb_ex_v3_upd_dbf] initializing..." );
+
+
+ xbDbf * MyTable = new xbDbf3( &x ); /* class for V3 table */
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ if(( iRc = MyTable->Open( "MyV3Table1.DBF" )) != XB_NO_ERROR ){
+ iErrorStop = 1;
+ throw iRc;
+ }
+
+ #ifdef XB_NDX_SUPPORT
+ // V3 NDX style indices can be opened manually (vs production MDX index files opened automatically)
+ if(( iRc = MyTable->OpenIndex( "NDX", "MYINDEX1.NDX")) != XB_NO_ERROR ){
+ iErrorStop = 2;
+ throw iRc;
+ }
+ if(( iRc = MyTable->OpenIndex( "NDX", "MYINDEX2.NDX" )) != XB_NO_ERROR ){
+ iErrorStop = 3;
+ throw iRc;
+ }
+ if(( iRc = MyTable->OpenIndex( "NDX", "MYINDEX3.NDX" )) != XB_NO_ERROR ){
+ iErrorStop = 4;
+ throw iRc;
+ }
+ std::cout << "Current tag = [" << MyTable->GetCurTagName().Str() << "]\n";
+ #endif
+
+
+
+ // get the field numbers for all the fields in the table
+ fld_FIRSTNAME = MyTable->GetFieldNo( "FIRSTNAME" );
+ fld_LASTNAME = MyTable->GetFieldNo( "LASTNAME" );
+ fld_BIRTHDATE = MyTable->GetFieldNo( "BIRTHDATE" );
+ fld_AMOUNT = MyTable->GetFieldNo( "AMOUNT" );
+ fld_RETIRED = MyTable->GetFieldNo( "RETIRED?" );
+ fld_ZIPCODE = MyTable->GetFieldNo( "ZIPCODE" );
+
+ #ifdef XB_MEMO_SUPPORT
+ fld_MEMO1 = MyTable->GetFieldNo( "MEMO1" );
+ #endif
+
+
+ // Blank the record buffer
+ if(( iRc = MyTable->BlankRecord()) != XB_NO_ERROR ){
+ iErrorStop = 7;
+ throw iRc;
+ }
+
+ // put field examples - using field numbers
+ if(( iRc = MyTable->PutField( fld_LASTNAME, "JONES" )) != XB_NO_ERROR ){
+ iErrorStop = 8;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( fld_FIRSTNAME, "JERRY" )) != XB_NO_ERROR ){
+ iErrorStop = 9;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( fld_AMOUNT, "12.35" )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( fld_BIRTHDATE, "19880208" )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutLogicalField( fld_RETIRED, "Y" )) != XB_NO_ERROR ){
+ iErrorStop = 11;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutLongField( fld_ZIPCODE, 12345 )) != XB_NO_ERROR ){
+ iErrorStop = 12;
+ throw iRc;
+ }
+
+ #ifdef XB_MEMO_SUPPORT
+ sMemoData = "Memo data record 1";
+ if(( iRc = MyTable->UpdateMemoField( fld_MEMO1, sMemoData )) != XB_NO_ERROR ){
+ iErrorStop = 13;
+ throw iRc;
+ }
+ #endif
+
+ // Append the first record
+ if(( iRc = MyTable->AppendRecord()) != XB_NO_ERROR ){
+ iErrorStop = 15;
+ throw iRc;
+ }
+
+ // put field to the record buffer using field name (slightly less efficient than using field numbers)
+
+ // Blank the record buffer
+ if(( iRc = MyTable->BlankRecord()) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( "LASTNAME", "EINSTIEN" )) != XB_NO_ERROR ){
+ iErrorStop = 21;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( "FIRSTNAME", "ALBERT" )) != XB_NO_ERROR ){
+ iErrorStop = 22;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( "AMOUNT", "987.55" )) != XB_NO_ERROR ){
+ iErrorStop = 23;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( fld_BIRTHDATE, "19890209" )) != XB_NO_ERROR ){
+ iErrorStop = 24;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutLogicalField( "RETIRED?", "N" )) != XB_NO_ERROR ){
+ iErrorStop = 25;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutLongField( "ZIPCODE", 44256 )) != XB_NO_ERROR ){
+ iErrorStop = 26;
+ throw iRc;
+ }
+
+ #ifdef XB_MEMO_SUPPORT
+ sMemoData = "Memo data record 2";
+ if(( iRc = MyTable->UpdateMemoField( fld_MEMO1, sMemoData )) != XB_NO_ERROR ){
+ iErrorStop = 27;
+ throw iRc;
+ }
+ #endif
+
+ // Append the second record
+ if(( iRc = MyTable->AppendRecord()) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+
+ // get a field with a field number
+ xbString FirstName;
+ if(( iRc = MyTable->GetField( fld_FIRSTNAME, FirstName )) < 0 ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ std::cout << "First Name is [" << FirstName.Str() << "]" << std::endl;
+
+ xbString LastName;
+ if(( iRc = MyTable->GetField( "LASTNAME", LastName )) < 0 ){
+ iErrorStop = 41;
+ throw iRc;
+ }
+ std::cout << "Last Name is [" << LastName.Str() << "]" << std::endl;
+
+ xbInt16 iNoOfDecimals;
+ if(( iRc = MyTable->GetFieldDecimal( "AMOUNT", iNoOfDecimals )) != XB_NO_ERROR ){
+ iErrorStop = 42;
+ throw iRc;
+ }
+ std::cout << "There are " << iNoOfDecimals << " decimals in the AMOUNT field" << std::endl;
+
+ xbString FieldName;
+ if(( iRc = MyTable->GetFieldName( 4, FieldName )) != XB_NO_ERROR ){
+ iErrorStop = 43;
+ throw iRc;
+ }
+ std::cout << "Field #4 name is " << FieldName.Str() << std::endl;
+
+ xbString sRetired;
+ if(( iRc = MyTable->GetLogicalField( "RETIRED?", sRetired )) < 0 ){
+ iErrorStop = 45;
+ throw iRc;
+ }
+ std::cout << "Switch value = [" << sRetired.Str() << "]" << std::endl;
+
+ xbInt32 lZip;
+ if(( iRc = MyTable->GetLongField( "ZIPCODE", lZip )) < 0 ){
+ iErrorStop = 46;
+ throw iRc;
+ }
+ std::cout << "Long value = [" << lZip << "]" << std::endl;
+
+ // Initialize the record buffer in preparation for another record
+ if(( iRc = MyTable->BlankRecord()) != XB_NO_ERROR ){
+ iErrorStop = 48;
+ throw iRc;
+ }
+
+ // Append another record (it will be blank)
+ if(( iRc = MyTable->AppendRecord()) != XB_NO_ERROR ){
+ iErrorStop = 49;
+ throw iRc;
+ };
+
+ // mark current record for deletion
+ if(( iRc = MyTable->DeleteRecord()) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ };
+
+ // save current record
+ if(( iRc = MyTable->PutRecord()) != XB_NO_ERROR ){
+ iErrorStop = 51;
+ throw iRc;
+ }
+ // pack the table with no options
+ if(( iRc = MyTable->Pack()) != XB_NO_ERROR ){
+ iErrorStop = 52;
+ throw iRc;
+ }
+
+ /* Close database and associated indexes */
+ if(( iRc = MyTable->Close()) != XB_NO_ERROR ){
+ iErrorStop = 53;
+ throw iRc;
+ }
+
+ }
+ catch( xbInt16 rc ){
+ std::cout << "xb_ex_v3_upd_dbf error. Error stop point = [" << iErrorStop << "] iRc = [" << rc << "]" << std::endl;
+ std::cout << x.GetErrorMessage( rc ) << std::endl;
+ }
+
+#endif // XB_DBF3_SUPPORT
+
+ return 0;
+}
diff --git a/src/examples/xb_ex_v4_create_dbf.cpp b/src/examples/xb_ex_v4_create_dbf.cpp
new file mode 100755
index 0000000..a2aff74
--- /dev/null
+++ b/src/examples/xb_ex_v4_create_dbf.cpp
@@ -0,0 +1,81 @@
+/* xb_ex_v4_create_dbf.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+ This example demonstrates the creation of a Version IV file and and indices
+
+*/
+
+#include <xbase.h>
+
+using namespace xb;
+
+int main()
+{
+
+#ifdef XB_DBF4_SUPPORT
+
+ xbSchema MyRecord[] =
+ {
+ { "FIRSTNAME", XB_CHAR_FLD, 15, 0 },
+ { "LASTNAME", XB_CHAR_FLD, 20, 0 },
+ { "BIRTHDATE", XB_DATE_FLD, 8, 0 },
+ { "AMOUNT", XB_NUMERIC_FLD, 9, 2 },
+ { "RETIRED?", XB_LOGICAL_FLD, 1, 0 },
+ { "ZIPCODE", XB_NUMERIC_FLD, 5, 0 },
+ { "NUMFLD1", XB_FLOAT_FLD, 12, 2 },
+ { "NUMFLD2", XB_FLOAT_FLD, 14, 2 },
+ #ifdef XB_MEMO_SUPPORT
+ { "MEMO1", XB_MEMO_FLD, 10, 0 },
+ #endif
+ { "",0,0,0 }
+ };
+
+ /* define the classes */
+ xbXBase x; /* initialize xbase */
+ x.SetDataDirectory( PROJECT_DATA_DIR ); /* where all the tables/files live */
+
+ xbInt16 iRc;
+ xbDbf * MyDbfFile;
+ xbIx *pIx;
+ void *pTag;
+ MyDbfFile = new xbDbf4( &x );
+
+ if(( iRc = MyDbfFile->CreateTable( "MyV4Table1", "MyV4TableAlias", MyRecord, XB_OVERLAY, XB_MULTI_USER )) != XB_NO_ERROR )
+ x.DisplayError( iRc );
+ else
+ {
+
+ #ifdef XB_MDX_SUPPORT
+
+ /*
+ Create a few index tags
+ CreateTag( const xbString &sIxType, const xbString &sName, const xbString &sKey, const xbString &sFilter,
+ xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverLay, xbIx **xbIxOut, void **vpTagOut );
+ */
+
+ // std::cout << "Creating three index tags\n";
+ if(( iRc = MyDbfFile->CreateTag( "MDX", "NAME_TAG", "LASTNAME+FIRSTNAME", ".NOT. DELETED()", 0, 0, XB_OVERLAY, &pIx, &pTag )) != XB_NO_ERROR )
+ x.DisplayError( iRc );
+ if(( iRc = MyDbfFile->CreateTag( "MDX", "BDDATE_TAG", "BIRTHDATE", "", 0, 0, XB_OVERLAY, &pIx, &pTag )) != XB_NO_ERROR )
+ x.DisplayError( iRc );
+ if(( iRc = MyDbfFile->CreateTag( "MDX", "ZIP_TAG", "ZIPCODE", "", 0, 0, XB_OVERLAY, &pIx, &pTag )) != XB_NO_ERROR )
+ x.DisplayError( iRc );
+
+ #endif // XB_MDX_SUPPORT
+ }
+
+ MyDbfFile->Close(); /* Close database and associated indexes */
+
+#endif // XB_DBF4_SUPPORT
+ return 0;
+}
diff --git a/src/examples/xb_ex_v4_upd_dbf.cpp b/src/examples/xb_ex_v4_upd_dbf.cpp
new file mode 100755
index 0000000..6f68c73
--- /dev/null
+++ b/src/examples/xb_ex_v4_upd_dbf.cpp
@@ -0,0 +1,283 @@
+/* xb_ex_v4_upd_dbf.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+ This example demonstrates how to open the DBase III table created by xb_ex_v4_create_dbf
+ and apply various updates to the table.
+
+*/
+
+#include <xbase.h>
+
+using namespace xb;
+
+#undef XB_MEMO_FIELDS
+
+int main()
+{
+
+#ifdef XB_DBF4_SUPPORT
+
+ xbInt16 fld_FIRSTNAME;
+ xbInt16 fld_LASTNAME;
+ xbInt16 fld_BIRTHDATE;
+ xbInt16 fld_AMOUNT;
+ xbInt16 fld_RETIRED;
+ xbInt16 fld_ZIPCODE;
+ xbInt16 fld_NUMFLD1;
+ xbInt16 fld_NUMFLD2;
+
+
+ #ifdef XB_MEMO_FIELDS
+ xbInt16 fld_MEMO1;
+ #endif
+
+
+ /* define the classes */
+ xbXBase x; /* initialize xbase */
+ x.SetDataDirectory( PROJECT_DATA_DIR ); /* where all the tables live */
+ x.EnableMsgLogging();
+ x.WriteLogMessage( "Program [xb_ex_v4_upd_dbf] initializing..." );
+
+
+ xbDbf *MyTable = new xbDbf4( &x ); /* class for table */
+
+#ifdef XB_INDEX_NDX
+ xbNdx MyIndex1( &MyTable ); /* class for index 1 */
+#endif
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+
+ try{
+
+ if(( iRc = MyTable->Open( "MyV4Table1.DBF" )) != XB_NO_ERROR ){
+ iErrorStop = 1;
+ throw iRc;
+ }
+
+ /* get the field numbers for all the fields in the table */
+
+
+ fld_FIRSTNAME = MyTable->GetFieldNo( "FIRSTNAME" );
+ fld_LASTNAME = MyTable->GetFieldNo( "LASTNAME" );
+ fld_BIRTHDATE = MyTable->GetFieldNo( "BIRTHDATE" );
+ fld_AMOUNT = MyTable->GetFieldNo( "AMOUNT" );
+ fld_RETIRED = MyTable->GetFieldNo( "RETIRED?" );
+ fld_ZIPCODE = MyTable->GetFieldNo( "ZIPCODE" );
+ fld_NUMFLD1 = MyTable->GetFieldNo( "NUMFLD1" );
+ fld_NUMFLD2 = MyTable->GetFieldNo( "NUMFLD2" );
+
+ #ifdef XB_MEMO_FIELDS
+ fld_MEMO1 = MyTable->GetFieldNo( "MEMO1" );
+ #endif
+
+
+ #ifdef XB_MDX_SUPPPORT
+ std::cout << "Current tag = [" << MyTable->GetCurTagName() << "]\n";
+ #endif
+
+ // Blank the record buffer
+ if(( iRc = MyTable->BlankRecord()) != XB_NO_ERROR ){
+ iErrorStop = 7;
+ throw iRc;
+ }
+
+ // put field examples - using field numbers
+ if(( iRc = MyTable->PutField( fld_LASTNAME, "JONES" )) != XB_NO_ERROR ){
+ iErrorStop = 8;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( fld_FIRSTNAME, "JERRY" )) != XB_NO_ERROR ){
+ iErrorStop = 9;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( fld_AMOUNT, "12.35" )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutLogicalField( fld_RETIRED, "Y" )) != XB_NO_ERROR ){
+ iErrorStop = 11;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( fld_BIRTHDATE, "19880209" )) != XB_NO_ERROR ){
+ iErrorStop = 12;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutLongField( fld_ZIPCODE, 12345 )) != XB_NO_ERROR ){
+ iErrorStop = 13;
+ throw iRc;
+ }
+
+ // Append the first record
+ if(( iRc = MyTable->AppendRecord()) != XB_NO_ERROR ){
+ iErrorStop = 15;
+ throw iRc;
+ }
+
+ // Blank the record buffer
+ if(( iRc = MyTable->BlankRecord()) != XB_NO_ERROR ){
+ iErrorStop = 16;
+ throw iRc;
+ }
+
+ // put field to the record buffer using field name (slightly less efficient than using field numbers)
+ if(( iRc = MyTable->PutField( "LASTNAME", "FUCKPUTIN" )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( "FIRSTNAME", "ALBERT" )) != XB_NO_ERROR ){
+ iErrorStop = 21;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutField( "AMOUNT", "987.55" )) != XB_NO_ERROR ){
+ iErrorStop = 22;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutLogicalField( "RETIRED?", "N" )) != XB_NO_ERROR ){
+ iErrorStop = 23;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->PutLongField( "ZIPCODE", 44256 )) != XB_NO_ERROR ){
+ iErrorStop = 24;
+ throw iRc;
+ }
+
+ xbFloat f = (xbFloat) 12345.67;
+ std::cout << f << std::endl;
+
+ if(( iRc = MyTable->PutFloatField( fld_NUMFLD1, f )) != XB_NO_ERROR ){
+ iErrorStop = 13;
+ throw iRc;
+ }
+ xbDouble d = 76543.21;
+ if(( iRc = MyTable->PutDoubleField( fld_NUMFLD2, d )) != XB_NO_ERROR ){
+ iErrorStop = 14;
+ throw iRc;
+ }
+
+ // Append the second record
+ if(( iRc = MyTable->AppendRecord()) != XB_NO_ERROR ){
+ iErrorStop = 25;
+ throw iRc;
+ }
+
+ // get a field with a field number
+ xbString FirstName;
+ if(( iRc = MyTable->GetField( fld_FIRSTNAME, FirstName )) < 0 ){
+ iErrorStop = 30;
+ throw iRc;
+ }
+ std::cout << "First Name is [" << FirstName.Str() << "]" << std::endl;
+
+ xbString LastName;
+ if(( iRc = MyTable->GetField( "LASTNAME", LastName )) < 0 ){
+ iErrorStop = 31;
+ throw iRc;
+ }
+ std::cout << "Last Name is [" << LastName.Str() << "]" << std::endl;
+
+ xbInt16 iNoOfDecimals;
+ if(( iRc = MyTable->GetFieldDecimal( "AMOUNT", iNoOfDecimals )) != XB_NO_ERROR ){
+ iErrorStop = 32;
+ throw iRc;
+ }
+ std::cout << "There are " << iNoOfDecimals << " decimals in the AMOUNT field" << std::endl;
+
+ xbString FieldName;
+ if(( iRc = MyTable->GetFieldName( 4, FieldName )) != XB_NO_ERROR ){
+ iErrorStop = 36;
+ throw iRc;
+ }
+ std::cout << "Field #4 name is " << FieldName.Str() << std::endl;
+
+ xbString sRetired;
+ if(( iRc = MyTable->GetLogicalField( "RETIRED?", sRetired )) < 0 ){
+ iErrorStop = 38;
+ throw iRc;
+ }
+ std::cout << "Switch value = [" << sRetired.Str() << "]" << std::endl;
+
+ xbInt32 lZip;
+ if(( iRc = MyTable->GetLongField( "ZIPCODE", lZip )) < 0 ){
+ iErrorStop = 39;
+ throw iRc;
+ }
+ std::cout << "Long value = [" << lZip << "]" << std::endl;
+
+ if(( iRc = MyTable->GetFloatField( fld_NUMFLD1, f )) < 0 ){
+ iErrorStop = 41;
+ throw iRc;
+ }
+ printf( "Field NUMFLD1 %8.2f\n", f );
+
+
+ if(( iRc = MyTable->GetDoubleField( fld_NUMFLD2, d )) < 0 ){
+ iErrorStop = 42;
+ throw iRc;
+ }
+ printf( "Field NUMFLD2 %8.2f\n", d );
+
+
+ // Initialize the record buffer in preparation for another record
+ if(( iRc = MyTable->BlankRecord()) != XB_NO_ERROR ){
+ iErrorStop = 44;
+ throw iRc;
+ }
+
+ // Append another record (it will be blank)
+ if(( iRc = MyTable->AppendRecord()) != XB_NO_ERROR ){
+ iErrorStop = 45;
+ throw iRc;
+ };
+
+ // mark current record for deletion
+ if(( iRc = MyTable->DeleteRecord()) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ };
+
+ // save current record
+ if(( iRc = MyTable->PutRecord()) != XB_NO_ERROR ){
+ iErrorStop = 51;
+ throw iRc;
+ }
+
+ if(( iRc = MyTable->Commit()) != XB_NO_ERROR ){
+ iErrorStop = 52;
+ throw iRc;
+ }
+
+ /* Close database and associated indexes */
+ if(( iRc = MyTable->Close()) != XB_NO_ERROR ){
+ iErrorStop = 53;
+ throw iRc;
+ }
+
+ }
+ catch( xbInt16 iRc ){
+ std::cout << "xb_ex_v4_upd_dbf error. Error stop point = [" << iErrorStop << "] iRc = [" << iRc << "]" << std::endl;
+ std::cout << x.GetErrorMessage( iRc ) << std::endl;
+ }
+
+#endif // XB_DBF4_SUPPORT
+ return 0;
+}
diff --git a/src/include/xbase.h b/src/include/xbase.h
new file mode 100755
index 0000000..33d2dc9
--- /dev/null
+++ b/src/include/xbase.h
@@ -0,0 +1,93 @@
+/* xbase.h
+
+
+Xbase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include <xbconfig.h>
+#include <stdio.h>
+#include <errno.h>
+#include <time.h>
+#include <math.h>
+
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
+
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+// #ifdef STDC_HEADERS
+#ifdef HAVE_STDARGS_H
+#include <stdargs.h>
+#endif
+
+#ifdef HAVE_CTYPE_H
+#include <ctype.h>
+#endif
+
+#ifdef HAVE_STDARG_H
+#include <stdarg.h>
+#endif
+
+#ifdef HAVE_STAT_H
+#include <sys/stat.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef HAVE_VARARGS_H
+#include <varargs.h>
+#endif
+
+#ifdef HAVE_WINDOWS_H
+#include <windows.h>
+#include <io.h>
+#endif
+
+#include <iomanip>
+
+#include <xbretcod.h>
+#include <xbtypes.h>
+#include <xbstring.h>
+#include <xbssv.h>
+#include <xbdate.h>
+#include <xbtblmgr.h>
+#include <xbxbase.h>
+#include <xblnknod.h>
+#include <xblnklst.h>
+#include <xblnklstord.h>
+#include <xbfile.h>
+#include <xblog.h>
+#include <xbmemo.h>
+#include <xbbcd.h>
+#include <xbuda.h>
+#include <xbexpnode.h>
+#include <xbexp.h>
+
+#include <xbtag.h>
+#include <xbdbf.h> /* dbf base class */
+#include <xbindex.h> /* index base class */
+#include <xbfilter.h>
+#include <xbsql.h>
diff --git a/src/include/xbbcd.h b/src/include/xbbcd.h
new file mode 100755
index 0000000..f94ed01
--- /dev/null
+++ b/src/include/xbbcd.h
@@ -0,0 +1,95 @@
+/* xbbcd.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014, 2018, 2019, 2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#ifndef __XB_BCD_H__
+#define __XB_BCD_H__
+#ifdef XB_INDEX_SUPPORT
+
+///@cond DOXYOFF
+
+namespace xb{
+
+// structure for bcd value
+// next structure superceeded. Different compilers allocate different
+// sizes to structures with bit fields, can't count on the size
+
+/*
+struct XBDLLEXPORT xbBcdStrucOld {
+ unsigned SigDigits : 8; // significant digit count
+ unsigned Filler : 2; // always set to 1
+ unsigned EncDigits : 5; // encoded digit count
+ unsigned Sign : 1; // +/- sign
+ unsigned char Data[10];
+};
+*/
+
+struct XBDLLEXPORT xbBcdStruct {
+ unsigned char cSigDigits; // significant digit count
+ unsigned char cEncDigits; // encoded digit count
+ unsigned char cData[10]; // data
+};
+
+struct XBDLLEXPORT xbByteSplit {
+ unsigned c1 : 4;
+ unsigned c2 : 4;
+};
+
+class XBDLLEXPORT xbBcd {
+ public:
+
+ xbBcd( const xbString &sIn );
+ xbBcd( xbDouble dIn );
+ xbBcd( const void *vBcd12In );
+ void Set( xbDouble dIn );
+ void Set( const void *cBcd12In );
+ void Set( const xbString &sIn );
+
+
+ void ToString( xbString &sOut );
+ void ToDouble( xbDouble &dOut );
+ void ToBcd( xbBcdStruct &bcdOut );
+ void ToChar( char *cOut );
+
+ // const unsigned char * GetBcd() const;
+ void StringToBcd( const xbString &sStringIn );
+
+// void StringToBcdOld( const xbString &sStringIn );
+
+ xbInt16 Compare( const xbBcd &bcdIn );
+ xbInt16 Compare( xbDouble d );
+
+ const unsigned char *GetData() const;
+ const void * GetBcd() const;
+
+
+ private:
+ void ctor();
+ unsigned char GetEncDigitsNoSign() const;
+ unsigned GetSign() const;
+ unsigned GetSigDigits() const;
+ unsigned GetActualSigDigits() const;
+
+
+// xbBcdStruc bcdOld;
+ xbBcdStruct bcd;
+};
+
+} /* namespace xb */
+
+
+///@endcond DOXYOFF
+
+#endif /* XB_INDEX_SUPPORT */
+#endif /* __XB_BCD_H__ */
diff --git a/src/include/xbconfig.h.in b/src/include/xbconfig.h.in
new file mode 100755
index 0000000..b749ff2
--- /dev/null
+++ b/src/include/xbconfig.h.in
@@ -0,0 +1,122 @@
+// the configured options and settings for xbase
+
+#define xbase_VERSION_MAJOR @xbase_VERSION_MAJOR@
+#define xbase_VERSION_MINOR @xbase_VERSION_MINOR@
+#define xbase_VERSION_PATCH @xbase_VERSION_PATCH@
+
+#define PROJECT_PARENT_DIR "@PROJECT_PARENT_DIR@"
+#define PROJECT_BINARY_DIR "@PROJECT_BINARY_DIR@"
+
+#define PROJECT_SOURCE_DIR "@PROJECT_SOURCE_DIR@"
+#define PROJECT_RUNTIME_DIR "@PROJECT_RUNTIME_DIR@"
+#define PROJECT_DATA_DIR "@PROJECT_DATA_DIR@"
+#define PROJECT_LOG_DIR "@PROJECT_LOG_DIR@"
+#define PROJECT_DFLT_LOGFILE "@CMAKE_SYSTEM_NAME@_@XB_PLATFORM@.xbLog.txt"
+#define EXTRA_LIBS "@EXTRA_LIBS@"
+#define CMAKE_RUNTIME_OUTPUT_DIRECTORY "@CMAKE_RUNTIME_OUTPUT_DIRECTORY@"
+
+
+#define CMAKE_HOME_DIRECTORY "@CMAKE_HOME_DIRECTORY@"
+#define CMAKE_PROJECT_NAME "@CMAKE_PROJECT_NAME@"
+#define BUILD_SHARED_LIBS "@BUILD_SHARED_LIBS@"
+#define CMAKE_SYSTEM_NAME "@CMAKE_SYSTEM_NAME@"
+#define CMAKE_SYSTEM_PROCESSOR "@CMAKE_SYSTEM_PROCESSOR@"
+#define CMAKE_SYSTEM_VERSION "@CMAKE_SYSTEM_VERSION@"
+#define CMAKE_BUILD_TYPE "@CMAKE_BUILD_TYPE@"
+#define CMAKE_C_FLAGS "@CMAKE_C_FLAGS@"
+#define CMAKE_C_FLAGS_DEBUG "@CMAKE_C_FLAGS_DEBUG@"
+#define CMAKE_C_FLAGS_RELEASE "@CMAKE_C_FLAGS_RELEASE@"
+
+
+#define XB_PLATFORM "@XB_PLATFORM@"
+#define Mylibrary_Exports "@Mylibrary_Exports@"
+#define MYLIB_EXPORT "@MYLIB_EXPORT@"
+#define CMAKE_SIZEOF_VOID_P "@CMAKE_SIZEOF_VOID_P@"
+
+#define CMAKE_COMPILER "@CMAKE_CXX_COMPILER_ID@"
+
+// integer definitions
+#define xbInt16 @xbInt16@
+#define xbUInt16 @xbUInt16@
+#define xbInt32 @xbInt32@
+#define xbUInt32 @xbUInt32@
+#define xbInt64 @xbInt64@
+#define xbUInt64 @xbUInt64@
+
+#cmakedefine UNIX
+
+#cmakedefine CMAKE_COMPILER_IS_GNUCC
+#cmakedefine HAVE_CTYPE_H
+#cmakedefine HAVE_DIRENT_H
+#cmakedefine HAVE_DOS_H
+#cmakedefine HAVE_FCNTL_H
+#cmakedefine HAVE_INTTYPES_H
+#cmakedefine HAVE_STDARG_H
+#cmakedefine HAVE_STDARGS_H
+#cmakedefine HAVE_STRING_H
+#cmakedefine HAVE_STRINGS_H
+#cmakedefine HAVE_STAT_H
+#cmakedefine HAVE_UNISTD_H
+#cmakedefine HAVE_VARARGS_H
+#cmakedefine HAVE_WINDOWS_H
+
+#cmakedefine HAVE__CLOSE_F
+#cmakedefine HAVE_CREATEPROCESSW_F
+#cmakedefine HAVE_CREATEPROCESSW_F2
+#cmakedefine HAVE_FCNTL_F
+#cmakedefine HAVE__FDOPEN_F
+#cmakedefine HAVE__FILENO_F
+#cmakedefine HAVE_FOPEN_S_F
+#cmakedefine HAVE__FSOPEN_F
+
+#cmakedefine HAVE_FORK_F
+#cmakedefine HAVE__FSEEKI64_F
+#cmakedefine HAVE_FSEEKO_F
+#cmakedefine HAVE_FTRUNCATE_F
+#cmakedefine HAVE__LOCALTIME64_S_F
+#cmakedefine HAVE_LOCKFILE_F
+#cmakedefine HAVE_LOCKING_F
+#cmakedefine HAVE__LOCKING_F
+#cmakedefine HAVE__OPEN_F
+#cmakedefine HAVE_SETENDOFFILE_F
+#cmakedefine HAVE_VSNPRINTF_F
+#cmakedefine HAVE__VSNPRINTF_S_F
+#cmakedefine HAVE_VSPRINTF_S_F
+
+#cmakedefine XB_PLATFORM_32
+#cmakedefine XB_PLATFORM_64
+#cmakedefine XB_DEBUG_SUPPORT
+#cmakedefine XB_LINKLIST_SUPPORT
+#cmakedefine XB_MEMO_SUPPORT
+#cmakedefine XB_LOGGING_SUPPORT
+#cmakedefine XB_DBF3_SUPPORT
+#cmakedefine XB_DBF4_SUPPORT
+#cmakedefine XB_LOCKING_SUPPORT
+#cmakedefine XB_FUNCTION_SUPPORT
+#cmakedefine XB_EXPRESSION_SUPPORT
+#cmakedefine XB_INDEX_SUPPORT
+#cmakedefine XB_NDX_SUPPORT
+#cmakedefine XB_MDX_SUPPORT
+#cmakedefine XB_SQL_SUPPORT
+#cmakedefine XB_NDXINF_SUPPORT
+#cmakedefine XB_FILTER_SUPPORT
+
+#cmakedefine XB_UTILS_SUPPORT
+#cmakedefine XB_EXAMPLES_SUPPORT
+
+#cmakedefine HAVE_LONG_LONG
+
+#if defined (WIN32)
+ #if defined ( Mylibrary_Exports )
+ #define XBDLLEXPORT __declspec(dllexport)
+ #else
+ #define XBDLLEXPORT __declspec(dllimport)
+ #endif
+#else
+ #define XBDLLEXPORT
+#endif
+
+#if defined (UNIX) && defined (XB_PLATFORM_32)
+ #define _FILE_OFFSET_BITS 64
+#endif
+
diff --git a/src/include/xbdate.h b/src/include/xbdate.h
new file mode 100755
index 0000000..5406cbb
--- /dev/null
+++ b/src/include/xbdate.h
@@ -0,0 +1,123 @@
+/* xbdate.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_XBDATE_H__
+#define __XB_XBDATE_H__
+
+#ifdef CMAKE_COMPILER_IS_GNUCC
+#pragma interface
+#endif
+
+
+namespace xb{
+
+#define XB_FMT_WEEK 1
+#define XB_FMT_MONTH 2
+#define XB_FMT_YEAR 3
+
+// next value is added to the date calculation to match dbase calculation
+// first valid dbase date is 01/01/0001
+#define JUL_OFFSET 1721425L
+
+
+//! @brief xbDate class.
+/*!
+This xbDate class handles two type of date values:<br>
+
+1) Gregorian dates with a format of CCYYMMDD. This is how dates are stored in dbf files.<br>
+2) Julian dates calculated as the number of days since 1901-01-01 + 1721425.<br>
+
+Leap Years: The routines in the class support both leap years (one every four
+years) and leap centuries (one every four hundred years.)
+
+A leap year is a year having 366 days, which can be evenly
+divisible by 4 and not by 100.<br>
+Leap centuries are years which are evenly divisible by 400.<br>
+
+From a programming perspective, Julian dates are useful for date
+arithmetic, determining the difference between two dates or calculating
+a future or past date.<br>
+
+To determine the difference between two dates, convert both dates to a
+Julian date and subtract one from the other.<br>
+
+To calculate a future or past date, convert the base date to a Julian date,
+add (or subtract) the number of days necessary to (from) it and convert the
+julian date back to a Gregorian date.
+*/
+
+class XBDLLEXPORT xbDate : public xbSsv {
+ public:
+
+ xbDate();
+ xbDate( const char * Date8 );
+ xbDate( const xbString &Date8 );
+ xbDate( xbInt32 lJulDate );
+ ~xbDate();
+
+ void operator=( const xbDate &d );
+ void operator+=( xbInt32 i );
+ void operator-=( xbInt32 i );
+ void operator++( xbInt32 i );
+ void operator--( xbInt32 i );
+
+ xbInt32 operator-( const xbDate & ) const;
+ const char * operator-( xbInt32 i );
+ const char * operator+( xbInt32 i );
+
+ xbBool operator==( const xbDate & ) const;
+ xbBool operator!=( const xbDate & ) const;
+ xbBool operator< ( const xbDate & ) const;
+ xbBool operator> ( const xbDate & ) const;
+ xbBool operator<=( const xbDate & ) const;
+ xbBool operator>=( const xbDate & ) const;
+
+ xbInt16 CalcRollingCenturyForYear( xbInt16 year ) const;
+ xbInt16 CenturyOf() const;
+ xbInt16 CharDayOf( xbString &sOutCharDay );
+ xbInt16 CharMonthOf( xbString &sOutCharMonth );
+ xbBool DateIsValid ( const xbString &sDate8 ) const;
+ xbInt16 DayOf( xbInt16 iFormat ) const;
+ xbInt16 CTOD( const xbString &sCtodInDate );
+// xbInt16 FormatDate( const char *sFmtIn, xbString &sFmtOut );
+ xbInt16 FormatDate( const xbString &sFmtIn, xbString &sFmtOut );
+ const char *Str() const;
+ xbBool IsLeapYear( xbInt16 iYear ) const;
+ xbBool IsLeapYear() const;
+ xbInt32 JulianDays() const;
+ xbInt16 JulToDate8( xbInt32 lJulDate );
+ xbInt16 LastDayOfMonth();
+ xbInt16 MonthOf() const;
+ xbInt16 Set( const xbString &Date8 );
+ xbInt16 Sysdate();
+ xbInt16 YearOf() const;
+
+#ifdef XB_DEBUG_SUPPORT
+ void Dump( const char * title );
+ void DumpDateTables();
+#endif
+
+ private:
+ void SetDateTables();
+ xbString sDate8; /* CCYYMMDD date format ie; 20140718 */
+
+ static int iAggregatedDaysInMonths[2][13];
+ static int iDaysInMonths[2][13];
+};
+
+} /* namespace */
+#endif /*__XB_XBDATE_H__ */
+
diff --git a/src/include/xbdbf.h b/src/include/xbdbf.h
new file mode 100755
index 0000000..710dd14
--- /dev/null
+++ b/src/include/xbdbf.h
@@ -0,0 +1,538 @@
+/* xbdbf.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014, 2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_XBDBF_H__
+#define __XB_XBDBF_H__
+
+//#ifdef CMAKE_COMPILER_IS_GNUCC
+//#pragma interface
+//#endif
+
+namespace xb{
+
+/*****************************/
+/* Field Types */
+
+#define XB_CHAR_FLD 'C'
+#define XB_LOGICAL_FLD 'L'
+#define XB_NUMERIC_FLD 'N'
+#define XB_DATE_FLD 'D'
+#define XB_MEMO_FLD 'M'
+#define XB_FLOAT_FLD 'F'
+
+/*****************************/
+/* File Status Codes */
+
+#define XB_CLOSED 0
+#define XB_OPEN 1
+#define XB_UPDATED 2
+
+
+/*****************************/
+/* File Access Modes */
+// #define XB_SINGLE_USER 0 // file buffering on
+// #define XB_MULTI_USER 1 // file buffering off
+
+/*****************************/
+/* File Lock Functions */
+#define XB_LOCK 0
+#define XB_UNLOCK 1
+
+#define LK_DBASE 1
+#define LK_CLIPPER 2 // future
+#define LK_FOX 3 // future
+#define LK_XBASE64 9 // future
+
+/*****************************/
+/* Record retrieve options */
+#define XB_ALL_RECS 0
+#define XB_ACTIVE_RECS 1
+#define XB_DELETED_RECS 2
+
+
+/*****************************/
+/* Other defines */
+
+#define XB_OVERLAY 1
+#define XB_DONTOVERLAY 0
+#define XB_CHAREOF '\x1A' /* end of DBF */
+#define XB_CHARHDR '\x0D' /* header terminator */
+
+
+//! @brief Schema used for defining tables with CreateTable methods.
+/*!
+ See program xb_ex_v3_create_dbf.cpp or xb_ex_v4_create_dbf.cpp
+ as examples on how to use.
+
+\code
+xbSchema MyRecord[] = {
+// FieldName, Type, Len, Dec
+ { "FIRSTNAME", XB_CHAR_FLD, 15, 0 },
+ { "LASTNAME", XB_CHAR_FLD, 20, 0 },
+ { "BIRTHDATE", XB_DATE_FLD, 8, 0 },
+ { "AMOUNT", XB_NUMERIC_FLD, 9, 2 },
+ { "RETIRED?", XB_LOGICAL_FLD, 1, 0 },
+ { "ZIPCODE", XB_NUMERIC_FLD, 5, 0 },
+ { "NUMFLD1", XB_FLOAT_FLD, 12, 2 },
+ { "NUMFLD2", XB_FLOAT_FLD, 14, 2 },
+ { "MEMO1", XB_MEMO_FLD, 10, 0 },
+ { "",0,0,0 }};
+\endcode
+*/
+struct XBDLLEXPORT xbSchema {
+ char cFieldName[11];
+ char cType;
+ xbInt16 iFieldLen; /* fields are stored as one byte on record*/
+ xbInt16 iNoOfDecs;
+};
+
+///@cond DOXYOFF
+struct XBDLLEXPORT xbSchemaRec {
+ char cFieldName[11]; /* ASCIIZ field name */
+ char cType; /* field type */
+ char *pAddress; /* pointer to field in record buffer 1 */
+ unsigned char cFieldLen; /* fields are stored as one byte on record */
+ unsigned char cNoOfDecs;
+ char *pAddress2; /* pointer to field in record buffer 2 */
+ xbInt16 iLongFieldLen; /* to handle long field lengths */
+ unsigned char cIxFlag; /* DBase IV Index field flag */
+};
+///@endcond DOXYOFF
+
+
+
+///@cond DOXYOFF
+#ifdef XB_INDEX_SUPPORT
+class XBDLLEXPORT xbIx;
+// structure for file list, each open DBF file can have one or more index files
+struct XBDLLEXPORT xbIxList {
+ xbIxList *next;
+ xbIx *ix;
+ xbString *sFmt;
+};
+#endif // XB_INDEX_SUPPORT
+///@endcond DOXYOFF
+
+
+//! @brief Base class for handling dbf files/tables.
+/*!
+The xbDbf class is used as a base class for accessing dbf files.
+In line with relational theory, a each dbf file can be considered as a table.
+The documentation uses the terms dbf and table interchangeably.<br>
+
+This module handles methods for accessing and updating dbf files.
+
+<br>
+The class is designed to support additional file layouts with a minimal amount of effort.
+If you are wanting to update the library to support a new dbf file type not currently supported
+by the library, create a derived class using xbDbf as a base class and modify methods needed
+to support the new dbf file version.<br>
+See the following for examples on how to start on this:<br>
+xbDbf3 is a derived class from xbDbf and supports the original Dbase III+ file version.<br>
+xbDbf4 is a derived class from xbDbf and supports the original Dbase IV file version.<br>
+
+*/
+
+
+class XBDLLEXPORT xbDbf : public xbFile {
+
+ public:
+ xbDbf( xbXBase *x );
+ virtual ~xbDbf();
+
+ virtual xbInt16 Abort();
+ virtual xbInt16 AppendRecord();
+ virtual xbInt16 BlankRecord();
+ virtual xbInt16 Commit();
+ virtual xbInt16 Close();
+ virtual xbInt16 CopyDbfStructure( xbDbf *dNewTable, const xbString &sTableName, const xbString &sTableAlias, xbInt16 iOverlay, xbInt16 iShareMode );
+ virtual xbInt16 CreateTable ( const xbString &sTableName, const xbString &sAlias, xbSchema *pSchema, xbInt16 iOverlay, xbInt16 iShareMode ) = 0;
+ virtual xbInt16 DeleteTable ();
+ virtual xbInt16 DeleteAll ( xbInt16 iOption );
+ virtual xbInt16 DeleteAllRecords ();
+ virtual xbInt16 DeleteRecord ();
+ virtual xbInt16 DumpHeader ( xbInt16 iOption ) const;
+ virtual xbInt16 DumpRecord ( xbUInt32 ulRecNo, xbInt16 iOutputDest = 0, xbInt16 iOutputFmt = 0 );
+ virtual xbInt16 GetAutoCommit () const;
+ virtual xbInt16 GetAutoCommit ( xbInt16 iOption ) const;
+ virtual xbUInt32 GetCurRecNo () const;
+ virtual xbInt16 GetDbfStatus () const;
+ virtual xbInt32 GetFieldCnt () const;
+ virtual xbInt16 GetFirstRecord ();
+ virtual xbInt16 GetFirstRecord ( xbInt16 iOption );
+ virtual xbInt16 GetLastRecord ();
+ virtual xbInt16 GetLastRecord ( xbInt16 iOption );
+
+ virtual xbInt16 GetNextRecord ();
+ virtual xbInt16 GetNextRecord ( xbInt16 iOption );
+ virtual xbInt16 GetNextRecord ( xbInt16 iOption, xbUInt32 ulStartRec );
+ virtual xbInt32 GetPhysicalIxCnt () const;
+ virtual xbInt16 GetPrevRecord ();
+ virtual xbInt16 GetPrevRecord ( xbInt16 iOption );
+ virtual xbInt16 GetRecord ( xbUInt32 ulRecNo );
+ virtual xbInt16 GetRecordCnt ( xbUInt32 & ulRecCnt );
+ virtual char * GetRecordBuf ( xbInt16 iOpt = 0 ) const;
+ virtual xbUInt16 GetRecordLen () const;
+ virtual const xbString &GetTblAlias() const;
+ virtual xbInt16 GetVersion () const = 0;
+ virtual xbXBase *GetXbasePtr () const; // return xbase pointer
+
+ virtual xbBool MemoFieldsExist () const;
+
+ virtual xbInt16 Open ( const xbString &sTableName );
+ virtual xbInt16 Open ( const xbString &sTableName, const xbString &sAlias );
+ virtual xbInt16 Open ( const xbString &sTableName, const xbString &sAlias, xbInt16 iOpenMode, xbInt16 iShareMode ) = 0;
+ virtual xbInt16 Pack ();
+ virtual xbInt16 Pack ( xbUInt32 &ulDeletedRecCnt );
+
+
+ virtual xbInt16 PutRecord (); // Put record to current location
+ virtual xbInt16 PutRecord ( xbUInt32 ulRecNo );
+ virtual xbInt16 ReadHeader ( xbInt16 iFilePositionOption, xbInt16 iReadOption );
+ virtual xbInt16 RecordDeleted ( xbInt16 iOpt = 0 ) const;
+
+ virtual xbInt16 SetAutoCommit ( xbInt16 iAutoCommit );
+
+ virtual xbInt16 UndeleteAllRecords();
+ virtual xbInt16 UndeleteRecord ();
+ virtual xbInt16 Zap ();
+
+
+ /* field methods */
+ //virtual xbInt16 GetRawField( xbInt16 iFieldNo, char *Buf, xbUInt32 BufSize, xbInt16 iRecBufSw ) const;
+ virtual xbInt16 GetField(xbInt16 iFieldNo, xbString &sFieldValue, xbInt16 iRecBufSw ) const;
+ virtual xbInt16 GetField(xbInt16 iFieldNo, xbString &sFieldValue) const;
+ virtual xbInt16 GetField(const xbString &sFieldName, xbString &sFieldValue) const;
+ virtual xbInt16 GetFieldDecimal( xbInt16 iFieldNo, xbInt16 &iFieldDecimal ) const;
+ virtual xbInt16 GetFieldDecimal( const xbString &sFieldName, xbInt16 &iFieldDecimal ) const;
+ virtual xbInt16 GetFieldLen( xbInt16 iFieldNo, xbInt16 &iFieldLen ) const;
+ virtual xbInt16 GetFieldLen( const xbString &sFieldName, xbInt16 &iFieldLen ) const;
+ virtual xbInt16 GetFieldName( xbInt16 iFieldNo, xbString &sFieldName ) const;
+
+ virtual xbInt16 GetFieldNo( const xbString &sFieldName, xbInt16 &iFieldNo ) const;
+ virtual xbInt16 GetFieldNo( const xbString &sFieldName ) const;
+
+ virtual xbInt16 GetFieldType( xbInt16 iFieldNo, char &cFieldType ) const;
+ virtual xbInt16 GetFieldType( const xbString &sFieldName, char &cFieldType ) const;
+ virtual xbInt16 PutField( const xbString &sFieldName, const xbString &sFieldData );
+ virtual xbInt16 PutField( xbInt16 iFieldNo, const xbString &sFieldData );
+
+ virtual xbInt16 PutLogicalField( xbInt16 iFieldNo, const xbString &sFieldData );
+ virtual xbInt16 PutLogicalField( const xbString &sFieldName, const xbString &sFieldData );
+ virtual xbInt16 GetLogicalField( xbInt16 iFieldNo, xbString &sFieldData ) const;
+ virtual xbInt16 GetLogicalField( const xbString &sFieldName, xbString &sFieldData) const;
+
+ virtual xbInt16 PutLogicalField( xbInt16 iFieldNo, xbBool bFieldData );
+ virtual xbInt16 PutLogicalField( const xbString &sFieldName, xbBool bFieldData );
+ virtual xbInt16 GetLogicalField( xbInt16 iFieldNo, xbBool &bFieldData ) const;
+ virtual xbInt16 GetLogicalField( xbInt16 iFieldNo, xbBool &bFieldData, xbInt16 iRecBufSw ) const;
+ virtual xbInt16 GetLogicalField( const xbString &sFieldName, xbBool &bFieldData) const;
+
+ virtual xbInt16 GetLongField( xbInt16 iFieldNo, xbInt32 &lFieldValue ) const;
+ virtual xbInt16 GetLongField( const xbString &sFieldName, xbInt32 &lFieldValue ) const;
+ virtual xbInt16 PutLongField( xbInt16 iFieldNo, xbInt32 lFieldValue );
+ virtual xbInt16 PutLongField( const xbString &sFieldNo, xbInt32 lFieldValue );
+
+ virtual xbInt16 GetULongField( xbInt16 iFieldNo, xbUInt32 &lFieldValue ) const;
+ virtual xbInt16 GetULongField( const xbString &sFieldName, xbUInt32 &lFieldValue ) const;
+ virtual xbInt16 PutULongField( xbInt16 iFieldNo, xbUInt32 lFieldValue );
+ virtual xbInt16 PutULongField( const xbString &sFieldNo, xbUInt32 lFieldValue );
+
+ virtual xbInt16 GetDoubleField( xbInt16 FieldNo, xbDouble &dFieldValue ) const;
+ virtual xbInt16 GetDoubleField( xbInt16 FieldNo, xbDouble &dFieldValue, xbInt16 iRecBufSw ) const;
+ virtual xbInt16 GetDoubleField( const xbString &sFieldName, xbDouble &dFieldValue ) const;
+ virtual xbInt16 PutDoubleField( xbInt16 FieldNo, xbDouble dFieldValue );
+ virtual xbInt16 PutDoubleField( const xbString &FieldName, xbDouble dFieldValue );
+
+ virtual xbInt16 GetFloatField( xbInt16 iFieldNo, xbFloat &fFieldValue ) const;
+ virtual xbInt16 GetFloatField( const xbString &sFieldName, xbFloat &fFieldValue ) const;
+ virtual xbInt16 PutFloatField( xbInt16 iFieldNo, xbFloat fFieldValue );
+ virtual xbInt16 PutFloatField( const xbString &sFieldName, xbFloat fFieldValue );
+
+ virtual xbInt16 GetDateField( xbInt16 iFieldNo, xbDate &dt ) const;
+ virtual xbInt16 GetDateField( const xbString &sFieldName, xbDate &dt ) const;
+ virtual xbInt16 PutDateField( xbInt16 iFieldNo, const xbDate &dt );
+ virtual xbInt16 PutDateField( const xbString &sFieldName, const xbDate &dt );
+
+
+
+ #ifdef XB_MEMO_SUPPORT
+ virtual xbInt16 GetMemoFieldCnt () const;
+ virtual xbMemo *GetMemoPtr ();
+ virtual xbUInt32 GetCreateMemoBlockSize() const;
+ virtual xbInt16 GetMemoField ( xbInt16 iFldNo, xbString &sMemoData );
+ virtual xbInt16 GetMemoField ( const xbString & sFldName, xbString &sMemoData );
+ virtual xbInt16 GetMemoFieldLen ( xbInt16 iFldNo, xbUInt32 &ullMemoFieldLen );
+ virtual xbInt16 GetMemoFieldLen ( const xbString & sFldName, xbUInt32 &ulMemoFieldLen );
+ virtual xbBool MemoFieldExists ( xbInt16 iFieldNo ) const;
+ virtual xbBool MemoFieldExists ( const xbString &sFieldName ) const;
+ virtual xbInt16 SetCreateMemoBlockSize( xbUInt32 ulBlockSize ) = 0;
+ virtual xbInt16 UpdateMemoField ( xbInt16 iFldNo, const xbString &sMemoData );
+ virtual xbInt16 UpdateMemoField ( const xbString & sFldName, const xbString &sMemoData );
+ #endif // XB_MEMO_SUPPORT
+
+
+ #ifdef XB_LOCKING_SUPPORT
+ virtual xbInt16 LockTable ( xbInt16 iLockFunction );
+ virtual xbInt16 LockRecord ( xbInt16 iLockFunction, xbUInt32 ulRecNo );
+ virtual xbInt16 LockAppend ( xbInt16 iLockFunction );
+ virtual xbInt16 LockHeader ( xbInt16 iLockFunction );
+
+ #ifdef XB_MEMO_SUPPORT
+ virtual xbInt16 LockMemo ( xbInt16 iLockFunction );
+ virtual xbBool GetMemoLocked () const;
+ #endif // XB_MEMO_LOCK
+
+ #ifdef XB_INDEX_SUPPORT
+ virtual xbInt16 LockIndices ( xbInt16 iLockFunction );
+ #endif // XB_INDEX_SUPPORT
+
+ xbInt16 GetAutoLock () const;
+ void SetAutoLock ( xbInt16 iAutoLock );
+ xbInt16 GetLockFlavor () const;
+ void SetLockFlavor ( xbInt16 iLockFlavor );
+ xbBool GetTableLocked () const;
+ xbBool GetHeaderLocked () const;
+ xbUInt32 GetAppendLocked () const;
+ xbLinkListNode<xbUInt32> * GetFirstRecLock () const;
+
+ #ifdef XB_DEBUG_SUPPORT
+ void DumpTableLockStatus() const;
+ #endif // XB_DEBUG_SUPPORT
+ #endif // XB_LOCKING_SUPPORT
+
+
+ #ifdef XB_INDEX_SUPPORT
+ virtual xbInt16 CloseIndexFile( xbIx *pIx );
+ virtual xbInt16 CreateTag( const xbString &sIxType, const xbString &sName, const xbString &sKey, const xbString &sFilter,
+ xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverLay, xbIx **xbIxOut, void **vpTagOut );
+ virtual xbInt16 DeleteTag( const xbString &sIxType, const xbString &sName );
+ virtual xbInt16 DeleteAllIndexFiles();
+ virtual xbInt16 Find( xbString &sKey );
+ virtual xbInt16 Find( xbDate &dtKey );
+ virtual xbInt16 Find( xbDouble &dKey );
+ virtual xbIx *GetCurIx() const;
+ virtual void *GetCurTag() const;
+
+ virtual xbInt16 GetFirstKey();
+ virtual xbInt16 GetNextKey();
+ virtual xbInt16 GetPrevKey();
+ virtual xbInt16 GetLastKey();
+
+ virtual const xbString &GetCurIxType() const;
+ virtual const xbString &GetCurTagName() const;
+ virtual xbIxList *GetIxList() const;
+ xbLinkListNode<xbTag *> *GetTagList () const;
+ virtual xbInt16 OpenIndex( const xbString &sIxType, const xbString &sIndexName );
+ virtual xbInt16 SetCurTag( const xbString &sTagName );
+ virtual void SetCurTag( const xbString &sIxType, xbIx *pIx, void *vpTag );
+
+ #ifdef XB_DEBUG_SUPPORT
+ virtual xbInt16 CheckTagIntegrity( xbInt16 iTagOpt, xbInt16 iOutputOpt );
+ virtual xbInt16 Reindex( xbInt16 iTagOpt );
+ #endif // XB_DEBUG_SUPPORT
+ #endif // XB_INDEX_SUPPORT
+
+ #ifdef XB_NDXINF_SUPPORT
+ virtual xbInt16 AssociateIndex( const xbString &sType, const xbString &sName, xbInt16 iOption );
+ xbLinkListNode<xbString> *GetNdxInfList() const;
+ #endif // XB_NDXINF_SUPPORT
+
+ //#ifdef XB_MDX_SUPPORT
+ //virtual xbInt16 GetCreateMdxBlockSize() const;
+ //virtual xbInt16 SetCreateMdxBlockSize( xbInt16 ulBlockSize );
+ //#endif
+
+
+
+ protected:
+ #ifdef XB_INDEX_SUPPORT
+ friend class xbIx;
+ friend class xbIxMdx;
+
+ xbInt16 AddIndex( xbIx *ix, const xbString &sFmt );
+ void ClearTagList();
+ virtual xbInt16 GetNdxInfFileName( xbString &sNdxIdxFileName );
+ xbInt16 RemoveIndex( xbIx * ix );
+ void UpdateSchemaIxFlag( xbInt16 iFldNo, unsigned char cVal );
+ virtual xbInt16 UpdateTagList ();
+ #endif
+
+
+
+ #ifdef XB_LOCKING_SUPPORT
+ void SetHeaderLocked ( xbBool bTableLocked );
+ void SetTableLocked ( xbBool bTableLocked );
+ #endif // XB_LOCKING_SUPORT
+
+ #ifdef XB_MEMO_SUPPORT
+ xbInt16 iMemoFieldCnt; // Memo field cnt in the table
+ xbMemo *Memo; // Pointer to memo class
+ xbUInt32 ulCreateMemoBlockSize; // blocksize to use when creating dbt file
+ #endif
+
+ #ifdef XB_NDXINF_SUPPORT
+ virtual xbInt16 DeleteNdxInfData();
+ virtual xbInt16 LoadNdxInfData();
+ virtual xbInt16 SaveNdxInfData();
+ #endif // XB_NDXINF_SUPPORT
+
+/*
+ #ifdef XB_MDX_SUPPORT
+ xbInt16 iCreateMdxBlockSize;
+ #endif // XB_MDX_SUPPORT
+*/
+
+ virtual xbInt16 GetRawField( xbInt16 iFieldNo, char *Buf, xbUInt32 BufSize, xbInt16 iRecBufSw ) const;
+ virtual void InitVars();
+ virtual xbInt16 SetVersion() = 0;
+ virtual xbInt16 ValidateSchema( xbSchema * s ) = 0;
+ xbInt16 WriteHeader( xbInt16 iPositionOption, xbInt16 iWriteOption );
+
+
+ xbUInt32 ulCurRec; // Current record or zero
+ xbInt16 iAutoCommit; // Auto commit updates if not explicitly performed before moving off record?
+ // -1 --> Use DBMS default
+ // 0 --> No auto update on this table, regardless of DBMS setting
+ // 1 --> Auto update on this table, regardless of DBMS setting
+
+ xbInt16 iFileVersion; // xBase file version - which class is in play
+
+
+ xbString sAlias; // table alias
+ xbInt16 iNoOfFields;
+ xbInt16 iDbfStatus; // 0 = closed
+ // 1 = open
+ // 2 = updates pending
+
+ xbSchemaRec *SchemaPtr; // Pointer to field data
+ char *RecBuf; // Pointer to record buffer
+ char *RecBuf2; // Pointer to original rec buf
+
+
+/* Next several variables are database header fields, up through dbase V */
+ unsigned char cVersion;
+ char cUpdateYY;
+ char cUpdateMM;
+ char cUpdateDD;
+ xbUInt32 ulNoOfRecs;
+ xbUInt16 uiHeaderLen;
+ xbUInt16 uiRecordLen;
+ char cTransactionFlag;
+ char cEncryptionFlag;
+ char cIndexFlag;
+ char cLangDriver; // dbase 7 sets to 1B
+
+
+
+ private:
+ void ResetNoOfRecords();
+
+
+#ifdef XB_LOCKING_SUPPORT
+ xbInt16 iAutoLock; // 0 - autolock off, 1 - autolock on
+ xbInt16 iLockFlavor;
+ xbBool bTableLocked; // is the table locked
+ xbBool bHeaderLocked; // is the header locked
+ xbUInt32 ulAppendLocked; // record number of the new record for the append lock operation
+ xbLinkListOrd<xbUInt32> lloRecLocks; // ordered link list of locked records
+#endif
+
+
+#ifdef XB_INDEX_SUPPORT
+ xbIxList *ixList; // pointer to a list of indices associated with the table
+// #ifdef XB_MDX_SUPPORT
+// xbIx *ixMdx; // pointer to production multi-tag index file
+// #endif
+ xbIx *pCurIx; // Pointer to current index class
+ void *vpCurIxTag; // Pointer to current tag
+ xbString sCurIxType; // Current index type
+ xbLinkList<xbTag *> llTags; // linked list of open tags
+
+#endif // XB_INDEX_SUPPORT
+
+#ifdef XB_NDXINF_SUPPORT
+ xbLinkList<xbString> llNdxInfData; // linked list of strings containing ndx file entries
+#endif // XB_NDXINF_SUPPORT
+
+
+};
+
+
+#ifdef XB_DBF3_SUPPORT
+//! @brief Derived class for handling dbf version III files/tables.
+/*!
+The xbDbf class is used as a base class for accessing dbf files.
+The xbDbf3 class is derived from the xbDbf class and is designed to handle the
+orginal version 3 type files.
+*/
+
+class XBDLLEXPORT xbDbf3 : public xbDbf {
+ public:
+ xbDbf3(xbXBase *x);
+ ~xbDbf3();
+ virtual xbInt16 CreateTable ( const xbString &sTableName, const xbString &sAlias, xbSchema *, xbInt16 iOverlay, xbInt16 iShareMode );
+ virtual xbInt16 GetVersion () const;
+ virtual xbInt16 Open ( const xbString &sTableName, const xbString &sAlias, xbInt16 iOpenMode, xbInt16 iShareMode );
+
+ #ifdef XB_MEMO_SUPPORT
+ virtual xbInt16 SetCreateMemoBlockSize( xbUInt32 iBlockSize );
+ #endif
+
+ protected:
+ xbInt16 SetVersion ();
+ virtual xbInt16 ValidateSchema( xbSchema *s );
+
+ private:
+
+};
+#endif /* XB_DBF3_SUPPORT */
+
+
+#ifdef XB_DBF4_SUPPORT
+//! @brief Derived class for handling dbf version IV files/tables.
+/*!
+The xbDbf class is used as a base class for accessing dbf files.
+The xbDbf4 class is derived from the xbDbf class and is designed to handle the
+orginal version 4 type files.
+*/
+class XBDLLEXPORT xbDbf4 : public xbDbf {
+ public:
+ xbDbf4( xbXBase *x );
+
+ ~xbDbf4();
+
+ virtual xbInt16 CreateTable ( const xbString &sTableName, const xbString &sAlias, xbSchema *, xbInt16 iOverlay, xbInt16 iShareMode );
+ virtual xbInt16 GetVersion () const;
+ virtual xbInt16 Open ( const xbString &sTableName, const xbString &sAlias, xbInt16 iOpenMode, xbInt16 iShareMode );
+
+ #ifdef XB_MEMO_SUPPORT
+ virtual xbInt16 SetCreateMemoBlockSize( xbUInt32 iBlockSize );
+ #endif
+
+ protected:
+ // void InitVars ();
+ xbInt16 SetVersion();
+ virtual xbInt16 ValidateSchema ( xbSchema *s );
+
+ private:
+
+};
+
+#endif /* XB_DBF4_SUPPORT */
+
+} /* namespace xb */
+#endif /* __XB_DBF_H__ */
diff --git a/src/include/xbexp.h b/src/include/xbexp.h
new file mode 100755
index 0000000..96413ac
--- /dev/null
+++ b/src/include/xbexp.h
@@ -0,0 +1,215 @@
+/* xbexp.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_EXP_H__
+#define __XB_EXP_H__
+
+
+// #ifdef CMAKE_COMPILER_IS_GNUCC
+// #pragma interface
+// #endif
+
+
+
+#ifdef XB_FUNCTION_SUPPORT
+#define XB_EXP_CHAR 'C'
+#define XB_EXP_DATE 'D'
+#define XB_EXP_LOGICAL 'L'
+#define XB_EXP_NUMERIC 'N'
+#define XB_EXP_UNKNOWN 'U'
+#endif
+
+#ifdef XB_EXPRESSION_SUPPORT
+
+#define XB_EXP_CONSTANT 'C'
+#define XB_EXP_FUNCTION 'F'
+#define XB_EXP_FIELD 'D'
+#define XB_EXP_OPERATOR 'O'
+#define XB_EXP_NOTROOT 'N' // not root node, needs further parsing
+#define XB_EXP_PRE_OPERATOR 'B' // (B)efore) pre increment, pre decrement
+#define XB_EXP_POST_OPERATOR 'A' // (A)fter) post increment, pre decrement
+
+#define XB_END_OF_EXPRESSION -100
+
+// #define XB_UNBALANCED_PARENS -101
+// #define XB_UNBALANCED_QUOTES -102
+
+
+namespace xb{
+
+///@cond DOXYOFF
+struct XBDLLEXPORT xbExpToken {
+ xbString sExpression; // in - expression to pull next token from
+ // out - remainder of the expression after token removed
+ xbString sToken; // next token pulled from the expression
+ char cNodeType; // one of XB_EXP_CONSTANT, XB_EXP_FUNCTION, XB_EXP_FIELD, XB_EXP_OPERATOR, XB_EXP_NOTROOT
+ char cReturnType; // one of XB_EXP_CHAR, XB_EXP_DATE, XB_EXP_LOGICAL, XB_EXP_NUMERIC, XB_EXP_UNKNOWN
+ xbInt16 iSts; // return status after retrieving or attempting next token from expression
+ // 0 = no error
+ // XB_END_OF_EXPRESSION
+ // XB_UNBALANCED_PARENS
+ // XB_UNBALANCED_QUOTES
+ char cPrevNodeType; // previous node type
+ char cPrevReturnType; // previous return type
+
+ // constructor
+ xbExpToken() { cNodeType = 0; cReturnType = 0; iSts = 0; cPrevNodeType = 0; cPrevReturnType = 0; }
+};
+///@endcond DOXYOFF
+
+
+/************************************************************************/
+
+//! @brief Class for handling expressions.
+/*!
+The xbExp class is used for parsing and evaluating expression.
+
+The Xbase64 library includes an expression parsing module which assists
+application programmers by providing a high level data manipulation tool and
+also allows for building complex index keys.
+
+The functions included were derived from dBASE III Plus, Dbase IV and Clipper.<br><br>
+
+<h3>Internal fuctioning</h3>
+The expression module works in two phases. Firstly, method
+<em>ParseExpression</em> is called and builds an expression tree from
+all the components of the expression. The tree is made up of individual
+nodes. The expression is checked for valid field names, literals,
+operands and functions. Any field references are resolved. If fields
+are used in an expression and the database name for the field is not
+included in the name with the -> operand, the routines assume the
+associated database has been successfully opened.
+<br>
+Secondly, method <em>ProcessExpression</em> is called to process the
+expression tree created by ParseExpression(). The routine parses each
+node in the expression tree, executing functions, processing operands
+and manipulating data to produce the desired result.<br>
+
+If an expression will be processed repeatedly, it is best to pre-parse the
+tree using <em>ParseExpression</em>, then for each new call to the expression,
+execute method <em>ProcessExpression</em> which processes the tree.<br><br>
+
+<h3>Expression Return Types</h3>
+Expressions will return a type of CHAR, NUMERIC, DATE or LOGICAL.<br>
+
+An expression return type can be determined with method <em>
+GetExpressionResultType</em> after parsing it.<br>
+
+Expressions returning a return type of CHAR are limited to a 200 byte internal
+buffer. There is also a 100 byte limit for NDX index key support. If
+the 200 byte limit is not large enough for your application, adjust field
+<em>enum { WorkBufMaxLen = 200 };</em> in file <em>exp.h</em>.<br><br>
+
+<h3>Expression Functions</h3>
+Each expression function also has a corresponding C++ function. It is
+slightly more efficient to call the C++ functions directly, rather than
+execute the expression parsing routines.<br><br>
+
+<h3>Expression Components</h3>
+Expressions are made up of one or more tokens. A token is one of literal,
+database field, operand or function. Literals are either numeric or character.
+Character literals are enclosed in 'single' or "double" quotes. numeric
+literals are a series of one or more contiguous numerals, ".", "+" or "-'".
+<br><br>
+A field is simply a field name in the default database, or is in the form
+of database->fieldname.
+
+*/
+
+class XBDLLEXPORT xbExp{
+
+ public:
+ xbExp( xbXBase * );
+ xbExp( xbXBase *, xbDbf * );
+ virtual ~xbExp();
+ void ClearTreeHandle();
+
+
+ #ifdef XB_DEBUG_SUPPORT
+ void DumpTree( xbInt16 iOption );
+ void DumpToken( xbExpToken &t, xbInt16 iOption = 0 );
+ #endif
+
+ xbInt16 GetResultLen() const;
+ char GetReturnType() const;
+ xbInt16 GetBoolResult( xbBool &bResult );
+ xbInt16 GetDateResult( xbDate &dtResult );
+ xbInt16 GetNumericResult( xbDouble &dResult );
+ xbInt16 GetStringResult( xbString &sResult );
+ xbInt16 GetStringResult( char * vpResult, xbUInt32 ulLen );
+ xbExpNode *GetTreeHandle();
+ xbInt16 ParseExpression( const xbString &sExpression );
+ xbInt16 ParseExpression( xbDbf *dbf, const xbString &sExpression );
+ xbInt16 ProcessExpression();
+ xbInt16 ProcessExpression( xbInt16 iRecBufSw );
+
+
+ protected:
+ xbInt16 GetNextToken( xbExpToken &t );
+ xbInt16 OperatorWeight( const xbString &sOperator );
+ xbExpNode *GetNextNode( xbExpNode * n ) const; // traverses the tree from bottom left node, right, then up
+
+ private: // methods
+
+ // xbInt16 CalcExpressionResultLen();
+ xbInt16 CalcFunctionResultLen( xbExpNode *n ) const;
+ xbInt16 CalcCharNodeLen( xbExpNode *n );
+ xbInt16 CheckParensAndQuotes( const xbString &sExpression );
+ xbInt16 GetExpressionResultLen() const;
+
+ xbInt16 GetTokenCharConstant ( xbExpToken &t );
+ xbInt16 GetTokenDatabaseField ( xbExpToken &t );
+ xbInt16 GetTokenDateConstant ( xbExpToken &t );
+ xbInt16 GetTokenFunction ( xbExpToken &t );
+ xbInt16 GetTokenLogicalConstant( xbExpToken &t );
+ xbInt16 GetTokenNumericConstant( xbExpToken &t );
+ xbInt16 GetTokenOperator ( xbExpToken &t );
+ xbInt16 GetTokenParen ( xbExpToken &t );
+
+ xbBool IsFunction ( const xbString &sExp, char &cReturnType );
+ xbBool IsLogicalConstant ( const xbString &sExp );
+ xbBool IsNumericConstant ( const xbString &sExp, char cPrevNodeType );
+ xbBool IsOperator ( const xbString &sExp );
+ char IsTokenSeparator ( char c );
+ xbBool IsWhiteSpace ( char c );
+
+ xbInt16 ParseExpression ( const xbString &sExpression, xbInt16 iWeight );
+ xbInt16 ParseExpressionConstant( xbExpToken &t, xbExpNode *n );
+ xbInt16 ParseExpressionFunction( xbExpToken &t, xbExpNode *n, xbInt16 iWeight );
+ xbInt16 ParseExpressionFunctionParms( const xbString &sParms, xbLinkList<xbString> &llParms );
+ xbInt16 ParseExpressionField ( xbExpToken &t, xbExpNode *n );
+ xbInt16 ParseExpressionOperator( xbExpToken &t, xbExpNode *n, xbInt16 iWeight );
+
+ xbInt16 ProcessExpressionFunction( xbExpNode *n, xbInt16 iRecBufSw = 0 );
+ xbInt16 ProcessExpressionOperator( xbExpNode *n );
+
+ private: // fields
+ xbXBase *xbase;
+ xbDbf *dbf;
+ xbExpNode *nTree; // pointer to tree of expNodes
+ // xbInt16 iExpLen; // size of expression result
+
+
+};
+
+/* Expression handler */
+
+
+};
+#endif // XB_EXPRESSION_SUPPORT
+#endif // __XB_EXP_H__
+
+
diff --git a/src/include/xbexpnode.h b/src/include/xbexpnode.h
new file mode 100755
index 0000000..f50d9eb
--- /dev/null
+++ b/src/include/xbexpnode.h
@@ -0,0 +1,120 @@
+/* xbexpnode.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_EXPNODE_H__
+#define __XB_EXPNODE_H__
+
+// #ifdef CMAKE_COMPILER_IS_GNUCC
+// #pragma interface
+// #endif
+
+#ifdef XB_EXPRESSION_SUPPORT
+
+
+namespace xb{
+
+//class XBDLLEXPORT xbDbf;
+
+/************************************************************************/
+//! @brief Expression node class for handling expression nodes.
+/*!
+The xbExpNode class is used by the expression logic for handling specific
+nodes within a tree of nodes.<br>
+
+Expressions are parsed into nodes and a logical tree of nodes is created
+out of all the individual components within the expression.<br>
+
+This class is used for handling a specific node within a tree.<br>
+
+An application program will typically not need to be concerned with
+this class.<br>
+
+*/
+class XBDLLEXPORT xbExpNode {
+ public:
+ xbExpNode();
+ xbExpNode( xbString &sNodeText, char cReturnType, char cNodeType );
+ xbExpNode( xbString &sNodeText, char cNodeType );
+ xbExpNode( char cNodeType );
+
+ virtual ~xbExpNode();
+ xbInt16 AddChild( xbExpNode *n );
+ xbExpNode *GetChild( xbUInt32 ulChildNo ) const;
+ xbUInt32 GetChildCnt() const;
+ xbUInt32 GetChildNo() const;
+ xbDbf *GetDbf() const;
+ xbInt16 GetFieldNo() const;
+ xbExpNode *GetFirstNode();
+ xbExpNode *GetNextNode() const;
+ void GetNodeText( xbString &sNodeText ) const;
+ char GetNodeType() const;
+ xbExpNode *GetParent() const;
+ xbString &GetStringResult();
+ xbBool GetBoolResult() const;
+ xbDouble GetNumericResult() const;
+ xbUInt32 GetResultLen() const;
+ xbExpNode *GetRightSibling() const;
+ char GetReturnType() const;
+ xbInt16 GetWeight() const;
+ xbBool HasRightSibling() const;
+ xbBool IsOperator() const;
+ xbBool IsUnaryOperator() const;
+ void RemoveLastChild();
+ void SetResultLen( xbUInt32 ulResultLen );
+ void SetDbfInfo( xbDbf *dbf );
+ void SetDbfInfo( xbDbf *dbf, xbInt16 iFieldNo );
+ void SetNodeText( xbString &sNodeText );
+ void SetNodeType( char cNodeType );
+ void SetParent( xbExpNode *n );
+ void SetResult( xbString &sResult );
+ void SetResult( xbDate &dtResult );
+ void SetResult( xbBool bResult );
+ void SetResult( xbDouble dResult );
+ void SetReturnType( char cReturnType );
+ void SetWeight( xbInt16 iWeight );
+
+ #ifdef XB_DEBUG_SUPPORT
+ void DumpNode( xbInt16 iOption ) const; // 0 = no children, 1 = and children
+ #endif
+
+ private:
+ xbString sNodeText; // expression text
+ char cReturnType; // one of: XB_EXP_CHAR, XB_EXP_DATE, XB_EXP_LOGICAL, XB_EXP_NUMERIC
+ char cNodeType; // one of: XB_EXP_CONSTANT, XB_EXP_FUNCTION, XB_EXP_FIELD, XB_EXP_OPERATOR
+ xbString sResult; // char result, and operator
+ xbDouble dResult; // numeric and bool results
+ xbExpNode * nParent; // pointer to parent
+ xbLinkList<xbExpNode *> llChildren; // linked list of descendent nodes
+ xbDbf *dbf; // pointer to dbf, used for field, RECNO() and RECCOUNT()
+ xbInt16 iFieldNo; // field no if DBF field
+ xbUInt32 ulResultLen; // for string results, accumulated length of character operations
+ // includes the sum of all nodes under this + this
+ // date = 8, numeric = 4, logical = 1
+ xbInt16 iWeight; // used for buildign the tree of nodes, assigned to operators
+ // the higher the number, the lower it goes on the tree
+
+};
+
+/************************************************************************/
+
+/* Expression handler */
+
+
+};
+#endif // XB_EXPRESSION_SUPPORT
+#endif // __XB_EXP_H__
+
+
diff --git a/src/include/xbfile.h b/src/include/xbfile.h
new file mode 100755
index 0000000..a636632
--- /dev/null
+++ b/src/include/xbfile.h
@@ -0,0 +1,194 @@
+/* xbfile.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#ifndef __XB_FILE_H__
+#define __XB_FILE_H__
+
+#ifdef CMAKE_COMPILER_IS_GNUCC
+#pragma interface
+#endif
+
+/*****************************/
+/* File Open Modes */
+#define XB_READ 0
+#define XB_READ_WRITE 1
+#define XB_WRITE 2
+
+/*****************************/
+/* File Access Modes */
+#define XB_SINGLE_USER 0 // file buffering on
+#define XB_MULTI_USER 1 // file buffering off
+
+namespace xb{
+
+/*! @brief Class for handling low level file I/O.
+*/
+
+/*!
+The xbFile class is used as an abstraction layer to isolate the library from the nuances
+of different operating systems and machine architectures.
+
+This module handles low level file I/O and is a base class
+for the (dbf) table, (dbt) memo and (ndx,mdx) index classes.
+Files are opened and manipulated via methods in the xbFile class.<br>
+This class handles:<br>
+1) Big and little endian reads/writes<br>
+2) 32 or 64 bit system calls, depending on OS<br>
+3) Various different c/c++ calls to open/close/read/write based on OS and compiler version<br>
+<br>
+If you are wanting to port this library to a new platform, start with this class.
+This class could be used if you want to write a platform independent program that needs R/W file access.
+*/
+
+
+class XBDLLEXPORT xbFile : public xbSsv {
+
+ public:
+ // xbFile();
+ xbFile( xbXBase * x );
+
+ ~xbFile();
+ xbInt16 CreateUniqueFileName( const xbString &sDirIn, const xbString &sExtIn, xbString &sFqnOut );
+ xbInt16 CreateUniqueFileName( const xbString &sDirIn, const xbString &sExtIn, xbString &sFqnOut, xbInt16 iOption );
+
+ const xbString& GetDirectory() const;
+ const xbString& GetFileName() const;
+ const xbString& GetFqFileName() const;
+
+ void SetDirectory ( const xbString &sDirectory);
+ void SetFileName ( const xbString &sFileName );
+ void SetFqFileName( const xbString &sFqName );
+
+ xbUInt32 GetBlockSize () const;
+ xbInt16 SetBlockSize ( xbUInt32 ulBlockSize );
+
+ xbInt16 GetOpenMode () const;
+ xbInt16 GetShareMode () const;
+
+ xbInt16 GetFileDirPart ( xbString &sFileDirPartOut ) const;
+ xbInt16 GetFileDirPart ( const xbString &sCompleteFileNameIn, xbString &sFileDirPartOut ) const;
+ xbInt16 GetFileExtPart ( xbString &sFileExtPartOut ) const;
+ xbInt16 GetFileExtPart ( const xbString &sCompleteFileNameIn, xbString &sFileExtPartOut ) const;
+ xbInt16 GetFileNamePart( xbString &sFileNamePartOut ) const;
+ xbInt16 GetFileNamePart( const xbString &sCompleteFileNameIn, xbString &sFileNamePartOut ) const;
+ xbInt16 GetFileType ( xbString &sFileType ) const;
+
+ xbInt16 GetXbaseFileTypeByte( const xbString &sFileName, xbInt16 &iVersion );
+ xbInt16 GetXbaseFileTypeByte( const xbString &sFileName, unsigned char &cFileTypeByte );
+ xbInt16 GetXbaseFileTypeByte( const xbString &sFileName, unsigned char &cFileTypeByte, xbInt16 &iVersion );
+ xbInt16 DetermineXbaseTableVersion( unsigned char cFileTypeByte ) const;
+ xbInt16 DetermineXbaseMemoVersion( unsigned char cFileTypeByte ) const;
+
+ xbBool FileExists () const;
+ xbBool FileExists ( xbInt16 iOption ) const;
+ xbBool FileExists ( const xbString &sFileName ) const;
+ xbBool FileExists ( const xbString &sFileName, xbInt16 iOption ) const;
+
+ xbBool FileIsOpen () const;
+
+ xbInt16 ReadBlock ( xbUInt32 ulBlockNo, size_t readSize, void *buf );
+ xbInt16 ReadBlock ( xbUInt32 ulBlockNo, xbUInt32 ulBlockSize, size_t readSize, void *buf );
+ xbInt16 WriteBlock( xbUInt32 ulBlockNo, size_t writeSize, void *buf );
+
+ xbInt16 GetFileSize( xbUInt64 &ullFileSize );
+ xbInt16 GetFileMtime( time_t &mtime );
+
+ xbDouble eGetDouble( const char *p ) const;
+ xbInt32 eGetInt32 ( const char *p ) const;
+ xbUInt32 eGetUInt32( const char *p ) const;
+ xbInt16 eGetInt16 ( const char *p ) const;
+ xbUInt16 eGetUInt16( const char *p ) const;
+ void ePutDouble( char *p, xbDouble d );
+ void ePutInt32 ( char *p, xbInt32 l );
+ void ePutUInt32( char *p, xbUInt32 ul );
+ void ePutInt16 ( char *p, xbInt16 s );
+ void ePutUInt16( char *p, xbUInt16 s );
+
+ xbInt16 xbFclose ();
+ xbInt16 xbFeof ();
+ xbInt16 xbFflush ();
+ xbInt16 xbFgetc ( xbInt32 &c );
+ xbInt16 xbFgetc ( char &c );
+
+ #ifdef XB_LOCKING_SUPPORT
+ xbInt16 xbLock ( xbInt16 iFunction, xbInt64 llOffset, size_t stLen );
+ xbInt16 GetLockRetryCount() const;
+ void SetLockRetryCount( xbInt16 iLockRetries );
+ #endif
+
+ xbInt16 xbFopen ( xbInt16 iOpenMode );
+ xbInt16 xbFopen ( const xbString &sOpenMode, xbInt16 iShareMode );
+ xbInt16 xbFopen ( xbInt16 iOpenMode, xbInt16 iShareMode );
+ xbInt16 xbFopen ( const xbString &sMode, const xbString &sFileName, xbInt16 iShareMode );
+
+ xbInt16 xbFputc ( xbInt32 c );
+ xbInt16 xbFputc ( xbInt32 c, xbInt32 iNoTimes );
+ xbInt16 xbFputs ( const xbString &s );
+ xbInt16 xbFread ( void *ptr, size_t size, size_t nmemb );
+ xbInt16 xbFgets ( size_t lSize, xbString &sLine );
+
+ size_t xbFtell ();
+ xbInt16 xbFseek ( xbInt64 llOffset, xbInt32 whence );
+
+ void xbFTurnOffFileBuffering();
+ xbInt16 xbFwrite ( const void *ptr, size_t lSize, size_t lNmemb );
+
+ xbInt16 xbReadUntil ( const char cDelim, xbString &sOut );
+ xbInt16 xbRemove ( const xbString &sFileName, xbInt16 iOption );
+ xbInt16 xbRemove ( const xbString &sFileName );
+ xbInt16 xbRemove ();
+
+ xbInt16 xbRename ( const xbString &sOldName, const xbString &sNewName );
+ xbInt16 xbRename ( const xbString &sOldName, const xbString &sNewName, xbInt16 iOption );
+ void xbRewind ();
+
+ xbInt16 xbTruncate ( xbInt64 llSize );
+ xbInt16 NameSuffixMissing( const xbString &sFileName, xbInt16 iOption ) const;
+
+ #ifdef XB_DEBUG_SUPPORT
+ xbInt16 DumpBlockToDisk( xbUInt32 ulBlockNo, size_t lBlockSize );
+ #endif
+
+
+ protected:
+
+ xbXBase *xbase; /* pointer to the main structures */
+
+ private:
+ FILE *fp;
+ xbString sFqFileName; /* fully qualified file name */
+ xbString sFileName; /* file name */
+ xbString sDirectory; /* directory, ends with / or \ */
+ xbBool bFileOpen; /* true if file is open */
+ xbUInt32 ulBlockSize; /* used for memo and index files */
+
+ xbInt16 iOpenMode; /* XB_READ || XB_READ_WRITE || XB_WRITE */
+ xbInt16 iShareMode; /* XB_SINGLE_USER || XB_MULTI_USER - set file buffering */
+ xbInt32 iFileNo; /* Library File No */
+
+ #ifdef XB_LOCKING_SUPPORT
+ xbInt16 iLockRetries; /* file override number of lock attempts */
+ #endif
+
+ #ifdef HAVE_SETENDOFFILE_F
+ HANDLE fHandle;
+ #endif
+
+
+};
+
+} /* namespace */
+#endif /* __XBFILE_H__ */
+
diff --git a/src/include/xbfilter.h b/src/include/xbfilter.h
new file mode 100755
index 0000000..8722256
--- /dev/null
+++ b/src/include/xbfilter.h
@@ -0,0 +1,78 @@
+/* xbfilter.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+This class manages the user data area (UDA)
+
+*/
+
+
+#ifndef __XB_XBFILTER_H__
+#define __XB_XBFILTER_H__
+
+#ifdef CMAKE_COMPILER_IS_GNUCC
+#pragma interface
+#endif
+
+
+#ifdef XB_FILTER_SUPPORT
+
+
+namespace xb{
+
+//#ifdef XB_INDEX_SUPPORT
+//class XBDLLEXPORT xbIx;
+//#endif // XB_INDEX_SUPPORT
+
+
+class XBDLLEXPORT xbFilter {
+
+ public:
+ xbFilter( xbXBase *xbase, xbDbf *dbf );
+ ~xbFilter();
+ xbInt16 Set( xbString &sFilterExpression );
+ xbInt16 GetFirstRecord( xbInt16 iOpt = 1 );
+ xbInt16 GetNextRecord ( xbInt16 iOpt = 1 );
+ xbInt16 GetPrevRecord ( xbInt16 iOpt = 1 );
+ xbInt16 GetLastRecord ( xbInt16 iOpt = 1 );
+ void SetLimit( xbInt32 ulLimit );
+ xbInt32 GetLimit() const;
+ void ResetQryCnt();
+ xbInt32 GetQryCnt() const;
+
+ #ifdef XB_INDEX_SUPPORT
+// void Set( xbIx *pIx, void *vpTag );
+ xbInt16 GetFirstRecordIx( xbInt16 iOpt = 1 );
+ xbInt16 GetNextRecordIx ( xbInt16 iOpt = 1 );
+ xbInt16 GetPrevRecordIx ( xbInt16 iOpt = 1 );
+ xbInt16 GetLastRecordIx ( xbInt16 iOpt = 1 );
+ #endif // XB_INDEX_SUPPORT
+
+
+ private:
+ xbXBase *xbase;
+ xbDbf *dbf;
+ xbExp *exp;
+
+ xbInt32 lLimit; // max number rows returned
+ xbInt32 lCurQryCnt; // current count of rows returned, neg# is moving from bottom to top
+ // pos# is moving from top to bottom
+ #ifdef XB_INDEX_SUPPORT
+ xbIx *pIx; // if index is set, the class uses the index tag, otherwise table
+ void *vpTag;
+ #endif // XB_INDEX_SUPPORT
+
+
+};
+} /* namespace */
+#endif /* XB_FILTER_SUPPORT */
+#endif /* __XBFILTER_H__ */ \ No newline at end of file
diff --git a/src/include/xbindex.h b/src/include/xbindex.h
new file mode 100755
index 0000000..b42f76e
--- /dev/null
+++ b/src/include/xbindex.h
@@ -0,0 +1,605 @@
+/* xbindex.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014, 2018, 2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_INDEX_H__
+#define __XB_INDEX_H__
+
+#ifdef XB_INDEX_SUPPORT
+
+
+#define XB_ADD_KEY 1
+#define XB_UPD_KEY 2
+#define XB_DEL_KEY 3
+
+namespace xb{
+
+
+
+///@cond DOXYOFF
+// structure for index nodes, each node contains information regarding one block
+struct XBDLLEXPORT xbIxNode {
+ xbIxNode *npPrev; // pointer to previous node in chain
+ xbIxNode *npNext; // pointer to next node in chain
+ xbUInt32 iCurKeyNo; // current key number in the node, 0 offset
+ xbUInt32 ulBlockNo; // this block number
+ xbUInt32 ulBufSize; // size of cpBlockData
+ char *cpBlockData; // pointer to memory version of block data stored in file
+};
+///@endcond DOXYOFF
+
+
+//! @brief Base class for handling dbf indices.
+/*!
+
+The xbIx class is used as a base class for accessing index files.
+Each index file can have one or more tags.
+
+Calls to the index routines to perform index updates are handled automatically by the dbf class.
+The application program does not need to be concerned with index updates.
+
+If there is a production MDX index, it is opened automatically when the dbf file is opened.
+If there is an ndx file, that has been associated with the dbf file with the metadata routines,
+it will be opened automatically when the dbf file is opened.
+If there are non prod ndx indices that are not associated with the dbf file, the application
+program will need to open as appropriate.
+The meta data association logic is specific to the Xbase64 library and is not applicable to
+other available tools that handle ndx indices.
+All index files are automatically closed when the dbf file is closed.
+
+
+<br>
+The class is designed to support the addition of additional indices with a minimal amount of effort
+needed to integrate into the library.
+If you are looking at adding an new index type to the library, create a derived class using xbIx as a
+base class and modify methods needed to support the new index file version.
+The xbDbf class (and derived classes) perform the needed calls to the index routines for updates.<br>
+See the following for examples on how to start on this:<br>
+xbIxNdx is a derived class and supports a single tag.<br>
+xbIxMdx is a derived class and supports multiple tags.<br>
+
+
+
+<br>
+How data fields are stored in index files:
+<table>
+<tr><th>Field Type<th>Stored in DBF as<th>Stored in NDX as<th>Stored in MDX as</tr>
+<tr><td>C<td>char<td>char<td>char
+<tr><td>F<td>text numbers<td>xbDouble<td>xbBcd
+<tr><td>N<td>text numbers<td>xbDouble<td>xbBcd
+<tr><td>D<td>text CCYYMMDD<td>xbDouble - julian<td>xbDouble - julian
+</table>
+
+
+<br>
+Pages Vs Blocks
+<br>
+For purposes of the Xbase index classes, a page is considered to be 512 bytes of data
+and a block is made up of one or more 512 byte pages.
+<br>Default block sixe of NDX indices is one 512 byte page.
+<br>Default block size of MDX indices is two 512 byte pages or 1024 bytes.
+
+<br>The WriteBlock and GetBlock functions calculate the physical position in the
+file based on a combination of Block Number and Block Size. Block size is set at
+time of index file creation, default is 1024 or two pages.
+
+<br>Page numbers are stored in the physical file, but block reads and writes
+are performed.
+
+<br>
+Duplicate Keys
+<br>
+With the original DBase unique indexing option, if a table has multiple records with the
+same key value, DBase would allow multiple records in the table, but only the first
+record would be found in the index.
+<br>
+XBase64 can be configured to support the original DBase duplicate key implementation,
+or can be configured to halt with a DUPLICATE_KEY error on the insertion of a record
+with a duplicate key.
+<br>
+<table>
+<tr><th>Option<th>Description</tr>
+<tr><td>XB_HALT_ON_DUPKEY</td><td>Return error XB_KEY_NOT_UNIQUE when attempting to append record with duplicate key</td></tr>
+<tr><td>XB_EMULATE_DBASE</td><td>Emulate DBase, allow duplicate records with the same key, only the first record is indexed</td></tr>
+</table>
+*/
+
+
+class XBDLLEXPORT xbIx : public xbFile {
+ public:
+ xbIx( xbDbf * d );
+ virtual ~xbIx();
+
+ virtual xbInt16 CheckTagIntegrity( void *vpTag, xbInt16 iOpt ) = 0;
+ virtual xbInt16 Close();
+ virtual xbInt16 CreateTag( const xbString &sName, const xbString &sKey, const xbString &sFilter, xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverlay, void **vpTag ) = 0;
+ virtual xbInt16 FindKey( void *vpTag, const xbString &sKey, xbInt16 iRetrieveSw );
+ virtual xbInt16 FindKey( void *vpTag, const char * cKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw );
+ virtual xbInt16 FindKey( void *vpTag, const xbBcd &bcd, xbInt16 iRetrieveSw );
+ virtual xbInt16 FindKey( void *vpTag, const xbDate &dtKey, xbInt16 iRetrieveSw );
+ virtual xbInt16 FindKey( void *vpTag, xbDouble dKey, xbInt16 iRetrieveSw );
+ virtual xbInt16 FindKey( void *vpTag, const void *vKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw ) = 0;
+ virtual void *GetCurTag() const;
+ virtual xbDbf *GetDbf() const;
+
+ virtual xbString &GetKeyExpression( const void *vpTag ) const = 0;
+ virtual xbString &GetKeyFilter( const void *vpTag ) const = 0;
+ virtual char GetKeyType( const void *vpTag ) const = 0;
+ virtual xbBool GetLocked() const;
+
+ virtual xbInt16 GetFirstKey( void *vpTag, xbInt16 iRetrieveSw ) = 0;
+ virtual xbInt16 GetFirstKey( void *vpTag );
+ virtual xbInt16 GetFirstKey();
+
+ virtual xbInt16 GetLastKey( void *vpTag, xbInt16 lRetrieveSw ) = 0;
+ virtual xbInt16 GetLastKey( void *vpTag );
+ virtual xbInt16 GetLastKey();
+
+ virtual xbInt16 GetNextKey( void *vpTag, xbInt16 iRetrieveSw ) = 0;
+ virtual xbInt16 GetNextKey( void *vpTag );
+ virtual xbInt16 GetNextKey();
+
+ virtual xbInt16 GetPrevKey( void *vpTag, xbInt16 iRetrieveSw ) = 0;
+ virtual xbInt16 GetPrevKey( void *vpTag );
+ virtual xbInt16 GetPrevKey();
+
+ virtual void *GetTag( xbInt16 iTagNo ) const = 0;
+ virtual void *GetTag( xbString &sTagName ) const = 0;
+ virtual xbInt16 GetTagCount() const = 0;
+
+ virtual xbString &GetTagName( void *vpTag ) const = 0;
+ virtual const char * GetTagName( void *vpTag, xbInt16 iOpt ) const = 0;
+ virtual void GetTagName( void *vpTag, xbString &sTagName ) {};
+
+ virtual xbBool GetUnique( void *vpTag ) const = 0;
+ virtual xbBool GetSortOrder( void *vpTag ) const = 0;
+
+ virtual xbInt16 Open( const xbString &sFileName );
+ virtual xbInt16 Reindex( void **vpTag ) = 0;
+ virtual xbInt16 SetCurTag( xbInt16 iTagNo ) = 0;
+ virtual xbInt16 SetCurTag( xbString &sTagName ) = 0;
+ virtual void SetCurTag( void * vpCurTag );
+ virtual void SetLocked( xbBool bLocked );
+
+ virtual void TestStub( char *s, void *vpTag ) {};
+
+
+ #ifdef XB_DEBUG_SUPPORT
+ virtual xbInt16 DumpFreeBlocks( xbInt16 iOpt = 0 ) { return XB_NO_ERROR; }
+ virtual xbInt16 DumpHeader( xbInt16 iDestOpt = 0, xbInt16 iFmtOpt = 0 ) = 0;
+ virtual xbInt16 DumpIxForTag( void *vpTag, xbInt16 iOutputOpt ) = 0;
+ virtual void DumpIxNodeChain( void *vpTag, xbInt16 iOutputOpt ) const = 0;
+ virtual xbInt16 DumpNode( void * vpTag, xbIxNode * pNode, xbInt16 iOption ) const;
+ virtual xbInt16 DumpTagBlocks( xbInt16 iOpt = 1, void *vpTag = NULL ) = 0;
+
+ #endif
+
+ protected:
+ friend class xbDbf;
+
+ virtual xbInt16 AddKey( void *vpTag, xbUInt32 ulRecNo ) = 0;
+ virtual xbInt16 AddKeys( xbUInt32 ulRecNo );
+ virtual xbIxNode *AllocateIxNode( xbUInt32 ulBufSize = 0, xbInt16 iOption = 0 );
+ virtual xbInt16 BSearchBlock( char cKeyType, xbIxNode *npNode, xbInt32 lKeyLen, const void *vpKey, xbInt32 lSearchKeyLen, xbInt16 &iCompRc, xbBool bDescending = xbFalse ) const;
+ virtual xbInt16 CheckForDupKeys();
+ virtual xbInt16 CheckForDupKey( void *vpTag ) = 0;
+ virtual xbInt16 CompareKey( char cKeyType, const void *v1, const void *v2, size_t lKeyLen ) const;
+ virtual xbInt16 CreateKeys( xbInt16 iOpt );
+ virtual xbInt16 CreateKey( void * vpTag, xbInt16 iOpt ) = 0;
+ virtual xbInt16 DeleteFromNode( void *vpTag, xbIxNode * npNode, xbInt16 iSlotNo ) = 0;
+// virtual xbInt16 DeleteKeys( xbUInt32 ulRecNo );
+ virtual xbInt16 DeleteKeys();
+ virtual xbInt16 DeleteKey( void *vpTag ) = 0;
+
+ virtual xbInt16 DeleteTag( void *vpTag ) = 0;
+
+
+ virtual xbInt16 FindKeyForCurRec( void *vpTag ) = 0;
+ virtual xbIxNode *FreeNodeChain( xbIxNode *np );
+ virtual xbInt16 GetBlock( void *vpTag, xbUInt32 ulBlockNo, xbInt16 iOpt, xbUInt32 ulAddlBuf = 0 );
+// virtual xbBool GetIndexUpdated() const = 0;
+ virtual xbInt32 GetKeyCount( xbIxNode *npNode ) const;
+ virtual char *GetKeyData( xbIxNode *npNode, xbInt16 iKeyNo, xbInt16 iKeyItemLen ) const;
+ virtual xbInt16 GetKeySts( void *vpTag ) const = 0;
+ virtual xbInt16 GetLastKey( xbUInt32 ulNodeNo, void *vpTag, xbInt16 lRetrieveSw ) = 0;
+ virtual xbInt16 InsertNodeL( void *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, char * cpKeyBuf, xbUInt32 uiPtr ) = 0;
+ virtual xbInt16 InsertNodeI( void *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, xbUInt32 uiPtr ) = 0;
+ virtual xbInt16 KeyExists( void * ) = 0;
+// virtual xbInt16 KeyUpdated( void *vpTag ) const = 0;
+ virtual void NodeFree( xbIxNode * ixNode );
+ virtual xbInt16 ReadHeadBlock( xbInt16 iOpt = 0 ) = 0;
+ virtual void SetDbf( xbDbf *dbf );
+ virtual xbInt16 SplitNodeL( void *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, char *cpKeyBuf, xbUInt32 uiPtr ) = 0;
+ virtual xbInt16 SplitNodeI( void *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 uiPtr ) = 0;
+ virtual xbInt16 UpdateTagKey( char cAction, void *vpTag, xbUInt32 ulRecNo = 0 ) = 0;
+ virtual xbInt16 WriteHeadBlock( xbInt16 iOption ) = 0;
+
+ xbDbf *dbf;
+ char *cNodeBuf; // pointer to memory for processing in a block of index data
+ void *vpCurTag; // pointer to active tag. Single index files have only one tag
+
+ private:
+ virtual void AppendNodeChain( void *vpTag, xbIxNode *npNode ) = 0;
+ virtual xbInt16 GetKeyPtr( void *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 &ulKeyPtr ) const = 0;
+ virtual xbBool IsLeaf( void *vpTag, xbIxNode *npNode ) const = 0;
+ // virtual void SetCurNode( void *vpTag, xbIxNode *npNode ) = 0;
+
+ xbBool bLocked; // index file locked?
+};
+
+#ifdef XB_NDX_SUPPORT
+
+#define XB_NDX_BLOCK_SIZE 512
+
+
+///@cond DOXYOFF
+struct XBDLLEXPORT xbNdxTag {
+
+ // NDX File Header Fields
+ xbUInt32 ulRootBlock; // header node is 0
+ xbUInt32 ulTotalBlocks; // includes header node
+ char cKeyType; // C = Char, F = Numeric, D = Date
+ xbInt16 iKeyLen; // length of key data
+ xbInt16 iKeysPerBlock; // max number keys per block <=100
+ xbInt16 iKeyType; // 00 = Char, 01 = Numeric
+ xbInt16 iKeyItemLen; // KeyLen + 8 bytes
+ char cSerNo; // rolling incrementing serial number +1 on each index update
+ xbInt16 iUnique; // True if unique
+ xbString sKeyExpression; // index expression
+ // end of NDX Header field
+
+ xbExp *exp; // pointer to expression for expression keys
+ time_t tNodeChainTs; // node chain time stamp
+ xbIxNode *npNodeChain;
+ xbIxNode *npCurNode;
+ char *cpKeyBuf; // key buffer, for searches and adds
+ char *cpKeyBuf2; // key buffer, for deletes
+ xbString sTagName; // tag name - is the file name without the extension
+// xbInt16 iKeyUpdated; // key updated? set in method KeyUpdated, checked in AddKey and DeleteKey routines
+ xbBool bFoundSts; // key found? used to determine if new key should be added in XB_EMULATE_DBASE mode in AddKey
+
+
+ xbInt16 iKeySts; // key updated? set in method CreateKey, checked in AddKey and DeleteKey routines
+ // old key filtered new key filtered iKeySts
+ // Y Y XB_UPD_KEY 2 - update key if changed (delete and add)
+ // Y N XB_DEL_KEY 3 - delete key
+ // N Y XB_ADD_KEY 1 - add key
+ // N N 0 - no update
+
+};
+///@endcond DOXYOFF
+
+//! @brief Class for handling NDX single tag indices.
+/*!
+
+The xbIxNdx class is derived from the xbIx base class and is specific to handling NDX single tag index files.
+Each NDX index file can have only one tag, but the methods are set up to take an argument for a specific tag.
+This was done in order to provide a consistant interface across index types.
+
+Calls to the ndx index routines to perform index updates are handled automatically be the dbf class after
+the ndx file has been opened.
+
+Xbase64 provides a mechanism to automatically open ndx files when a dbf file is opened.
+If the ndx file has been associated with the dbf file with the metadata routines,
+it will be opened automatically when the dbf file is opened.
+If there are non prod ndx indices that are not associated with the dbf file, the application
+program will need to open as appropriate.
+The meta data association logic is specific to the Xbase64 library and is not applicable to
+other available tools that handle ndx indices.
+
+*/
+
+class XBDLLEXPORT xbIxNdx : public xbIx {
+ public:
+ xbIxNdx( xbDbf * d );
+ ~xbIxNdx();
+ xbInt16 CheckTagIntegrity( void *vpTag, xbInt16 iOpt );
+ xbInt16 CreateTag( const xbString &sName, const xbString &sKey, const xbString &sFilter, xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverlay, void **vpTag );
+// xbInt16 DeleteTag( void *vpTag );
+ xbInt16 FindKey( void *vpTag, const void *vpKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw );
+ xbInt16 GetFirstKey( void *vpTag, xbInt16 iRetrieveSw );
+
+ xbInt16 GetLastKey( void *vpTag, xbInt16 iRetrieveSw = 1 );
+ xbInt16 GetNextKey( void *vpTag, xbInt16 iRetrieveSw = 1 );
+ xbInt16 GetPrevKey( void *vpTag, xbInt16 iRetrieveSw = 1 );
+ xbInt32 GetKeyLen ( const void *vpTag ) const;
+ char GetKeyType ( const void *vpTag ) const;
+ xbString &GetKeyExpression( const void *vpTag ) const;
+ xbString &GetKeyFilter( const void *vpTag ) const;
+ void *GetTag( xbInt16 iTagNo ) const;
+ void *GetTag( xbString &sTagName ) const;
+ xbString &GetTagName( void *vpTag ) const;
+ const char * GetTagName( void *vpTag, xbInt16 iOpt ) const;
+
+ xbInt16 GetTagCount() const;
+ xbBool GetUnique( void *vpTag = NULL ) const;
+ xbBool GetSortOrder( void *vpTag ) const;
+ xbInt16 Reindex( void **vpTag );
+ xbInt16 SetCurTag( xbInt16 iTagNo );
+ xbInt16 SetCurTag( xbString &sTagName );
+
+
+
+ #ifdef XB_DEBUG_SUPPORT
+ xbInt16 DumpTagBlocks( xbInt16 iOpt = 1, void *vpTag = NULL );
+ xbInt16 DumpHeader( xbInt16 iOpt = 0, xbInt16 iFmt = 0 );
+ xbInt16 DumpIxForTag( void *vpTag, xbInt16 iOutputOpt );
+ void DumpIxNodeChain( void *vpTag, xbInt16 iOutputOpt ) const;
+ xbInt16 DumpNode( void * vpTag, xbIxNode * pNode, xbInt16 iOption ) const;
+ #endif
+
+ protected:
+ friend class xbDbf;
+ xbInt16 AddKey( void *vpTag, xbUInt32 ulRecNo );
+ xbIxNode *AllocateIxNode( xbUInt32 ulBufSize = 0, xbInt16 iOption = 0 );
+ xbInt16 CheckForDupKey( void *vpTag );
+ xbIxNode *CreateIxNode( xbUInt32 ulBufSize );
+ xbInt16 CreateKey( void * vpTag, xbInt16 iOpt );
+ xbInt16 DeleteFromNode( void *vpTag, xbIxNode * npNode, xbInt16 iSlotNo );
+ xbInt16 DeleteKey( void *vpTag );
+
+ xbInt16 DeleteTag( void *vpTag );
+
+ xbInt16 FindKeyForCurRec( void *vpTag );
+// xbBool GetIndexUpdated() const;
+ xbInt16 GetKeyTypeN( const void *vpTag ) const;
+ xbInt16 GetKeySts( void *vpTag ) const;
+ xbInt16 GetLastKey( xbUInt32 ulNodeNo, void *vpTag, xbInt16 iRetrieveSw = 1 );
+ xbInt16 InsertNodeI( void *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, xbUInt32 uiPtr );
+ xbInt16 InsertNodeL( void *vpTag, xbIxNode * npNode, xbInt16 iSlotNo, char * cpKeyBuf, xbUInt32 uiPtr );
+ xbInt16 KeyExists( void *vpTag = NULL );
+// xbBool KeyFiltered( void *vpTag ) const;
+// xbInt16 KeyUpdated( void *vpTag ) const;
+ xbInt16 ReadHeadBlock(xbInt16 iOpt); // read the header node of the disk NDX file
+ xbInt16 SplitNodeI( void *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 uiPtr );
+ xbInt16 SplitNodeL( void *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, char *cpKeyBuf, xbUInt32 uiPtr );
+ xbInt16 UpdateTagKey( char cAction, void *vpTag, xbUInt32 ulRecNo = 0 );
+ xbInt16 WriteHeadBlock( xbInt16 iOption );
+
+ private:
+ xbInt16 AddKeyNewRoot( xbNdxTag *npTag, xbIxNode *npLeft, xbIxNode *npRight );
+ void AppendNodeChain( void *vpTag, xbIxNode *npNode );
+ xbInt16 GetDbfPtr( void *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 &ulDbfPtr ) const;
+ xbInt16 GetKeyPtr( void *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 &ulKeyPtr ) const;
+ xbInt16 GetLastKeyForBlockNo( void *vpTag, xbUInt32 ulBlockNo, char *cpKeyBuf );
+ xbBool IsLeaf( void *vpTag, xbIxNode *npNode ) const;
+ xbInt16 KeySetPosAdd( xbNdxTag *npTag, xbUInt32 ulAddKeyRecNo );
+ xbInt16 KeySetPosDel( xbNdxTag *npTag );
+ // void SetCurNode( void *vpTag, xbIxNode *np );
+ xbNdxTag *ndxTag;
+};
+
+#endif /* XB_NDX_SUPPORT */
+
+
+#ifdef XB_MDX_SUPPORT
+//#define XB_MDX_BLOCK_SIZE 1024
+
+struct XBDLLEXPORT xbMdxTag {
+
+ // next 7 fields comprise the tag table entry
+ xbUInt32 ulTagHdrPageNo; // 512 byte page number, NOT block number
+ char cTagName[11];
+ char cKeyFmt; // always 0x10 w/ DBase V7
+ char cLeftChild; // cFwdTagThread
+ char cRightChild; // cFwdTagThread2
+ char cParent; // cBwdTagThread
+ char c2;
+ char cKeyType; // C,D,N
+
+ xbUInt32 ulRootPage; // 512 byte page number, NOT block number
+ xbUInt32 ulTagSize; // Number of 512 byte pages allocated to the tag. Tag size of two is a single 1024 block
+
+ char cKeyFmt2; // 0x10 - base
+ // 0x08 - descending
+ // 0x40 - unique
+ char cKeyType2;
+ // one unused byte fits here
+
+ char cTag11; // dbase sets to 0x1B
+
+ xbInt16 iKeyLen;
+ xbInt16 iKeysPerBlock;
+ xbInt16 iSecKeyType;
+ xbInt16 iKeyItemLen; // iKeyLen + 4
+
+ char cSerialNo; // Increments +1 for each tag update
+ char cUnique;
+ xbString *sKeyExp; // Key expression
+
+ char cHasFilter; // 0x00 or 0x01
+ char cHasKeys; // 0x00 or 0x01
+
+ xbUInt32 ulLeftChild; // dbase 7 sets this to the root page on tag creation
+ xbUInt32 ulRightChild; // dbase 7 sets this to the root page on tag creation
+
+ char cTagYY;
+ char cTagMM;
+ char cTagDD;
+
+ char cKeyFmt3; // dbase 7 sets this 0x01 if discreet field or 0x00 if calculated or combination field key expression on tag creation
+
+ xbString *sFiltExp; // Filter expression
+
+ time_t tNodeChainTs;
+ xbIxNode *npNodeChain;
+ xbIxNode *npCurNode;
+ xbExp *exp; // pointer to expression for expression based tags
+ xbExp *filter; // pointer to expression for index filter
+
+ char *cpKeyBuf; // key buffer
+ char *cpKeyBuf2; // key buffer
+// xbBool iKeyUpdated; // key updated? set in method CreateKey, checked in AddKey and DeleteKey routines
+ // 0 - no update
+ // 1 - Add
+ // 2 - Update
+ // 3 - Delete
+// xbBool bKeyFiltered; // key filtered? True if included key, False if excluded key. Set in method CreateKey, checked in AddKey and DeleteKey routines
+ xbString *sTagName; // string tag name
+
+
+ xbMdxTag *next;
+ xbBool bFoundSts; // key found? used to determine if new key should be added in XB_EMULATE_DBASE mode in AddKey
+
+
+ xbInt16 iKeySts; // key updated? set in method CreateKey, checked in AddKey and DeleteKey routines
+ // old key filtered new key filtered iKeySts
+ // Y Y XB_UPD_KEY 2 - update key if changed (delete and add)
+ // Y N XB_DEL_KEY 3 - delete key
+ // N Y XB_ADD_KEY 1 - add key
+ // N N 0 - no update
+
+
+};
+
+
+class XBDLLEXPORT xbIxMdx : public xbIx {
+ public:
+ xbIxMdx( xbDbf * d );
+ ~xbIxMdx();
+ xbInt16 CheckTagIntegrity( void *vpTag, xbInt16 iOpt );
+ xbInt16 CreateTag( const xbString &sName, const xbString &sKey, const xbString &sFilter, xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverlay, void **vpTag );
+// xbInt16 DeleteTag( void *vpTag );
+ xbInt16 FindKey( void *vpTag, const void *vKey, xbInt32 lKeyLen, xbInt16 iRetrieveSw );
+ xbInt16 FindKey( void *vpTag, xbDouble dKey, xbInt16 iRetrieveSw );
+ xbInt16 GetFirstKey( void *vpTag, xbInt16 lRetrieveSw );
+ xbString &GetKeyExpression( const void *vpTag ) const;
+ xbString &GetKeyFilter( const void *vpTag ) const;
+ char GetKeyType( const void *vpTag ) const;
+ xbInt16 GetLastKey( void *vpTag, xbInt16 lRetrieveSw );
+ xbInt16 GetNextKey( void *vpTag, xbInt16 lRetrieveSw );
+ xbInt16 GetPrevKey( void *vpTag, xbInt16 lRetrieveSw );
+ xbBool GetReuseEmptyNodesSw() const;
+ xbBool GetSortOrder( void *vpTag ) const;
+ void *GetTag( xbInt16 iTagNo ) const;
+ void *GetTag( xbString &sTagName ) const;
+ xbInt16 GetTagCount() const;
+
+ xbString &GetTagName( void *vpTag ) const;
+ const char * GetTagName( void *vpTag, xbInt16 iOpt ) const;
+ void GetTagName( void *vpTag, xbString &sTagName );
+
+ xbInt16 GetUnique( void *vpTag ) const;
+ xbInt16 Reindex( void **vpTag );
+ xbInt16 SetCurTag( xbInt16 iTagNo );
+ xbInt16 SetCurTag( xbString &sTagName );
+ void SetReuseEmptyNodesSw( xbBool bReuse );
+
+ void TestStub( char *s, void *vpTag );
+
+ protected:
+ friend class xbDbf;
+
+ xbInt16 AddKey( void *vpTag, xbUInt32 ulRecNo );
+ xbIxNode *AllocateIxNode( xbMdxTag * mpTag, xbUInt32 ulBufSize, xbUInt32 ulBlock2 );
+ xbInt16 CheckForDupKey( void *vpTag );
+ xbInt16 Close();
+ xbInt16 CreateKey( void * vpTag, xbInt16 iOpt );
+ xbInt16 DeleteFromNode( void *vpTag, xbIxNode * npNode, xbInt16 iSlotNo );
+ xbInt16 DeleteKey( void *vpTag );
+
+ xbInt16 DeleteTag( void *vpTag );
+
+ xbInt16 FindKeyForCurRec( void *vpTag );
+ xbInt16 GetKeySts( void *vpTag ) const;
+ xbInt16 GetLastKey( xbUInt32 ulBlockNo, void *vpTag, xbInt16 lRetrieveSw );
+ void *GetTagTblPtr() const;
+ void Init( xbInt16 iOpt = 0 );
+ xbInt16 InsertNodeI( void *vpTag, xbIxNode *npNode, xbInt16 iSlotNo, xbUInt32 uiPtr );
+ xbInt16 InsertNodeL( void *vpTag, xbIxNode *npNode, xbInt16 iSlotNo, char *cpKeyBuf, xbUInt32 uiPtr );
+ xbInt16 KeyExists( void * );
+ xbInt16 LoadTagTable();
+ xbInt16 ReadHeadBlock(xbInt16 iOpt); // read the header node of the disk file
+ xbInt16 SplitNodeI( void *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, xbUInt32 uiPtr );
+ xbInt16 SplitNodeL( void *vpTag, xbIxNode * npLeft, xbIxNode *npRight, xbInt16 iSlotNo, char *cpKeyBuf, xbUInt32 uiPtr );
+ xbInt16 UpdateTagKey( char cAction, void *vpTag, xbUInt32 ulRecNo = 0 );
+ xbInt16 WriteHeadBlock( xbInt16 iOption );
+
+ #ifdef XB_DEBUG_SUPPORT
+ xbInt16 DumpTagBlocks( xbInt16 iOpt = 1, void *vpTag = NULL );
+ xbInt16 DumpFreeBlocks( xbInt16 iOpt = 0 );
+ xbInt16 DumpHeader( xbInt16 iOpt = 0, xbInt16 iFmtOpt = 0 );
+ xbInt16 DumpIxForTag( void *vpTag, xbInt16 iOutputOpt );
+ void DumpIxNodeChain( void *vpTag, xbInt16 iOutputOpt ) const;
+ #endif
+
+ private:
+ xbInt16 AddKeyNewRoot( xbMdxTag *npTag, xbIxNode *npLeft, xbIxNode *npRight );
+ void AppendNodeChain( void *vpTag, xbIxNode *npNode );
+ xbUInt32 BlockToPage( xbUInt32 ulBlockNo );
+ void CalcBtreePointers();
+ char CalcTagKeyFmt( xbExp &exp );
+ char CalcTagFwdThread1();
+ char CalcTagFwdThread2();
+ xbMdxTag *ClearTagTable();
+ xbInt16 DumpBlock( xbInt16 iOpt, xbUInt32 ulBlockNo, xbMdxTag * mpTag );
+ xbInt16 GetDbfPtr( void *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 &ulDbfPtr ) const;
+ xbInt16 GetKeyPtr( void *vpTag, xbInt16 iKeyNo, xbIxNode *npNode, xbUInt32 &ulKeyPtr ) const;
+ xbInt16 GetLastKeyForBlockNo( void *vpTag, xbUInt32 ulBlockNo, char *cpKeyBuf );
+ xbInt16 HarvestEmptyNode( xbMdxTag *mpTag, xbIxNode *npNode, xbInt16 iOpt, xbBool bHarvestRoot = xbFalse );
+ xbInt16 HarvestTagNodes( xbMdxTag *mpTag, xbBool bRecycleRoot = xbFalse );
+ xbBool IsLeaf( void *vpTag, xbIxNode *npNode ) const;
+ xbInt16 KeySetPosAdd( xbMdxTag *mpTag, xbUInt32 ulAddKeyRecNo );
+ xbInt16 KeySetPosDel( xbMdxTag *mpTag );
+ xbInt16 LoadTagDetail( xbInt16 iOption, xbMdxTag *tte );
+ xbUInt32 PageToBlock( xbUInt32 ulPageNo );
+ xbInt16 TagSerialNo( xbInt16 iOption, xbMdxTag *mpTag );
+ xbInt16 UpdateTagSize( xbMdxTag *mpTag, xbUInt32 ulTagSz );
+
+ #ifdef XB_DEBUG_SUPPORT
+ xbInt16 PrintKey( void *vpTag, xbIxNode *npNode, xbInt16 iKeyNo, xbInt16 iDepth, char cType, xbInt16 iOutputOpt );
+ #endif
+
+ // MDX File Header Fields
+ char cVersion;
+ char cCreateYY;
+ char cCreateMM;
+ char cCreateDD;
+ xbString sFileName;
+ xbInt16 iBlockFactor; // 1-32 #of 512 byte segments in a block
+
+ // use file version
+ // xbInt16 iBlockSize; // Stored at the xbFile level
+
+ char cProdIxFlag;
+ char cTagEntryCnt;
+ xbInt16 iTagLen;
+ xbInt16 iTagUseCnt;
+ char cNextTag; // byte 28 +1
+ char c1B; // always 0x1B
+ xbUInt32 ulPageCnt; // number of 512 byte pages in the mdx file
+ xbUInt32 ulFirstFreePage; // page number corresponding to the next free block
+ xbUInt32 ulNoOfBlockAvail; // might be improperly named?? not sure how it is used
+ char cUpdateYY;
+ char cUpdateMM;
+ char cUpdateDD;
+ // end of MDX Header fields
+
+
+
+ xbMdxTag *mdxTagTbl;
+
+ xbBool bReuseEmptyNodes; // Reuese empty MDX nodes when all keys deleted?
+ // DBase 7.x and MS ODBC drivers do not reuse empty nodes, leaves them stranded in the file
+ // Codebase 6.x reuses empty nodes.
+ // Setting this to True will reuse empty nodes in the same manner Codebase 6.x reuses them.
+
+};
+#endif /* XB_MDX_SUPPORT */
+
+
+} /* namespace xb */
+#endif /* XB_INDEX_SUPPORT */
+#endif /* __XB_INDEX_H__ */
diff --git a/src/include/xblnklst.h b/src/include/xblnklst.h
new file mode 100755
index 0000000..eaec587
--- /dev/null
+++ b/src/include/xblnklst.h
@@ -0,0 +1,257 @@
+/* xblnklst.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_XBLNKLST_H__
+#define __XB_XBLNKLST_H__
+
+#ifdef XB_LINKLIST_SUPPORT
+
+namespace xb{
+
+
+template<class xbNodeType>
+class XBDLLEXPORT xbLinkList {
+ public:
+ xbLinkList();
+ ~xbLinkList();
+
+ xbLinkListNode<xbNodeType> *GetHeadNode() const;
+ xbLinkListNode<xbNodeType> *GetEndNode() const;
+ xbLinkListNode<xbNodeType> *GetNodeForNo( xbUInt32 ulNodeNo ) const;
+
+ void Clear();
+ xbUInt32 GetNodeCnt () const;
+ xbInt16 InsertAtEnd ( const xbNodeType &xbLLN );
+ xbInt16 InsertAtFront ( const xbNodeType &xbLLN );
+ xbInt16 RemoveByVal ( const xbNodeType &xbLLN );
+ xbInt16 RemoveFromEnd ();
+ xbInt16 RemoveFromEnd ( xbNodeType &xbLLN );
+ xbInt16 RemoveFromFront( xbNodeType &xbLLN );
+ xbInt16 SearchFor ( const xbNodeType &xbLLN );
+
+ private:
+ xbUInt32 ulNodeCnt;
+ xbLinkListNode<xbNodeType> *llStartPtr;
+ xbLinkListNode<xbNodeType> *llEndPtr;
+};
+
+template<class xbNodeType>
+xbLinkList<xbNodeType>::xbLinkList(){
+ ulNodeCnt = 0;
+ llStartPtr = NULL;
+ llEndPtr = NULL;
+}
+
+template<class xbNodeType>
+xbLinkList<xbNodeType>::~xbLinkList(){
+ Clear();
+}
+
+template<class xbNodeType>
+void xbLinkList<xbNodeType>::Clear(){
+ xbLinkListNode<xbNodeType> *cPtr = llStartPtr, *tPtr;
+ for( xbUInt32 i = 0; i < ulNodeCnt; i++ ){
+ tPtr = cPtr;
+ cPtr = cPtr->GetNextNode();
+ delete tPtr;
+ }
+ ulNodeCnt = 0;
+ llStartPtr = NULL;
+ llEndPtr = NULL;
+}
+
+
+template<class xbNodeType>
+xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetHeadNode() const{
+ return llStartPtr;
+}
+
+template<class xbNodeType>
+xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetEndNode() const{
+ return llEndPtr;
+}
+
+
+template<class xbNodeType>
+xbLinkListNode<xbNodeType> *xbLinkList<xbNodeType>::GetNodeForNo( xbUInt32 ulNo ) const{
+
+ xbLinkListNode<xbNodeType> *cPtr = llStartPtr;
+ xbUInt32 i;
+ for( i = 0; i < ulNo && i < ulNodeCnt; i++ )
+ cPtr = cPtr->GetNextNode();
+
+ if( i == ulNo )
+ return cPtr;
+ else
+ return 0;
+}
+
+
+
+template<class xbNodeType>
+xbUInt32 xbLinkList<xbNodeType>::GetNodeCnt() const{
+ return ulNodeCnt;
+}
+
+template<class xbNodeType>
+xbInt16 xbLinkList<xbNodeType>::InsertAtFront( const xbNodeType & ntKey ){
+
+ xbLinkListNode<xbNodeType> *p = new xbLinkListNode<xbNodeType>( ntKey );
+ if( p == 0 )
+ return XB_NO_MEMORY;
+
+ if( ulNodeCnt > 0 ){
+ llStartPtr->SetPrevNode( p );
+ p->SetNextNode( llStartPtr );
+ } else {
+ llEndPtr = p;
+ }
+
+ llStartPtr = p;
+ ulNodeCnt++;
+ return XB_NO_ERROR;
+}
+
+template<class xbNodeType>
+xbInt16 xbLinkList<xbNodeType>::InsertAtEnd( const xbNodeType & ntKey ){
+
+ xbLinkListNode<xbNodeType> *p = new xbLinkListNode<xbNodeType>( ntKey );
+ if( p == 0 )
+ return XB_NO_MEMORY;
+
+ if( ulNodeCnt > 0 ){
+ llEndPtr->SetNextNode( p );
+ p->SetPrevNode( llEndPtr );
+ llEndPtr = p;
+ } else {
+ llStartPtr = p;
+ }
+
+ llEndPtr = p;
+ ulNodeCnt++;
+ return XB_NO_ERROR;
+}
+
+
+
+template<class xbNodeType>
+xbInt16 xbLinkList<xbNodeType>::RemoveByVal( const xbNodeType & ntKey ){
+ // Remove the first instance of ntKey from the node chain
+ xbLinkListNode<xbNodeType> *currPtr = llStartPtr;
+ xbLinkListNode<xbNodeType> *prevPtr = NULL;
+
+ for( xbUInt32 i = 0; i < ulNodeCnt; i++ ){
+ if( currPtr->GetKey() == ntKey ){
+ if( prevPtr == NULL ){ //then this is the first node
+ llStartPtr = currPtr->GetNextNode();
+ if( llStartPtr ) // if more than one link in the linked list
+ llStartPtr->SetPrevNode( NULL );
+ delete currPtr;
+ ulNodeCnt--;
+ return i + 1;
+ }
+ else {
+ prevPtr->SetNextNode( currPtr->GetNextNode());
+ if( currPtr->GetNextNode())
+ currPtr->GetNextNode()->SetPrevNode( prevPtr );
+ delete currPtr;
+ ulNodeCnt--;
+ return i + 1;
+ }
+ }
+ prevPtr = currPtr;
+ currPtr = currPtr->GetNextNode();
+ }
+ return XB_NOT_FOUND;
+}
+
+
+template<class xbNodeType>
+xbInt16 xbLinkList<xbNodeType>::RemoveFromFront( xbNodeType & ntKey ){
+
+ if( ulNodeCnt <= 0 )
+ return XB_INVALID_NODELINK;
+ xbLinkListNode<xbNodeType> *p = llStartPtr;
+ llStartPtr = p->GetNextNode();
+ if( llStartPtr )
+ llStartPtr->SetPrevNode( NULL );
+ ntKey = p->GetKey();
+ delete p;
+ ulNodeCnt--;
+ return XB_NO_ERROR;
+}
+
+
+template<class xbNodeType>
+xbInt16 xbLinkList<xbNodeType>::RemoveFromEnd( xbNodeType & ntKey ){
+
+ if( ulNodeCnt <= 0 )
+ return XB_INVALID_NODELINK;
+ xbLinkListNode<xbNodeType> *p = llEndPtr;
+ if( p->GetPrevNode()){
+ llEndPtr = p->GetPrevNode();
+ llEndPtr->SetNextNode( NULL );
+ } else {
+ // there are no more nodes
+ llStartPtr = NULL;
+ llEndPtr = NULL;
+ }
+ ntKey = p->GetKey();
+ delete p;
+ ulNodeCnt--;
+ return XB_NO_ERROR;
+}
+
+
+template<class xbNodeType>
+xbInt16 xbLinkList<xbNodeType>::RemoveFromEnd(){
+
+ if( ulNodeCnt <= 0 )
+ return XB_INVALID_NODELINK;
+ xbLinkListNode<xbNodeType> *p = llEndPtr;
+ if( p->GetPrevNode()){
+ llEndPtr = p->GetPrevNode();
+ llEndPtr->SetNextNode( NULL );
+ } else {
+ // there are no more nodes
+ llStartPtr = NULL;
+ llEndPtr = NULL;
+ }
+ delete p->GetKey();
+ delete p;
+ ulNodeCnt--;
+ return XB_NO_ERROR;
+}
+
+
+template<class xbNodeType>
+xbInt16 xbLinkList<xbNodeType>::SearchFor( const xbNodeType & ntKey ){
+
+ xbLinkListNode<xbNodeType> *cPtr = llStartPtr;
+ for( xbUInt32 i = 0; i < ulNodeCnt; i++ ){
+ if( cPtr->GetKey() == ntKey )
+ return i+1;
+ cPtr = cPtr->GetNextNode();
+ }
+ return XB_NO_ERROR;
+
+}
+} // namespace
+
+#endif // XB_LINKLIST_SUPPORT
+#endif // XB_XBLNKLST_H__
+
+
diff --git a/src/include/xblnklstord.h b/src/include/xblnklstord.h
new file mode 100755
index 0000000..d319c31
--- /dev/null
+++ b/src/include/xblnklstord.h
@@ -0,0 +1,367 @@
+/* xblnklstord.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2019,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+// Ordered link list
+
+
+
+#ifndef __XB_XBLNKLSTORD_H__
+#define __XB_XBLNKLSTORD_H__
+
+#ifdef XB_LINKLIST_SUPPORT
+
+
+namespace xb{
+
+
+template<class xbNodeType>
+class XBDLLEXPORT xbLinkListOrd {
+ public:
+ xbLinkListOrd();
+ ~xbLinkListOrd();
+
+ void Clear();
+ xbLinkListNode<xbNodeType> *GetHeadNode() const;
+ xbLinkListNode<xbNodeType> *GetEndNode() const;
+ xbLinkListNode<xbNodeType> *GetNodeForKey( const xbString &sKey ) const;
+
+ xbInt16 GetDataForKey ( const xbNodeType &ntKey, xbString &sData );
+
+ xbBool GetDupKeys ();
+
+ xbUInt32 GetNodeCnt () const;
+ xbUInt32 GetNodeCnt ( const xbString &sNodeKey ) const;
+ xbInt16 InsertKey ( const xbNodeType &ntKey );
+ xbInt16 InsertKey ( const xbNodeType &ntKey, const xbString &sData );
+ xbInt16 InsertKey ( const xbNodeType &ntKey, xbUInt32 ulData );
+
+ xbBool KeyExists ( const xbNodeType &ntKey ) const;
+ xbInt16 RemoveKey ( const xbNodeType &ntKey );
+ xbInt16 RemoveFromEnd ( xbNodeType &ntKey );
+ xbInt16 RemoveFromFront( xbNodeType &ntKey );
+ xbInt16 RemoveFromFront();
+ void SetDupKeys ( xbBool bAllowDupKeys );
+ xbInt16 UpdateForKey ( const xbNodeType &ntKey, const xbString &sData );
+
+
+ private:
+ xbUInt32 ulNodeCnt;
+ xbBool bAllowDupKeys;
+ xbLinkListNode<xbNodeType> *llStartPtr;
+ xbLinkListNode<xbNodeType> *llEndPtr;
+
+};
+
+
+template<class xbNodeType>
+xbLinkListOrd<xbNodeType>::xbLinkListOrd(){
+ bAllowDupKeys = xbTrue; // default setting - allow duplicate keys
+ ulNodeCnt = 0;
+ llStartPtr = NULL;
+ llEndPtr = NULL;
+}
+
+template<class xbNodeType>
+xbLinkListOrd<xbNodeType>::~xbLinkListOrd(){
+ Clear();
+}
+
+template<class xbNodeType>
+void xbLinkListOrd<xbNodeType>::Clear(){
+ xbLinkListNode<xbNodeType> *cPtr = llStartPtr, *tPtr;
+ for( xbUInt32 i = 0; i < ulNodeCnt; i++ ){
+ tPtr = cPtr;
+ cPtr = cPtr->GetNextNode();
+
+ // next line might cause seg faults
+ // delete tPtr->GetData();
+
+ delete tPtr;
+ }
+ ulNodeCnt = 0;
+ llStartPtr = NULL;
+ llEndPtr = NULL;
+}
+
+template<class xbNodeType>
+xbLinkListNode<xbNodeType> * xbLinkListOrd<xbNodeType>::GetHeadNode() const{
+ return llStartPtr;
+}
+
+template<class xbNodeType>
+xbLinkListNode<xbNodeType> * xbLinkListOrd<xbNodeType>::GetEndNode() const{
+ return llEndPtr;
+}
+
+template<class xbNodeType>
+xbUInt32 xbLinkListOrd<xbNodeType>::GetNodeCnt() const{
+ return ulNodeCnt;
+}
+
+template<class xbNodeType>
+xbUInt32 xbLinkListOrd<xbNodeType>::GetNodeCnt( const xbString &sNodeKey ) const{
+
+ // won't work if nodekey is not a string
+ xbLinkListNode<xbNodeType> *currPtr = llStartPtr;
+ // skip to sNodeKey
+ while( currPtr && ( sNodeKey > currPtr->GetKey())) {
+ currPtr = currPtr->GetNextNode();
+ }
+ // count entries for sNodeKey
+ xbInt16 iKeyCnt = 0;
+ while( currPtr && ( sNodeKey == currPtr->GetKey())) {
+ iKeyCnt++;
+ currPtr = currPtr->GetNextNode();
+ }
+ return iKeyCnt;
+}
+
+
+template<class xbNodeType>
+xbInt16 xbLinkListOrd<xbNodeType>::InsertKey( const xbNodeType &ntKey ){
+ xbString s;
+ return InsertKey( ntKey, s );
+}
+
+
+
+
+template<class xbNodeType>
+xbInt16 xbLinkListOrd<xbNodeType>::InsertKey( const xbNodeType &ntKey, xbUInt32 ul ){
+
+ xbString s;
+ s.Sprintf( "%ld", ul );
+ return InsertKey( ntKey, s );
+}
+
+
+template<class xbNodeType>
+xbInt16 xbLinkListOrd<xbNodeType>::InsertKey( const xbNodeType &ntKey, const xbString &sData ){
+
+ xbLinkListNode<xbNodeType> *p = new xbLinkListNode<xbNodeType>( ntKey, sData );
+ if( p == 0 )
+ return XB_NO_MEMORY;
+
+ if( ulNodeCnt > 0 ){
+ xbLinkListNode<xbNodeType> *currPtr = llStartPtr;
+ xbLinkListNode<xbNodeType> *prevPtr = NULL;
+
+ // find location in the chain
+ while( currPtr && ntKey > currPtr->GetKey() ){
+ prevPtr = currPtr;
+ currPtr = currPtr->GetNextNode();
+ }
+ if( currPtr && ntKey == currPtr->GetKey() && bAllowDupKeys == 0 ){
+ delete p;
+ return XB_KEY_NOT_UNIQUE;
+ }
+
+ if( currPtr == NULL ){
+ // std::cout << "at the end of the chain\n";
+ llEndPtr = p;
+ prevPtr->SetNextNode( p );
+ p->SetPrevNode( prevPtr );
+
+ } else if( currPtr->GetPrevNode() == NULL ){
+ // std::cout << "at the beginning of the chain\n";
+ p->SetNextNode( llStartPtr );
+ llStartPtr->SetPrevNode( p );
+ llStartPtr = p;
+
+ } else {
+ // std::cout << "in the middle of the chain\n";
+ p->SetNextNode( currPtr );
+ p->SetPrevNode( currPtr->GetPrevNode());
+ currPtr->SetPrevNode( p );
+ prevPtr->SetNextNode( p );
+ }
+ } else {
+ // std::cout << "first addition to the chain\n";
+ llStartPtr = p;
+ llEndPtr = p;
+ }
+ ulNodeCnt++;
+ return XB_NO_ERROR;
+}
+
+template<class xbNodeType>
+xbInt16 xbLinkListOrd<xbNodeType>::RemoveKey( const xbNodeType &ntKey ){
+ // Remove the first instance of ntKey from the node chain
+ xbLinkListNode<xbNodeType> *currPtr = llStartPtr;
+ xbLinkListNode<xbNodeType> *prevPtr = NULL;
+
+ while( currPtr && ntKey > currPtr->GetKey() ){
+ prevPtr = currPtr;
+ currPtr = currPtr->GetNextNode();
+ }
+
+ if( currPtr && ntKey == currPtr->GetKey()){
+// ntKey = currPtr->GetKey();
+ if( prevPtr == NULL ){ // this is the first node
+ llStartPtr = currPtr->GetNextNode();
+ // next line fails
+ if( llStartPtr ){
+ llStartPtr->SetPrevNode( NULL );
+ }
+ delete currPtr;
+ ulNodeCnt--;
+ return XB_NO_ERROR;
+ } else if( currPtr->GetNextNode() == NULL ){ // this is the last node
+ llEndPtr = prevPtr;
+ prevPtr->SetNextNode( NULL );
+ delete currPtr;
+ ulNodeCnt--;
+ return XB_NO_ERROR;
+ } else {
+
+ prevPtr->SetNextNode( currPtr->GetNextNode());
+ currPtr->GetNextNode()->SetPrevNode( prevPtr );
+ delete currPtr;
+ ulNodeCnt--;
+ return XB_NO_ERROR;
+ }
+ } else {
+ return XB_NOT_FOUND;
+ }
+}
+
+template<class xbNodeType>
+xbInt16 xbLinkListOrd<xbNodeType>::RemoveFromFront( xbNodeType &ntKey ){
+
+ if( ulNodeCnt <= 0 )
+ return XB_INVALID_NODELINK;
+ xbLinkListNode<xbNodeType> *p = llStartPtr;
+ llStartPtr = p->GetNextNode();
+ if( llStartPtr )
+ llStartPtr->SetPrevNode( NULL );
+ ntKey = p->GetKey();
+ delete p;
+ ulNodeCnt--;
+ return XB_NO_ERROR;
+}
+
+template<class xbNodeType>
+xbInt16 xbLinkListOrd<xbNodeType>::RemoveFromFront(){
+
+ if( ulNodeCnt <= 0 )
+ return XB_INVALID_NODELINK;
+ xbLinkListNode<xbNodeType> *p = llStartPtr;
+ llStartPtr = p->GetNextNode();
+ if( llStartPtr )
+ llStartPtr->SetPrevNode( NULL );
+
+ if( p->GetKey())
+ delete p->GetKey();
+
+ delete p;
+ ulNodeCnt--;
+
+ return XB_NO_ERROR;
+}
+
+
+template<class xbNodeType>
+xbInt16 xbLinkListOrd<xbNodeType>::RemoveFromEnd( xbNodeType &ntKey ){
+
+ if( ulNodeCnt <= 0 )
+ return XB_INVALID_NODELINK;
+ xbLinkListNode<xbNodeType> *p = llEndPtr;
+ llEndPtr = p->GetPrevNode();
+ llEndPtr->SetNextNode( NULL );
+ ntKey = p->GetKey();
+ delete p;
+ ulNodeCnt--;
+ return XB_NO_ERROR;
+}
+
+template<class xbNodeType>
+xbBool xbLinkListOrd<xbNodeType>::GetDupKeys(){
+ return bAllowDupKeys;
+}
+
+template<class xbNodeType>
+void xbLinkListOrd<xbNodeType>::SetDupKeys( xbBool bAllowDupKeys ){
+ this->bAllowDupKeys = bAllowDupKeys;
+}
+
+
+template<class xbNodeType>
+xbBool xbLinkListOrd<xbNodeType>::KeyExists( const xbNodeType &ntKey ) const {
+
+ xbLinkListNode<xbNodeType> *currPtr = llStartPtr;
+ while( currPtr && ntKey > currPtr->GetKey() ){
+ currPtr = currPtr->GetNextNode();
+ }
+ if( currPtr && ntKey == currPtr->GetKey()){
+ return xbTrue;
+ } else {
+ return xbFalse;
+ }
+}
+
+
+template<class xbNodeType>
+xbInt16 xbLinkListOrd<xbNodeType>::GetDataForKey( const xbNodeType &ntKey, xbString &sData ){
+
+ xbLinkListNode<xbNodeType> *currPtr = llStartPtr;
+ while( currPtr && ntKey > currPtr->GetKey() ){
+ currPtr = currPtr->GetNextNode();
+ }
+
+ if( currPtr && ntKey == currPtr->GetKey()){
+ sData = currPtr->GetData();
+ return XB_NO_ERROR;
+ } else {
+ return XB_NOT_FOUND;
+ }
+}
+
+
+template<class xbNodeType>
+xbInt16 xbLinkListOrd<xbNodeType>::UpdateForKey( const xbNodeType &ntKey, const xbString &sData ){
+
+ if( ulNodeCnt == 0 )
+ return InsertKey( ntKey, sData );
+ xbLinkListNode<xbNodeType> * currPtr = llStartPtr;
+ xbLinkListNode<xbNodeType> * prevPtr = NULL;
+ while( currPtr && ntKey > currPtr->GetKey() ) {
+ prevPtr = currPtr;
+ currPtr = currPtr->GetNextNode();
+ }
+
+ if( currPtr && ntKey == currPtr->GetKey() ) {
+ xbLinkListNode<xbNodeType> *p = new xbLinkListNode<xbNodeType>( ntKey, sData );
+ if( prevPtr )
+ prevPtr->SetNextNode( p );
+ else
+ llStartPtr = p;
+ p->SetNextNode( currPtr->GetNextNode() );
+ p->SetPrevNode( currPtr->GetPrevNode() );
+ delete currPtr;
+ return XB_NO_ERROR;
+ }
+
+ return InsertKey( ntKey, sData );
+
+// return 0;
+}
+
+} // namespace
+
+#endif // XB_LINKLIST_SUPPORT
+#endif // XB_XBLNKLSTORD_H__
+
+
diff --git a/src/include/xblnknod.h b/src/include/xblnknod.h
new file mode 100755
index 0000000..ef45be8
--- /dev/null
+++ b/src/include/xblnknod.h
@@ -0,0 +1,94 @@
+/* xblnknod.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_XBLNKNOD_H__
+#define __XB_XBLNKNOD_H__
+
+
+
+#ifdef XB_LINKLIST_SUPPORT
+
+namespace xb{
+
+template<class xbNodeType>
+class XBDLLEXPORT xbLinkListNode {
+ public:
+ xbLinkListNode( const xbNodeType & );
+ xbLinkListNode( const xbNodeType &, const xbString & );
+ xbNodeType GetKey() const;
+ xbString &GetData();
+ xbLinkListNode<xbNodeType> *GetNextNode() const;
+ xbLinkListNode<xbNodeType> *GetPrevNode() const;
+ void SetNextNode( xbLinkListNode<xbNodeType> *llNext );
+ void SetPrevNode( xbLinkListNode<xbNodeType> *llPrev );
+
+ private:
+ xbNodeType ntKey;
+ xbString sData;
+ xbLinkListNode *llNext;
+ xbLinkListNode *llPrev;
+};
+
+ template<class xbNodeType>
+ xbLinkListNode<xbNodeType>::xbLinkListNode( const xbNodeType &key ){
+ ntKey = key;
+ llNext = NULL;
+ llPrev = NULL;
+ }
+
+ template<class xbNodeType>
+ xbLinkListNode<xbNodeType>::xbLinkListNode( const xbNodeType &key, const xbString &s ){
+ ntKey = key;
+ sData = s;
+ llNext = NULL;
+ llPrev = NULL;
+ }
+
+ template<class xbNodeType>
+ xbNodeType xbLinkListNode<xbNodeType>::GetKey() const {
+ return ntKey;
+ }
+
+ template<class xbNodeType>
+ xbString &xbLinkListNode<xbNodeType>::GetData(){
+ return sData;
+ }
+
+ template<class xbNodeType>
+ xbLinkListNode<xbNodeType> *xbLinkListNode<xbNodeType>::GetNextNode() const {
+ return llNext;
+ }
+
+ template<class xbNodeType>
+ xbLinkListNode<xbNodeType> *xbLinkListNode<xbNodeType>::GetPrevNode() const {
+ return llPrev;
+ }
+
+ template<class xbNodeType>
+ void xbLinkListNode<xbNodeType>::SetNextNode( xbLinkListNode<xbNodeType> *lln ){
+ llNext = lln;
+ }
+
+ template<class xbNodeType>
+ void xbLinkListNode<xbNodeType>::SetPrevNode( xbLinkListNode<xbNodeType> *llp ){
+ llPrev = llp;
+ }
+
+} // namespace
+#endif // XB_LINKLIST_SUPPORT
+#endif // XB_XBLNKNOD_H__
+
+
diff --git a/src/include/xblog.h b/src/include/xblog.h
new file mode 100755
index 0000000..e78f476
--- /dev/null
+++ b/src/include/xblog.h
@@ -0,0 +1,66 @@
+/* xblog.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#ifndef __XB_XBLOG_H__
+#define __XB_XBLOG_H__
+
+#ifdef CMAKE_COMPILER_IS_GNUCC
+#pragma interface
+#endif
+
+namespace xb{
+
+#ifdef XB_LOGGING_SUPPORT
+
+//! @brief xbLog class.
+/*!
+The xbLog class handles message logging functions.
+
+If logging is enabled in an application, error messages are printed
+in the log file.
+
+Once a logfile reaches a predefined size, the logfile is closed, renamed
+and opened.
+
+The logging functions can be accessed through the xbXBase class.
+Each application has one of those.
+*/
+
+class XBDLLEXPORT xbLog : public xbFile {
+ public:
+ xbLog();
+ xbLog( const xbString &sLogFileName );
+ ~xbLog();
+
+ xbInt16 LogClose ();
+ xbInt16 LogGetStatus ();
+ xbInt16 LogOpen ();
+ void LogSetStatus ( xbBool bLogStatus );
+ void LogSetLogSize( size_t lSize ); // { LogSize = size; }
+ xbInt16 LogWrite ( const xbString &LogEntry, xbInt16 iOutputOption = 0 );
+ xbInt16 LogWriteBytes( xbUInt32 lByteCnt, const char *p );
+
+ private:
+ xbBool bLoggingStatus; // false = logging off
+ // true = logging on
+ size_t lLogSize;
+ xbInt16 iShareMode;
+};
+
+#endif // XB_LOGGING_SUPPORT
+} // namespace
+#endif // XB_XBLOG_H__
+
+
diff --git a/src/include/xbmemo.h b/src/include/xbmemo.h
new file mode 100755
index 0000000..e86a65c
--- /dev/null
+++ b/src/include/xbmemo.h
@@ -0,0 +1,223 @@
+/* xbmemo.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_XBMEMO_H__
+#define __XB_XBMEMO_H__
+
+
+// dont use "#pragma interface" with abstract classes
+// #ifdef CMAKE_COMPILER_IS_GNUCC
+// #pragma interface
+// #endif
+
+#ifdef XB_MEMO_SUPPORT
+
+
+
+
+namespace xb{
+
+//! @brief Base class for memo files.
+/*!
+
+The xbMemo class is used as a base class for accessing memo files.
+
+Any DBF file which has any memo fields, will also have a DBT file with the same name.
+Memo fields are stored in the DBT file in 512 or 1024 byte sized blocks.
+
+Calls to the memo routines to read and access memo fields are supported from within
+the dbf class via the GetMemoField and UpdateMemoField routines.
+From an application program point of view, the application program does not need to
+be concerned with the memo classes.<br>
+
+The main difference between the version 3 and version 4 memo files is that
+the version 4 files will reclaim and reuse blocks if available. The version 3
+memo file logic does not.<br>
+
+If you are adding a new style memo table to the logic, you can create a new class
+modeled after xbMemoDbt3 or xbDbtMemo4, using the xbMemo class as a base class.
+
+*/
+
+class XBDLLEXPORT xbMemo : public xbFile {
+ public:
+
+ xbMemo( xbDbf *dbf, xbString const &sFileName );
+
+ /* virtual methods */
+ virtual ~xbMemo();
+ virtual xbInt16 Abort () = 0;
+ virtual xbInt16 CloseMemoFile ();
+ virtual xbInt16 Commit () = 0;
+
+ #ifdef XB_LOCKING_SUPPORT
+ virtual xbInt16 LockMemo ( xbInt16 iLockFunction );
+ virtual xbBool GetMemoLocked () const;
+ #endif
+
+ /* pure virtual methods */
+ virtual xbInt16 CreateMemoFile () = 0;
+
+ virtual xbInt16 GetMemoField ( xbInt16 iFieldNo, xbString &sMemoData ) = 0;
+ virtual xbInt16 GetMemoFieldLen( xbInt16 iFieldNo, xbUInt32 &ulMemoFieldLen ) = 0;
+ virtual xbInt16 OpenMemoFile () = 0;
+ virtual xbInt16 GetMemoFileType();
+ virtual xbInt16 PackMemo ( void (*memoStatusFunc)(xbUInt32 ulItemNum, xbUInt32 ulNumItems)) = 0;
+ virtual xbInt16 UpdateMemoField( xbInt16 iFieldNo, const xbString &sMemoData ) = 0;
+
+ #ifdef XB_DEBUG_SUPPORT
+ virtual xbInt16 DumpMemoFreeChain() = 0;
+ virtual xbInt16 DumpMemoHeader () = 0;
+ #endif
+
+ // *********** FIXME *************
+ // next two methods should be protected but are called in the xb_test_xxxx programs testing routines
+ // so for now, they are kept as public
+ virtual xbInt16 CalcLastDataBlock ( xbUInt32 &lLastDataBlock );
+ virtual xbInt16 GetHdrNextBlock ( xbUInt32 &ulBlockNo );
+
+ protected:
+ friend class xbDbf;
+
+ virtual xbInt16 ReadDbtHeader ( xbInt16 iOption ) = 0;
+ virtual xbInt16 UpdateHeaderName () = 0;
+ virtual xbInt16 UpdateHeadNextNode();
+ virtual xbInt16 Zap () = 0;
+
+ xbDbf *dbf; /* pointer to related dbf instance */
+ char cVersion; /* byte 16 off the header block, 0x03 for V3, version IV - ? */
+ xbInt16 iMemoFileType; /* 3 = version III, 4 = version IV */
+ xbUInt32 ulHdrNextBlock; /* next available block , bytes 0-3 of the memo header */
+ void * mbb; /* memo block buffer */
+
+
+ private:
+
+ #ifdef XB_LOCKING_SUPPORT
+ xbBool bFileLocked; /* memo file locked */
+ #endif
+
+};
+
+
+
+#ifdef XB_DBF3_SUPPORT
+//! @brief Derived class for version 3 memo files.
+/*!
+
+The xbMemoDbt3 class is derived from the xbMome class and is used for accessing the
+older Version 3 memo files.
+
+The main difference between the version 3 and version 4 memo files is that
+the version 4 files will reclaim and reuse blocks if available. The version 3
+memo file logic does not.<br>
+
+*/
+
+
+class XBDLLEXPORT xbMemoDbt3 : public xbMemo {
+ public:
+ xbMemoDbt3( xbDbf *dbf, xbString const &sFileName );
+ ~xbMemoDbt3();
+ virtual xbInt16 Abort ();
+ virtual xbInt16 Commit ();
+ virtual xbInt16 CreateMemoFile ();
+ virtual xbInt16 GetMemoField ( xbInt16 iFieldNo, xbString &sMemoData );
+ virtual xbInt16 GetMemoFieldLen( xbInt16 iFieldNo, xbUInt32 &ulMemoFieldLen );
+ virtual xbInt16 OpenMemoFile ();
+ virtual xbInt16 PackMemo ( void (*memoStatusFunc) (xbUInt32 ulItemNum, xbUInt32 ulNumItems));
+ virtual xbInt16 UpdateMemoField( xbInt16 iFieldNo, const xbString &sMemoData );
+
+ #ifdef XB_DEBUG_SUPPORT
+ virtual xbInt16 DumpMemoFreeChain();
+ virtual xbInt16 DumpMemoHeader ();
+ #endif
+
+ protected:
+ virtual xbInt16 ReadDbtHeader( xbInt16 iOption );
+ virtual xbInt16 UpdateHeaderName();
+ virtual xbInt16 Zap();
+
+ private:
+};
+#endif
+
+
+#ifdef XB_DBF4_SUPPORT
+
+//! @brief Derived class for version 4 memo files.
+/*!
+
+The xbMemoDbt4 class is derived from the xbMeme class and is used for accessing the
+current Version 4 memo files.
+
+The main difference between the version 3 and version 4 memo files is that
+the version 4 files will reclaim and reuse blocks if available. The version 3
+memo file logic does not.<br>
+*/
+
+class XBDLLEXPORT xbMemoDbt4 : public xbMemo {
+ public:
+ xbMemoDbt4( xbDbf *dbf, xbString const &sFileName );
+ ~xbMemoDbt4();
+ virtual xbInt16 Abort ();
+ virtual xbInt16 Commit ();
+ virtual xbInt16 CreateMemoFile ();
+
+ virtual xbInt16 GetMemoField ( xbInt16 iFieldNo, xbString &sMemoData );
+ virtual xbInt16 GetMemoFieldLen ( xbInt16 iFieldNo, xbUInt32 &ulMemoFieldLen );
+ virtual xbInt16 GetMemoFieldLen ( xbInt16 iFieldNo, xbUInt32 &ulMemoFieldLen, xbUInt32 &lBlockNo );
+ virtual xbInt16 OpenMemoFile ();
+ virtual xbInt16 PackMemo ( void (*memoStatusFunc) (xbUInt32 ulItemNum, xbUInt32 ulNumItems));
+ virtual xbInt16 UpdateMemoField ( xbInt16 iFieldNo, const xbString &sMemoData );
+
+ #ifdef XB_DEBUG_SUPPORT
+ virtual xbInt16 DumpMemoFreeChain ();
+ virtual xbInt16 DumpMemoHeader ();
+ virtual xbInt16 DumpMemoInternals ();
+ virtual xbInt16 ReadFreeBlockHeader( xbUInt32 ulBlockNo, xbUInt32 &ulNextBlock, xbUInt32 &ulFreeBlockCnt );
+ #endif
+
+ protected:
+ virtual xbInt16 FindBlockSetInChain( xbUInt32 ulBlocksNeeded, xbUInt32 &ulLastDataBlock, xbUInt32 &ulLocation, xbUInt32 &ulPrevNode, xbBool &bFound );
+ virtual xbInt16 FreeMemoBlockChain( xbUInt32 ulBlockNo );
+ virtual xbInt16 FreeMemoBlockChain( xbUInt32 ulBlockNo, xbUInt32 &ulLastDataBlock );
+ virtual xbInt16 GetBlockSetFromChain( xbUInt32 ulBlocksNeeded, xbUInt32 ulLocation, xbUInt32 ulPrevNode );
+ virtual xbInt16 ReadDbtHeader( xbInt16 iOption );
+ virtual xbInt16 ReadBlockHeader( xbUInt32 ulBlockNo, xbInt16 iOption );
+ virtual xbInt16 UpdateHeaderName ();
+ virtual xbInt16 WriteBlockHeader( xbUInt32 ulBlockNo, xbInt16 iOption );
+ virtual xbInt16 Zap();
+
+ private:
+ xbString sDbfFileNameWoExt;
+ xbUInt32 ulNextFreeBlock;
+ xbUInt32 ulFreeBlockCnt;
+ xbInt16 iField1;
+ xbInt16 iStartPos;
+ xbUInt32 ulFieldLen;
+
+ xbLinkList<xbUInt32> llOldBlocks; // list of previously used memo blocks for field, used by Commit() / Abort()
+ xbLinkList<xbUInt32> llNewBlocks; // list of newly updated memo blocks for field, used by Commit() / Abort()
+
+};
+#endif
+
+
+} /* namespace xb */
+#endif /* XB_MEMO_SUPPORT */
+#endif /* __XB_MEMO_H__ */
+
diff --git a/src/include/xbretcod.h b/src/include/xbretcod.h
new file mode 100755
index 0000000..6b73527
--- /dev/null
+++ b/src/include/xbretcod.h
@@ -0,0 +1,94 @@
+/* xbretcod.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#ifndef __XB_RETCODES_H__
+#define __XB_RETCODES_H__
+
+/***********************************************/
+/* Return Codes and Error Messages */
+
+namespace xb{
+
+ #define XB_NO_ERROR 0 // general
+ #define XB_NO_MEMORY -100 // general
+ #define XB_INVALID_OPTION -101 // general
+ #define XB_DUP_TABLE_OR_ALIAS -110 // table manager
+ #define XB_INVALID_NODELINK -120 // linklist
+ #define XB_KEY_NOT_UNIQUE -121 // linklist
+
+ #define XB_FILE_EXISTS -200 // file
+ #define XB_ALREADY_OPEN -201 // file
+ #define XB_DBF_FILE_NOT_OPEN -202 // file
+ #define XB_FILE_NOT_FOUND -203 // file
+ #define XB_FILE_TYPE_NOT_SUPPORTED -204 // file
+ #define XB_RENAME_ERROR -205 // file
+ #define XB_INVALID_OBJECT -206 // file
+ #define XB_NOT_OPEN -207 // file
+ #define XB_NOT_FOUND -208 // file
+ #define XB_OPEN_ERROR -209 // file
+ #define XB_CLOSE_ERROR -210 // file
+ #define XB_SEEK_ERROR -211 // file
+ #define XB_READ_ERROR -212 // file
+ #define XB_WRITE_ERROR -213 // file
+ #define XB_EOF -214 // file
+ #define XB_BOF -215 // file
+ #define XB_INVALID_BLOCK_SIZE -216 // file
+ #define XB_INVALID_BLOCK_NO -217 // file
+ #define XB_INVALID_RECORD -218 // file
+ #define XB_DELETE_FAILED -219 // file
+ #define XB_INVALID_TABLE_NAME -220 // file
+ #define XB_EMPTY -221 // file
+ #define XB_LIMIT_REACHED -222 // file
+
+ #define XB_INVALID_FIELD_TYPE -300 // field
+ #define XB_INVALID_FIELD_NO -301 // field
+ #define XB_INVALID_DATA -302 // field
+ #define XB_INVALID_FIELD_NAME -303 // field
+ #define XB_INVALID_MEMO_FIELD -304 // field
+ #define XB_INVALID_FIELD -305 // field
+ #define XB_INVALID_FIELD_LEN -306 // field
+ #define XB_INVALID_DATE -307 // date field
+
+ #define XB_INVALID_LOCK_OPTION -400 // lock
+ #define XB_LOCK_FAILED -401 // lock
+ #define XB_TABLE_NOT_LOCKED -402 // lock - need table locked for operation
+
+ #define XB_PARSE_ERROR -500 // expression
+ #define XB_INVALID_FUNCTION -501 // expression
+ #define XB_INVALID_PARM -502 // expression
+ #define XB_INCONSISTENT_PARM_LENS -503 // expression
+ #define XB_INCOMPATIBLE_OPERANDS -504 // expression
+ #define XB_UNBALANCED_PARENS -505 // expression
+ #define XB_UNBALANCED_QUOTES -506 // expression
+ #define XB_INVALID_EXPRESSION -507 // expression
+
+ #define XB_INVALID_KEYNO -600 // index
+ #define XB_INVALID_INDEX -601 // index file error
+ #define XB_INVALID_TAG -602 // invalid index tag name, must be <= 10 bytes
+ #define XB_INVALID_PAGE -603 // invalid index page
+
+
+ #define XB_SYNTAX_ERROR -700 // sql syntax error
+
+
+ #define XB_MAX_ERROR_NO -999
+
+
+/* when updating this table, also need to update messages in xbssv.cpp */
+
+
+} /* namespace */
+#endif /* __XB_RETCODES_H__ */
+
diff --git a/src/include/xbsql.h b/src/include/xbsql.h
new file mode 100755
index 0000000..3869995
--- /dev/null
+++ b/src/include/xbsql.h
@@ -0,0 +1,69 @@
+/* xbsql.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+This class manages a list of open tables, open indices are connected to the open tables
+
+*/
+
+
+#ifndef __XB_XBSQL_H__
+#define __XB_XBSQL_H__
+
+#ifdef CMAKE_COMPILER_IS_GNUCC
+#pragma interface
+#endif
+
+
+#ifdef XB_SQL_SUPPORT
+
+namespace xb{
+
+
+class XBDLLEXPORT xbSql : public xbSsv {
+ public:
+ // xbSql();
+ xbSql( xbXBase *x );
+ ~xbSql();
+
+ xbInt16 ExecuteNonQuery( const xbString &sCmdLine );
+ xbXBase *GetXbasePtr() const;
+
+ protected:
+
+ private:
+
+ xbInt16 SqlCreateTable( const xbString &sCmdLine );
+ xbInt16 SqlCreateIndex( const xbString &sCmdLine );
+
+ xbInt16 SqlDropIndex( const xbString &sCmdLine );
+ xbInt16 SqlDropTable( const xbString &sCmdLine );
+
+
+// xbInt16 SqlCreateView( const xbString &sCmdLine );
+// xbInt16 SqlDropView( const xbString &sCmdLine );
+// xbInt16 SqlUpdate( const xbString &sCmdLine );
+// xbInt16 SqlSelect( const xbString &sCmdLine );
+
+ void SqlHelp() const;
+ xbInt16 SqlInsert( const xbString &sCmLine );
+ xbInt16 SqlSet( const xbString &sCmdLine );
+ xbInt16 SqlUse( const xbString &sCmdLine );
+
+ xbXBase *xbase;
+ xbUda uda;
+
+};
+
+} /* namespace xb */
+#endif /* XB_SQL_SUPPORT */
+#endif /* __XB_XBSQL_H__ */ \ No newline at end of file
diff --git a/src/include/xbssv.h b/src/include/xbssv.h
new file mode 100755
index 0000000..80da2d0
--- /dev/null
+++ b/src/include/xbssv.h
@@ -0,0 +1,177 @@
+/* xbssv.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_XBSSV_H__
+#define __XB_XBSSV_H__
+
+#ifdef CMAKE_COMPILER_IS_GNUCC
+#pragma interface
+#endif
+
+
+namespace xb{
+
+class XBDLLEXPORT xbXBase;
+
+///@cond DOXYOFF
+struct XBDLLEXPORT xbErrorMessage{
+ xbInt16 iErrorNo;
+ const char *sErrorText;
+};
+///@endcond DOXYOFF
+
+
+//! @brief Class for handling shared system variables.
+/*!
+This class defines static variables which are referenced across class instances.
+
+This class is designed to have the variables set when the xbXBase class constructor is called
+(xbXBase is a derived class). The xbXbase class is designed to be called first in an application
+programs, and it is only called once. The static values in this class are typically initialized at
+program startup and don't require additional updates.
+
+*/
+
+
+// By design, DBase allows mutliple records in a table all having the same key, but only one entry in a unique index
+// XB_HALT_ON_DUP_KEY tells the library to not allow appending records which generate duplicate keys in a unique index
+//
+#if defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)
+#define XB_HALT_ON_DUPKEY 0
+#define XB_EMULATE_DBASE 1
+#endif
+
+
+
+class XBDLLEXPORT xbSsv{
+ public:
+ xbSsv();
+ const static char *ErrorCodeText[];
+
+ void DisplayError ( xbInt16 ErrorCode ) const;
+ xbString& GetDefaultDateFormat () const;
+ xbString& GetDataDirectory () const;
+ xbInt16 GetEndianType () const;
+
+ const char *GetErrorMessage ( xbInt16 ErrorCode ) const;
+ void SetDataDirectory ( const xbString &sDataDirectory );
+ void SetDefaultDateFormat ( const xbString &sDefaultDateFormat );
+
+
+ xbBool BitSet ( unsigned char c, xbInt16 iBitNo ) const;
+ #ifdef XB_DEBUG_SUPPORT
+ void BitDump ( unsigned char c ) const;
+ void BitDump ( char c ) const;
+ #endif
+
+ xbBool GetDefaultAutoCommit () const;
+ void SetDefaultAutoCommit ( xbBool bDefaultAutoCommit );
+
+ xbString& GetDefaultLogDirectory () const;
+ xbString& GetDefaultLogFileName () const;
+ void SetDefaultLogDirectory ( const xbString &sDefaultLogDirectory );
+
+ xbBool GetMultiUser () const;
+ void SetMultiUser ( xbBool bMultiUser );
+
+ #if defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)
+ xbInt16 GetUniqueKeyOpt () const;
+ xbInt16 SetUniqueKeyOpt ( xbInt16 iUniqueKeyOpt );
+ #endif
+
+ #ifdef XB_LOCKING_SUPPORT
+ xbInt16 GetDefaultLockRetries () const;
+ void SetDefaultLockRetries ( xbInt16 iRetryCount );
+ xbInt32 GetDefaultLockWait () const;
+ void SetDefaultLockWait ( xbInt32 lRetryWait );
+ xbInt16 GetDefaultLockFlavor () const;
+ void SetDefaultLockFlavor ( xbInt16 iLockFlavor );
+ xbBool GetDefaultAutoLock () const;
+ void SetDefaultAutoLock ( xbBool bAutoLock );
+ void EnableDefaultAutoLock ();
+ void DisableDefaultAutoLock ();
+ #endif
+
+ #ifdef XB_MDX_SUPPORT
+ xbInt16 GetCreateMdxBlockSize() const;
+ xbInt16 SetCreateMdxBlockSize( xbInt16 ulBlockSize );
+ #endif
+
+ protected:
+
+ void SetEndianType ();
+
+ static xbInt16 iEndianType; // B=Big Endian L=Little Endian
+ static xbString sNullString; // Null String
+
+
+ private:
+
+ static xbString sDefaultDateFormat;
+ static xbString sDataDirectory; //Data file directory
+
+ #ifdef XB_LOGGING_SUPPORT
+ static xbString sDefaultLogDirectory; //Default location to store log files
+ static xbString sDefaultLogFileName; //Default LogFileName
+ #endif
+
+ static xbInt16 iDefaultFileVersion; // 3 = DBase 3
+ // 4 = DBase 4
+ // default version used in CreateTable command
+ // can be over ridden at the Xbase level, or table level
+ // Different versions can be open simultaneously
+
+ static xbBool bDefaultAutoCommit; // Default dbf auto commit switch
+
+ static xbBool bMultiUser; // True if multi user mode is turned on
+ // Turn this off for better performance in single user mode
+ // This needs to be turned on or off before any data tables are opened
+ // turning this on after tables are opened, can result in out of date
+ // file buffers if multiple users are sharing the files
+
+#ifdef XB_LOCKING_SUPPORT
+ static xbInt32 lDefaultLockWait; // Number of milliseconds between lock retries
+ static xbInt16 iDefaultLockRetries; // Number of times to retry a lock before conceding
+ static xbInt16 bDefaultAutoLock; // Autolocking enabled?
+ static xbInt16 iDefaultLockFlavor; // 1 = DBase
+ // 2 = Clipper - not developed yet
+ // 3 = FoxPro - not developed yet
+ // 9 = Xbase64 - not developed yet
+#endif
+
+
+
+#if defined (XB_NDX_SUPPORT) || defined (XB_MDX_SUPPORT)
+
+ static xbInt16 iUniqueKeyOpt;
+
+ // is one of:
+ // XB_HALT_ON_DUPKEY
+ // XB_EMULATE_DBASE
+
+#endif
+
+
+#ifdef XB_MDX_SUPPORT
+ static xbInt16 iCreateMdxBlockSize; // System level Mdx Block Size
+#endif // XB_MDX_SUPPORT
+
+
+
+};
+
+} /* namespace xb */
+#endif /* __XB_XBSSV_H__ */ \ No newline at end of file
diff --git a/src/include/xbstring.h b/src/include/xbstring.h
new file mode 100755
index 0000000..c2f15cd
--- /dev/null
+++ b/src/include/xbstring.h
@@ -0,0 +1,183 @@
+/* xbstring.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#ifndef __XBSTRING_H__
+#define __XBSTRING_H__
+
+#ifdef CMAKE_COMPILER_IS_GNUCC
+#pragma interface
+#endif
+
+#include <stdlib.h>
+#include <iostream>
+
+namespace xb{
+
+
+//! @brief Class for handling string data.
+
+/*!
+This class defines a basic string class with all the functions one would expect in a string class.
+
+For purposes of the xbString class, a string is defined as a variable sized array of one byte
+characters terminated with a null (0x00 or \0) byte.<br><br>
+
+This version of the xbString class does not support wide (wchar_t) characters. Perhaps you would
+be interested in creating a class for supporting wide characters.<br><br>
+
+This string class handle strings in a 1-based (not 0 based) fashion.
+Any string routines taking an offset use a 1-based value. That is, the first position of
+the string is position 1, not 0.<br><br>
+
+Position 1 (not 0) is considered the first position in a string.
+A return of 0 would indicate a not found condition. A return of 1, would be the
+first byte.
+*/
+
+
+class XBDLLEXPORT xbString {
+
+ public:
+ //Various constructors
+ xbString(xbUInt32 size);
+ xbString(char c);
+ xbString(const char *s, xbUInt32 lMaxLen);
+ xbString(const xbString &s);
+ xbString(const char * = "");
+ xbString( xbDouble d );
+ ~xbString();
+
+ //operators
+ xbString &operator= (const xbString &s);
+ xbString &operator= (const char *s);
+ operator const char *() const;
+ char &operator[](xbUInt32 n) const;
+ char &operator[](xbInt32 n) const;
+
+ xbString &operator+=(const xbString &s);
+ xbString &operator+=(const char *s);
+ xbString &operator+=(char c);
+ xbString &operator-=(const xbString &s);
+ xbString &operator-=(const char *s);
+ xbString &operator-=(char c);
+
+ xbBool operator == ( const xbString& ) const;
+ xbBool operator == ( const char * ) const;
+ xbBool operator != ( const xbString& ) const;
+ xbBool operator != ( const char * ) const;
+
+ xbBool operator < ( const xbString& ) const;
+ xbBool operator > ( const xbString& ) const;
+ xbBool operator <= ( const xbString& ) const;
+ xbBool operator >= ( const xbString& ) const;
+
+ xbString operator-( const xbString &s );
+ xbString operator+( const char *s );
+ xbString operator+( const xbString &s );
+ xbString operator+( const char c );
+
+ xbString &AddBackSlash( char c );
+ xbString &Append(const xbString &s);
+ xbString &Append(const char *s);
+ xbString &Append(const char *s, xbUInt32 iByteCount );
+ xbString &Append(char c);
+ xbString &Assign(const char *srcStr, xbUInt32 lStartPos, xbUInt32 lCopyLen );
+ xbString &Assign(const char *srcStr, xbUInt32 lStartPos );
+ xbString &Assign(const xbString &s, xbUInt32 pos, xbUInt32 n );
+ xbString &Assign(const xbString &s, xbUInt32 n );
+
+ xbString Copy() const;
+ xbUInt32 CountChar( char c ) const;
+ xbUInt32 CountChar( char c, xbInt16 iOpt ) const;
+ xbInt16 CvtHexChar( char &cOut );
+ xbInt16 CvtHexString( xbString &sOut );
+ xbInt16 CvtULongLong( xbUInt64 &ullOut );
+ xbInt16 CvtLongLong( xbInt64 &llOut );
+
+ #ifdef XB_DEBUG_SUPPORT
+ void Dump( const char *title ) const;
+ void Dump( const char *title, xbInt16 iOption ) const;
+ void DumpHex( const char *title ) const;
+ #endif
+
+ xbString &ExtractElement(const char *src, char delim, xbUInt32 iCnt, xbInt16 iOpt = 0 );
+ char GetCharacter( xbUInt32 lPos ) const;
+ xbUInt32 GetLastPos(char c) const;
+ xbUInt32 GetLastPos(const char *s) const;
+ char GetPathSeparator() const;
+ xbUInt32 GetSize() const;
+
+ xbBool HasAlphaChars() const;
+ xbBool IsEmpty() const;
+ xbBool IsNull() const;
+
+ xbString &Left( xbUInt32 ulLen );
+ xbUInt32 Len() const; // returns the length of the string
+ xbString &Ltrim();
+ xbString &Ltrunc( xbUInt32 ulCnt );
+
+ xbString &Mid(xbUInt32 ulPos, xbUInt32 lLen );
+ xbString &PadLeft( char c, xbUInt32 ulLen );
+ xbString &PadRight( char c, xbUInt32 ulLen );
+ xbUInt32 Pos(char c) const;
+ xbUInt32 Pos(const char *s) const;
+ xbString &PutAt(xbUInt32 ulPos, char c);
+
+ xbString &Remove( xbUInt32 ulPos, xbUInt32 ulN );
+ xbString &Resize( xbUInt32 lSize );
+ xbString &Rtrim();
+
+ xbString &Set( const char *s );
+ xbString &Set( const xbString &s );
+ xbString &Set( const char *s, xbUInt32 ulSize );
+ xbString &SetNum( xbInt32 lNum );
+ xbString &Sprintf(const char *format, ...);
+
+ const char *Str() const;
+ char *strncpy( char * cDest, xbUInt32 n ) const;
+ xbString &SwapChars( char from, char to );
+
+ xbString &ToLowerCase();
+ xbString &ToUpperCase();
+ xbString &Trim();
+
+ xbBool ValidLogicalValue() const;
+ xbBool ValidNumericValue() const;
+ xbString &ZapChar( char c );
+ xbString &ZapLeadingChar( char c );
+ xbString &ZapTrailingChar( char c );
+
+ friend std::ostream& operator<< ( std::ostream& os, const xbString& s );
+
+ private:
+
+ static const char * NullString;
+ static char cJunkBuf;
+
+ char *data; // pointer to actual string data
+ xbUInt32 size; // size of string plus null terminating byte
+
+ void ctor(const char *s);
+// xbUInt32 CalcSprintfBufSize(const char *format, ...);
+
+// char * xb_realloc( char *pIn, xbUInt32 iLen );
+
+ // next routine could result in buffer over runs if used with improperly sized buffers
+ char * xb_strcpy ( char *target, const char *source);
+
+};
+
+} /* namespace */
+#endif /* __XBSTRING_H__ */
diff --git a/src/include/xbtag.h b/src/include/xbtag.h
new file mode 100755
index 0000000..9b518a3
--- /dev/null
+++ b/src/include/xbtag.h
@@ -0,0 +1,74 @@
+/* xbtag.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_XBTAG_H__
+#define __XB_XBTAG_H__
+
+//#ifdef CMAKE_COMPILER_IS_GNUCC
+//#pragma interface
+//#endif
+
+namespace xb{
+
+
+#ifdef XB_INDEX_SUPPORT
+
+class XBDLLEXPORT xbIx;
+
+
+
+//! @brief xbTag is used for linking index tags to a table (aka dbf file).
+/*!
+
+ Each dbf file (or table) can have zero, one or many tags.
+ Each tag is maintained in a linked list of xbTags.
+
+ NDX index files contain only one index tag.<br>
+ MDX index files can contain one to 47 index tags. The production MDX file is opened automatically
+ and the tags are added to the tag list.
+
+*/
+
+class XBDLLEXPORT xbTag {
+
+ public:
+ xbTag( xbIx *pIx, void *vpTag, xbString &sType, xbString &sTagName, xbString &sExpression, xbString &sFilter, xbBool bUnique, xbBool bSort );
+
+ xbIx *GetIx() const;
+ void *GetVpTag() const;
+ const xbString &GetType() const;
+ const xbString &GetTagName() const;
+ const xbString &GetExpression() const;
+ const xbString &GetFilter() const;
+ xbBool GetUnique() const;
+ xbBool GetSort() const;
+
+ private:
+ xbIx *pIx;
+ void *vpTag;
+ xbString sType;
+ xbString sTagName;
+ xbString sExpression;
+ xbString sFilter;
+ xbBool bUnique;
+ xbBool bSort; // 0 = Ascending, 1 = Descending
+};
+
+#endif // XB_INDEX_SUPPORT
+
+
+} /* namespace xb */
+#endif /* __XB_TAG_H__ */
diff --git a/src/include/xbtblmgr.h b/src/include/xbtblmgr.h
new file mode 100755
index 0000000..d551002
--- /dev/null
+++ b/src/include/xbtblmgr.h
@@ -0,0 +1,61 @@
+/* xbtblmgr.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+This class manages a list of open tables, open indices are connected to the open tables
+
+*/
+
+
+#ifndef __XB_XBMGR_H__
+#define __XB_XBMGR_H__
+
+#ifdef CMAKE_COMPILER_IS_GNUCC
+#pragma interface
+#endif
+
+namespace xb{
+
+class XBDLLEXPORT xbDbf;
+
+/* this structure is a linked list of open tables */
+struct XBDLLEXPORT xbTblList{
+ xbTblList *pNext;
+ xbString *psTblName; /* Name of table - same table can be opened multiple times, but must have unique alias */
+ xbString *psTblAlias; /* TblAliasName must be unique */
+ xbDbf *pDbf;
+};
+
+class XBDLLEXPORT xbTblMgr : public xbSsv {
+ public:
+ xbTblMgr();
+ ~xbTblMgr();
+ xbInt16 AddTblToTblList ( xbDbf *d, const xbString &sTblName );
+ xbInt16 AddTblToTblList ( xbDbf *d, const xbString &sTblName, const xbString &sTblAlias );
+ xbInt16 DisplayTableList () const;
+ xbDbf * GetDbfPtr ( const xbString &sTblAlias ) const;
+ xbDbf * GetDbfPtr ( xbInt16 sItemNo ) const;
+ xbInt16 GetOpenTableCount () const;
+ xbInt16 RemoveTblFromTblList ( const xbString &sTblAlias );
+ xbInt16 RemoveTblFromTblList ( xbDbf *d );
+
+ protected:
+
+ private:
+ xbTblList * TblList; // List of open database tables
+ xbInt16 iOpenTableCount; // Number of open tables
+
+};
+
+} /* namespace xb */
+
+#endif /* __XB_XBMGR_H__ */ \ No newline at end of file
diff --git a/src/include/xbtypes.h b/src/include/xbtypes.h
new file mode 100755
index 0000000..99b6c22
--- /dev/null
+++ b/src/include/xbtypes.h
@@ -0,0 +1,55 @@
+/* xbtypes.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#ifndef __XB_XTYPES_H__
+#define __XB_XTYPES_H__
+
+namespace xb{
+
+
+typedef float xbFloat;
+typedef double xbDouble;
+typedef short int xbBool;
+typedef xbUInt64 xbOffT;
+
+
+#define xbTrue 1
+#define xbFalse 0
+
+
+#ifdef HAVE__FILENO_F
+ #define xbFileNo _fileno
+#else
+ #define xbFileNo fileno
+#endif
+
+#ifdef XB_LOCKING_SUPPORT
+ #if defined( HAVE_LONG_LONG )
+ #define LK4026531839 4026531839LL
+ #define LK4026531838 4026531838LL
+ #define LK3026531838 3026531838LL
+ #define LK1000000000 1000000000LL
+ #else
+ #define LK4026531839 4026531839L
+ #define LK4026531838 4026531838L
+ #define LK3026531838 3026531838L
+ #define LK1000000000 1000000000L
+ #endif
+#endif
+
+
+
+} /* namespace */
+#endif /* __XB_XTYPES_H__ */
diff --git a/src/include/xbuda.h b/src/include/xbuda.h
new file mode 100755
index 0000000..84eccee
--- /dev/null
+++ b/src/include/xbuda.h
@@ -0,0 +1,52 @@
+/* xbuda.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+This class manages the user data area (UDA)
+
+*/
+
+
+#ifndef __XB_XBUDA_H__
+#define __XB_XBUDA_H__
+
+#ifdef CMAKE_COMPILER_IS_GNUCC
+#pragma interface
+#endif
+
+
+#ifdef XB_EXPRESSION_SUPPORT
+
+
+namespace xb{
+
+class XBDLLEXPORT xbUda {
+
+ public:
+ xbUda();
+ ~xbUda();
+
+ xbInt16 AddTokenForKey( const xbString &sKey, const xbString &sToken );
+ void Clear();
+ xbInt16 DelTokenForKey( const xbString &sKey );
+ xbInt16 GetTokenCnt() const;
+ xbInt16 GetTokenForKey( const xbString &sKey, xbString &sData );
+ xbInt16 UpdTokenForKey( const xbString &sKey, const xbString &sToken );
+ void DumpUda() const;
+
+ private:
+ xbLinkListOrd<xbString> llOrd;
+
+};
+} /* namespace */
+#endif /* XB_EXPRESSION_SUPPORT */
+#endif /* __XBUDA_H__ */ \ No newline at end of file
diff --git a/src/include/xbxbase.h b/src/include/xbxbase.h
new file mode 100755
index 0000000..204e744
--- /dev/null
+++ b/src/include/xbxbase.h
@@ -0,0 +1,222 @@
+/* xbxbase.h
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+
+#ifndef __XB_XBDBLIST_H__
+#define __XB_XBDBLIST_H__
+
+#ifdef CMAKE_COMPILER_IS_GNUCC
+#pragma interface
+#endif
+
+namespace xb{
+
+class XBDLLEXPORT xbLog;
+
+/************************************************************************/
+/*
+ Xbase functions
+
+ Min Parm Count is the minimum number of input parms needed by the function
+
+ Return Type
+ C Char or string
+ D Date
+ L Logical
+ N Numeric
+ 1 Varies - pull return type from first sibling
+ 2 Varies - pull return type from second sibling
+*/
+
+#ifdef XB_FUNCTION_SUPPORT
+
+/*
+struct XBDLLEXPORT xbFunctionInfo {
+ const char * FuncName; // function name
+ char ReturnType; // return type of function
+ xbInt16 iReturnLenCalc; // used to calculate the function return value is
+ // 1 = use value specified in iReturnLenVal
+ // 2 = use length of operand specified in col 4
+ // 3 = use valued of numeric operand specified in col 4
+ // 4 = length of parm 1 * numeric value parm
+ // 5 = larger length of parm 2 or length of parm 3
+ // 6 = if two or more parms, use numeric value from second parm,
+ // otherwise use col4 value
+ xbInt16 iReturnLenVal; // Used in combination with iReturnLenCalc
+
+};
+*/
+/*
+static xbFunctionInfo FunctionList[] =
+// Func Return -Rtrn Len-
+// Name Type -Calc Val-
+{
+ { "ABS", 'N', 1, 4 },
+ { "ALLTRIM", 'C', 2, 1 },
+ { "ASC", 'N', 1, 4 },
+ { "AT", 'N', 1, 4 },
+ { "CDOW", 'C', 1, 9 },
+ { "CHR", 'C', 1, 1 },
+ { "CMONTH", 'C', 1, 9 },
+ { "CTOD", 'D', 1, 8 },
+ { "DATE", 'D', 1, 8 },
+ { "DAY", 'N', 1, 4 },
+ { "DEL", 'C', 1, 1 },
+ { "DELETED", 'L', 1, 1 },
+ { "DESCEND", '1', 2, 1 },
+ { "DOW", 'N', 1, 4 },
+ { "DTOC", 'C', 1, 8 },
+ { "DTOS", 'C', 1, 8 },
+ { "EXP", 'N', 1, 4 },
+ { "IIF", 'C', 5, 0 },
+ { "INT", 'N', 1, 4 },
+ { "ISALPHA", 'L', 1, 1 },
+ { "ISLOWER", 'L', 1, 1 },
+ { "ISUPPER", 'L', 1, 1 },
+ { "LEFT", 'C', 3, 2 },
+ { "LEN", 'N', 1, 4 },
+ { "LOG", 'N', 1, 4 },
+ { "LOWER", 'C', 2, 1 },
+ { "LTRIM", 'C', 2, 1 },
+ { "MAX", 'N', 1, 4 },
+ { "MIN", 'N', 1, 4 },
+ { "MONTH", 'N', 1, 4 },
+ { "RECNO", 'N', 1, 4 },
+ { "RECCOUNT", 'N', 1, 4 },
+ { "REPLICATE", 'C', 4, 0 },
+ { "RIGHT", 'C', 3, 2 },
+ { "RTRIM", 'C', 2, 1 },
+ { "SPACE", 'C', 3, 1 },
+ { "SQRT", 'N', 1, 4 },
+ { "STOD", 'D', 1, 8 },
+ { "STR", 'C', 6, 10 },
+ { "STRZERO", 'C', 3, 2 },
+ { "SUBSTR", 'C', 3, 3 },
+ { "TRIM", 'C', 2, 1 },
+ { "UPPER", 'C', 2, 1 },
+ { "VAL", 'N', 1, 4 },
+ { "YEAR", 'N', 1, 4 },
+ { 0, 0, 0, 0 },
+};
+*/
+#endif
+
+
+
+//! @brief xbXbase class.
+/*!
+ The xbXBase class is the core class that needs to be in every application program.
+*/
+
+class XBDLLEXPORT xbXBase : public xbTblMgr{
+ public:
+ xbXBase();
+ ~xbXBase();
+
+ xbInt16 CloseAllTables();
+ void DisableMsgLogging();
+ void EnableMsgLogging ();
+ xbInt16 FlushLog();
+
+ const xbString &GetLogDirectory () const;
+ const xbString &GetLogFileName () const;
+ const xbString &GetLogFqFileName() const;
+ xbBool GetLogStatus () const;
+
+ xbInt16 OpenHighestVersion( const xbString &sTableName, const xbString &sAlias, xbDbf &dbf, int dummy );
+ xbInt16 OpenHighestVersion( const xbString &sTableName, const xbString &sAlias, xbDbf **dbf );
+
+ xbDbf * Open( const xbString &sTableName, xbInt16 &iRc );
+ xbDbf * Open( const xbString &sTableName, const xbString &sAlias, xbInt16 iOpenMode, xbInt16 iShareMode, xbInt16 iVersion, xbInt16 &iRc );
+ void SetLogDirectory( const xbString &sLogFileDirectory );
+ void SetLogFileName ( const xbString &sLogFileName );
+ void SetLogSize ( size_t lSize );
+ xbInt16 WriteLogMessage( const xbString &sLogMessage, xbInt16 iOutputOpt = 0 );
+ xbInt16 WriteLogBytes ( xbUInt32 lCnt, const char *p );
+
+ void xbSleep ( xbInt32 lMillisecs );
+
+
+ /* xbase functions */
+ #ifdef XB_FUNCTION_SUPPORT
+ xbInt16 ABS( xbDouble dIn, xbDouble &dOut );
+ xbInt16 ALLTRIM( const xbString &sIn, xbString &sOut );
+ xbInt16 ASC( const xbString &s, xbDouble &dAscOut );
+ xbInt16 AT( const xbString &sSrchFor, const xbString &sBase, xbDouble &dPos );
+ xbInt16 CDOW( xbDate &dInDate, xbString &sOutDow );
+ xbInt16 CHR( xbDouble dAsciCd, xbString &sOut );
+ xbInt16 CMONTH( xbDate &dInDate, xbString &sOutMonth );
+ xbInt16 CTOD( const xbString &sInDate, xbDate &dOutDate );
+ xbInt16 DATE( xbDate &dOutDate );
+ xbInt16 DAY( const xbDate &dInDate, xbDouble &dOutDay );
+ xbInt16 DEL( xbDbf * d, xbString &sOut, xbInt16 iRecBufSw = 0 );
+ xbInt16 DELETED( xbDbf * d, xbBool &bOut, xbInt16 iRecBufSw = 0 );
+ xbInt16 DESCEND( const xbString &sIn, xbString &sOut );
+ xbInt16 DESCEND( const xbDate &dInDate, xbDate &dOutDate );
+ xbInt16 DESCEND( const xbDouble dIn, xbDouble &dsOut );
+ xbInt16 DOW( const xbDate &sInDate, xbDouble &dDowOut );
+ xbInt16 DTOC( xbDate &dInDate, xbString &sOutFmtDate );
+ xbInt16 DTOS( xbDate &dInDate, xbString &sOutFmtDate );
+ xbInt16 EXP( xbDouble dIn, xbDouble &dOut );
+ xbInt16 IIF( xbBool bResult, const xbString &sTrueResult, const xbString &sFalseResult, xbString &sResult );
+ xbInt16 INT( xbDouble dIn, xbDouble &dOut );
+ xbInt16 ISALPHA( const xbString &s, xbBool &bResult );
+ xbInt16 ISLOWER( const xbString &s, xbBool &bResult );
+ xbInt16 ISUPPER( const xbString &s, xbBool &bResult );
+ xbInt16 LEFT( const xbString &sIn, xbUInt32 lCharCnt, xbString &sOut );
+ xbInt16 LEN( const xbString &sIn, xbDouble &dLen );
+ xbInt16 LOG( xbDouble dIn, xbDouble &dOut );
+ xbInt16 LOWER( const xbString &sIn, xbString &sOut );
+ xbInt16 LTRIM( const xbString &sIn, xbString & sOut );
+ xbInt16 MAX( xbDouble dIn1, xbDouble dIn2, xbDouble &dOut );
+ xbInt16 MIN( xbDouble dIn1, xbDouble dIn2, xbDouble &dOut );
+ xbInt16 MONTH( xbDate &dInDate, xbDouble &dMonthOut );
+ xbInt16 RECCOUNT( xbDbf * d, xbDouble &dRecOut );
+ xbInt16 RECNO( xbDbf * d, xbDouble &dRecOut );
+ xbInt16 REPLICATE( const xbString &sIn, xbUInt32 ulRepCnt, xbString &sOut );
+ xbInt16 RIGHT( const xbString &sIn, xbUInt32 iCharCnt, xbString &sOut );
+ xbInt16 RTRIM( const xbString &sIn, xbString &sOut );
+ xbInt16 SPACE( xbInt32 lCnt, xbString &sOut );
+ xbInt16 SQRT( xbDouble dBase, xbDouble &dSqrRt );
+ xbInt16 STOD( const xbString &sIn, xbDate &sDateOut );
+ xbInt16 STR( xbDouble dIn, xbString &sOut );
+ xbInt16 STR( xbDouble dIn, xbUInt32 ulLen, xbString &sOut );
+ xbInt16 STR( xbDouble dIn, xbUInt32 ulLen, xbUInt32 ulDec, xbString &sOut );
+ xbInt16 STR( xbDouble dIn, xbUInt32 ulLen, xbUInt32 ulDec, xbString &sPadChar, xbString &sOut );
+ xbInt16 STRZERO( xbDouble dIn, xbUInt32 ulLen, xbUInt32 ulDec, xbString &sOut );
+ xbInt16 SUBSTR( const xbString &sIn, xbUInt32 ulStartPos, xbUInt32 ulLen, xbString &sOut );
+ xbInt16 TRIM( const xbString &sIn, xbString &sOut );
+ xbInt16 UPPER( const xbString &sIn, xbString &sOut );
+ xbInt16 VAL( const xbString &sIn, xbDouble &dOut );
+ xbInt16 YEAR( xbDate &dInDate, xbDouble &dOutYear );
+ #endif
+
+ protected:
+ friend class xbBcd;
+ friend class xbExp;
+
+ xbInt16 GetFunctionInfo( const xbString &sExpLine, char &cReturnType, xbInt16 &iReturnLenCalc, xbInt32 &lReturnLenVal ) const;
+ static xbInt16 xbMemcmp( const unsigned char *s1, const unsigned char *s2, size_t n );
+
+ private:
+
+#ifdef XB_LOGGING_SUPPORT
+ xbLog *xLog;
+#endif
+
+};
+
+} /* namespace xb */
+#endif /* __XB_DBLIST_H__ */ \ No newline at end of file
diff --git a/src/sql/xbcrix.cpp b/src/sql/xbcrix.cpp
new file mode 100755
index 0000000..b24782e
--- /dev/null
+++ b/src/sql/xbcrix.cpp
@@ -0,0 +1,279 @@
+/* xbcrix.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_SQL_SUPPORT
+
+namespace xb{
+
+
+/***********************************************************************/
+xbInt16 xbSql::SqlCreateIndex( const xbString &sCmdLine ){
+
+ // std::cout << "CREATE INDEX " << sCmdLine << std::endl;
+
+ // expected format to create an Dbase 3, NDX index:
+ // CREATE INDEX ixname.ndx ON tablename.dbf ( EXPRESSION ) [ASSOCIATE]
+
+ // expected format to create an Dbase 4, tag on an MDX index:
+ // CREATE [UNIQUE] INDEX tagname ON tablename.dbf ( EXPRESSION ) [DESC] [FILTER .NOT. DELETED()]
+
+ // The ASSOCIATE parameter is specific to Xbase64 library, it is used to associate
+ // a non production (NDX) index file to a dbf file so it will be automatically
+ // opened with the dbf file whenever the dbf file is opened by the xbase64 routines.
+
+ // The [ASSOCIATE] parameter is not used with MDX production indices
+
+ // This method first looks for ".NDX" in the file name to determine if an NDX
+ // index should be created.
+ // if .NDX is not in the filename, it looks in the uda for "IXTYPE" for either
+ // NDX or MDX to detmermine the index type to create
+ // if IXTYPE not found, create an MDX tag
+
+ // The optional DESC parameter defines an entire index key as descending. This is
+ // different than other SQL implementations where specific fields can be descending.
+
+ // The optional FILTER parameter is specific to the XBASE64 library, is it used to
+ // assign a filter to a tag in an MDX style index. Everything to the right of
+ // the keyword FILTER is considered part of the filter.
+
+ // The original DBASE indices used to '+' to create an index on more than one field
+ // ie: FIELD1+FIELD2+FIELD3
+ // SQL uses commas: ie: FIELD1, FIELD2, FIELD3
+ // The Xbase library supports either '+' or ',' when creating mutli field indices.
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbString sTableName;
+ xbString sIxName;
+ xbString sIxType;
+ xbUInt32 ulPos;
+ xbString sCmd = sCmdLine;
+ xbString sNode;
+ xbBool bUnique = xbFalse;
+ xbDbf * dbf = NULL;
+
+ try{
+
+ // std::cout << "xbSql::CreateIx()\n" ;
+
+ // drop off the first node
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ sNode.ExtractElement( sCmd, ' ', 1, 0 );
+ sNode.ToUpperCase();
+
+ if( sNode == "UNIQUE" ){
+ //std::cout << "unique ix\n";
+ bUnique = xbTrue;
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+ }
+
+ // go past the index keyword
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ // pull the index name off the cmd line
+ sIxName.ExtractElement( sCmd, ' ', 1, 0 );
+
+ #ifdef XB_NDX_SUPPORT
+ xbString sTemp = sIxName;
+ sTemp.ToUpperCase();
+ ulPos = sTemp.Pos( ".NDX" );
+ if(ulPos == (sTemp.Len() - 3) )
+ sIxType = "NDX";
+ #endif // XB_NDX_SUPPORT
+
+ if( sIxType == "" ){
+ if(( iRc = uda.GetTokenForKey( "IXTYPE", sIxType )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+
+ #ifdef XB_NDX_SUPPORT
+ if( sIxType == "NDX" ){
+ xbFile f( xbase );
+ f.SetFileName( sIxName );
+ if( f.FileExists()){
+ iErrorStop = 30;
+ iRc = XB_FILE_EXISTS;
+ throw iRc;
+ }
+ }
+ #endif // XB_NDX_SUPPORT
+
+ // skip past index name
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ // skip past "ON"
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ // get the table name
+ ulPos = sCmd.Pos( '(' );
+ sTableName.ExtractElement( sCmd, '(', 1, 0 );
+ sTableName.Trim();
+
+ xbFile fDbf( xbase );
+ fDbf.SetFileName( sTableName );
+
+ // if not open, attempt to open it
+ dbf = xbase->GetDbfPtr( fDbf.GetFqFileName());
+ if( !dbf ){
+ if(( iRc = xbase->OpenHighestVersion( sTableName, "", &dbf )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ }
+ if( dbf == NULL ){
+ iErrorStop = 50;
+ iRc = XB_FILE_NOT_FOUND;
+ throw iRc;
+ }
+ sCmd.Ltrunc( ulPos );
+
+ // std::cout << "cp1 ulPos = " << ulPos << " scmd = " << sCmd << "\n";
+
+ //ulPos = sCmd.GetLastPos( ')' );
+ xbString sKeyExpression;
+ xbBool bDone = xbFalse;
+ xbUInt32 lPos = 1;
+ xbInt16 iParenCtr = 0;
+ while( !bDone && lPos < sCmd.Len()){
+ if( sCmd[lPos] == '(' ){
+ iParenCtr++;
+ sKeyExpression.Append( sCmd[lPos] );
+ } else if( sCmd[lPos] == ')' ){
+ if( iParenCtr > 0 ){
+ iParenCtr--;
+ sKeyExpression.Append( sCmd[lPos] );
+ } else {
+ bDone = xbTrue;
+ }
+ } else if( sCmd[lPos] == ',' ){
+ sKeyExpression.Append( '+' );
+ } else if( sCmd[lPos] != ' ' ){
+ sKeyExpression.Append( sCmd[lPos] );
+ }
+ lPos++;
+ }
+// std::cout << "Key Expression =[" << sKeyExpression << "]\n";
+ sCmd.Ltrunc( lPos );
+ sCmd.Trim();
+
+ xbBool bDesc = xbFalse;
+// std::cout << "sCmd - looking for DESC [" << sCmd << "]\n";
+ if( sCmd.Len() > 4 ){
+ sNode = sCmd;
+ sNode.ToUpperCase();
+ ulPos = sNode.Pos( "DESC" );
+ if( ulPos > 0 ){
+ bDesc = xbTrue;
+ sCmd.Ltrunc( 4 );
+ sCmd.Trim();
+ // std::cout << "Descending\n";
+ }
+ }
+
+// std::cout << "sCmd - looking for FILTER stuff [" << sCmd << "]\n";
+ xbString sFilter;
+ if( sCmd.Len() > 6 ){
+ sNode = sCmd;
+ sNode.ToUpperCase();
+ ulPos = sNode.Pos( "FILTER" );
+ if( ulPos > 0 ){
+ sFilter = sCmd;
+ sFilter.Ltrunc( ulPos + 7 );
+ sFilter.Trim();
+ }
+ }
+// std::cout << "sCmd - FILTER = [" << sFilter << "]\n";
+
+ #ifdef XB_LOCKING_SUPPORT
+ if(( iRc = dbf->LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc;
+ }
+ #endif // XB_LOCKING_SUPPORT
+
+// std::cout << "SqlCreateIndex() - ixtype = " << sIxType << "\n";
+
+ xbIx *pIx;
+ void *vpTag;
+
+ if(( iRc = dbf->CreateTag( sIxType, sIxName, sKeyExpression, sFilter, bDesc, bUnique, xbFalse, &pIx, &vpTag )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+// std::cout << "SqlCreateIndex() - back from tag create\n";
+ #ifdef XB_NDX_SUPPORT
+ if( sIxType == "NDX"){
+ sCmd.Ltrunc( ulPos );
+ sCmd.Trim();
+ if( sCmd.Len() > 0 ){
+ sCmd.ToUpperCase();
+ if( sCmd.Pos( "ASSOCIATE" )){
+ if(( iRc = dbf->AssociateIndex( "NDX", sIxName, 0 )) != XB_NO_ERROR ){
+ iErrorStop = 80;
+ throw iRc;
+ }
+ }
+ }
+ }
+ if( sIxType == "NDX"){
+ if(( iRc = pIx->Reindex( &vpTag )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ }
+ #endif // XB_NDX_SUPPORT
+
+ #ifdef XB_LOCKING_SUPPORT
+ if(( iRc = dbf->LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc;
+ }
+ #endif // XB_LOCKING_SUPPORT
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbSql::SqlCreateIndex() Exception Caught. Error Stop = [%d] rc = [%d] table = [%s]", iErrorStop, iRc, sTableName.Str() );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ dbf->LockTable( XB_UNLOCK );
+ #endif // XB_LOCKING_SUPPORT
+
+ return iRc;
+}
+
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_SQL_SUPPORT */
+
diff --git a/src/sql/xbcrtbl.cpp b/src/sql/xbcrtbl.cpp
new file mode 100755
index 0000000..4193d01
--- /dev/null
+++ b/src/sql/xbcrtbl.cpp
@@ -0,0 +1,256 @@
+/* xbcrtbl.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2019,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_SQL_SUPPORT
+
+namespace xb{
+
+
+/***********************************************************************/
+xbInt16 xbSql::SqlCreateTable( const xbString &sCmdLine ){
+
+
+ // std::cout << "CREATE TABLE " << sCmdLine << std::endl;
+
+ // expected format:
+ // CREATE TABLE tablename.dbf (Field1 CHAR(10), INTFLD1 INTEGER, ... )
+
+ // supported fields types
+ //
+ // SQL TYPE XBASE Field Type
+ // -------- ----------------
+ // SMALLINT NUMERIC(6,0)
+ // INTEGER NUMERIC(11,0)
+ // DECIMAL(x,y) NUMERIC(x+1,y)
+ // NUMERIC(x,y) NUMERIC(x,y)
+ // FLOAT(x,y) FLOAT(x,y)
+ // CHAR(n) CHARACTER(n)
+ // DATE DATE
+ // VARCHAR MEMO
+ // LOGICAL LOGICAL
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbString sTableName;
+ xbString sFieldName;
+ xbString sDataType;
+ xbString sAttrib1;
+ xbString sAttrib2;
+ xbString sLlEntry;
+ xbInt16 iType = 0;
+ xbInt16 iAttribCnt; // number of attributes for a given data type
+ xbString s;
+ xbUInt32 lPos = 0;
+ xbUInt32 lSpPos = 0; // space position
+ xbUInt32 lCmPos = 0; // comma position
+ xbUInt32 lLpPos = 0; // left paren position
+ xbLinkList<xbString> ll;
+ xbSchema *schema = NULL;
+ xbString sMsg;
+
+ try{
+ // retrieve table name
+ s.ExtractElement( sCmdLine, '(', 1, 0 );
+ sTableName.ExtractElement( s, ' ', 3, 0 );
+ sTableName.Trim();
+
+ // std::cout << "Tablename = [" << sTableName << "]\n";
+
+
+ // determine if it already exists
+ xbFile f( xbase );
+ f.SetFileName( sTableName );
+ if( f.FileExists() ){
+ iErrorStop = 10;
+ iRc = XB_FILE_EXISTS;
+ throw iRc;
+ }
+
+ // build out table structure with parms from the sql string
+ lPos = sCmdLine.Pos( '(' );
+ s = sCmdLine;
+ s.Ltrunc( lPos );
+ s.Trim();
+
+ // remove the last byte, should be a )
+ s.Remove( s.Len(), 1 );
+
+ s.Trim();
+ //std::cout << "s = [" << s << "]\n";
+
+
+ xbBool bDone = xbFalse;
+ xbInt16 iLoop = 0;
+ while( !bDone && iLoop++ < 255 ){
+ sFieldName.ExtractElement( s, ' ', 1 , 0 );
+ lPos = sFieldName.Len();
+ sFieldName.Trim();
+ if( sFieldName.Len() > 10 )
+ sFieldName.Mid( 1, 10 ); // shrink to 10 buytes if too big
+
+ //std::cout << "field name=[" << sFieldName << "]\n";
+ s.Ltrunc( lPos + 1 );
+ s.Ltrim();
+ //std::cout << "remainder after field name removed = [" << s << "]\n";
+
+ // Data type is delimited with either a space, comma or left paren
+ lPos = 9999999;
+ lSpPos = s.Pos( ' ' );
+ lCmPos = s.Pos( ',' );
+ lLpPos = s.Pos( '(' );
+ if( lSpPos != 0 ) lPos = lSpPos;
+ if( lCmPos != 0 && lCmPos < lPos ) lPos = lCmPos;
+ if( lLpPos != 0 && lLpPos < lPos ) lPos = lLpPos;
+
+ //sMsg.Sprintf( "SpPos=[%d] CmPos=[%d] LpPos=[%d] lPos=[%d]", lSpPos, lCmPos, lLpPos, lPos );
+ //std::cout << sMsg << "\n";
+
+ sDataType.Assign( s, 1, lPos-1 );
+
+ //std::cout << "DataType=[" << sDataType << "]\n";
+ if( sDataType == "CHAR" )
+ iAttribCnt = 1;
+ else if( sDataType == "DECIMAL" || sDataType == "NUMERIC" || sDataType == "FLOAT" )
+ iAttribCnt = 2;
+ else if( sDataType == "SMALLINT" || sDataType == "INTEGER" || sDataType == "DATE" || sDataType == "VARCHAR" || sDataType == "LOGICAL" )
+ iAttribCnt = 0;
+ else{
+ iErrorStop = 20;
+ iRc = XB_INVALID_FIELD_TYPE;
+ throw iRc;
+ }
+
+ sAttrib1 = "";
+ sAttrib2 = "0";
+
+ if( iAttribCnt == 0 ){
+ s.Ltrunc( sDataType.Len());
+
+ } else if( iAttribCnt > 0 ){
+ lPos = s.Pos( '(' );
+ if( lPos <= 0 ){
+ iErrorStop = 30;
+ iRc = XB_INVALID_FIELD_LEN;
+ throw iRc;
+ }
+ s.Ltrunc( lPos );
+ if( iAttribCnt == 1 )
+ lPos = s.Pos( ')' );
+ else
+ lPos = s.Pos( ',' );
+
+ sAttrib1.Assign( s, 1, lPos-1 );
+ sAttrib1.Trim();
+ s.Ltrunc( lPos );
+
+ if( iAttribCnt > 1 ){
+ lPos = s.Pos( ')' );
+ sAttrib2.Assign( s, 1, lPos-1 );
+ s.Ltrunc( lPos );
+ }
+ }
+
+ s.Ltrim();
+ s.ZapLeadingChar( ',' );
+ s.Ltrim();
+
+ if( sDataType == "CHAR" ){
+ iType = XB_CHAR_FLD;
+ } else if( sDataType == "DECIMAL" ){
+ xbInt32 lVal = atol( sAttrib1.Str()) + 1;
+ sAttrib1.Sprintf( "%d", lVal );
+ iType = XB_NUMERIC_FLD;
+ } else if( sDataType == "SMALLINT" ){
+ sAttrib1 = "6";
+ iType = XB_NUMERIC_FLD;
+ } else if( sDataType == "INTEGER" ){
+ sAttrib1 = "11";
+ iType = XB_NUMERIC_FLD;
+ } else if( sDataType == "NUMERIC" ){
+ iType = XB_NUMERIC_FLD;
+ } else if( sDataType == "FLOAT" ) {
+ iType = XB_FLOAT_FLD;
+ } else if( sDataType == "DATE" ){
+ iType = XB_DATE_FLD;
+ sAttrib1 = "8";
+ } else if( sDataType == "VARCHAR" ){
+ iType = XB_MEMO_FLD;
+ sAttrib1 = "10";
+ } else if( sDataType == "LOGICAL" ){
+ iType = XB_LOGICAL_FLD;
+ sAttrib1 = "1";
+ }
+ sLlEntry.Sprintf( "%s,%s,%c,%s,%s", sFieldName.Str(), sDataType.Str(), iType, sAttrib1.Str(), sAttrib2.Str());
+ ll.InsertAtEnd( sLlEntry );
+
+ if( s.Len() == 0 )
+ bDone = xbTrue;
+ }
+
+ schema = (xbSchema *) calloc( ll.GetNodeCnt()+1, sizeof( xbSchema ));
+ xbLinkListNode<xbString> * llN = ll.GetHeadNode();
+ xbUInt32 ulCnt = ll.GetNodeCnt();
+
+ char *pTrg;
+ for( xbUInt32 i = 0; i < ulCnt; i++ ){
+ s = llN->GetKey();
+ sFieldName.ExtractElement( s, ',', 1 , 0 );
+ pTrg = schema[i].cFieldName;
+ for( xbUInt32 j = 0; j < sFieldName.Len(); j++ )
+ *pTrg++ = sFieldName[j+1];
+ sDataType.ExtractElement( s, ',', 3, 0 );
+ schema[i].cType = sDataType[1];
+ sAttrib1.ExtractElement( s, ',', 4, 0 );
+ schema[i].iFieldLen = atoi( sAttrib1.Str());
+ sAttrib2.ExtractElement( s, ',', 5, 0 );
+ schema[i].iNoOfDecs = atoi( sAttrib2.Str());
+ llN = llN->GetNextNode();
+ }
+
+ // create the table
+ xbDbf * dbf = NULL;
+ #ifdef XB_DBF4_SUPPORT
+ dbf = new xbDbf4( xbase );
+ #elif XB_DBF3_SUPPORT
+ dbf = new xbDbf3( xbase );
+ #endif
+ if(( iRc = dbf->CreateTable( sTableName, "", schema, 0, XB_MULTI_USER )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+
+ free( schema );
+ ll.Clear();
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ if( sFieldName.Len() > 0 )
+ sMsg.Sprintf( "xbSql::SqlCreateTbl() Exception Caught. Error Stop = [%d] rc = [%d] table = [%s] field = [%s]", iErrorStop, iRc, sTableName.Str(), sFieldName.Str() );
+ else
+ sMsg.Sprintf( "xbSql::SqlCreateTbl() Exception Caught. Error Stop = [%d] rc = [%d] table = [%s]", iErrorStop, iRc, sTableName.Str() );
+
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( schema ) free( schema );
+ }
+ return iRc;
+}
+
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_SQL_SUPPORT */
+
diff --git a/src/sql/xbdrpix.cpp b/src/sql/xbdrpix.cpp
new file mode 100755
index 0000000..9e3bc3b
--- /dev/null
+++ b/src/sql/xbdrpix.cpp
@@ -0,0 +1,143 @@
+/* xbdrpix.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_SQL_SUPPORT
+
+namespace xb{
+
+
+/***********************************************************************/
+xbInt16 xbSql::SqlDropIndex( const xbString &sCmdLine ){
+
+ // std::cout << "DROP INDEX [" << sCmdLine << "]\n";
+
+ // expected format:
+ // DROP INDEX [IF EXISTS] ixname.ndx ON tablename.dbf
+
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbString sTableName;
+ xbString sIxName;
+ xbUInt32 ulPos;
+ xbString sCmd = sCmdLine;
+ xbString sNode;
+ xbBool bIfExists = xbFalse;
+ xbDbf * dbf = NULL;
+
+ try{
+
+ // drop off the first node "DROP"
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ // drop off the second node "INDEX"
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ sNode.ExtractElement( sCmd, ' ', 1, 0 );
+ sNode.Trim();
+ sNode.ToUpperCase();
+
+ if( sNode == "IF" ){
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+ sNode.ExtractElement( sCmd, ' ', 1, 0 );
+ sNode.Trim();
+ sNode.ToUpperCase();
+ if( sNode != "EXISTS" ){
+ iErrorStop = 10;
+ iRc = XB_SYNTAX_ERROR;
+ throw iRc;
+ } else {
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+ bIfExists = xbTrue;
+ }
+ }
+
+ // get the index name
+ sIxName.ExtractElement( sCmd, ' ', 1, 0 );
+ sIxName.Trim();
+
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ // go past "ON"
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ sTableName = sCmd;
+ sTableName.Trim();
+
+ xbFile fDbf( xbase );
+ fDbf.SetFileName( sTableName );
+
+ // if not open, attempt to open it
+ dbf = xbase->GetDbfPtr( fDbf.GetFqFileName());
+ if( !dbf ){
+ if(( iRc = xbase->OpenHighestVersion( sTableName, "", &dbf )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ if( dbf == NULL ){
+ iErrorStop = 40;
+ iRc = XB_FILE_NOT_FOUND;
+ throw iRc;
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ if(( iRc = dbf->LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+ #endif // XB_LOCKING_SUPPORT
+
+ iRc = dbf->DeleteTag( "NDX", sIxName );
+ if( iRc == XB_FILE_NOT_FOUND && !bIfExists ){
+ iErrorStop = 60;
+ throw( iRc );
+ } else if( iRc != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbSql::SqlDropIndex() Exception Caught. Error Stop = [%d] rc = [%d] table = [%s]", iErrorStop, iRc, sTableName.Str() );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ #ifdef XB_LOCKING_SUPPORT
+ dbf->LockTable( XB_UNLOCK );
+ #endif // XB_LOCKING_SUPPORT
+
+ return iRc;
+}
+
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_SQL_SUPPORT */
+
diff --git a/src/sql/xbdrptbl.cpp b/src/sql/xbdrptbl.cpp
new file mode 100755
index 0000000..e2cfa9d
--- /dev/null
+++ b/src/sql/xbdrptbl.cpp
@@ -0,0 +1,125 @@
+/* xbdrptbl.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_SQL_SUPPORT
+
+namespace xb{
+
+
+/***********************************************************************/
+xbInt16 xbSql::SqlDropTable( const xbString &sCmdLine ){
+
+ // std::cout << "DROP TABLE [" << sCmdLine << "]\n";
+ // expected format:
+ // DROP TABLE [IF EXISTS] tablename.dbf
+
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbString sTableName = "";
+ xbUInt32 ulPos = 0;
+ xbString sCmd = sCmdLine;
+ xbString sNode = "";
+ xbBool bIfExists = xbFalse;
+ xbDbf * dbf = NULL;
+
+ try{
+
+ // drop off the first node "DROP"
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ // drop off the second node "TABLE"
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ sNode.ExtractElement( sCmd, ' ', 1, 0 );
+ sNode.Trim();
+ sNode.ToUpperCase();
+
+ if( sNode == "IF" ){
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+ sNode.ExtractElement( sCmd, ' ', 1, 0 );
+ sNode.Trim();
+ sNode.ToUpperCase();
+ if( sNode != "EXISTS" ){
+ iErrorStop = 10;
+ iRc = XB_SYNTAX_ERROR;
+ throw iRc;
+ } else {
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+ bIfExists = xbTrue;
+ }
+ }
+
+ // get the table name
+ sTableName.ExtractElement( sCmd, ' ', 1, 0 );
+ sTableName.Trim();
+
+ xbFile fDbf( xbase );
+ fDbf.SetFileName( sTableName );
+
+ if( bIfExists && ! fDbf.FileExists())
+ return XB_NO_ERROR;
+
+ // if not open, attempt to open it
+ dbf = xbase->GetDbfPtr( fDbf.GetFqFileName());
+
+ if( !dbf ){
+ dbf = xbase->Open( sTableName, iRc );
+ if( iRc != XB_NO_ERROR ){
+ if( iRc == XB_FILE_NOT_FOUND && bIfExists ){
+ return XB_NO_ERROR;
+ } else {
+ iErrorStop = 20;
+ throw iRc;
+ }
+ }
+ }
+ if( dbf == NULL ){
+ iErrorStop = 40;
+ iRc = XB_OPEN_ERROR;
+ throw iRc;
+ }
+
+ if(( dbf->DeleteTable()) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+
+ }
+
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbSql::SqlDropTable() Exception Caught. Error Stop = [%d] rc = [%d] table = [%s]", iErrorStop, iRc, sTableName.Str() );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ return iRc;
+}
+
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_SQL_SUPPORT */
+
diff --git a/src/sql/xbinsert.cpp b/src/sql/xbinsert.cpp
new file mode 100755
index 0000000..1095202
--- /dev/null
+++ b/src/sql/xbinsert.cpp
@@ -0,0 +1,190 @@
+/* xbinsert.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_SQL_SUPPORT
+
+namespace xb{
+
+
+/***********************************************************************/
+xbInt16 xbSql::SqlInsert( const xbString &sCmdLine ){
+
+ // expected format:
+ // INSERT INTO tablename (field1, field2, field3,...) VALUES ( 'charval', numval, 'what is the correct odbc date format to use? CCYYMMDD');
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbString sTableName;
+ xbDbf * dbf = NULL;
+
+ xbString sWork1;
+ xbString sFieldList;
+ xbString sDataList;
+ xbString sFieldName;
+ xbString sFieldData;
+
+ // queue the memo data to post after the append occurs
+ // dbase does not support usage of memo fields with insert commands
+ xbLinkList <xbInt16> llMemoFieldNos;
+ xbLinkList <xbString> llMemoFieldData;
+
+ try{
+ // retrieve table name
+ sTableName.ExtractElement( sCmdLine, ' ', 3, 0 );
+ sTableName.Trim();
+
+ // if not open, attempt to open it
+ dbf = xbase->GetDbfPtr( sTableName );
+
+ if( !dbf ){
+ if(( iRc = xbase->OpenHighestVersion( sTableName, "", &dbf )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+
+ if( !dbf ){
+ iErrorStop = 20;
+ iRc = XB_FILE_NOT_FOUND;
+ throw iRc;
+ }
+
+ // blank the record buffer
+ dbf->BlankRecord();
+
+ sWork1.ExtractElement( sCmdLine, ')', 1, 0 );
+ sFieldList.ExtractElement( sWork1, '(', 2, 0 );
+
+ sDataList.ExtractElement( sCmdLine, '(', 3, 0 );
+ sDataList.Trim();
+ sDataList.ZapTrailingChar( ')' );
+
+ xbUInt32 iFldCnt = sFieldList.CountChar( ',' );
+ xbUInt32 iDataCnt = sDataList.CountChar( ',', 1 );
+
+ // verify there are the same count in the field list and values list
+ if( iFldCnt != iDataCnt ){
+ iErrorStop = 30;
+ iRc = XB_SYNTAX_ERROR;
+ throw iRc;
+ }
+
+ iFldCnt++;
+ xbInt16 iFldNo = -1;
+ char cFldType = 0x00;
+ for( xbUInt32 i = 1; i <= iFldCnt; i++ ){
+ sFieldName.ExtractElement( sFieldList, ',', i, 0 );
+ sFieldName.Trim();
+ if(( iRc = dbf->GetFieldNo( sFieldName, iFldNo )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc;
+ }
+ if(( iRc = dbf->GetFieldType( iFldNo, cFldType )) != XB_NO_ERROR ){
+ iErrorStop = 50;
+ throw iRc;
+ }
+
+ // get the field data here
+ sFieldData.ExtractElement( sDataList, ',', i, 1 );
+ sFieldData.Trim();
+
+ // remove beginning and ending quotes
+ if(( sFieldData[1] == '\'' && sFieldData[sFieldData.Len()] == '\'') || (sFieldData[1] == '"' && sFieldData[sFieldData.Len()] == '"' )){
+ sFieldData.Remove( sFieldData.Len(), 1 );
+ sFieldData.Remove( 1, 1 );
+ }
+
+ switch( cFldType ){
+ case 'C':
+ case 'N':
+ case 'L':
+ if(( iRc = dbf->PutField( iFldNo, sFieldData )) != XB_NO_ERROR ){
+ iErrorStop = 100;
+ throw iRc;
+ }
+ break;
+
+ case 'D':
+ // assumes input date format of yyyy-mm-dd
+ if( sFieldData.Len() != 10 || sFieldData[5] != '-' || sFieldData[8] != '-' ){
+ iErrorStop = 110;
+ iRc = XB_INVALID_DATA;
+ throw iRc;
+ }
+ sWork1 = sFieldData;
+ sWork1.Remove( 8, 1 );
+ sWork1.Remove( 5, 1 );
+ if(( iRc = dbf->PutField( iFldNo, sWork1 )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc;
+ }
+ break;
+
+ case 'M':
+ llMemoFieldNos.InsertAtFront( iFldNo );
+ llMemoFieldData.InsertAtFront( sFieldData );
+ break;
+
+ default:
+ iErrorStop= 150;
+ iRc = XB_INVALID_FIELD_TYPE;
+ throw iRc;
+ }
+ }
+
+ if(( iRc = dbf->AppendRecord()) != XB_NO_ERROR ){
+ iErrorStop = 300;
+ throw iRc;
+ }
+
+ // Add any memo fields
+ xbLinkListNode<xbInt16> * llN = llMemoFieldNos.GetHeadNode();
+ xbLinkListNode<xbString> * llD = llMemoFieldData.GetHeadNode();
+ xbUInt32 ulCnt = llMemoFieldNos.GetNodeCnt();
+ for( xbUInt32 i = 0; i < ulCnt; i++ ){
+ iFldNo = llN->GetKey();
+ sFieldData = llD->GetKey();
+ if(( iRc = dbf->UpdateMemoField( iFldNo, sFieldData )) != XB_NO_ERROR ){
+ iErrorStop = 400;
+ throw iRc;
+ }
+ llN = llN->GetNextNode();
+ llD = llD->GetNextNode();
+ }
+
+ if(( iRc == dbf->Commit()) != XB_NO_ERROR ){
+ iErrorStop = 500;
+ throw iRc;
+ }
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ xbase->WriteLogMessage( sCmdLine );
+ sMsg.Sprintf( "xbSql::SqlInsert() Exception Caught. Error Stop = [%d] rc = [%d] table = [%s] field = [%s] data = [%s]", iErrorStop, iRc, sTableName.Str(), sFieldName.Str(), sFieldData.Str() );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ if( dbf )
+ dbf->Abort();
+ }
+ return iRc;
+
+}
+
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_SQL_SUPPORT */
+
diff --git a/src/sql/xbset.cpp b/src/sql/xbset.cpp
new file mode 100755
index 0000000..98de309
--- /dev/null
+++ b/src/sql/xbset.cpp
@@ -0,0 +1,91 @@
+/* xbset.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_SQL_SUPPORT
+
+namespace xb{
+
+
+/***********************************************************************/
+xbInt16 xbSql::SqlSet( const xbString &sCmdLine ){
+
+ // std::cout << "SET [" << sCmdLine << "]\n";
+ // expected format:
+ // SET ATTRIBUTE = DATAVALUE
+ // SET ATTRIBUTE = ^ (to delete an entry)
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbUInt32 ulPos;
+
+ try{
+
+ xbString sCmd = sCmdLine;
+ sCmd.Trim();
+ sCmd.ZapTrailingChar( ';' );
+ sCmd.Trim();
+
+ // drop off the first node "SET"
+ ulPos = sCmd.Pos( ' ' );
+ sCmd.Ltrunc( ulPos );
+ sCmd.Ltrim();
+
+ xbString sNode1 = sCmd;
+ sNode1.ToUpperCase();
+
+ if( sNode1 == "SET" ) {
+ uda.DumpUda();
+
+ } else {
+
+ xbString sKey;
+ sKey.ExtractElement( sCmd, '=', 1, 0 );
+ sKey.Trim();
+
+ xbString sToken;
+ sToken.ExtractElement( sCmd, '=', 2, 0 );
+ sToken.Trim();
+
+
+ if( sToken == '^' ){
+ if(( iRc = uda.DelTokenForKey( sKey )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ } else {
+ if(( iRc = uda.UpdTokenForKey( sKey, sToken )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ throw iRc;
+ }
+ }
+ }
+
+ }
+ catch (xbInt16 iRc ){
+ xbString sMsg;
+ sMsg.Sprintf( "xbSql::SqlSet() Exception Caught. Error Stop = [%d] rc = [%d]", iErrorStop, iRc );
+ xbase->WriteLogMessage( sMsg.Str() );
+ xbase->WriteLogMessage( GetErrorMessage( iRc ));
+ }
+
+ return iRc;
+}
+
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_SQL_SUPPORT */
+
diff --git a/src/sql/xbsql.cpp b/src/sql/xbsql.cpp
new file mode 100755
index 0000000..25cd2c8
--- /dev/null
+++ b/src/sql/xbsql.cpp
@@ -0,0 +1,143 @@
+/* xbsql.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef XB_SQL_SUPPORT
+
+namespace xb{
+
+/***********************************************************************/
+xbSql::xbSql( xbXBase *x ){
+ xbase = x;
+ xbString sIxType;
+
+ #ifdef XB_MDX_SUPPORT
+ sIxType = "MDX";
+ #endif
+
+ #ifdef XB_NDX_SUPPORT
+ if( sIxType == "" )
+ sIxType = "NDX";
+ #endif
+
+ if( sIxType != "" )
+ uda.AddTokenForKey( "IXTYPE", sIxType );
+
+}
+/***********************************************************************/
+xbSql::~xbSql(){
+}
+
+/***********************************************************************/
+xbInt16 xbSql::ExecuteNonQuery( const xbString &sCmdLine ) {
+
+// std::cout << "\n\n\nExecute() " << sCmdLine.Str() << "\n";
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbString sCmd = sCmdLine;
+
+ sCmd.Trim();
+ xbString sNode1;
+ sNode1.ExtractElement( sCmd.Str(), ' ', 1, 0 );
+ sNode1.ToUpperCase();
+ sNode1.Trim();
+
+// std::cout << "node 1 = " << sNode1.Str() << std::endl;
+
+ if( sNode1 == "CREATE" ){
+
+ xbString sNode2;
+ sNode2.ExtractElement( sCmd.Str(), ' ', 2, 0 );
+ sNode2.ToUpperCase();
+ sNode2.Trim();
+ if( sNode2 == "TABLE" )
+ iRc = SqlCreateTable( sCmd );
+ else if( sNode2 == "INDEX" || sNode2 == "UNIQUE" )
+ iRc = SqlCreateIndex( sCmd );
+
+ else
+ iRc = XB_INVALID_FUNCTION;
+
+ } else if( sNode1 == "DROP" ){
+
+ xbString sNode2;
+ sNode2.ExtractElement( sCmd.Str(), ' ', 2, 0 );
+ sNode2.ToUpperCase();
+ sNode2.Trim();
+
+ if( sNode2 == "TABLE" )
+ iRc = SqlDropTable( sCmd );
+
+ else if( sNode2 == "INDEX" )
+ iRc = SqlDropIndex( sCmd );
+
+ } else if( sNode1 == "HELP" )
+ SqlHelp();
+
+ else if( sNode1 == "INSERT" ){
+
+ iRc = SqlInsert( sCmd );
+
+ // else if( sNode1 == "UPDATE" )
+ // iRc = SqlUpdate( sCmd );
+ }
+ else if( sNode1 == "USE" )
+ iRc = SqlUse( sCmd );
+
+ else if( sNode1 == "SET" )
+ iRc = SqlSet( sCmd );
+
+ else
+ return XB_INVALID_FUNCTION;
+
+ return iRc;
+}
+
+/***********************************************************************/
+xbXBase *xbSql::GetXbasePtr() const {
+ return xbase;
+}
+
+
+/***********************************************************************/
+void xbSql::SqlHelp() const {
+ std::cout << "************************" << std::endl;
+ std::cout << "Valid XBase SQL commands" << std::endl << std::endl;
+ std::cout << "HELP" << std::endl;
+ std::cout << "USE /dir/to/dbf/tables" << std::endl;
+ std::cout << "CREATE TABLE" << std::endl << std::endl << std::endl;
+}
+
+/***********************************************************************/
+xbInt16 xbSql::SqlUse( const xbString &sCmdLine ){
+
+ xbString sNode2;
+ sNode2.ExtractElement( sCmdLine.Str(), ' ', 2, 0 );
+ sNode2.Trim();
+ xbase->SetDataDirectory( sNode2 );
+// std::cout << "USE " << sNode2 << std::endl;
+ return XB_NO_ERROR;
+}
+
+/***********************************************************************/
+/***********************************************************************/
+/***********************************************************************/
+/***********************************************************************/
+/***********************************************************************/
+
+/***********************************************************************/
+} /* namespace */
+#endif /* XB_SQL_SUPPORT */
diff --git a/src/tests/tstfuncs.cpp b/src/tests/tstfuncs.cpp
new file mode 100755
index 0000000..c499d3f
--- /dev/null
+++ b/src/tests/tstfuncs.cpp
@@ -0,0 +1,581 @@
+/* tstfuncs.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+time_t timer;
+
+xbDouble ChronTime();
+void InitTime();
+
+xbBool dblEquals( xbDouble a, xbDouble b, xbDouble epsilon );
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, const xbString &result, const char * expectedResult, size_t expectedLen );
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, char result, char expectedResult );
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbInt32 result, xbInt32 expectedResult );
+//xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbUInt32 result, xbUInt32 expectedResult );
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbUInt64 result, xbUInt64 expectedResult );
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbFloat result, xbFloat expectedResult );
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbDouble result, xbDouble expectedResult );
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbDouble result, xbDouble expectedResult, xbDouble dEpsilon );
+
+
+xbInt16 FileCompare( xbXBase &x, xbInt16 iPo, const xbString &sFile1, const xbString &sFile2, const xbString &sSkipBytes );
+
+
+#ifdef XB_LOCKING_SUPORT
+xbInt16 SetCmd( xbXBase &x, const xbString &sFileName, const xbString &sCmd, const char cSrc, xbInt16 iPo );
+xbInt16 GetCmd( xbXBase &x, const xbString &sFileName, xbString &sCmd, const char cSrc, xbInt16 iPo );
+#endif
+
+#if defined( XB_DBF4_SUPPORT ) && defined( XB_MEMO_SUPPORT )
+
+xbInt16 TestDbt4Method( xbInt16 PrintOption, const char * title, xbMemo * m, xbUInt32 ulHdrNext, xbUInt32 ulBlockCnt, xbString sNodeChain );
+xbInt16 TestDbt4Method( xbInt16 PrintOption, const char * title, xbMemo * m, xbUInt32 ulHdrNext, xbUInt32 ulBlockCnt, xbString sNodeChain ){
+
+ xbUInt32 ulLastDataBlock = 0L;
+ xbUInt32 ulHdrNextBlock = 0L;
+ xbInt16 iRc = 0;
+
+ iRc = m->GetHdrNextBlock( ulHdrNextBlock );
+ if( iRc != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 1] " << title << std::endl;
+ std::cout << "Error [" << iRc << "] in GetHdrNextBlock" << std::endl;
+ return -1;
+ }
+
+ iRc = m->CalcLastDataBlock( ulLastDataBlock );
+ if( iRc != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 2] " << title << std::endl;
+ std::cout << "Error [" << iRc << "] in CalcLastDataBlock" << std::endl;
+ return -1;
+ }
+
+ if( ulHdrNext > 0 ){
+ if( ulHdrNextBlock != ulHdrNext ){
+ std::cout << std::endl << "[FAIL 3] " << title << std::endl;
+ std::cout << "Expected Header Next Block = [" << ulHdrNext << "] Actual = [" << ulHdrNextBlock << "]" << std::endl;
+ return -1;
+ }
+ if( PrintOption == 2 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[PASS][%3.4f] %s Expected matches actual Len=[%ld] Data=[%lds]\n",
+ ChronTime(), title, ulHdrNextBlock, ulHdrNext );
+ std::cout << sMsg.Str();
+ // std::cout << "[PASS][" << ChronTime() << "] " << title << " Expected matches actual HdrBlock=[" << ulHdrNextBlock << "] Data=[" << ulHdrNext << "]" << std::endl;
+ } else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ }
+
+ if( ulBlockCnt > 0 ){
+ if( ulLastDataBlock != ulBlockCnt ){
+ std::cout << std::endl << "[FAIL 4] " << title << std::endl;
+ std::cout << "Expected Block Count = [" << ulBlockCnt << "] Actual = [" << ulLastDataBlock << "]" << std::endl;
+ return -1;
+ }
+ if( PrintOption == 2 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[PASS][%3.4f] %s Expected matches actual Len=[%ld] Data=[%lds]\n",
+ ChronTime(), title, ulLastDataBlock, ulBlockCnt );
+ std::cout << sMsg.Str();
+ // std::cout << "[PASS][" << ChronTime() << "] " << title << " Expected matches actual LastBlock=[" << ulLastDataBlock << "] Data=[" << ulBlockCnt << "]" << std::endl;
+ } else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ }
+
+ #ifdef XB_DEBUG_SUPPORT
+ xbMemoDbt4 *m4 = (xbMemoDbt4 *) m;
+ if( sNodeChain != "-1" ){
+ xbUInt32 ulNode = ulHdrNextBlock;
+ xbUInt32 ulNextBlock;
+ xbUInt32 ulFreeBlockCnt;
+ xbString sActualNodeChain;
+
+ while( ulNode < ulLastDataBlock ){
+ iRc = m4->ReadFreeBlockHeader( ulNode, ulNextBlock, ulFreeBlockCnt );
+ if( iRc != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 5] " << title << std::endl;
+ std::cout << "Error [" << iRc << "] in CalcLastDataBlock" << std::endl;
+ return -1;
+ }
+ if( sActualNodeChain != "" )
+ sActualNodeChain += ",";
+ sActualNodeChain.Sprintf( "%s%ld,%ld,%ld", sActualNodeChain.Str(), ulNode, ulFreeBlockCnt, ulNextBlock );
+ ulNode = ulNextBlock;
+ }
+ if( sNodeChain != sActualNodeChain ){
+ std::cout << std::endl << "[FAIL 6] " << title << std::endl;
+ std::cout << "Expected Block Chain = [" << sNodeChain.Str() << "] Actual = [" << sActualNodeChain.Str() << "]" << std::endl;
+ return -1;
+ }
+ if( PrintOption == 2 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[PASS][%3.4f] %s Expected matches actual Len=[%d] Data=[%s]\n", ChronTime(), title, sNodeChain.Str() );
+ std::cout << sMsg.Str();
+ //std::cout << "[PASS][" << ChronTime() << "] " << title << " Expected matches actual BlockChain=[" << sNodeChain.Str() << "]" << std::endl;
+ } else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ }
+ #endif // XB_DEBUG_SUPPORT"
+
+ return 0;
+}
+#endif
+
+
+
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, const xbString &sResult, const char * expectedResult, size_t expectedLen ){
+ xbInt16 rc = 0;
+
+ if( sResult == expectedResult && sResult.Len() == expectedLen ){
+ if( PrintOption == 2 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[PASS][%3.4f] %s Expected matches actual Len=[%d] Data=[%s]\n", ChronTime(), title, expectedLen, expectedResult );
+ std::cout << sMsg.Str();
+ } else if( PrintOption == 1 ) {
+ std::cout << "[PASS] " << title << std::endl;
+ }
+ } else {
+ std::cout << std::endl << "[FAIL 1] " << title << std::endl;
+ std::cout << " Expected Len = [" << expectedLen << "] Expected Data = [" << expectedResult << "]" << std::endl;
+ std::cout << " Actual Len = [" << sResult.Len() << "] Actual Data = [" << sResult.Str() << "]" << std::endl;
+
+ if( sResult.Len() == expectedLen )
+ printf( "lengths match\n" );
+ else
+ printf( "lengths dont match\n" );
+
+ if( sResult == expectedResult )
+ printf( "result matches\n" );
+ else
+ printf( "result does not match\n" );
+
+ rc = -1;
+ }
+ return rc;
+}
+
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, char result, char expectedResult ){
+ xbInt16 rc = 0;
+ if( result == expectedResult ){
+ if( PrintOption == 2 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[PASS][%3.4f] %s Expected matches actual Data=[%c]\n", ChronTime(), title, expectedResult );
+ std::cout << sMsg.Str();
+ // std::cout << "[PASS][" << ChronTime() << "] " << title << " Expected matches actual Data=[" << expectedResult << "]" << std::endl;
+ } else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ rc = 0;
+ } else {
+ std::cout << std::endl << "[FAIL 2] " << title << std::endl;
+ std::cout << " Expected Data = [" << expectedResult << "]" << std::endl;
+ std::cout << " Actual Data = [" << result << "]" << std::endl;
+ rc = -1;
+ }
+ return rc;
+}
+
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbInt32 result, xbInt32 expectedResult ){
+ xbInt16 rc = 0;
+ if( result == expectedResult ){
+ if( PrintOption == 2 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[PASS][%3.4f] %s Expected matches actual Data=[%d]\n", ChronTime(), title, expectedResult );
+ std::cout << sMsg.Str();
+ // std::cout << "[PASS][" << ChronTime() << "] " << title << " Expected matches actual Data=[" << expectedResult << "]" << std::endl;
+ } else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ rc = 0;
+ } else {
+ std::cout << std::endl << "[FAIL 3] " << title << std::endl;
+ std::cout << " Expected Data = [" << expectedResult << "]" << std::endl;
+ std::cout << " Actual Data = [" << result << "]" << std::endl;
+ rc = -1;
+ }
+ return rc;
+}
+
+
+/*
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbUInt32 result, xbUInt32 expectedResult ){
+ xbInt16 rc = 0;
+ if( result == expectedResult ){
+ if( PrintOption == 2 )
+ std::cout << "[PASS][" << ChronTime() << "] " << title << " Expected matches actual Data=[" << expectedResult << "]" << std::endl;
+ else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ rc = 0;
+ } else {
+ std::cout << std::endl << "[FAIL 3] " << title << std::endl;
+ std::cout << " Expected Data = [" << expectedResult << "]" << std::endl;
+ std::cout << " Actual Data = [" << result << "]" << std::endl;
+ rc = -1;
+ }
+ return rc;
+}
+*/
+
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbUInt64 result, xbUInt64 expectedResult ){
+ xbInt16 rc = 0;
+ if( result == expectedResult ){
+ if( PrintOption == 2 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[PASS][%f] %3.4s Expected matches actual Data=[%ld]\n", ChronTime(), title, expectedResult );
+ std::cout << sMsg.Str();
+ // std::cout << "[PASS][" << ChronTime() << "] " << title << " Expected matches actual Data=[" << expectedResult << "]" << std::endl;
+ } else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ rc = 0;
+ } else {
+ std::cout << std::endl << "[FAIL 4] " << title << std::endl;
+ std::cout << " Expected Data = [" << expectedResult << "]" << std::endl;
+ std::cout << " Actual Data = [" << result << "]" << std::endl;
+ rc = -1;
+ }
+ return rc;
+}
+
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbFloat result, xbFloat expectedResult ){
+ xbInt16 rc = 0;
+ if( result == expectedResult ){
+ if( PrintOption == 2 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[PASS][%f] %3.4s Expected matches actual Data=[%f]\n", ChronTime(), title, expectedResult );
+ std::cout << sMsg.Str();
+ // std::cout << "[PASS][" << ChronTime() << "] " << title << " Expected matches actual Data=[" << expectedResult << "]" << std::endl;
+ } else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ rc = 0;
+ } else {
+ std::cout << std::endl << "[FAIL 5] " << title << std::endl;
+ std::cout << " Expected Data = [" << expectedResult << "]" << std::endl;
+ std::cout << " Actual Data = [" << result << "]" << std::endl;
+ rc = -1;
+ }
+ return rc;
+}
+
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbDouble result, xbDouble expectedResult ){
+ xbInt16 rc = 0;
+ if( result == expectedResult ){
+ // if( dblEquals( result, expectedResult ) == 0 ){
+ if( PrintOption == 2 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[PASS][%3.4f] %s Expected matches actual Data=[%f]\n", ChronTime(), title, expectedResult );
+ std::cout << sMsg.Str();
+ //std::cout << "[PASS][" << ChronTime() << "] " << title << " Expected matches actual Data=[" << expectedResult << "]" << std::endl;
+ } else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ rc = 0;
+ } else {
+ std::cout << std::endl << "[FAIL 6] " << title << std::endl;
+ std::cout << " Expected Data = [" << expectedResult << "]" << std::endl;
+ std::cout << " Actual Data = [" << result << "]" << std::endl;
+ rc = -1;
+ }
+ return rc;
+}
+
+
+// next three routines used to do a compare on double values
+xbDouble dblMax( xbDouble a, xbDouble b ){
+ if( a > b )
+ return a;
+ else
+ return b;
+}
+xbDouble dblMin( xbDouble a, xbDouble b ){
+ if( a < b )
+ return a;
+ else
+ return b;
+}
+xbBool dblEquals( xbDouble a, xbDouble b, xbDouble epsilon = 0.0001 ){
+
+ // std::cout << "a=[" << a << "] b=[ " << b << "] dblmax [" << dblAbsMax( a, b ) << "] min [" << dblAbsMin( a, b ) << "]\n";
+ if( a < 0 && b >= 0 )
+ return xbFalse;
+ else if( a >= 0 && b < 0 )
+ return xbFalse;
+ if( (dblMax( a ,b ) - dblMin( a, b )) < epsilon )
+ return xbTrue;
+ else
+ {
+// std::cout << "no match a=[" << a << "] b=[" << b << "] dblmax [" << dblAbsMax( a, b ) << "] min [" << dblAbsMin( a, b ) << "]\n";
+ return xbFalse;
+ }
+}
+
+xbInt16 TestMethod( xbInt16 PrintOption, const char * title, xbDouble result, xbDouble expectedResult, xbDouble dEpsilon ){
+ xbInt16 rc;
+ if( dblEquals( result, expectedResult, dEpsilon ) == xbTrue ){
+ if( PrintOption == 2 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[PASS][%3.4f] %s Expected matches actual Data=[%f]\n", ChronTime(), title, expectedResult );
+ std::cout << sMsg.Str();
+ //std::cout << "[PASS][" << ChronTime() << "] " << title << " Expected matches actual Data=[" << expectedResult << "]" << std::endl;
+ } else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ rc = 0;
+ } else {
+ std::cout << std::endl << "[FAIL 6] " << title << std::endl;
+ std::cout << " Expected Data = [" << expectedResult << "]" << std::endl;
+ std::cout << " Actual Data = [" << result << "]" << std::endl;
+ rc = -1;
+ }
+ return rc;
+}
+
+
+#ifdef XB_LOCKING_SUPPORT
+
+xbInt16 GetCmd( xbXBase &x, const xbString &sFileName, xbString &sCmd, const char cSrc, xbInt16 iPo ){
+ xbInt16 iTryCnt = 0;
+ xbInt16 iMaxTries = 10;
+ char cInBuf[256];
+ FILE *f;
+ xbBool bDone = xbFalse;
+ xbString sMsg;
+
+ while( !bDone && iTryCnt < iMaxTries ){
+
+ #ifdef HAVE__FSOPEN_F
+ // 0x40 is SH_DENYNO or _SH_DENYNO
+ if(( f = _fsopen( sFileName.Str(), "r", 0x40 )) == NULL){
+ sMsg.Sprintf( "GetCmd _fsopen() error opening [%s]", sFileName.Str() );
+ x.WriteLogMessage( sMsg );
+ std::cout << sMsg.Str() << "\n";
+ x.xbSleep( 250 );
+ iTryCnt++;
+ }
+
+ #else
+
+ if(( f = fopen( sFileName.Str(), "r" )) == NULL ){
+ sMsg.Sprintf( "GetCmd fopen() error opening [%s]", sFileName.Str() );
+ x.WriteLogMessage( sMsg );
+ std::cout << sMsg.Str() << "\n";
+ x.xbSleep( 250 );
+ iTryCnt++;
+ }
+ #endif
+
+ else {
+ memset( cInBuf, 0x00, 256 );
+ fgets( cInBuf, 256, f );
+ fclose( f );
+ sCmd = cInBuf;
+ if( sCmd != "" )
+ bDone = xbTrue;
+ else{
+ x.xbSleep( 250 );
+ }
+ }
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ if( iPo > 0 ){
+ sMsg.Sprintf( "[%c] GetCmd [%s]", cSrc, sCmd.Str());
+ x.WriteLogMessage( sMsg );
+ x.FlushLog();
+ }
+ #endif
+
+ if( iTryCnt >= iMaxTries )
+ return -1;
+ else
+ return 0;
+}
+
+xbInt16 SetCmd( xbXBase &x, const xbString &sFileName, const xbString &sCmd, const char cSrc, xbInt16 iPo ){
+
+ xbInt16 iTryCnt = 0;
+ FILE *f;
+ xbBool bDone = xbFalse;
+
+ #ifdef XB_LOGGING_SUPPORT
+ if( iPo > 0 ){
+ xbString sMsg;
+ sMsg.Sprintf( "[%c] SetCmd [%s] FileName [%s]", cSrc, sCmd.Str(), sFileName.Str());
+ x.WriteLogMessage( sMsg );
+ x.FlushLog();
+ }
+ #endif
+
+ while( !bDone && iTryCnt < 10 ){
+
+ #ifdef HAVE__FSOPEN_F
+ // 0x40 is SH_DENYNO or _SH_DENYNO
+ if(( f = _fsopen( sFileName.Str(), "r", 0x40 )) == NULL){
+ x.xbSleep( 250 );
+ iTryCnt++;
+ }
+
+ #else
+ if(( f = fopen( sFileName.Str(), "w" )) == NULL ){
+ x.xbSleep( 250 );
+ iTryCnt++;
+ }
+ #endif
+
+ else {
+ fputs( sCmd.Str(), f );
+ fflush( f );
+ fclose( f );
+ bDone = xbTrue;
+ }
+ }
+ if( iTryCnt == 10 )
+ return -1;
+ else{
+ x.xbSleep( 250 );
+ return 0;
+ }
+}
+
+
+
+#endif
+void InitTime(){
+ time( &timer );
+}
+
+
+xbDouble ChronTime(){
+ time_t tWork = timer;
+ time( &timer );
+ return difftime( timer, tWork );
+
+}
+
+
+
+xbInt16 FileCompare( xbXBase &x, xbInt16 iPo, const xbString &sFile1, const xbString &sFile2, const xbString &sSkipBytes ){
+
+/*
+ iPo print option
+ sFile1 - File 1
+ sFile2 - File 2
+ sSkipBytes - comma separated list of bytes to skip the compare on
+*/
+
+ xbInt16 iRc = 0;
+ xbInt16 iErrorStop = 0;
+ xbInt16 iErrorCnt = 0;
+ xbFile f1( &x );
+ xbFile f2( &x );
+ xbString sMsg;
+ char c1;
+ char c2;
+
+ if( iPo > 0 ){
+ std::cout << "FileCompare\n";
+ std::cout << "Skip bytes = " << sSkipBytes.Str() << std::endl;
+ std::cout << sFile1.Str() << std::endl;
+ std::cout << sFile2.Str() << std::endl;
+ }
+
+ xbLinkListOrd<xbInt32> llO;
+ llO.SetDupKeys( 0 );
+ if( sSkipBytes.Len() > 0 ){
+ xbString sNode;
+ xbUInt32 iCommaCnt = sSkipBytes.CountChar( ',' );
+ for( xbUInt32 i = 0; i < (iCommaCnt+1); i++ ){
+ sNode.ExtractElement( sSkipBytes, ',', i+1, 0 );
+ //std::cout << "Adding key = " << atol( sNode.Str()) << std::endl;
+ llO.InsertKey( atol( sNode.Str()));
+ }
+ }
+
+ xbInt32 iPos = 0;
+ try{
+
+ if(( iRc = f1.xbFopen( "r", sFile1, XB_SINGLE_USER )) != XB_NO_ERROR ){
+ iErrorStop = 10;
+ iErrorCnt++;
+ throw iRc;
+ }
+
+ if(( iRc = f2.xbFopen( "r", sFile2, XB_SINGLE_USER )) != XB_NO_ERROR ){
+ iErrorStop = 20;
+ iErrorCnt++;
+ throw iRc;
+ }
+
+ xbUInt64 uiFs1;
+ xbUInt64 uiFs2;
+
+ if(( iRc = f1.GetFileSize( uiFs1 )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ iErrorCnt++;
+ throw iRc;
+ }
+
+ if(( iRc = f2.GetFileSize( uiFs2 )) != XB_NO_ERROR ){
+ iErrorStop = 40;
+ iErrorCnt++;
+ throw iRc;
+ }
+
+ // std::cout << "file size " << uiFs1 << " " << uiFs2 << "\n";
+
+ f1.xbRewind();
+ f2.xbRewind();
+
+ while( !f1.xbFeof() && !f2.xbFeof()){
+ f1.xbFgetc( c1 );
+ f2.xbFgetc( c2 );
+ if( c1 != c2 ){
+ if( !llO.KeyExists( iPos )){
+ iErrorCnt++;
+ if( iPo > 0 ){
+ sMsg.Sprintf( "Diff %ld %x %x\n", iPos, c1, c2 );
+ std::cout << sMsg.Str();
+ }
+ }
+ }
+ iPos++;
+ }
+ }
+
+ catch( xbInt16 ){
+ if( iPo > 0 ){
+ std::cout << "File Compare Error Count = " << iErrorCnt << std::endl;
+
+ switch( iErrorStop ){
+ case 10:
+ std::cout << "Error opening file = " << sFile1.Str() << std::endl;
+ break;
+ case 20:
+ std::cout << "Error opening file = " << sFile2.Str() << std::endl;
+ break;
+ case 30:
+ std::cout << "GetFileSize() error " << sFile1.Str() << std::endl;
+ break;
+ case 40:
+ std::cout << "GetFileSize() error " << sFile2.Str() << std::endl;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ if( f1.FileIsOpen() )
+ f1.xbFclose();
+ if( f1.FileIsOpen() )
+ f1.xbFclose();
+
+ return iRc;
+}
+
+
diff --git a/src/tests/xb_test_bcd.cpp b/src/tests/xb_test_bcd.cpp
new file mode 100755
index 0000000..1eab20f
--- /dev/null
+++ b/src/tests/xb_test_bcd.cpp
@@ -0,0 +1,128 @@
+/* xb_test_bcd.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2017,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the xb bcd functions
+// usage: xb_test_expnode QUITE|NORMAL|VERBOSE
+
+#include "xbase.h"
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+/**************************************************************************/
+
+int main( int argCnt, char **av )
+{
+
+ #ifdef XB_INDEX_SUPPORT
+
+ xbInt16 iRc = 0;
+ xbInt16 iPo = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ iPo = 0;
+ else if( av[1][0] == 'V' )
+ iPo = 2;
+ }
+
+
+ xbXBase x;
+
+ #ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( iPo ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+
+
+ if( iPo > 0 ){
+ std::cout << "XBase bcd testing program.." << std::endl;
+ std::cout << "This program tests the bcd logic." << std::endl;
+ }
+
+ iRc += TestMethod( iPo, "sizeof( xbBcdStruct )", (xbInt32) sizeof( xbBcdStruct ), (xbInt32) 12 );
+
+ xbString s1( -12345.60 );
+ xbBcd bcd1( s1 );
+ xbDouble d1;
+ bcd1.ToDouble( d1 );
+ xbString s2( d1 );
+ bcd1.ToString( s2 );
+
+ iRc += TestMethod( iPo, "String Constructor1", d1, -12345.6 );
+ iRc += TestMethod( iPo, "String Constructor2", s2.Str(), "-12345.6", 8 );
+
+ d1 = 0034.04;
+ xbBcd bcd2( d1 );
+ bcd2.ToString( s2 );
+ iRc += TestMethod( iPo, "xbDouble Constructor1", s2.Str(), "34.04", 5 );
+
+ // test the sign comparison logic
+ xbInt16 iComp = bcd1.Compare( bcd2 );
+ iRc += TestMethod( iPo, "Sign Compare 1", iComp, -1 );
+ iComp = bcd2.Compare( bcd1 );
+ iRc += TestMethod( iPo, "Sign Compare 2", iComp, 1 );
+
+ // bcd length compare scenarios
+ bcd1.Set( 123 );
+ iRc += TestMethod( iPo, "Length Compare 1", bcd1.Compare( 12 ), 1 );
+ iRc += TestMethod( iPo, "Length Compare 2", bcd1.Compare( 1234 ), -1 );
+ bcd1.Set( -456 );
+ iRc += TestMethod( iPo, "Length Compare 3", bcd1.Compare( -12 ), -1 );
+ iRc += TestMethod( iPo, "Length Compare 4", bcd1.Compare( -1234 ), 1 );
+
+ // same length, value compares
+ bcd1.Set( 11 );
+ iRc += TestMethod( iPo, "Value Compare 1", bcd1.Compare( 10 ), 1 );
+
+ bcd1.Set( 111 );
+ iRc += TestMethod( iPo, "Value Compare 2", bcd1.Compare( 110 ), 1 );
+
+
+ bcd1.Set( 111.111 );
+ iRc += TestMethod( iPo, "Value Compare 3", bcd1.Compare( 111.112 ), -1 );
+
+ bcd1.Set( -100 );
+ iRc += TestMethod( iPo, "Value Compare 4", bcd1.Compare( -111 ), 1 );
+ iRc += TestMethod( iPo, "Value Compare 5", bcd1.Compare( -99 ), -1 );
+
+ bcd1.Set( (xbDouble) 0 );
+ iRc += TestMethod( iPo, "Value Compare 6", bcd1.Compare( (xbDouble) 0 ), 0 );
+
+ if( iPo > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ return iRc;
+ #else
+ return XB_NO_ERROR;
+ #endif // XB_INDEX_SUPPORT
+
+}
diff --git a/src/tests/xb_test_date.cpp b/src/tests/xb_test_date.cpp
new file mode 100755
index 0000000..1d9b523
--- /dev/null
+++ b/src/tests/xb_test_date.cpp
@@ -0,0 +1,189 @@
+/* xb_test_date.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the date class xbDate
+
+// usage: xb_test_date QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+int main( int argCnt, char **av )
+{
+ int iRc = 0;
+ xbInt16 po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+#ifdef XB_LOGGING_SUPPORT
+ xbXBase x;
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+ InitTime();
+
+ xbDate d1;
+#ifdef XB_DEBUG_SUPPORT
+ if( po > 0 )
+ d1.DumpDateTables();
+#endif
+
+ xbDate d2( "19890209" );
+ xbString s3 = "20120709";
+ xbDate d3( s3 );
+ xbString s4;
+ xbString sFmt = "";
+ xbString sOutDate;
+ xbString s;
+
+ iRc += TestMethod( po, "FormatDate( '', sOutDate ) (sys default format)", d3.FormatDate( sFmt, sOutDate ), 0 );
+ iRc += TestMethod( po, "FormatDate( '', sOutDate ) (sys default format)", sOutDate, "07/09/12", 8 );
+ iRc += TestMethod( po, "CenturyOf()" , d3.CenturyOf(), 20 );
+ iRc += TestMethod( po, "YearOf()", d3.YearOf(), 2012 );
+ iRc += TestMethod( po, "MonthOf()", d3.MonthOf(), 7 );
+
+ iRc += TestMethod( po, "DayOf( XB_FMT_DAY )", d3.DayOf( XB_FMT_WEEK ), 2 );
+ iRc += TestMethod( po, "DayOf( XB_FMT_MONTH )", d3.DayOf( XB_FMT_MONTH ), 9 );
+ iRc += TestMethod( po, "DayOf( XB_FMT_YEAR )", d3.DayOf( XB_FMT_YEAR ), 191 );
+
+ iRc += TestMethod( po, "DateIsValid( '12345678' )", d3.DateIsValid( "12345678" ), 0 );
+ iRc += TestMethod( po, "d3.DateIsValid( '20120708' )", d3.DateIsValid( "20120708" ), 1 );
+ iRc += TestMethod( po, "d3.IsLeapYear()", d3.IsLeapYear(), 1 );
+ iRc += TestMethod( po, "d2.IsLeapYear()", d2.IsLeapYear(), 0 );
+
+ d1.Set( "20010102" );
+ iRc += TestMethod( po, "d1.Set('20010102')", d1.Str(), "20010102", 8 );
+ iRc += TestMethod( po, "d1.CalcRollingCenturyForYear(10)", d1.CalcRollingCenturyForYear( 10 ), 20 );
+
+ iRc += TestMethod( po, "d1.JulianDays()", d1.JulianDays(), 2451912 );
+
+
+ iRc += TestMethod( po, "d1.Set( '20140709' )", d1.Set( "20140709" ) , 0 );
+ d1.CharDayOf( s );
+ iRc += TestMethod( po, "d1.CharDayOf(s)", s, "Wednesday", 9 );
+
+ d1.CharMonthOf( s );
+ iRc += TestMethod( po, "d1.CharMonthOf()", s, "July", 4 );
+
+ iRc += TestMethod( po, "d1.JulToDate8( 2451913 )", d1.JulToDate8( 2451912 ), 0 );
+ iRc += TestMethod( po, "d1.JulToDate8( 2451913 )", d1.Str(), "20010102", 8 );
+ iRc += TestMethod( po, "d1.LastDayOfMonth()", d1.LastDayOfMonth(), 0 );
+ iRc += TestMethod( po, "d1.LastDayOfMonth()", d1.Str(), "20010131", 8 );
+
+ iRc += TestMethod( po, "d1.CTOD( '12/01/02' )", d1.CTOD( "12/01/02" ), 0 );
+ iRc += TestMethod( po, "d1.CTOD( '12/01/02' )", d1.Str(), "20021201", 8 );
+
+ xbString s1, s2;
+ s1 = "MM-DD-YY";
+ d1 = "20130402";
+ iRc+= TestMethod( po, "d1.FormatDate( s1, sOutDate )", d1.FormatDate( s1, sOutDate ), 0 );
+ iRc+= TestMethod( po, "d1.FormatDate( s1, sOutDate )", sOutDate, "04-02-13", 8 );
+
+ d1 = "20120203";
+ iRc += TestMethod( po, "d1=20120203", d1.Str(), "20120203", 8 );
+
+ s1 = "20130405";
+ d1 = s1;
+ iRc += TestMethod( po, "d1=s1", d1.Str(), "20130405", 8 );
+
+ d2 = d1;
+ iRc += TestMethod( po, "d2=d1", d2.Str(), "20130405", 8 );
+
+ d2+=5;
+ iRc += TestMethod( po, "d2+=5", d2.Str(), "20130410", 8 );
+
+ d2-=7;
+ iRc += TestMethod( po, "d2-=5", d2.Str(), "20130403", 8 );
+
+ d2++;
+ iRc += TestMethod( po, "d2++", d2.Str(), "20130404", 8 );
+
+ d2--;
+ iRc+= TestMethod( po, "d2--", d2.Str(), "20130403", 8 );
+ iRc+= TestMethod( po, "d2-d1", d1-d2, 2 );
+ iRc+= TestMethod( po, "d1+2", d1+2, "20130407", 8 );
+ iRc+= TestMethod( po, "d1-5", d1-5, "20130402", 8 );
+
+// d1.Dump( "d1" );
+// d2.Dump( "d2" );
+
+ iRc+= TestMethod( po, "d1==d2", d1==d2, 0 );
+ d2 = d1;
+ iRc+= TestMethod( po, "d1==d2", d1==d2, 1 );
+ iRc+= TestMethod( po, "d1>=d2", d1>=d2, 1 );
+ iRc+= TestMethod( po, "d1<=d2", d1<=d2, 1 );
+ iRc+= TestMethod( po, "d1!=d2", d1!=d2, 0 );
+ d2++;
+ iRc+= TestMethod( po, "d1!=d2", d1!=d2, 1 );
+
+ iRc+= TestMethod( po, "d1>d2", d1>d2, 0 );
+ iRc+= TestMethod( po, "d1>=d2", d1>=d2, 0 );
+ iRc+= TestMethod( po, "d1<d2", d1<d2, 1 );
+ iRc+= TestMethod( po, "d1<=d2", d1<=d2, 1 );
+
+ d2-=2;
+ iRc+= TestMethod( po, "d1>d2", d1>d2, 1 );
+ iRc+= TestMethod( po, "d1>=d2", d1>=d2, 1 );
+ iRc+= TestMethod( po, "d1<d2", d1<d2, 0 );
+ iRc+= TestMethod( po, "d1<=d2", d1<=d2, 0 );
+ iRc+= TestMethod( po, "d1-d2", d1-d2, 1 );
+
+/*
+ xbDate d4( "20171015" );
+ std::cout << "day of [" << d4.Str() << "][" << d4.DayOf( XB_FMT_WEEK ) << "]\n";
+ d4++;
+ std::cout << "day of [" << d4.Str() << "][" << d4.DayOf( XB_FMT_WEEK ) << "]\n";
+ d4++;
+ std::cout << "day of [" << d4.Str() << "][" << d4.DayOf( XB_FMT_WEEK ) << "]\n";
+ d4++;
+ std::cout << "day of [" << d4.Str() << "][" << d4.DayOf( XB_FMT_WEEK ) << "]\n";
+ d4++;
+ std::cout << "day of [" << d4.Str() << "][" << d4.DayOf( XB_FMT_WEEK ) << "]\n";
+ d4++;
+ std::cout << "day of [" << d4.Str() << "][" << d4.DayOf( XB_FMT_WEEK ) << "]\n";
+ d4++;
+ std::cout << "day of [" << d4.Str() << "][" << d4.DayOf( XB_FMT_WEEK ) << "]\n";
+ d4++;
+ std::cout << "day of [" << d4.Str() << "][" << d4.DayOf( XB_FMT_WEEK ) << "]\n";
+*/
+
+ if( po > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return iRc;
+}
diff --git a/src/tests/xb_test_dbf_v3_memos.cpp b/src/tests/xb_test_dbf_v3_memos.cpp
new file mode 100755
index 0000000..e364741
--- /dev/null
+++ b/src/tests/xb_test_dbf_v3_memos.cpp
@@ -0,0 +1,233 @@
+/* xb_test_xbdbf_v3_memos.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the version III memo field logic
+
+// usage: xb_test_dbf_v3_memos QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+int main( int argCnt, char **av )
+{
+ int rc = 0;
+ int rc2 = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+
+ xbSchema MyV3Record[] =
+ {
+ { "RECID", XB_NUMERIC_FLD, 8, 0 },
+ { "MEMOFLD1", XB_MEMO_FLD, 10, 0 },
+ { "MEMOFLD2", XB_MEMO_FLD, 10, 0 },
+ { "",0,0,0 }
+ };
+
+
+ xbXBase x;
+
+#ifdef XB_LOGGING_SUPPORT
+
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+
+#endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ x.DisableDefaultAutoLock();
+ InitTime();
+
+ if( po > 0 )
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+
+ xbDbf3 V3Dbf( &x ); /* version 3 dbf file */
+
+ rc2 = V3Dbf.CreateTable( "TestV3_memos.DBF", "TestV3", MyV3Record, XB_OVERLAY, XB_MULTI_USER );
+ rc += TestMethod( po, "CreateTable()", (xbInt32) rc2, XB_NO_ERROR );
+
+
+ if( rc2 )
+ x.DisplayError( rc2 );
+ else{
+
+ xbInt16 fldRecId = V3Dbf.GetFieldNo( "RECID" );
+ xbInt16 fldMemo1 = V3Dbf.GetFieldNo( "MEMOFLD1" );
+ xbInt16 fldMemo2 = V3Dbf.GetFieldNo( "MEMOFLD2" );
+ xbString sData;
+
+ // Record 1
+ rc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V3Dbf.PutField( fldRecId, "1" ), XB_NO_ERROR );
+ sData = "Memo data";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+
+ sData = "Some other memo data";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+ // Record 2
+ rc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V3Dbf.PutField( fldRecId, "2" ), XB_NO_ERROR );
+ sData = "Memo data Rec 2 ..[";
+ sData.PadRight( 'Z', 1036 );
+ sData += ']';
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Some other memo data Rec 2 ... [";
+ sData.PadRight( 'W', 1555 );
+ sData += ']';
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+ // Check memo header file
+ xbUInt32 ulNextBlock;
+ xbMemo *Memo = V3Dbf.GetMemoPtr();
+ rc += TestMethod( po, "GetHdrNextBlock()", Memo->GetHdrNextBlock( ulNextBlock ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetHdrNextBlock()", (xbInt32) ulNextBlock, 10 );
+
+
+ // Zap a table with memo fields
+ rc += TestMethod( po, "Zap(0)", V3Dbf.Zap(), XB_NO_ERROR );
+ xbUInt32 ulRecCnt = 0;
+ rc += TestMethod( po, "GetRecCount()", V3Dbf.GetRecordCnt( ulRecCnt ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetRecCount() b", (xbInt32) ulRecCnt, 0 );
+ Memo = V3Dbf.GetMemoPtr();
+ rc += TestMethod( po, "GetHdrNextBlock()", Memo->GetHdrNextBlock( ulNextBlock ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetHdrNextBlock()", (xbInt32) ulNextBlock, 1 );
+
+
+
+ // Add records back into the table
+ // Record 1
+ rc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V3Dbf.PutField( fldRecId, "1" ), XB_NO_ERROR );
+ sData = "Memo data rec 1 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+
+ sData = "Memo data rec 1 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+ // Record 2
+ rc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V3Dbf.PutField( fldRecId, "2" ), XB_NO_ERROR );
+ sData = "Memo data Rec 2 memo 1..[";
+ sData.PadRight( 'Z', 1036 );
+ sData += ']';
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Some other memo data Rec 2 memo 2 ... [";
+ sData.PadRight( 'W', 1555 );
+ sData += ']';
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+ // Record 3
+ rc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V3Dbf.PutField( fldRecId, "3" ), XB_NO_ERROR );
+ sData = "Memo data Rec 3 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+
+ sData = "Memo data Rec 3 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+
+ // Record 4
+ rc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V3Dbf.PutField( fldRecId, "4" ), XB_NO_ERROR );
+ sData = "Memo data Rec 4 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data Rec 4 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+
+ // Record 5
+ rc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V3Dbf.PutField( fldRecId, "5" ), XB_NO_ERROR );
+ sData = "Memo data Rec 5 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data Rec 5 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+
+ // Record 6
+ rc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V3Dbf.PutField( fldRecId, "6" ), XB_NO_ERROR );
+ sData = "Memo data Rec 6 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data Rec 6 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+
+ // Record 7
+ rc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V3Dbf.PutField( fldRecId, "7" ), XB_NO_ERROR );
+ sData = "Memo data Rec 7 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data Rec 7 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V3Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+
+ // Flag 1, 3, 5 and 7 for deletion
+ rc += TestMethod( po, "GetRecord()", V3Dbf.GetRecord( 1 ), XB_NO_ERROR );
+ rc += TestMethod( po, "DeleteRecord()", V3Dbf.DeleteRecord(), XB_NO_ERROR );
+
+ rc += TestMethod( po, "GetRecord()", V3Dbf.GetRecord( 3 ), XB_NO_ERROR );
+ rc += TestMethod( po, "DeleteRecord()", V3Dbf.DeleteRecord(), XB_NO_ERROR );
+
+ rc += TestMethod( po, "GetRecord()", V3Dbf.GetRecord( 5 ), XB_NO_ERROR );
+ rc += TestMethod( po, "DeleteRecord()", V3Dbf.DeleteRecord(), XB_NO_ERROR );
+
+ rc += TestMethod( po, "GetRecord()", V3Dbf.GetRecord( 7 ), XB_NO_ERROR );
+ rc += TestMethod( po, "DeleteRecord()", V3Dbf.DeleteRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "Pack()", V3Dbf.Pack(), XB_NO_ERROR );
+ rc += TestMethod( po, "Close()", V3Dbf.Close(), XB_NO_ERROR );
+ }
+
+ if( po > 0 || rc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", rc * -1 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], rc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return rc;
+}
diff --git a/src/tests/xb_test_dbf_v3_nomemos.cpp b/src/tests/xb_test_dbf_v3_nomemos.cpp
new file mode 100755
index 0000000..aab118f
--- /dev/null
+++ b/src/tests/xb_test_dbf_v3_nomemos.cpp
@@ -0,0 +1,323 @@
+/* xb_test_xbdbf_v3_nomemos.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xbXdbf
+
+// usage: xb_test_dbf_v3_nomemos QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+int main( int argCnt, char **av )
+{
+ int iRc = 0;
+ int iRc2 = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+
+ xbSchema MyV3Record[] =
+ {
+ { "FIRSTNAME", XB_CHAR_FLD, 15, 0 },
+ { "LASTNAME", XB_CHAR_FLD, 20, 0 },
+ { "MIDDLEINIT", XB_CHAR_FLD, 1, 0 },
+ { "BIRTHDATE", XB_DATE_FLD, 8, 0 },
+ { "STARTDATE", XB_DATE_FLD, 8, 0 },
+ { "AMOUNT", XB_NUMERIC_FLD, 9, 2 },
+ { "TESTNUM", XB_NUMERIC_FLD, 12, 4 },
+ { "SWITCH", XB_LOGICAL_FLD, 1, 0 },
+ { "ZIPCODE", XB_NUMERIC_FLD, 5, 0 },
+ { "",0,0,0 }
+ };
+
+
+ xbXBase x;
+
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ x.DisableDefaultAutoLock();
+ InitTime();
+
+ if( po > 0 )
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+
+
+ xbDbf3 V3Dbf( &x ); /* version 3 dbf file */
+
+ iRc2 = V3Dbf.CreateTable( "TestV3.DBF", "TestV3", MyV3Record, XB_OVERLAY, XB_MULTI_USER );
+
+ iRc += TestMethod( po, "CreateTable()", (xbInt32) iRc2, XB_NO_ERROR );
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+
+ if( po == 2 ){
+ std::cout << "There should be one entry in the table list" << std::endl;
+ x.DisplayTableList();
+ }
+
+ xbDbf3 V3Dbf2( &x );
+ // next occurrence should error as a dup
+ x.WriteLogMessage( "Second create attempt" );
+ iRc2 = V3Dbf2.CreateTable( "TestV3.DBF", "TestV3", MyV3Record, XB_DONTOVERLAY, XB_MULTI_USER );
+ iRc += TestMethod( po, "CreateTable()", iRc2, XB_FILE_EXISTS );
+ if( iRc2 != XB_FILE_EXISTS ){
+ x.DisplayError( iRc2 );
+ }
+
+ if( po == 2 ){
+ std::cout << "There should be one entry in the table list" << std::endl;
+ x.DisplayTableList();
+ }
+
+ iRc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetFieldNo()", V3Dbf.GetFieldNo("LASTNAME"), 1 );
+ iRc += TestMethod( po, "GetFieldNo()", V3Dbf.GetFieldNo("MIDDLEINIT"), 2 );
+
+ xbInt16 fldLastName = V3Dbf.GetFieldNo( "LASTNAME" );
+
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( fldLastName, "NELSON" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "FIRSTNAME", "WILLIE" ), XB_NO_ERROR );
+
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "AMOUNT", "12.34" ), XB_NO_ERROR );
+ xbDate d( "19991201" );
+ iRc += TestMethod( po, "PutDateField()", V3Dbf.PutDateField( "STARTDATE", d ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "STARTDATE", "19991301" ), XB_INVALID_DATA );
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "STARTDATE", "19991201" ), XB_NO_ERROR );
+
+
+ iRc += TestMethod( po, "PutLongField()", V3Dbf.PutLongField( "ZIPCODE", 12345 ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutLogicalField()", V3Dbf.PutLogicalField( "SWITCH", "Y" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutFloatField()", V3Dbf.PutFloatField( "TESTNUM", (xbFloat) 1234.5678 ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+ xbString sf;
+ iRc += TestMethod( po, "GetField1()", V3Dbf.GetField( fldLastName, sf, 0 ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetField2()", sf, "NELSON ", 20 );
+ iRc += TestMethod( po, "GetField3()", V3Dbf.GetField( fldLastName, sf ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetField4()", sf, "NELSON ", 20 );
+ iRc += TestMethod( po, "GetField5()", V3Dbf.GetField( "LASTNAME", sf ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetField6()", sf, "NELSON ", 20 );
+ xbInt16 iNoOfDecimals;
+ iRc += TestMethod( po, "GetFieldDecimal()", V3Dbf.GetFieldDecimal( "AMOUNT", iNoOfDecimals ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetFieldDecimal()", iNoOfDecimals, 2 );
+
+ char FieldType;
+ iRc += TestMethod( po, "GetFieldType()", V3Dbf.GetFieldType( "STARTDATE", FieldType ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetFieldType()", FieldType , 'D' );
+
+ xbInt16 iFieldLen;
+ iRc += TestMethod( po, "GetFieldLen()", V3Dbf.GetFieldLen( "STARTDATE", iFieldLen ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetFieldLen()", iFieldLen, 8 );
+
+ xbInt16 fldAMT = V3Dbf.GetFieldNo( "AMOUNT" );
+ iRc += TestMethod( po, "GetRawField1()", V3Dbf.GetField( fldAMT, sf ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetRawField2()", sf, " 12.34", 9 );
+
+ xbInt32 lZip;
+ iRc += TestMethod( po, "GetLongField()", V3Dbf.GetLongField( "ZIPCODE", lZip ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetLongField()", lZip, 12345 );
+
+ xbString sSwitch;
+ iRc += TestMethod( po, "GetLogicalField()", V3Dbf.GetLogicalField( "SWITCH", sSwitch ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetLogicalField()", sSwitch, "Y", 1 );
+
+ xbFloat fNum;
+ iRc += TestMethod( po, "GetFloatField()", V3Dbf.GetFloatField( "TESTNUM", fNum ), 0 );
+ iRc += TestMethod( po, "GetFloatField()", fNum, (xbFloat) 1234.5678 );
+
+ iRc += TestMethod( po, "GetDateField()", V3Dbf.GetDateField( "STARTDATE", d ), 0 );
+ iRc += TestMethod( po, "GetDateField()", d.Str(), "19991201", 8 );
+
+ // init a second record for more testing
+ iRc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutLogicalField()", V3Dbf.PutLogicalField( "SWITCH", xbTrue ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+ xbBool bSwitch;
+ iRc += TestMethod( po, "GetLogicalField()", V3Dbf.GetLogicalField( "SWITCH", bSwitch ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetLogicalField()", bSwitch, xbTrue );
+
+ // init a third record for more testing
+ iRc += TestMethod( po, "BlankRecord()", V3Dbf.BlankRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutLogicalField()", V3Dbf.PutLogicalField( "SWITCH", xbFalse ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+
+ iRc += TestMethod( po, "GetLogicalField()", V3Dbf.GetLogicalField( "SWITCH", bSwitch ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetLogicalField()", bSwitch, xbFalse );
+
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "TESTNUM", "12345678" ), XB_INVALID_DATA );
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "TESTNUM", "1234567" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "TESTNUM", "1234567.12345" ), XB_INVALID_DATA );
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "TESTNUM", ".12345" ), XB_INVALID_DATA );
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "TESTNUM", ".1234" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "TESTNUM", "12345678.1234" ), XB_INVALID_DATA );
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "TESTNUM", "1234567.1234" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AppendRecord()", V3Dbf.AppendRecord(), XB_NO_ERROR );
+
+ iRc += TestMethod( po, "GetFieldCnt()", V3Dbf.GetFieldCnt(), 9 );
+ iRc += TestMethod( po, "GetTblAlias()", V3Dbf.GetTblAlias(), "TestV3", 6 );
+ iRc += TestMethod( po, "GetDbfStatus()", V3Dbf.GetDbfStatus(), XB_OPEN );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 4 );
+ iRc += TestMethod( po, "GetFirstRecord()", V3Dbf.GetFirstRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 1 );
+ iRc += TestMethod( po, "GetNextRecord()", V3Dbf.GetNextRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 2 );
+ iRc += TestMethod( po, "GetLastRecord()", V3Dbf.GetLastRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 4 );
+ iRc += TestMethod( po, "GetPrevRecord()", V3Dbf.GetPrevRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 3 );
+ iRc += TestMethod( po, "GetRecordLen()", V3Dbf.GetRecordLen(), 80 );
+
+ iRc += TestMethod( po, "GetFirstRecord( XB_ALL_RECS )", V3Dbf.GetFirstRecord( XB_ALL_RECS ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 1 );
+ iRc += TestMethod( po, "GetNextRecord( XB_ALL_RECS )", V3Dbf.GetNextRecord( XB_ALL_RECS ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 2 );
+ iRc += TestMethod( po, "GetLastRecord( XB_ALL_RECS )", V3Dbf.GetLastRecord( XB_ALL_RECS ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 4 );
+ iRc += TestMethod( po, "GetPrevRecord( XB_ALL_RECS )", V3Dbf.GetPrevRecord( XB_ALL_RECS ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 3 );
+
+ iRc += TestMethod( po, "GetFirstRecord( XB_DELETED_RECS )", V3Dbf.GetFirstRecord( XB_DELETED_RECS ), XB_EOF );
+ iRc += TestMethod( po, "GetLastRecord( XB_DELETED_RECS )", V3Dbf.GetLastRecord( XB_DELETED_RECS ), XB_EOF );
+
+ iRc += TestMethod( po, "GetFirstRecord( XB_ALL_RECS )", V3Dbf.GetFirstRecord( XB_ALL_RECS ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetNextRecord( XB_DELETED_RECS )", V3Dbf.GetNextRecord( XB_DELETED_RECS ), XB_EOF );
+
+ iRc += TestMethod( po, "GetLastRecord( XB_ALL_RECS )", V3Dbf.GetLastRecord( XB_ALL_RECS ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetPrevRecord( XB_DELETED_RECS )", V3Dbf.GetPrevRecord( XB_DELETED_RECS ), XB_BOF );
+
+ iRc += TestMethod( po, "DeleteAllRecords()", V3Dbf.DeleteAllRecords(), XB_NO_ERROR );
+
+
+ iRc += TestMethod( po, "GetFirstRecord()", V3Dbf.GetFirstRecord(), XB_EOF );
+ iRc += TestMethod( po, "GetLastRecord()", V3Dbf.GetLastRecord(), XB_EOF );
+
+ iRc += TestMethod( po, "GetFirstRecord( XB_ALL_RECS )", V3Dbf.GetFirstRecord( XB_ALL_RECS ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 1 );
+
+ iRc += TestMethod( po, "GetNextRecord( XB_ALL_RECS )", V3Dbf.GetNextRecord( XB_ALL_RECS ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 2 );
+
+ iRc += TestMethod( po, "GetNextRecord()", V3Dbf.GetNextRecord(), XB_EOF );
+
+ iRc += TestMethod( po, "GetLastRecord( XB_ALL_RECS )", V3Dbf.GetLastRecord( XB_ALL_RECS ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 4 );
+
+ iRc += TestMethod( po, "GetPrevRecord( XB_ALL_RECS )", V3Dbf.GetPrevRecord( XB_ALL_RECS ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetCurRecNo()", (xbInt32) V3Dbf.GetCurRecNo(), 3 );
+
+ iRc += TestMethod( po, "UndeleteAllRecords()", V3Dbf.UndeleteAllRecords(), XB_NO_ERROR );
+
+ char * p = V3Dbf.GetRecordBuf();
+ iRc += TestMethod( po, "GetRecordBuf()", p[0], ' ' );
+
+ if( po == 2 ){
+ V3Dbf.DumpHeader( 3 );
+ V3Dbf.DumpRecord( 4 );
+ }
+
+
+
+ iRc += TestMethod( po, "PutField()", V3Dbf.PutField( "LASTNAME", "CLINTON" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutRecord()", V3Dbf.PutRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "DeleteRecord()", V3Dbf.DeleteRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "UndeleteRecord()", V3Dbf.UndeleteRecord(), XB_NO_ERROR );
+ xbUInt32 ulRecCnt = 0;
+ iRc += TestMethod( po, "GetRecordCnt()", V3Dbf.GetRecordCnt( ulRecCnt ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetRecordCnt()b",(xbInt32) ulRecCnt, 4 );
+ iRc += TestMethod( po, "DeleteAllRecords()", V3Dbf.DeleteAllRecords(), XB_NO_ERROR );
+ iRc += TestMethod( po, "UndeleteAllRecords()", V3Dbf.UndeleteAllRecords(), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetRecord()", V3Dbf.GetRecord( 4 ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DeleteRecord()", V3Dbf.DeleteRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "Commit()", V3Dbf.Commit(), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetDbfStatus()", V3Dbf.GetDbfStatus(), XB_OPEN );
+
+ if( po == 2 ){
+ V3Dbf.DumpRecord( 4 );
+ }
+
+ xbDbf3 CopyDbf( &x );
+ iRc += TestMethod( po, "CopyDbfStructure()", V3Dbf.CopyDbfStructure( &CopyDbf, "CopyStructureV3NoMemos", "CopyAliasV3NoMemos", XB_OVERLAY, XB_MULTI_USER ), XB_NO_ERROR );
+ iRc += TestMethod( po, "CopyDbf.Close()", CopyDbf.Close(), XB_NO_ERROR );
+
+ if( po == 2 ){
+ std::cout << "There should be one entry in the table list" << std::endl;
+ x.DisplayTableList();
+ }
+
+ iRc += TestMethod( po, "GetDbfStatus()", CopyDbf.GetDbfStatus(), XB_CLOSED );
+ iRc += TestMethod( po, "Open()", CopyDbf.xbDbf::Open( "CopyStructureV3NoMemos.DBF", "CopyAliasV3NoMemos" ), XB_NO_ERROR );
+
+ if( po == 2 ){
+ std::cout << "There should be two entries in the table list" << std::endl;
+ x.DisplayTableList();
+ }
+
+ iRc += TestMethod( po, "CopyDbf.Close()", CopyDbf.Close(), XB_NO_ERROR );
+
+ #ifdef XB_DEBUG_SUPPORT
+ #ifdef XB_LOCKING_SUPPORT
+ V3Dbf.DumpTableLockStatus();
+ #endif
+ #endif
+
+ iRc += TestMethod( po, "PackTable( 0, 0 )", V3Dbf.Pack(), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetDbfStatus()", V3Dbf.GetDbfStatus(), XB_OPEN );
+
+ iRc += TestMethod( po, "Zap()", V3Dbf.Zap(), XB_NO_ERROR );
+ if( po == 2 )
+ x.DisplayTableList();
+
+ iRc += TestMethod( po, "Close()", V3Dbf.Close(), XB_NO_ERROR );
+ if( po == 2 )
+ x.DisplayTableList();
+
+ if( po > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+
+ V3Dbf.Abort(); // don't crash the program if uncommited updates
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return iRc;
+}
diff --git a/src/tests/xb_test_dbf_v4_memos.cpp b/src/tests/xb_test_dbf_v4_memos.cpp
new file mode 100755
index 0000000..e92b5b2
--- /dev/null
+++ b/src/tests/xb_test_dbf_v4_memos.cpp
@@ -0,0 +1,335 @@
+/* xb_test_xbdbf_v4_memos.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the version III memo field logic
+// usage: xb_test_dbf_v4_memos QUITE|NORMAL|VERBOSE
+
+#include "xbase.h"
+using namespace xb;
+#include "tstfuncs.cpp"
+
+int main( int argCnt, char **av )
+{
+ int rc = 0;
+ int rc2 = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ xbSchema MyV4Record[] =
+ {
+ { "RECID", XB_NUMERIC_FLD, 8, 0 },
+ { "MEMOFLD1", XB_MEMO_FLD, 10, 0 },
+ { "MEMOFLD2", XB_MEMO_FLD, 10, 0 },
+ { "MEMOFLD3", XB_MEMO_FLD, 10, 0 },
+ { "",0,0,0 }
+ };
+
+ xbXBase x;
+
+#ifdef XB_LOGGING_SUPPORT
+
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+
+#endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ x.DisableDefaultAutoLock();
+ InitTime();
+
+
+ if( po > 0 )
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+
+ xbDbf4 V4Dbf( &x );
+ rc += TestMethod( po, "SetCreateMemoBlockSize", V4Dbf.SetCreateMemoBlockSize( 1024 ), XB_NO_ERROR );
+ rc2 = V4Dbf.CreateTable( "TestV4_memos.DBF", "TestV4", MyV4Record, XB_OVERLAY, XB_MULTI_USER );
+
+ xbUInt64 ullDbfOrigFileSize = 0;
+ xbUInt64 ullDbtOrigFileSize = 0;
+ rc = V4Dbf.GetFileSize( ullDbfOrigFileSize );
+ rc = V4Dbf.GetMemoPtr()->GetFileSize( ullDbtOrigFileSize );
+
+ rc += TestMethod( po, "CreateTable()", (xbInt32) rc2, XB_NO_ERROR );
+ if( rc2 )
+ x.DisplayError( rc2 );
+ else{
+
+ xbInt16 fldRecId = V4Dbf.GetFieldNo( "RECID" );
+ xbInt16 fldMemo1 = V4Dbf.GetFieldNo( "MEMOFLD1" );
+ xbInt16 fldMemo2 = V4Dbf.GetFieldNo( "MEMOFLD2" );
+ xbInt16 fldMemo3 = V4Dbf.GetFieldNo( "MEMOFLD3" );
+ xbString sData;
+
+
+
+
+ // Record 1
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "1" ), XB_NO_ERROR );
+ sData = "Memo data";
+
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add one block", V4Dbf.GetMemoPtr(), 2, 2, "" );
+
+ sData = "Some other memo data";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add one block", V4Dbf.GetMemoPtr(), 3, 3, "" );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+
+
+
+
+ // Record 2
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "2" ), XB_NO_ERROR );
+ sData = "Memo data Rec 2 ..[";
+ sData.PadRight( 'Z', 1036 );
+ sData += ']';
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Some other memo data Rec 2 ... [";
+ sData.PadRight( 'W', 1555 );
+ sData += ']';
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add 7 blocks", V4Dbf.GetMemoPtr(), 7, 7, "" );
+
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, "" ), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Delete 2 blocks", V4Dbf.GetMemoPtr(), 3, 7, "3,2,7" );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+
+ // Record 3
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "3" ), XB_NO_ERROR );
+ sData = "Memo data r3f1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add one block", V4Dbf.GetMemoPtr(), 4, 7, "4,1,7" );
+ sData = "Memo data r3f2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add one block", V4Dbf.GetMemoPtr(), 7, 7, "" );
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, "" ), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Delete one block", V4Dbf.GetMemoPtr(), 3, 7, "3,1,7" );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+
+ // Record 4
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "4" ), XB_NO_ERROR );
+ sData = "Memo data Rec 4 fld1 ..[";
+ sData.PadRight( 'Q', 1036 );
+ sData += ']';
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Update Memo Field", V4Dbf.GetMemoPtr(), 3, 9, "3,1,9" );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+
+ // go back a record and delete a memo field and test if all blocks filled in
+ rc += TestMethod( po, "GetPrevRecord()", V4Dbf.GetPrevRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, "" ), XB_NO_ERROR );
+ rc += TestMethod( po, "Commit()", V4Dbf.Commit(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Delete one block", V4Dbf.GetMemoPtr(), 3, 9, "3,2,9" );
+
+ // Record 5
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "5" ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+
+ // Zap a table with memo fields
+ rc += TestMethod( po, "Zap()", V4Dbf.Zap(), XB_NO_ERROR );
+ xbUInt32 ulRecCnt = 0;
+ rc += TestMethod( po, "GetRecCount()", V4Dbf.GetRecordCnt( ulRecCnt ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetRecCount()b", (xbInt32) ulRecCnt, 0 );
+
+ // Add records back into the table, and verify the block chains created as designed
+ // Record 1
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "1" ), XB_NO_ERROR );
+ sData = "Memo data rec 1 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Update Memo Field", V4Dbf.GetMemoPtr(), 2, 2, "" );
+
+ // Revise the memo field
+ sData = "Updated memo data rec1 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "Commit()", V4Dbf.Commit(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "UpdateMemoField", V4Dbf.GetMemoPtr(), 2, 2, "" );
+
+ sData = "Memo data rec 1 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "Commit()", V4Dbf.Commit(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "UpdateMemoField", V4Dbf.GetMemoPtr(), 3, 3, "" );
+
+ // Record 2
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "2" ), XB_NO_ERROR );
+ sData = "Memo data rec 2 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 2 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add one block", V4Dbf.GetMemoPtr(), 5, 5, "" );
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, "" ), XB_NO_ERROR );
+ rc += TestMethod( po, "Commit()", V4Dbf.Commit(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "UpdateMemoField", V4Dbf.GetMemoPtr(), 3, 5, "3,1,5" );
+
+ sData = "Test the abort code";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "Abort()", V4Dbf.Abort(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "UpdateMemoField", V4Dbf.GetMemoPtr(), 3, 5, "3,1,5" );
+
+ sData = "Test mulitple updates before commit";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Test mulitple updates before commit2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "UpdateMemoField", V4Dbf.GetMemoPtr(), 5, 5, "" );
+ sData = "Test mulitple updates before commit3";
+
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "Commit()", V4Dbf.Commit(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "UpdateMemoField", V4Dbf.GetMemoPtr(), 5, 5, "" );
+
+// V4Dbf.GetMemoPtr()->DumpMemoInternals();
+
+ rc += TestMethod( po, "Zap(0)", V4Dbf.Zap(), XB_NO_ERROR );
+
+ xbUInt64 ullDbfPostZapFileSize = 0;
+ xbUInt64 ullDbtPostZapFileSize = 0;
+ rc += V4Dbf.GetFileSize( ullDbfPostZapFileSize );
+ rc += V4Dbf.GetMemoPtr()->GetFileSize( ullDbtPostZapFileSize );
+
+ rc += TestMethod( po, "Zap()", ullDbfPostZapFileSize, ullDbfOrigFileSize );
+ rc += TestMethod( po, "Memo->Zap()", ullDbtPostZapFileSize, ullDbtOrigFileSize );
+ rc += TestDbt4Method( po, "Zap() block check", V4Dbf.GetMemoPtr(), 1, 1, "" );
+
+ rc += TestMethod( po, "GetRecCount()", V4Dbf.GetRecordCnt( ulRecCnt ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetRecCount()", (xbInt32) ulRecCnt, 0 );
+
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "1" ), XB_NO_ERROR );
+ sData = "Memo data rec 1 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 1 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 1 memo 3";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo3, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+
+ sData = "Memo data rec 1 memo 1 A";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 1 memo 2 A";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 1 memo 3A ";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo3, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "Commit()", V4Dbf.Commit(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Update Memo Field", V4Dbf.GetMemoPtr(), 4, 4, "" );
+
+ // Record 2
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "2" ), XB_NO_ERROR );
+ sData = "Memo data rec 2 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 2 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add two blocks", V4Dbf.GetMemoPtr(), 6, 6, "" );
+
+ // Record 3
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "3" ), XB_NO_ERROR );
+ sData = "Memo data rec 3 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 3 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add two blocks", V4Dbf.GetMemoPtr(), 8, 8, "" );
+
+ // Record 4
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "4" ), XB_NO_ERROR );
+ sData = "Memo data rec 4 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 4 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add two blocks", V4Dbf.GetMemoPtr(), 10, 10, "" );
+
+ // Record 5
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "5" ), XB_NO_ERROR );
+ sData = "Memo data rec 5 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 5 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add two blocks", V4Dbf.GetMemoPtr(), 12, 12, "" );
+
+ // Record 6
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "6" ), XB_NO_ERROR );
+ sData = "Memo data rec 6 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 6 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add two blocks", V4Dbf.GetMemoPtr(), 14, 14, "" );
+
+ // Record 7
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldRecId, "7" ), XB_NO_ERROR );
+ sData = "Memo data rec 6 memo 1";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo1, sData ), XB_NO_ERROR );
+ sData = "Memo data rec 6 memo 2";
+ rc += TestMethod( po, "UpdateMemoField()", V4Dbf.UpdateMemoField( fldMemo2, sData ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+ rc += TestDbt4Method( po, "Add two blocks", V4Dbf.GetMemoPtr(), 16, 16, "" );
+
+ // delete records 1, 3, 5, 7
+ rc += TestMethod( po, "GetRecord()", V4Dbf.GetRecord( 1 ), XB_NO_ERROR );
+ rc += TestMethod( po, "DeleteRecord()", V4Dbf.DeleteRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetRecord()", V4Dbf.GetRecord( 3 ), XB_NO_ERROR );
+ rc += TestMethod( po, "DeleteRecord()", V4Dbf.DeleteRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetRecord()", V4Dbf.GetRecord( 5 ), XB_NO_ERROR );
+ rc += TestMethod( po, "DeleteRecord()", V4Dbf.DeleteRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetRecord()", V4Dbf.GetRecord( 7 ), XB_NO_ERROR );
+ rc += TestMethod( po, "DeleteRecord()", V4Dbf.DeleteRecord(), XB_NO_ERROR );
+
+
+ rc += TestMethod( po, "Pack()", V4Dbf.Pack(), XB_NO_ERROR );
+ rc += TestMethod( po, "Close()", V4Dbf.Close(), XB_NO_ERROR );
+ }
+
+ if( po > 0 || rc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", rc * -1 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], rc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return rc;
+}
diff --git a/src/tests/xb_test_dbf_v4_nomemos.cpp b/src/tests/xb_test_dbf_v4_nomemos.cpp
new file mode 100755
index 0000000..68ecda0
--- /dev/null
+++ b/src/tests/xb_test_dbf_v4_nomemos.cpp
@@ -0,0 +1,330 @@
+/* xb_test_xbdbf_v4_nomemos.cpp
+
+XBase Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xbXdbf
+
+// usage: xb_test_dbf_v4_nomemos QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+int main( int argCnt, char **av )
+{
+ int rc = 0;
+ int rc2 = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ xbSchema MyV4Record[] =
+ {
+ { "FIRSTNAME", XB_CHAR_FLD, 15, 0 },
+ { "LASTNAME", XB_CHAR_FLD, 20, 0 },
+ { "MIDDLEINIT", XB_CHAR_FLD, 1, 0 },
+ { "BIRTHDATE", XB_DATE_FLD, 8, 0 },
+ { "STARTDATE", XB_DATE_FLD, 8, 0 },
+ { "AMOUNT", XB_NUMERIC_FLD, 9, 2 },
+ { "TESTNUM", XB_NUMERIC_FLD, 12, 4 },
+ { "SWITCH", XB_LOGICAL_FLD, 1, 0 },
+ { "ZIPCODE", XB_NUMERIC_FLD, 5, 0 },
+ { "DBLFLDTST", XB_FLOAT_FLD, 14, 4 },
+ { "",0,0,0 }
+ };
+
+ xbXBase x;
+
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ x.DisableDefaultAutoLock();
+ InitTime();
+
+ if( po > 0 )
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+
+ xbDbf4 V4Dbf( &x ); // version 4 dbf file
+ rc2 = V4Dbf.CreateTable( "TestV4.DBF", "TestV4", MyV4Record, XB_OVERLAY, XB_MULTI_USER );
+ rc += TestMethod( po, "CreateTable()", (xbInt32) rc2, XB_NO_ERROR );
+ if( rc2 )
+ x.DisplayError( rc2 );
+
+ xbUInt64 ullFileSize;
+ rc2 = V4Dbf.GetFileSize( ullFileSize );
+
+ rc = TestMethod( po, "CheckTableSize", ullFileSize, (xbUInt64) 353 );
+
+ if( po == 2 ){
+ std::cout << "There should be one entry in the table list" << std::endl;
+ x.DisplayTableList();
+ }
+
+ xbDbf4 V4Dbf2( &x );
+
+ // next occurrence should error as a dup
+ x.WriteLogMessage( "Second create attempt" );
+ rc2 = V4Dbf2.CreateTable( "TestV4.DBF", "TestV4", MyV4Record, XB_DONTOVERLAY, XB_MULTI_USER );
+ rc += TestMethod( po, "CreateTable()", rc2, XB_FILE_EXISTS );
+ if( rc2 != XB_FILE_EXISTS ){
+ x.DisplayError( rc2 );
+ }
+
+ if( po == 2 ){
+ std::cout << "There should be one entry in the table list" << std::endl;
+ x.DisplayTableList();
+ }
+
+
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetFieldNo()", V4Dbf.GetFieldNo("LASTNAME"), 1 );
+ rc += TestMethod( po, "GetFieldNo()", V4Dbf.GetFieldNo("MIDDLEINIT"), 2 );
+
+ xbInt16 fldLastName = V4Dbf.GetFieldNo( "LASTNAME" );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldLastName, "NELSON" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "FIRSTNAME", "WILLIE" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "AMOUNT", "12.34" ), XB_NO_ERROR );
+ xbDate dt( "19500209" );
+ rc += TestMethod( po, "PutDateField()", V4Dbf.PutDateField( "BIRTHDATE", dt ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutLongField()", V4Dbf.PutLongField( "ZIPCODE", 12345 ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutLogicalField()", V4Dbf.PutLogicalField( "SWITCH", "Y" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutFloatField()", V4Dbf.PutFloatField( "TESTNUM", (xbFloat) 1234.5678 ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutDoubleField()", V4Dbf.PutDoubleField( "DBLFLDTST", (xbDouble) 9876.5432 ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+
+
+ xbString sf;
+ rc += TestMethod( po, "GetField()", V4Dbf.GetField( fldLastName, sf, 0 ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", sf, "NELSON ", 20 );
+ rc += TestMethod( po, "GetField()", V4Dbf.GetField( fldLastName, sf ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", sf, "NELSON ", 20 );
+ rc += TestMethod( po, "GetField()", V4Dbf.GetField( "LASTNAME", sf ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", sf, "NELSON ", 20 );
+ xbInt16 iNoOfDecimals;
+ rc += TestMethod( po, "GetFieldDecimal()", V4Dbf.GetFieldDecimal( "AMOUNT", iNoOfDecimals ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetFieldDecimal()", iNoOfDecimals, 2 );
+
+ xbDouble d;
+ rc += TestMethod( po, "GetDoubleField()", V4Dbf.GetDoubleField( "DBLFLDTST", d ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetDoubleField()-b", d, (xbDouble) 9876.5432 );
+
+ char FieldType;
+ rc += TestMethod( po, "GetFieldType()", V4Dbf.GetFieldType( "STARTDATE", FieldType ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetFieldType()", FieldType , 'D' );
+
+ xbInt16 iFieldLen;
+ rc += TestMethod( po, "GetFieldLen()", V4Dbf.GetFieldLen( "STARTDATE", iFieldLen ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetFieldLen()", iFieldLen, 8 );
+
+ xbInt16 fldAMT = V4Dbf.GetFieldNo( "AMOUNT" );
+ rc += TestMethod( po, "GetField()", V4Dbf.GetField( fldAMT, sf ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", sf, " 12.34", 9 );
+
+ xbInt32 lZip;
+ rc += TestMethod( po, "GetLongField()", V4Dbf.GetLongField( "ZIPCODE", lZip ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetLongField()", lZip, 12345 );
+
+ xbString sSwitch;
+ rc += TestMethod( po, "GetLogicalField()", V4Dbf.GetLogicalField( "SWITCH", sSwitch ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetLogicalField()", sSwitch, "Y", 1 );
+
+ xbFloat fNum;
+ rc += TestMethod( po, "GetFloatField()", V4Dbf.GetFloatField( "TESTNUM", fNum ), 0 );
+ rc += TestMethod( po, "GetFloatField()", fNum, (xbFloat) 1234.5678 );
+
+ // init a second record for more testing
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutLogicalField()", V4Dbf.PutLogicalField( "SWITCH", xbTrue ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+ xbBool bSwitch;
+ rc += TestMethod( po, "GetLogicalField()", V4Dbf.GetLogicalField( "SWITCH", bSwitch ), 0 );
+ rc += TestMethod( po, "GetLogicalField()", bSwitch, xbTrue );
+
+ // init a third record for more testing
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutLogicalField()", V4Dbf.PutLogicalField( "SWITCH", xbFalse ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetLogicalField()", V4Dbf.GetLogicalField( "SWITCH", bSwitch ), 0 );
+ rc += TestMethod( po, "GetLogicalField()", bSwitch, xbFalse );
+
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "TESTNUM", "12345678" ), XB_INVALID_DATA );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "TESTNUM", "1234567" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "TESTNUM", "1234567.12345" ), XB_INVALID_DATA );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "TESTNUM", ".12345" ), XB_INVALID_DATA );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "TESTNUM", ".1234" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "TESTNUM", "12345678.1234" ), XB_INVALID_DATA );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "TESTNUM", "1234567.1234" ), XB_NO_ERROR );
+
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+
+ rc += TestMethod( po, "GetFieldCnt()", V4Dbf.GetFieldCnt(), 10 );
+ rc += TestMethod( po, "GetTblAlias()", V4Dbf.GetTblAlias(), "TestV4", 6 );
+ rc += TestMethod( po, "GetDbfStatus()", V4Dbf.GetDbfStatus(), XB_OPEN );
+ rc += TestMethod( po, "GetCurRecNo()", (xbInt32) V4Dbf.GetCurRecNo(), 4 );
+ rc += TestMethod( po, "GetFirstRecord()", V4Dbf.GetFirstRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetCurRecNo()", (xbInt32) V4Dbf.GetCurRecNo(), 1 );
+ rc += TestMethod( po, "GetNextRecord()", V4Dbf.GetNextRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetCurRecNo()", (xbInt32) V4Dbf.GetCurRecNo(), 2 );
+ rc += TestMethod( po, "GetLastRecord()", V4Dbf.GetLastRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetCurRecNo()", (xbInt32) V4Dbf.GetCurRecNo(), 4 );
+ rc += TestMethod( po, "GetPrevRecord()", V4Dbf.GetPrevRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetCurRecNo()", (xbInt32) V4Dbf.GetCurRecNo(), 3 );
+ rc += TestMethod( po, "GetRecordLen()", (xbInt32) V4Dbf.GetRecordLen(), 94 );
+
+ char * p = V4Dbf.GetRecordBuf();
+ rc += TestMethod( po, "GetRecordBuf()", p[0], ' ' );
+
+ if( po == 2 ){
+ V4Dbf.DumpHeader( 3 );
+ V4Dbf.DumpRecord( 4 );
+ }
+
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "LASTNAME", "CLINTON" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutRecord()", V4Dbf.PutRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "DeleteRecord()", V4Dbf.DeleteRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "UndeleteRecord()", V4Dbf.UndeleteRecord(), XB_NO_ERROR );
+ xbUInt32 ulRecCnt = 0;
+ rc += TestMethod( po, "GetRecordCnt()", V4Dbf.GetRecordCnt( ulRecCnt ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetRecordCnt()", (xbInt32) ulRecCnt, 4 );
+ rc += TestMethod( po, "DeleteAllRecords()", V4Dbf.DeleteAllRecords(), XB_NO_ERROR );
+ rc += TestMethod( po, "UndeleteAllRecords()", V4Dbf.UndeleteAllRecords(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetRecord()", V4Dbf.GetRecord( 2L ), XB_NO_ERROR );
+ rc += TestMethod( po, "DeleteRecord()", V4Dbf.DeleteRecord(), XB_NO_ERROR );
+
+ if( po == 2 ){
+ V4Dbf.DumpRecord( 4 );
+ }
+
+ xbDbf4 CopyDbf( &x );
+ rc += TestMethod( po, "CopyDbfStructure()", V4Dbf.CopyDbfStructure( &CopyDbf, "CopyStructureV4NoMemos", "CopyAliasV4NoMemos", XB_OVERLAY, XB_MULTI_USER ), XB_NO_ERROR );
+ rc += TestMethod( po, "CopyDbf.Close()", CopyDbf.Close(), XB_NO_ERROR );
+
+ if( po == 2 ){
+ std::cout << "There should be one entry in the table list" << std::endl;
+ x.DisplayTableList();
+ }
+
+ rc += TestMethod( po, "GetDbfStatus()", CopyDbf.GetDbfStatus(), XB_CLOSED );
+ rc += TestMethod( po, "Open()", CopyDbf.xbDbf::Open( "CopyStructureV4NoMemos.DBF", "CopyAliasV4NoMemos" ), XB_NO_ERROR );
+
+ if( po == 2 ){
+ std::cout << "There should be two entries in the table list" << std::endl;
+ x.DisplayTableList();
+ }
+
+ rc += TestMethod( po, "Pack()", V4Dbf.Pack(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetDbfStatus()", V4Dbf.GetDbfStatus(), XB_OPEN );
+
+ rc += TestMethod( po, "Zap()", V4Dbf.Zap(), XB_NO_ERROR );
+ if( po == 2 )
+ x.DisplayTableList();
+
+ xbUInt64 ullFileSize2 = 0;
+ rc2 = V4Dbf.GetFileSize( ullFileSize2 );
+ rc = TestMethod( po, "CheckTableSize", ullFileSize2, ullFileSize );
+
+// Test of auto commit code here
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldLastName, "NELSON" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "FIRSTNAME", "WILLIE" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "AMOUNT", "12.34" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutLongField()", V4Dbf.PutLongField( "ZIPCODE", 12345 ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutLogicalField()", V4Dbf.PutLogicalField( "SWITCH", "Y" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutFloatField()", V4Dbf.PutFloatField( "TESTNUM", (xbFloat) 1234.5678 ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutDoubleField()", V4Dbf.PutDoubleField( "DBLFLDTST", (xbDouble) 9876.5432 ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+
+ rc += TestMethod( po, "BlankRecord()", V4Dbf.BlankRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( fldLastName, "JOHNSON" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "FIRSTNAME", "JIMMY" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "AMOUNT", "555.33" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutLongField()", V4Dbf.PutLongField( "ZIPCODE", 76523 ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutLogicalField()", V4Dbf.PutLogicalField( "SWITCH", "N" ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutFloatField()", V4Dbf.PutFloatField( "TESTNUM", (xbFloat) 8765.4321 ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutDoubleField()", V4Dbf.PutDoubleField( "DBLFLDTST", (xbDouble) 9876.5432 ), XB_NO_ERROR );
+ rc += TestMethod( po, "AppendRecord()", V4Dbf.AppendRecord(), XB_NO_ERROR );
+
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "AMOUNT", "666.22" ), XB_NO_ERROR );
+ rc += TestMethod( po, "Abort()", V4Dbf.Abort(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", V4Dbf.GetField( "AMOUNT", sf ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", sf, " 555.33", 9 );
+
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "AMOUNT", "666.22" ), XB_NO_ERROR );
+ rc += TestMethod( po, "Commit()", V4Dbf.Commit(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", V4Dbf.GetField( fldAMT, sf ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", sf, " 666.22", 9 );
+
+ rc += TestMethod( po, "GetPrevRecord()", V4Dbf.GetPrevRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetNextRecord()", V4Dbf.GetNextRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", V4Dbf.GetField( fldAMT, sf ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", sf, " 666.22", 9 );
+
+ rc += TestMethod( po, "AutoCommit()", V4Dbf.SetAutoCommit( 0 ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "AMOUNT", "999.33" ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetPrevRecord()", V4Dbf.GetPrevRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetNextRecord()", V4Dbf.GetNextRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", V4Dbf.GetField( fldAMT, sf ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", sf, " 666.22", 9 );
+
+ rc += TestMethod( po, "AutoCommit()", V4Dbf.SetAutoCommit( -1 ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "AMOUNT", "999.33" ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetCurRecNo()", (xbInt32) V4Dbf.GetCurRecNo(), 2 );
+ rc += TestMethod( po, "GetPrevRecord()", V4Dbf.GetPrevRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetNextRecord()", V4Dbf.GetNextRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", V4Dbf.GetField( fldAMT, sf ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", sf, " 999.33", 9 );
+
+ rc += TestMethod( po, "AutoCommit()", V4Dbf.SetAutoCommit( 1 ), XB_NO_ERROR );
+ rc += TestMethod( po, "PutField()", V4Dbf.PutField( "AMOUNT", "432.55" ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetCurRecNo()", (xbInt32) V4Dbf.GetCurRecNo(), 2 );
+ rc += TestMethod( po, "GetPrevRecord()", V4Dbf.GetPrevRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetNextRecord()", V4Dbf.GetNextRecord(), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", V4Dbf.GetField( fldAMT, sf ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetField()", sf, " 432.55", 9 );
+
+ rc += TestMethod( po, "Close()", V4Dbf.Close(), XB_NO_ERROR );
+ if( po == 2 )
+ x.DisplayTableList();
+
+ if( po > 0 || rc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", rc * -1 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], rc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return rc;
+}
diff --git a/src/tests/xb_test_expnode.cpp b/src/tests/xb_test_expnode.cpp
new file mode 100755
index 0000000..3fb716d
--- /dev/null
+++ b/src/tests/xb_test_expnode.cpp
@@ -0,0 +1,123 @@
+/* xb_test_expnode.cpp
+
+XBase Software Library
+
+Copyright (c) 1997,2003,2014,2017,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the xb expression node functions
+// usage: xb_test_expnode QUITE|NORMAL|VERBOSE
+
+#include "xbase.h"
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+/**************************************************************************/
+
+int main( int argCnt, char **av )
+{
+ xbInt16 iRc = 0;
+ xbInt16 po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ xbXBase x;
+
+ #ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ InitTime();
+
+ if( po > 0 ){
+ std::cout << "XBase Expression Node testing program.." << std::endl;
+ std::cout << "This program tests the XBase expression node logic." << std::endl;
+ }
+
+ xbString s1 = "TestNode1";
+ xbExpNode *n1 = new xbExpNode();
+ n1->SetNodeText( s1 );
+ n1->SetNodeType( XB_EXP_OPERATOR );
+ n1->SetReturnType( XB_EXP_LOGICAL );
+
+ iRc += TestMethod( po, "GetNodeType()", n1->GetNodeType(), 'O' );
+ iRc += TestMethod( po, "GetReturnType()", n1->GetReturnType(), 'L' );
+
+ xbString s2 = "TestNode2";
+ xbExpNode *n2 = new xbExpNode( s2, XB_EXP_FUNCTION, XB_EXP_CHAR );
+
+ xbString s3 = "TestNode3";
+ xbExpNode *n3 = new xbExpNode( s3, XB_EXP_CONSTANT, XB_EXP_NUMERIC );
+
+ xbString s4 = "TestNode4";
+ xbExpNode *n4 = new xbExpNode( s4, XB_EXP_OPERATOR, XB_EXP_DATE );
+
+ xbString s5 = "TestNode5";
+ xbExpNode *n5 = new xbExpNode( s5, XB_EXP_FIELD, XB_EXP_LOGICAL );
+
+ n1->AddChild( n2 );
+ n1->AddChild( n3 );
+ n1->AddChild( n4 );
+ n1->AddChild( n5 );
+
+ iRc += TestMethod( po, "GetChildCnt()", (xbInt32) n1->GetChildCnt(), 4 );
+
+ n1->SetResult( s1 );
+ iRc += TestMethod( po, "SetResult() / GetStringResult()", s1, n1->GetStringResult(), 9 );
+
+ xbBool bVal = xbTrue;
+ n1->SetResult( bVal );
+ iRc += TestMethod( po, "SetResult() / GetBoolResult()", xbTrue, n1->GetBoolResult() );
+
+ xbDouble d = 123456.789;
+ n1->SetResult( d );
+ iRc += TestMethod( po, "SetResult() / GetNumericResult()", d, n1->GetNumericResult() );
+
+ #ifdef XB_DEBUG_SUPPORT
+ if( po > 0 ){
+ n1->DumpNode( xbTrue );
+ n1->GetChild( 0 )->DumpNode( xbTrue );
+ n1->GetChild( 1 )->DumpNode( xbTrue );
+ n1->GetChild( 2 )->DumpNode( xbTrue );
+ n1->GetChild( 3 )->DumpNode( xbTrue );
+ }
+ #endif
+
+ delete n1;
+
+ if( po > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ return iRc;
+}
diff --git a/src/tests/xb_test_expression.cpp b/src/tests/xb_test_expression.cpp
new file mode 100755
index 0000000..e3b47cc
--- /dev/null
+++ b/src/tests/xb_test_expression.cpp
@@ -0,0 +1,791 @@
+/* xb_test_expression.cpp
+
+XBase Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xbExp
+// usage: xb_test_expression QUITE|NORMAL|VERBOSE
+
+#include "xbase.h"
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+/**************************************************************************/
+///@cond DOXYOFF
+
+class xbExpTest : public xbExp {
+
+ public:
+ xbExpTest( xbXBase * x );
+ xbInt16 GetNextTokenTest( xbExpToken &t );
+ xbInt16 OperatorWeightTest( const xbString &sOperator );
+ xbExpNode *GetNextNodeTest( xbExpNode * );
+};
+
+/**************************************************************************/
+xbExpTest::xbExpTest( xbXBase * x ) : xbExp( x ){
+}
+/**************************************************************************/
+xbExpNode *xbExpTest::GetNextNodeTest( xbExpNode *n ){
+ return GetNextNode( n );
+}
+/**************************************************************************/
+xbInt16 xbExpTest::GetNextTokenTest( xbExpToken &t ){
+ return GetNextToken( t );
+}
+/**************************************************************************/
+xbInt16 xbExpTest::OperatorWeightTest( const xbString &sOperator ){
+ return OperatorWeight( sOperator );
+}
+///@endcond DOXYOFF
+
+
+/**************************************************************************/
+xbInt16 DevTester( xbXBase * xb, xbDbf * dbf, const char * sExpIn ){
+
+ xbExpTest exp( xb );
+ xbExpNode *n;
+
+ std::cout << "going to parse expression [" << sExpIn << "]\n";
+ xbInt16 iRc = exp.ParseExpression( dbf, sExpIn );
+
+ std::cout << "back from parse expression\n";
+ std::cout << "dump nodes\n";
+ n = exp.GetNextNodeTest( NULL );
+ if( iRc == XB_NO_ERROR ){
+ exp.DumpTree( xbTrue );
+ std::cout << "dump nodes\n";
+ n = exp.GetNextNodeTest( NULL );
+ if( !n ){
+ std::cout << "n is null\n";
+ } else {
+ xbInt16 i = 0;
+ while( n && i < 30 ){
+ std::cout << "Node Text = [" << n->GetStringResult().Str() << "]\n";
+ n = exp.GetNextNodeTest( n );
+ i++;
+ }
+ }
+ std::cout << "end dump nodes\n";
+ return 0;
+ }else{
+ std::cout << "Parse Error [" << iRc << "]\n";
+ return -1;
+ }
+ return 0;
+}
+
+/**************************************************************************/
+xbInt16 TestWeight( xbXBase * xb, xbInt16 iPrintOption, const char * title, const char *sOperator, xbInt16 iExpectedWeight );
+xbInt16 TestWeight( xbXBase * xb, xbInt16 iPrintOption, const char * title, const char *sOperator, xbInt16 iExpectedWeight ){
+
+ xbInt16 iRc = 0;
+ xbExpTest expT1( xb );
+
+ if(( iRc = expT1.OperatorWeightTest( sOperator )) != iExpectedWeight ){
+ std::cout << std::endl << "[FAIL O1] " << title << std::endl;
+ std::cout << " Operator [" << sOperator << "] Weight [" << iRc << "] Expected [" << iExpectedWeight << "]" << std::endl;
+ return -1;
+ }
+
+ if( iPrintOption == 2 )
+ std::cout << "[PASS] " << title << " Expected matches actual Data=[" << sOperator << "][" << iExpectedWeight << "]" << std::endl;
+ else if( iPrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+
+ return XB_NO_ERROR;
+}
+/**************************************************************************/
+xbInt16 TestTokenMethod( xbXBase *xb, xbInt16 iPrintOption, const char * title, const char *sExpression,
+ const char *sExpectedToken, const char *sExpectedRemainder, char cExpectedNodeType,
+ char cExpectedReturnType, xbInt16 iErc, xbInt16 iTrc );
+
+xbInt16 TestTokenMethod( xbXBase *xb, xbInt16 iPrintOption, const char * title, const char *sExpression,
+ const char *sExpectedToken, const char *sExpectedRemainder, char cExpectedNodeType,
+ char cExpectedReturnType, xbInt16 iErc, xbInt16 iTrc ){
+
+ xbExpTest expT1( xb );
+ xbExpToken t;
+ xbInt16 iRc = XB_NO_ERROR;
+ t.sExpression = sExpression;
+
+ if(( iRc = expT1.GetNextTokenTest( t )) != iErc ){
+ std::cout << std::endl << "[FAIL T1] " << title << std::endl;
+ std::cout << " Expression [" << sExpression << "]" << std::endl;
+ std::cout << " GetNextToken iRc = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+
+ if( iTrc != t.iSts ){
+ std::cout << std::endl << "[FAIL T2] " << title << std::endl;
+ std::cout << " Expression [" << sExpression << "]" << std::endl;
+ std::cout << " GetNextToken Token Return Code = [" << iTrc << "]" << std::endl;
+ return -1;
+ }
+ if( iErc == XB_NO_ERROR && iTrc == XB_NO_ERROR && t.sToken != sExpectedToken ){
+ std::cout << std::endl << "[FAIL T3] " << title << std::endl;
+ std::cout << " Expression " << sExpression << std::endl;
+ std::cout << " Expected Result = [" << sExpectedToken << "] Actual = [" << t.sToken.Str() << "]\n";
+ return -1;
+ }
+ if( iErc == XB_NO_ERROR && iTrc == XB_NO_ERROR && t.sExpression != sExpectedRemainder ){
+ std::cout << std::endl << "[FAIL T4] " << title << std::endl;
+ std::cout << " Expression " << sExpression << std::endl;
+ std::cout << " Expected Remainder = [" << sExpectedRemainder << "] Actual = [" << t.sExpression.Str() << "]\n";
+ return -1;
+ }
+ if( iErc == XB_NO_ERROR && iTrc == XB_NO_ERROR&& t.cNodeType != cExpectedNodeType ){
+ std::cout << std::endl << "[FAIL T5] " << title << std::endl;
+ std::cout << " Expression " << sExpression << std::endl;
+ std::cout << " Expected Node type = [" << cExpectedNodeType << "] Actual = [" << t.cNodeType << "]\n";
+ return -1;
+ }
+ if( iErc == XB_NO_ERROR && iTrc == XB_NO_ERROR&& t.cReturnType != cExpectedReturnType ){
+ std::cout << std::endl << "[FAIL T6] " << title << std::endl;
+ std::cout << " Expression " << sExpression << std::endl;
+ std::cout << " Expected Return type = [" << cExpectedReturnType << "] Actual = [" << t.cReturnType << "]\n";
+ return -1;
+ }
+ if( iPrintOption == 2 ){
+ if( iErc == XB_NO_ERROR )
+ std::cout << "[PASS] " << title << " Expected matches actual Data=[" << sExpectedToken << "]" << std::endl;
+ else
+ std::cout << "[PASS] " << title << " Expected return code matches actual =[" << iErc << "]" << std::endl;
+ } else if( iPrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+
+ return 0;
+}
+
+/**************************************************************************/
+xbInt16 TestMethod( xbXBase *xb, xbDbf *d, xbInt16 PrintOption, const char * title,
+ const xbString &sExpression, const char * sExpectedResult, xbInt16 iExpectedResultLen );
+
+xbInt16 TestMethod( xbXBase *xb, xbDbf *d, xbInt16 PrintOption, const char * title,
+ const xbString &sExpression, const char * sExpectedResult, xbInt16 iExpectedResultLen ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+ xbString sResult;
+ xbExp exp( xb );
+
+ if(( iRc = exp.ParseExpression( d, sExpression )) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 1] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.GetReturnType()) != XB_EXP_CHAR ){
+ std::cout << std::endl << "[FAIL 2] " << title << std::endl;
+ std::cout << " Result type not XB_EXP_CHAR = [" << exp.GetReturnType() << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.ProcessExpression()) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 3] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.GetStringResult( sResult )) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 4] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if( sResult != sExpectedResult ){
+ std::cout << std::endl << "[FAIL 5] " << title << std::endl;
+ std::cout << " Expected Result = [" << sExpectedResult << "] Actual Result =[" << sResult.Str() << "]" << std::endl;
+ exp.DumpTree( 1 );
+ return -1;
+ }
+ if( exp.GetResultLen() != iExpectedResultLen ){
+ std::cout << std::endl << "[FAIL 6] " << title << std::endl;
+ std::cout << " Expected Result Len = [" << iExpectedResultLen << "] Actual Result =[" << exp.GetResultLen() << "]" << std::endl;
+ exp.DumpTree( 1 );
+ return -1;
+ }
+ if( PrintOption == 2 )
+ std::cout << "[PASS] " << title << " Expected [" << sExpectedResult << "] matches actual [" << exp.GetResultLen() << "]" << std::endl;
+ else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+
+ return 0;
+}
+
+/**************************************************************************/
+xbInt16 TestMethod( xbXBase * xb, xbDbf * d, xbInt16 PrintOption, const char * title,
+ const xbString &sExpression, xbDouble dExpectedResult );
+
+xbInt16 TestMethod( xbXBase * xb, xbDbf * d, xbInt16 PrintOption, const char * title,
+ const xbString &sExpression, xbDouble dExpectedResult ){
+
+ xbDouble dResult;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbExp exp( xb );
+
+ if(( iRc = exp.ParseExpression( d, sExpression )) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 1] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.GetReturnType()) != XB_EXP_NUMERIC ){
+ std::cout << std::endl << "[FAIL 2] " << title << std::endl;
+ std::cout << " Result type not XB_EXP_NUMERIC = [" << exp.GetReturnType() << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.ProcessExpression()) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 3] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.GetNumericResult( dResult )) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 4] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if( !dblEquals( dResult, dExpectedResult, .01 )){
+ std::cout << std::endl << "[FAIL 5] " << title << std::endl;
+ std::cout << " Expected Result = [" << dExpectedResult << "] Actual Result =[" << dResult << "]" << std::endl;
+ // dump out the tree
+ exp.DumpTree( 1 );
+ return -1;
+ }
+ if( PrintOption == 2 )
+ std::cout << "[PASS] " << title << " Expected [" << dExpectedResult << "] matches actual [" << exp.GetResultLen() << "]" << std::endl;
+ else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ return 0;
+}
+/**************************************************************************/
+xbInt16 TestMethod( xbXBase * xb, xbDbf * d, xbInt16 PrintOption, const char * title,
+ const xbString &sExpression, xbDate dtExpectedResult );
+xbInt16 TestMethod( xbXBase * xb, xbDbf * d, xbInt16 PrintOption, const char * title,
+ const xbString &sExpression, xbDate dtExpectedResult ){
+
+ xbDate dtResult;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbExp exp( xb );
+ if(( iRc = exp.ParseExpression( d, sExpression )) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 1] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.GetReturnType()) != XB_EXP_DATE ){
+ std::cout << std::endl << "[FAIL 2] " << title << std::endl;
+ std::cout << " Result type not XB_EXP_DATE = [" << exp.GetReturnType() << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.ProcessExpression()) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 3] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.GetDateResult( dtResult )) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 4] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if( dtResult != dtExpectedResult ){
+ std::cout << std::endl << "[FAIL 5] " << title << std::endl;
+ std::cout << " Expected Result = [" << dtExpectedResult.Str() << "] Actual Result =[" << dtResult.Str() << "]" << std::endl;
+ // dump out the tree
+ exp.DumpTree( 1 );
+ return -1;
+ }
+ if( PrintOption == 2 )
+ std::cout << "[PASS] " << title << " Expected [" << dtExpectedResult.Str() << "] matches actual [" << exp.GetResultLen() << "]" << std::endl;
+ else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+
+ return 0;
+}
+/**************************************************************************/
+xbInt16 TestMethod( xbXBase * xb, xbDbf * d, xbInt16 PrintOption, const char * title,
+ const xbString &sExpression, xbBool bExpectedResult );
+xbInt16 TestMethod( xbXBase * xb, xbDbf * d, xbInt16 PrintOption, const char * title,
+ const xbString &sExpression, xbBool bExpectedResult ){
+
+ xbInt16 iRc = XB_NO_ERROR;
+
+ xbBool bResult;
+ xbExp exp( xb );
+ if(( iRc = exp.ParseExpression( d, sExpression )) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 1] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.GetReturnType()) != XB_EXP_LOGICAL ){
+ std::cout << std::endl << "[FAIL 2] " << title << std::endl;
+ std::cout << " Result type not XB_EXP_LOGICAL = [" << exp.GetReturnType() << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.ProcessExpression()) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 3] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if(( iRc = exp.GetBoolResult( bResult )) != XB_NO_ERROR ){
+ std::cout << std::endl << "[FAIL 4] " << title << std::endl;
+ std::cout << " Return Code = [" << iRc << "]" << std::endl;
+ return -1;
+ }
+ if( bResult != bExpectedResult ){
+ std::cout << std::endl << "[FAIL 5] " << title << std::endl;
+ std::cout << " Expected Result = [" << bExpectedResult << "] Actual Result =[" << bResult << "]" << std::endl;
+ // dump out the tree
+ exp.DumpTree( 1 );
+ return -1;
+ }
+ if( PrintOption == 2 )
+ std::cout << "[PASS] " << title << " Expected [" << bExpectedResult << "] matches actual [" << bResult << "]" << std::endl;
+ else if( PrintOption == 1 )
+ std::cout << "[PASS] " << title << std::endl;
+ return 0;
+}
+/**************************************************************************/
+int main( int argCnt, char **av )
+{
+ xbInt16 iRc = 0;
+ xbInt16 rc2 = 0;
+ xbInt16 po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ xbSchema MyRecord[] =
+ {
+ { "CHAR1", XB_CHAR_FLD, 5, 0 },
+ { "CHAR2", XB_CHAR_FLD, 7, 0 },
+ { "DATE1", XB_DATE_FLD, 8, 0 },
+ { "DATE2", XB_DATE_FLD, 8, 0 },
+ { "NUM1", XB_NUMERIC_FLD, 9, 2 },
+ { "",0,0,0 }
+ };
+
+ xbXBase x;
+ xbDbf * MyFile;
+ xbDate d;
+
+ #ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ InitTime();
+
+ if( po > 0 ){
+ std::cout << "XBase Expression testing program.." << std::endl;
+ std::cout << "This program tests the XBase expression logic." << std::endl;
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+ }
+
+// return 0;
+
+ #ifdef XB_DBF4_SUPPORT
+ MyFile = new xbDbf4( &x ); /* version 4 dbf file */
+ #else
+ MyFile = new xbDbf3( &x ); /* version 3 dbf file */
+ #endif
+
+
+
+// return 0;
+
+ rc2 = MyFile->CreateTable( "ExpTest.DBF", "ExpTest", MyRecord, XB_OVERLAY, XB_MULTI_USER );
+
+// return 0;
+
+ iRc += TestMethod( po, "CreateTable()", rc2, XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", MyFile->PutField( "CHAR1", "TEST" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", MyFile->PutField( "CHAR2", "TEST7B" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", MyFile->PutFloatField( "NUM1", 5 ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", MyFile->PutField( "DATE1", "19890303" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", MyFile->PutField ( "DATE2", "20120708" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AppendRecord()", MyFile->AppendRecord(), XB_NO_ERROR );
+
+
+// return 0;
+
+
+ iRc += TestTokenMethod( &x, po, "EOX Test1", "", "", "", '?', XB_EXP_UNKNOWN, XB_NO_ERROR, XB_END_OF_EXPRESSION );
+ iRc += TestTokenMethod( &x, po, "EOX Test2 ", " ", "", "", '?', XB_EXP_UNKNOWN, XB_NO_ERROR, XB_END_OF_EXPRESSION );
+ iRc += TestTokenMethod( &x, po, "Paren Test1 ", "(SOMETOKEN)+5-100", "SOMETOKEN", "+5-100", XB_EXP_NOTROOT, XB_EXP_UNKNOWN, XB_NO_ERROR , XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Paren Test2 ", "{ANOTHERTOKEN} + 55-100", "ANOTHERTOKEN", " + 55-100", XB_EXP_NOTROOT, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Paren Test3 ", "{{NESTED}TOKEN} + 55-100", "{NESTED}TOKEN", " + 55-100", XB_EXP_NOTROOT, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+
+ // next line generates log message
+ iRc += TestTokenMethod( &x, po, "Paren Test4 ", "{{NESTED}TOKEN + 55-100", "{NESTED}TOKEN", " + 55-100", XB_EXP_NOTROOT, XB_EXP_UNKNOWN, XB_PARSE_ERROR, XB_UNBALANCED_PARENS );
+ iRc += TestTokenMethod( &x, po, "Paren Test5 ", " (SOMETOKEN )+5-100", "SOMETOKEN ", "+5-100", XB_EXP_NOTROOT, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Quote Test1 ", "\"SOMETOKEN\"+5-100", "SOMETOKEN", "+5-100", XB_EXP_CONSTANT, XB_EXP_CHAR, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Quote Test2 ", "'SOMETOKEN2'", "SOMETOKEN2", "", XB_EXP_CONSTANT, XB_EXP_CHAR, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Quote Test3 ", " 'SOMETOKEN3 '", "SOMETOKEN3 ", "", XB_EXP_CONSTANT, XB_EXP_CHAR, XB_NO_ERROR, XB_NO_ERROR );
+
+
+
+ // next line generates log message
+
+ iRc += TestTokenMethod( &x, po, "Quote Test3 ", " 'SOMETOKEN4 ", "SOMETOKEN3 ", "", XB_EXP_CONSTANT, XB_EXP_CHAR, XB_PARSE_ERROR, XB_UNBALANCED_QUOTES );
+
+
+ iRc += TestTokenMethod( &x, po, "Logical Constant1 ", ".T.", "T", "", XB_EXP_CONSTANT, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Logical Constant2 ", ".F.", "F", "", XB_EXP_CONSTANT, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Logical Constant3 ", ".TRUE.", "T", "", XB_EXP_CONSTANT, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Logical Constant4 ", ".FALSE.", "F", "", XB_EXP_CONSTANT, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Logical Constant5 ", ".T. and x", "T", " and x", XB_EXP_CONSTANT, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Numeric Constant1 ", "123", "123", "", XB_EXP_CONSTANT, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+
+
+
+ iRc += TestTokenMethod( &x, po, "Numeric Constant2 ", "-123", "-123", "", XB_EXP_CONSTANT, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Numeric Constant3 ", " - 123", "-123", "", XB_EXP_CONSTANT, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Numeric Constant4 ", " - .456", "-.456", "", XB_EXP_CONSTANT, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Numeric Constant5 ", " -.002", "-.002", "", XB_EXP_CONSTANT, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Numeric Constant6 ", " - .002 + 1", "-.002", " + 1", XB_EXP_CONSTANT, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 1", "-", "-", "", XB_EXP_OPERATOR, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 2", "+", "+", "", XB_EXP_OPERATOR, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 3", "*", "*", "", XB_EXP_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 4", "/", "/", "", XB_EXP_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 5", "^", "^", "", XB_EXP_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 6", "%", "%", "", XB_EXP_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 7", "=", "=", "", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 8", "<", "<", "", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 9", ">", ">", "", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 10", "$", "$", "", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 11", "**", "**", "", XB_EXP_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 12", "++", "++", "", XB_EXP_POST_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 13", "--", "--", "", XB_EXP_POST_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 14", "-- ", "--", " ", XB_EXP_POST_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 15", "--X", "--", "X", XB_EXP_PRE_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 16", "++X", "++", "X", XB_EXP_PRE_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 17", "+=", "+=", "", XB_EXP_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 18", "-=", "-=", "", XB_EXP_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 19", "*=", "*=", "", XB_EXP_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 20", "/=", "/=", "", XB_EXP_OPERATOR, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 21", "<>", "<>", "", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 22", "<=", "<=", "", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 23", ">=", ">=", "", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 24", ">= grapes", ">=", " grapes", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 25", "< apples ", "<", " apples ", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 26", ".NOT.", ".NOT.", "", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 27", ".AND.", ".AND.", "", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Operator 28", ".OR.", ".OR.", "", XB_EXP_OPERATOR, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+
+ iRc += TestTokenMethod( &x, po, "Function 1", "STOD ( \"08252017\" )", "STOD ( \"08252017\" )", "", XB_EXP_FUNCTION, XB_EXP_DATE, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Function 2", "STR( 8 )", "STR( 8 )", "", XB_EXP_FUNCTION, XB_EXP_CHAR, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Function 3", "STR( (8-3)+3 )", "STR( (8-3)+3 )", "", XB_EXP_FUNCTION, XB_EXP_CHAR, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Function 4", "STR( (8-3)+3 ) + \"A\"", "STR( (8-3)+3 )", " + \"A\"", XB_EXP_FUNCTION, XB_EXP_CHAR, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Function 5", "ISALPHA( \"A\" )", "ISALPHA( \"A\" )", "", XB_EXP_FUNCTION, XB_EXP_LOGICAL, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Function 6", "EXP( 6 )", "EXP( 6 )", "", XB_EXP_FUNCTION, XB_EXP_NUMERIC, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Field 1", "NUM1", "NUM1", "", XB_EXP_FIELD, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Field 2", "NUM1 + X", "NUM1", " + X", XB_EXP_FIELD, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Field 3", "ExpTest->NUM1", "ExpTest->NUM1", "", XB_EXP_FIELD, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Field 4", "ExpTest ->NUM1", "ExpTest ->NUM1", "", XB_EXP_FIELD, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Field 5", "ExpTest -> NUM1", "ExpTest -> NUM1", "", XB_EXP_FIELD, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+ iRc += TestTokenMethod( &x, po, "Field 6", "ExpTest -> NUM1+1", "ExpTest -> NUM1", "+1", XB_EXP_FIELD, XB_EXP_UNKNOWN, XB_NO_ERROR, XB_NO_ERROR );
+
+ iRc += TestWeight( &x, po, "Weight Test", "", 0 );
+ iRc += TestWeight( &x, po, "Weight Test", "toobig", 0 );
+ iRc += TestWeight( &x, po, ".OR. Weight Test", ".OR.", 1 );
+ iRc += TestWeight( &x, po, ".AND. Weight Test", ".AND.", 2 );
+ iRc += TestWeight( &x, po, ".NOT. Weight Test", ".NOT.", 3 );
+ iRc += TestWeight( &x, po, "> Weight Test", ">", 4 );
+ iRc += TestWeight( &x, po, ">= Weight Test", ">=", 4 );
+ iRc += TestWeight( &x, po, "< Weight Test", "<", 4 );
+ iRc += TestWeight( &x, po, "<= Weight Test", "<=", 4 );
+ iRc += TestWeight( &x, po, "<> Weight Test", "<>", 4 );
+ iRc += TestWeight( &x, po, "# Weight Test", "#", 4 );
+ iRc += TestWeight( &x, po, "$ Weight Test", "$", 4 );
+ iRc += TestWeight( &x, po, "= Weight Test", "=", 4 );
+ iRc += TestWeight( &x, po, "-- Prefix decrement Weight Test", "--0", 9 );
+ iRc += TestWeight( &x, po, "++ Prefix increment Weight Test", "++0", 9 );
+ iRc += TestWeight( &x, po, "** Weight Test", "**", 8 );
+ iRc += TestWeight( &x, po, "^ Weight Test", "^", 8 );
+ iRc += TestWeight( &x, po, "* Weight Test", "*", 7 );
+ iRc += TestWeight( &x, po, "* Weight Test", "/", 7 );
+ iRc += TestWeight( &x, po, "* Weight Test", "%", 7 );
+ iRc += TestWeight( &x, po, "* Weight Test", "*=", 7 );
+ iRc += TestWeight( &x, po, "* Weight Test", "/=", 7 );
+ iRc += TestWeight( &x, po, "+ Weight Test", "+", 6 );
+ iRc += TestWeight( &x, po, "- Weight Test", "-", 6 );
+ iRc += TestWeight( &x, po, "+= Weight Test", "+=", 6 );
+ iRc += TestWeight( &x, po, "-= Weight Test", "-=", 6 );
+ iRc += TestWeight( &x, po, "-- Postfix decrement Weight Test", "--1", 5 );
+ iRc += TestWeight( &x, po, "++ Postfix increment Weight Test", "++1", 5 );
+
+ iRc += TestMethod( &x, MyFile, po, "CharTest1", "CHAR1", "TEST ", 5 );
+ iRc += TestMethod( &x, MyFile, po, "CharTest2", "ExpTest->CHAR1", "TEST ", 5 );
+ iRc += TestMethod( &x, MyFile, po, "CharTest3", "ExpTest->CHAR1+CHAR1", "TEST TEST ", 10 );
+ iRc += TestMethod( &x, MyFile, po, "CharTest4", "\"PRE_ \"+\" _POST\"", "PRE_ _POST", 11 );
+ iRc += TestMethod( &x, MyFile, po, "CharTest5", "\"PRE_ \"-\" _POST\"", "PRE_ _POST ", 11 );
+ iRc += TestMethod( &x, MyFile, po, "CharTest6", "\"PRE_\"+ExpTest->CHAR1+\"_POST\"", "PRE_TEST _POST", 14 );
+ iRc += TestMethod( &x, MyFile, po, "CharTest7", "STR(123)", " 123", 10 );
+ iRc += TestMethod( &x, MyFile, po, "CharTest8", "STR(123)+LTRIM(STR(456))", " 123456", 20 );
+ iRc += TestMethod( &x, MyFile, po, "CharTest9", "STR(8)+STR(7)", " 8 7", 20 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest1", "ALLTRIM( \" ABCD \" )", "ABCD", 11 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest2", "CDOW( STOD( \"20171014\" ))", "Saturday", 9 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest3", "CHR( 66 )", "B", 1 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest4", "CMONTH( STOD( \"20171114\" ) )", "November", 9 );
+
+ // next line causes MAC compiler to cough up a furball
+ //iRc += TestMethod( &x, MyFile, po, "FuncTest5", "DESCEND( \"ABCDE\" )", "", 5 );
+
+ char sDescendResult[6]; // = "";
+ sDescendResult[0] = (char) 0xBE;
+ sDescendResult[1] = (char) 0xBD;
+ sDescendResult[2] = (char) 0xBC;
+ sDescendResult[3] = (char) 0xBB;
+ sDescendResult[4] = (char) 0xBA;
+ sDescendResult[5] = (char) 0x00;
+ iRc += TestMethod( &x, MyFile, po, "FuncTest5", "DESCEND( \"ABCDE\" )", sDescendResult, 5 );
+
+ iRc += TestMethod( &x, MyFile, po, "FuncTest6", "DTOC( STOD( \"20171114\" ))", "11/14/17", 8 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest7", "DTOS( STOD( \"20171114\" ))", "20171114", 8 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest8", "LEFT( \"ABCDEFGH\", 5 )", "ABCDE", 5 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest9", "LOWER( \"ABCDEFGH\" )", "abcdefgh", 8 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest10", "LTRIM( \" ABC\" )", "ABC", 6 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest11", "REPLICATE( \"ABC\", 3 )", "ABCABCABC", 9 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest12", "RIGHT( \"ABCDEFGH\", 5 )", "DEFGH", 5 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest13", "RTRIM( \"ABCD \" )", "ABCD", 7 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest14", "SPACE( 5 )", " ", 5 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest15", "STR( 8 )", " 8", 10 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest16", "STR( 3, 4 )", " 3", 4 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest17", "STR( 12.7, 5, 2 )", "12.70", 5 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest18", "STR( 43.17, 9, 4, \"0\" )", "0043.1700", 9 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest19", "STRZERO( 56.21, 9, 4 )", "0056.2100", 9 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest20", "SUBSTR( \"SOMESTRING\", 3, 5 )", "MESTR", 5 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest21", "TRIM( \" abc123 \" )", " abc123", 12 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest22", "UPPER( \"abc123RRR\" )", "ABC123RRR", 9 );
+
+ // numeric logic tests
+ iRc += TestMethod( &x, MyFile, po, "NumericTest1", "1 + 1", (xbDouble) 2 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest2", "6 - 1", (xbDouble) 5 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest3", "6 * 4", (xbDouble) 24 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest4", "8 / 2", (xbDouble) 4 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest5", "3 ^ 3", (xbDouble) 27 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest6", "4 ** 4", (xbDouble) 256 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest7", "NUM1", (xbDouble) 5 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest8", "NUM1 + 2.3", (xbDouble) 7.3 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest9", "++NUM1", (xbDouble) 6 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest10", "NUM1++", (xbDouble) 5 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest11", "--NUM1", (xbDouble) 4 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest12", "NUM1--", (xbDouble) 5 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest13", "3++", (xbDouble) 3 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest14", "++3", (xbDouble) 4 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest15", "4--", (xbDouble) 4 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest16", "--4", (xbDouble) 3 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest17", "3 += 12", (xbDouble) 15 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest18", "3 -= 12", (xbDouble) -9 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest19", "3 *= 12", (xbDouble) 36 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest20", "12 /= 3", (xbDouble) 4 );
+ iRc += TestMethod( &x, MyFile, po, "NumericTest21", "(12+3)*(15-13)", (xbDouble) 30 );
+
+ // numeric functions
+ iRc += TestMethod( &x, MyFile, po, "FuncTest23", "ABS( -22 )", (xbDouble) 22 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest24", "ABS( 23 )", (xbDouble) 23 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest25", "ASC( \"A\" )", (xbDouble) 65 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest26", "AT( \",\", \"Booth, Joseph\" )", (xbDouble) 6 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest27", "DAY( STOD( \"20171017\" ))", (xbDouble) 17 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest28", "DESCEND( 1991 )", (xbDouble) -1991 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest29", "DOW( STOD( \"20171017\" ) )", (xbDouble) 3 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest30", "DOW( STOD( \"20171021\" ) )", (xbDouble) 0 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest31", "EXP( 0 )", (xbDouble) 1 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest32", "INT( 123.45 )", (xbDouble) 123 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest33", "LEN( \"ABC123\" )", (xbDouble) 6 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest34", "LOG( 10 )", (xbDouble) 2.3 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest35", "MAX( 10, 20 )", (xbDouble) 20 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest36", "MIN( 10, 20 )", (xbDouble) 10 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest37", "MONTH( STOD( \"20171017\" ))", (xbDouble) 10 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest38", "RECCOUNT()", (xbDouble) 1 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest39", "RECNO()", (xbDouble) 1 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest40", "SQRT( 9 )", (xbDouble) 3 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest41", "VAL( \"89\" )", (xbDouble) 89 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest42", "VAL( \"22.13 and some text\" )", (xbDouble) 22.13 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest43", "YEAR( STOD( \"20171017\" ))", (xbDouble) 2017 );
+
+ // date logic tests
+ xbDate dtTest1( "19890303" );
+ xbDate dtTest2( "20120708" );
+ iRc += TestMethod( &x, MyFile, po, "DateTest1", "ExpTest->DATE1", dtTest1 );
+ iRc += TestMethod( &x, MyFile, po, "DateTest2", "DATE1", dtTest1 );
+ iRc += TestMethod( &x, MyFile, po, "DateTest3", "ExpTest->DATE2", dtTest2 );
+ iRc += TestMethod( &x, MyFile, po, "DateTest4", "DATE2", dtTest2 );
+ iRc += TestMethod( &x, MyFile, po, "DateTest5", "DATE2 - DATE1", (xbDouble) 8528 );
+
+ dtTest1.Set( "20120705" );
+ iRc += TestMethod( &x, MyFile, po, "DateTest6", "DATE2 - 3", dtTest1 );
+ iRc += TestMethod( &x, MyFile, po, "DateTest7", "DATE2 -= 3", dtTest1 );
+
+ dtTest1.Set( "20120718" );
+ iRc += TestMethod( &x, MyFile, po, "DateTest8", "DATE2 + 10", dtTest1 );
+ iRc += TestMethod( &x, MyFile, po, "DateTest9", "DATE2 += 10", dtTest1 );
+
+ dtTest1.Set( "20120709" );
+ iRc += TestMethod( &x, MyFile, po, "DateTest10", "++DATE2", dtTest1 );
+ dtTest1.Set( "20120707" );
+ iRc += TestMethod( &x, MyFile, po, "DateTest11", "--DATE2", dtTest1 );
+
+ dtTest1.Set( "20120708" );
+ iRc += TestMethod( &x, MyFile, po, "DateTest12", "DATE2++", dtTest1 );
+ iRc += TestMethod( &x, MyFile, po, "DateTest13", "DATE2--", dtTest1 );
+
+ iRc += TestMethod( &x, MyFile, po, "DateTest14", "{07/08/12}", dtTest1 );
+ iRc += TestMethod( &x, MyFile, po, "DateTest15", "{07/08/2012}", dtTest1 );
+
+ iRc += TestMethod( &x, MyFile, po, "DateTest16", "{07/11/12} -3", dtTest1 );
+ iRc += TestMethod( &x, MyFile, po, "DateTest17", "{07/06/2012} + 2", dtTest1 );
+
+ iRc += TestMethod( &x, MyFile, po, "FuncTest44", "CTOD( \"07\\08\\12\" )", dtTest1 );
+
+ xbDate dtToday;
+ iRc += TestMethod( &x, MyFile, po, "FuncTest45", "DATE()", dtToday );
+
+ dtTest2 = "28870625";
+ iRc += TestMethod( &x, MyFile, po, "FuncTest46", "DESCEND( DATE2 )", dtTest2 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest47", "STOD( \"20120708\" )", dtTest1 );
+
+ // boolean logic tests
+ iRc += TestMethod( &x, MyFile, po, "LogicTest1", "3=5", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest2", "5=5", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest3", "\"abc\"=\"def\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest4", "\"abc\"=\"abc\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest5", "CTOD( \"07\\08\\12\" ) = CTOD ( \"07\\08\\12\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest6", "CTOD( \"07\\09\\12\" ) = CTOD ( \"07\\08\\12\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest7", "3<>5", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest8", "5<>5", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest9", "3!=5", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest10", "5!=5", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest11", "3 # 5", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest12", "5#5", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest13", "\"3\"<>\"5\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest14", "\"5\"<>\"5\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest15", "\"3\"!=\"5\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest16", "\"5\"!=\"5\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest17", "\"3\" # \"5\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest18", "\"5\"#\"5\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest19", "CTOD( \"07\\08\\12\" ) <> CTOD ( \"07\\08\\12\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest20", "CTOD( \"07\\09\\12\" ) <> CTOD ( \"07\\08\\12\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest21", "CTOD( \"07\\08\\12\" ) != CTOD ( \"07\\08\\12\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest22", "CTOD( \"07\\09\\12\" ) != CTOD ( \"07\\08\\12\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest23", "CTOD( \"07\\08\\12\" ) # CTOD ( \"07\\08\\12\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest24", "CTOD( \"07\\09\\12\" ) # CTOD ( \"07\\08\\12\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest25", "3<5", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest26", "5<5", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest27", "5<4", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest28", "\"a\"<\"b\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest29", "\"a\"<\"a\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest30", "\"c\"<\"b\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest31", "CTOD( \"07\\07\\12\" ) < CTOD ( \"07\\08\\12\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest32", "CTOD( \"07\\08\\12\" ) < CTOD ( \"07\\08\\12\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest33", "CTOD( \"07\\09\\12\" ) < CTOD ( \"07\\08\\12\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest34", "3>5", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest35", "5>5", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest36", "5>4", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest37", "\"a\">\"b\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest38", "\"a\">\"a\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest39", "\"c\">\"b\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest40", "CTOD( \"07\\07\\12\" ) > CTOD ( \"07\\08\\12\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest41", "CTOD( \"07\\08\\12\" ) > CTOD ( \"07\\08\\12\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest42", "CTOD( \"07\\09\\12\" ) > CTOD ( \"07\\08\\12\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest43", "3<=5", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest44", "5<=5", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest45", "5<=4", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest46", "\"a\"<=\"b\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest47", "\"a\"<=\"a\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest48", "\"c\"<=\"b\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest49", "CTOD( \"07\\07\\12\" ) <= CTOD ( \"07\\08\\12\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest50", "CTOD( \"07\\08\\12\" ) <= CTOD ( \"07\\08\\12\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest51", "CTOD( \"07\\09\\12\" ) <= CTOD ( \"07\\08\\12\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest52", "3>=5", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest53", "5>=5", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest54", "5>=4", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest55", "\"a\">=\"b\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest56", "\"a\">=\"a\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest57", "\"c\">=\"b\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest58", "CTOD( \"07\\07\\12\" ) >= CTOD ( \"07\\08\\12\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest59", "CTOD( \"07\\08\\12\" ) >= CTOD ( \"07\\08\\12\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest60", "CTOD( \"07\\09\\12\" ) >= CTOD ( \"07\\08\\12\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest61", "\"abc123\" $ \"abc\"", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest62", "\"abc\" $ \"abc123\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest63", "\"abc\" $ \"zzabc123\"", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest64", ".T.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest65", ".F.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest66", ".TRUE.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest67", ".FALSE.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest68", ".NOT. .F.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest69", " NOT .F.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest70", ".NOT. .T.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest71", " NOT .T.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest72", ".T. .AND. .T.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest73", ".T. AND .T.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest74", ".T. .AND. .NOT. .T.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest75", ".T. AND NOT .T.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest76", ".NOT. .T. .AND. .T.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest77", " NOT .T. AND .T.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest78", ".NOT. .T. .AND. .NOT. .T.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest79", " NOT .T. AND NOT .T.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest80", ".T. .OR. .T.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest81", ".T. OR .T.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest82", ".T. .OR. .NOT. .T.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest83", ".T. OR NOT .T.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest84", ".NOT. .T. .OR. .T.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest85", " NOT .T. OR .T.", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest86", ".NOT. .T. .OR. .NOT. .T.", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "LogicTest87", " NOT .T. OR NOT .T.", (xbBool) xbFalse );
+
+ iRc += TestMethod( &x, MyFile, po, "FuncTest48", "ISALPHA( \"12345\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest49", "ISALPHA( \"ABCDEF\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest50", "ISALPHA( \"A1234\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest51", "ISLOWER( \"12345\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest52", "ISLOWER( \"ABCDEF\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest53", "ISLOWER( \"abc123\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest54", "ISLOWER( \"xyz\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest55", "ISUPPER( \"12345\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest56", "ISUPPER( \"ABCDEF\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest57", "ISUPPER( \"abc123\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest58", "ISUPPER( \"xyz\" )", (xbBool) xbFalse );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest59", "ISUPPER( \"Xyz\" )", (xbBool) xbTrue );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest60", "IIF( .T., \"TRUE \", \"FALSE\" )", "TRUE ", 5 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest61", "IIF( .F., \"TRUE \", \"FALSE\" )", "FALSE", 5 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest62", "DEL()", " ", 1 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest63", "DELETED()", (xbBool) xbFalse );
+ iRc += TestMethod( po, "DeleteRecord()", MyFile->DeleteRecord(), XB_NO_ERROR );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest64", "DEL()", "*", 1 );
+ iRc += TestMethod( &x, MyFile, po, "FuncTest65", "DELETED()", (xbBool) xbTrue );
+ iRc += TestMethod( po, "UndeleteRecord()", MyFile->UndeleteRecord(), XB_NO_ERROR );
+
+
+ iRc += TestMethod( po, "Close()", MyFile->Close(), XB_NO_ERROR );
+ delete MyFile;
+
+ if( po > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ return iRc;
+}
diff --git a/src/tests/xb_test_file.cpp b/src/tests/xb_test_file.cpp
new file mode 100755
index 0000000..ca32693
--- /dev/null
+++ b/src/tests/xb_test_file.cpp
@@ -0,0 +1,212 @@
+/* xb_test_file.cpp
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the file functions
+
+// usage: xb_test_file QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+
+using namespace xb;
+
+
+#include "tstfuncs.cpp"
+
+
+int main( int argCnt, char **av )
+{
+ int rc = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+#ifdef XB_LOGGING_SUPPORT
+ xbXBase x;
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ InitTime();
+ xbFile f( &x );
+ xbString sWrkStr;
+ xbString sWrkStr2;
+ sWrkStr = PROJECT_DATA_DIR;
+ f.SetDataDirectory( PROJECT_DATA_DIR );
+
+ #ifdef WIN32
+ sWrkStr.SwapChars( '/', '\\' );
+ #else
+ sWrkStr.SwapChars( '\\', '/' );
+ #endif
+
+ rc += TestMethod( po, "Set/GetDataDirectory()", f.GetDataDirectory(), sWrkStr, sWrkStr.Len());
+
+ f.SetFileName( "TestFile.txt" );
+ sWrkStr = "TestFile.txt";
+ rc += TestMethod( po, "Set/GetFileName()", f.GetFileName(), sWrkStr, sWrkStr.Len());
+
+ f.GetFileType( sWrkStr );
+ rc += TestMethod( po, "GetFileType()", sWrkStr, "TXT", 3 );
+
+ #ifdef WIN32
+ sWrkStr = "\\my\\directory\\";
+ #else
+ sWrkStr = "/my/directory/";
+ #endif
+
+ f.SetDirectory( sWrkStr );
+ rc += TestMethod( po, "Set/GetDirectory()", f.GetDirectory(), sWrkStr, sWrkStr.Len());
+
+ sWrkStr += "TestFile.txt";
+ rc += TestMethod( po, "GetFqFileName()", f.GetFqFileName(), sWrkStr, 26 );
+
+#ifdef WIN32
+ sWrkStr = "\\some\\directory\\myfile.dat";
+ sWrkStr2 = "\\some\\directory\\";
+#else
+ sWrkStr = "/some/directory/myfile.dat";
+ sWrkStr2 = "/some/directory/";
+#endif
+
+
+ f.SetFqFileName( sWrkStr );
+ rc += TestMethod( po, "GetDirectory()", f.GetDirectory(), sWrkStr2, 16 );
+ rc += TestMethod( po, "GetFileName()", f.GetFileName(), "myfile.dat", 10 );
+
+ rc += TestMethod( po, "NameSuffixMissing()", f.NameSuffixMissing( "myfile.dbf", 1 ), 0 );
+ rc += TestMethod( po, "NameSuffixMissing()", f.NameSuffixMissing( "myfile", 1 ), 1 );
+ rc += TestMethod( po, "NameSuffixMissing()", f.NameSuffixMissing( "MYFILE", 1 ), 2 );
+
+ f.SetDirectory( PROJECT_DATA_DIR );
+ f.SetFileName( "xbfile.txt" );
+
+ rc += TestMethod( po, "xbFopen()", f.xbFopen( "w+b", XB_MULTI_USER ), XB_NO_ERROR );
+
+
+ xbString sTest;
+ sTest = "Test Data";
+ rc += TestMethod( po, "xbWrite()", f.xbFwrite( sTest.Str(), 9, 1 ), XB_NO_ERROR );
+ rc += TestMethod( po, "xbFclose()", f.xbFclose(), XB_NO_ERROR );
+
+ rc += TestMethod( po, "xbFopen()", f.xbFopen( "r+b", XB_MULTI_USER ), XB_NO_ERROR );
+ rc += TestMethod( po, "xbFseek()", f.xbFseek( 0, SEEK_SET ), XB_NO_ERROR );
+ char buf[10];
+ for( int i = 0; i < 10; i++ )
+ buf[i] = 0x00;
+ rc += TestMethod( po, "xbFread()", f.xbFread( buf, 5, 1 ), XB_NO_ERROR );
+ rc += TestMethod( po, "xbFread()", buf, "Test ", 5 );
+
+ rc += TestMethod( po, "xbFclose()", f.xbFclose(), XB_NO_ERROR );
+ rc += TestMethod( po, "xbRemove()", f.xbRemove(), XB_NO_ERROR );
+ xbInt16 iWork = 100;
+ char cBuf[9];
+ char *p = cBuf;
+ f.ePutInt16( cBuf, iWork );
+ rc += TestMethod( po, "Put/GetShort()", f.eGetInt16( p ), 100 );
+
+ xbInt32 lWork = 10101;
+ f.ePutInt32( p, lWork );
+ rc += TestMethod( po, "Put/GetLong()", f.eGetInt32( p ), 10101 );
+
+ lWork = 2147483647;
+ f.ePutInt32( p, lWork );
+ rc += TestMethod( po, "Put/GetLong()", f.eGetInt32( p ), 2147483647 );
+ rc += TestMethod( po, "Put/GetLong()", (xbInt32) f.eGetUInt32( p ), 2147483647 );
+
+ xbDouble d = 123456.789;
+ f.ePutDouble( p, d );
+ rc += TestMethod( po, "Put/GetDouble()", f.eGetDouble( p ), 123456.789 );
+
+ xbString sFqnS;
+ xbString sFqnT;
+ xbFile f2( &x );
+ rc += TestMethod( po, "CreateUniqueFileName()", f2.CreateUniqueFileName( PROJECT_DATA_DIR, "dbf", sFqnS ), XB_NO_ERROR );
+
+ rc += TestMethod( po, "FileExists()", f2.FileExists( sFqnS ), xbFalse );
+ rc += TestMethod( po, "xbFopen()", f2.xbFopen( "w+b", sFqnS, XB_SINGLE_USER ), XB_NO_ERROR );
+ rc += TestMethod( po, "xbFclose()", f2.xbFclose(), XB_NO_ERROR );
+ rc += TestMethod( po, "FileExists()", f2.FileExists( sFqnS ), xbTrue );
+
+ rc += TestMethod( po, "CreateUniqueFileName()", f2.CreateUniqueFileName( PROJECT_DATA_DIR, "dbf", sFqnT ), XB_NO_ERROR );
+ rc += TestMethod( po, "xbRename()", f2.xbRename( sFqnS, sFqnT ), XB_NO_ERROR );
+ rc += TestMethod( po, "xbRemove()", f.xbRemove( sFqnT ), XB_NO_ERROR );
+
+ xbString sFn;
+ rc += TestMethod( po, "GetFileNamePart()", f2.GetFileNamePart( sFqnS , sFn ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetFileExtPart()", f2.GetFileExtPart( sFqnS , sFn ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetFileExtPart()", f2.GetFileDirPart( sFqnS , sFn ), XB_NO_ERROR );
+
+
+ rc += TestMethod( po, "SetBlockSize()", f.SetBlockSize( 100 ), XB_INVALID_BLOCK_SIZE );
+ rc += TestMethod( po, "SetBlockSize()", f.SetBlockSize( 512 ), XB_NO_ERROR );
+ rc += TestMethod( po, "GetBlockSize()", (xbInt32) f.GetBlockSize(), 512 );
+
+
+ char BlockBuf[513];
+ memset( BlockBuf, 0x00, 513 );
+ rc += TestMethod( po, "xbFopen()", f.xbFopen( "w+b", XB_SINGLE_USER ), XB_NO_ERROR );
+
+ for( int i = 0; i < 512; i++ )
+ BlockBuf[i] = 'A';
+ rc += TestMethod( po, "WriteBlock()", f.WriteBlock( 0L, 512, BlockBuf ), XB_NO_ERROR );
+
+ for( int i = 0; i < 512; i++ )
+ BlockBuf[i] = 'B';
+ rc += TestMethod( po, "WriteBlock()", f.WriteBlock( 1L, 512, BlockBuf ), XB_NO_ERROR );
+
+ for( int i = 0; i < 512; i++ )
+ BlockBuf[i] = 'C';
+ rc += TestMethod( po, "WriteBlock()", f.WriteBlock( 2L, 512, BlockBuf ), XB_NO_ERROR );
+
+ char BlockBuf2[513];
+ memset( BlockBuf2, 0x00, 513 );
+ rc += TestMethod( po, "ReadBlock()", f.ReadBlock( 2L, 512, BlockBuf2 ), XB_NO_ERROR );
+
+ xbString s1 = BlockBuf;
+ xbString s2 = BlockBuf2;
+
+ rc += TestMethod( po, "ReadBlock()", s1, s2, 512 );
+
+ rc += TestMethod( po, "xbTruncate()", f.xbTruncate( 1000 ), XB_NO_ERROR );
+
+ xbUInt64 ullFsize;
+ rc += TestMethod( po, "GetFileSize()", f.GetFileSize( ullFsize ), XB_NO_ERROR );
+ rc += TestMethod( po, "xbGetFileSize()", (xbInt32) ullFsize, 1000 );
+ rc += TestMethod( po, "xbFclose()", f.xbFclose(), XB_NO_ERROR );
+
+ if( po > 0 || rc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", rc * -1 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], rc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return rc;
+}
+
diff --git a/src/tests/xb_test_filter.cpp b/src/tests/xb_test_filter.cpp
new file mode 100755
index 0000000..2aeade3
--- /dev/null
+++ b/src/tests/xb_test_filter.cpp
@@ -0,0 +1,185 @@
+/* xb_test_filter.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2020,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xbIxFilter
+
+// usage: xb_test_filter QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+int main( int argCnt, char **av )
+{
+ int iRc = 0;
+ int iRc2 = 0;
+ int iPo = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ iPo = 0;
+ else if( av[1][0] == 'V' )
+ iPo = 2;
+ }
+
+
+ xbSchema MyV4Record[] =
+ {
+ { "CFLD", XB_CHAR_FLD, 6, 0 },
+ { "NFLD", XB_NUMERIC_FLD, 6, 0 },
+ { "ZFLD", XB_CHAR_FLD, 1, 0 },
+ { "",0,0,0 }
+ };
+
+
+ xbXBase x;
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( iPo ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ x.SetLogSize( 1000000 );
+#endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+
+ char c;
+ xbString s;
+ xbInt32 lRecCnt = 0;
+ iRc = 0;
+
+ if( iPo > 0 )
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+
+ xbDbf *V4Dbf = new xbDbf4( &x );
+
+ iRc2 = V4Dbf->CreateTable( "TestFilt.DBF", "TestFilter", MyV4Record, XB_OVERLAY, XB_MULTI_USER );
+ iRc += TestMethod( iPo, "CreateTable()", (xbInt32) iRc2, XB_NO_ERROR );
+
+
+ #ifdef XB_NDX_SUPPORT
+ xbIx *ixPtr;
+ void *ndx;
+ iRc2 = V4Dbf->CreateTag( "NDX", "TestFilt.NDX", "CFLD", "", 0, 0, XB_OVERLAY, &ixPtr, &ndx );
+ iRc += TestMethod( iPo, "CreateTag()", (xbInt32) iRc2, XB_NO_ERROR );
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+ #endif // XB_NDX_SUPPORT
+
+
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+
+ for( xbUInt16 i = 0; i < 5 && iRc == XB_NO_ERROR; i++ ){
+ // for( xbUInt16 j = 0; j < 26 && iRc == XB_NO_ERROR; j++ ){
+ for( xbInt16 j = 25; j >= 0 && iRc == XB_NO_ERROR; j-- ){
+ c = j + 65;
+ s = c;
+ s.PadRight( c, (xbUInt32) i + 1 );
+ V4Dbf->BlankRecord();
+ V4Dbf->PutField( "CFLD", s );
+ V4Dbf->PutLongField( "NFLD", ++lRecCnt );
+ iRc = V4Dbf->AppendRecord();
+ }
+ }
+
+ iRc += TestMethod( iPo, "SetCurTag()", V4Dbf->SetCurTag( "" ), XB_NO_ERROR );
+ xbFilter f1( &x, V4Dbf );
+ xbString sMyFilterExpression = "LEFT( CFLD, 2 ) = 'YY'";
+ iRc += TestMethod( iPo, "Set()", f1.Set( sMyFilterExpression ), XB_NO_ERROR );
+
+ iRc += TestMethod( iPo, "SetCurTag()", V4Dbf->SetCurTag( "" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "Set()", f1.Set( sMyFilterExpression ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetFirstRecord()", f1.GetFirstRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 28 );
+ iRc += TestMethod( iPo, "GetNextRecord()", f1.GetNextRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 54 );
+ iRc += TestMethod( iPo, "GetNextRecord()", f1.GetNextRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 80 );
+ iRc += TestMethod( iPo, "GetLast()", f1.GetLastRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 106 );
+ iRc += TestMethod( iPo, "GetPrev()", f1.GetPrevRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 80 );
+
+ sMyFilterExpression = "LEFT( CFLD, 2 ) = 'CC'";
+ iRc += TestMethod( iPo, "Set()", f1.Set( sMyFilterExpression ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetFirstRecord()", f1.GetFirstRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 50 );
+ iRc += TestMethod( iPo, "GetNextRecord()", f1.GetNextRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 76 );
+ iRc += TestMethod( iPo, "GetNextRecord()", f1.GetNextRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 102 );
+ iRc += TestMethod( iPo, "GetLast()", f1.GetLastRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 128 );
+ iRc += TestMethod( iPo, "GetPrev()", f1.GetPrevRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 102 );
+
+
+ #ifdef XB_NDX_SUPPORT
+ f1.SetLimit( 0 );
+
+ // change things up a bit
+ iRc += TestMethod( iPo, "GetRecord()", V4Dbf->GetRecord( 32 ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "PutField()", V4Dbf->PutField( "ZFLD", "Z" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetRecord()", V4Dbf->GetRecord( 52 ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "PutField()", V4Dbf->PutField( "ZFLD", "Z" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetRecord()", V4Dbf->GetRecord( 76 ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "PutField()", V4Dbf->PutField( "ZFLD", "Z" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetRecord()", V4Dbf->GetRecord( 103 ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "PutField()", V4Dbf->PutField( "ZFLD", "Z" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "Commit()", V4Dbf->Commit(), XB_NO_ERROR );
+
+ iRc += TestMethod( iPo, "SetCurTag()", V4Dbf->SetCurTag( "TestFilt" ), XB_NO_ERROR );
+ sMyFilterExpression = "ZFLD = 'Z'";
+ iRc += TestMethod( iPo, "Set()", f1.Set( sMyFilterExpression ), XB_NO_ERROR );
+
+ iRc += TestMethod( iPo, "GetFirstRecord()", f1.GetFirstRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 52 );
+ iRc += TestMethod( iPo, "GetNextRecord()", f1.GetNextRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 103 );
+ iRc += TestMethod( iPo, "GetNextRecord()", f1.GetNextRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 76 );
+ iRc += TestMethod( iPo, "GetLast()", f1.GetLastRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 32 );
+ iRc += TestMethod( iPo, "GetPrev()", f1.GetPrevRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4Dbf->GetCurRecNo(), 76 );
+
+ #endif // XB_NDX_SUPPORT
+
+
+ iRc += TestMethod( iPo, "Close()", V4Dbf->Close(), XB_NO_ERROR );
+ delete V4Dbf;
+
+ if( iPo > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg, 2 );
+#endif
+
+ return iRc;
+}
diff --git a/src/tests/xb_test_funcs.cpp b/src/tests/xb_test_funcs.cpp
new file mode 100755
index 0000000..07e2c17
--- /dev/null
+++ b/src/tests/xb_test_funcs.cpp
@@ -0,0 +1,288 @@
+/* xb_test_funcs.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the xb functions
+// usage: xb_test_funcs QUITE|NORMAL|VERBOSE
+
+#include "xbase.h"
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+/**************************************************************************/
+
+int main( int argCnt, char **av )
+{
+ xbInt16 iRc = 0;
+ xbInt16 rc2 = 0;
+ xbInt16 po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ xbSchema MyRecord[] =
+ {
+ { "NUM1", XB_NUMERIC_FLD, 9, 2 },
+ { "DATE1", XB_DATE_FLD, 8, 0 },
+ { "DATE2", XB_DATE_FLD, 8, 0 },
+ { "",0,0,0 }
+ };
+
+
+ xbXBase x;
+ xbDbf * MyFile;
+ xbDate d;
+
+ xbString sResult;
+ xbDate dtResult;
+ xbDouble dResult;
+ xbBool bResult;
+ xbDate dtIn( "19890209" );
+
+
+ #ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ InitTime();
+
+ if( po > 0 ){
+ std::cout << "XBase Expression testing program.." << std::endl;
+ std::cout << "This program tests the XBase expression logic." << std::endl;
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+ }
+
+ #ifdef XB_DBF4_SUPPORT
+ MyFile = new xbDbf4( &x ); /* version 4 dbf file */
+ #else
+ MyFile = new xbDbf3( &x ); /* version 3 dbf file */
+ #endif
+
+ rc2 = MyFile->CreateTable( "Functest.DBF", "ExpTest", MyRecord, XB_OVERLAY, XB_MULTI_USER );
+ iRc += TestMethod( po, "CreateTable()", rc2, XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", MyFile->PutFloatField( "NUM1", 5 ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", MyFile->PutField( "DATE1", "19890303" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", MyFile->PutField ( "DATE2", "20120708" ), XB_NO_ERROR );
+
+ MyFile->SetAutoLock( xbFalse );
+ iRc += TestMethod( po, "AppendRecord()", MyFile->AppendRecord(), XB_NO_ERROR );
+
+ iRc += TestMethod( po, "ABS( -222, dResult )", x.ABS( -222, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "ABS( -222, dResult )", -222, -222 );
+ iRc += TestMethod( po, "ABS( 333, dResult )", x.ABS( 333, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "ABS( 333, dResult )", 333, 333 );
+
+ iRc += TestMethod( po, "x.ALLTRIM( \" zzz \", sResult )", x.ALLTRIM( " zzz ", sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.ALLTRIM( \" zzz \", sResult )", sResult, "zzz", 3 );
+
+ iRc += TestMethod( po, "ASC( \"A\", dResult )", x.ASC( "A", dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "ASC( \"A\" )", dResult, (xbDouble) 65 );
+ iRc += TestMethod( po, "ASC( \"B\", dResult )", x.ASC( "B", dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "ASC( \"B\" )", dResult, (xbDouble) 66 );
+ iRc += TestMethod( po, "AT( \"ABC\", \"XYZABC\", 4 )", x.AT( "ABC", "XYZABC", dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AT( \"ABC\", \"XYZABC\", 4 )", dResult, (xbDouble) 4 );
+ iRc += TestMethod( po, "CDOW( dtIn, sResult )", x.CDOW( dtIn, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "CDOW( dtIn, sResult )", sResult, "Thursday", 8 );
+ iRc += TestMethod( po, "CHR( 101, sResult )", x.CHR( 101, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "CHR( 101, sResult )", sResult, "e", 1 );
+
+ dtIn = "19870103";
+ iRc += TestMethod( po, "CMONTH( dtIn, sResult )", x.CMONTH( dtIn, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "CMONTH( dtIn, sResult )", sResult, "January", 7 );
+ iRc += TestMethod( po, "CTOD( \"01\\03\\87\", dtResult )", x.CTOD( "01\\03\\87", dtResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "CTOD( \"01\\03\\87\", dtResult )", dtResult.Str(), "19870103", 8 );
+ iRc += TestMethod( po, "DATE( dtResult )", x.DATE( dtResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DATE( dtResult )", dtResult.Str(), d.Str(), 8 );
+ iRc += TestMethod( po, "DAY(\"19870103\", dResult )", x.DAY( "19870103", dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DAY(\"19870103\", dResult )", dResult, (xbDouble) 3 );
+
+ iRc += TestMethod( po, "DEL( MyFile, sResult )", x.DEL( MyFile, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DEL( MyFile, sResult )", sResult, " ", 1 );
+
+ iRc += TestMethod( po, "DELETED( MyFile, bResult )", x.DELETED( MyFile, bResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DELETED( MyFile, bResult )", (xbInt32) bResult, xbFalse );
+
+ iRc += TestMethod( po, "DeleteRecord()", MyFile->DeleteRecord(), XB_NO_ERROR );
+
+ iRc += TestMethod( po, "DEL( MyFile, sResult )", x.DEL( MyFile, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DEL( MyFile, sResult )", sResult, "*", 1 );
+ iRc += TestMethod( po, "DELETED( MyFile, bResult )", x.DELETED( MyFile, bResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DELETED( MyFile, bResult )", (xbInt32) bResult, xbTrue );
+
+ iRc += TestMethod( po, "UndeleteRecord()", MyFile->UndeleteRecord(), XB_NO_ERROR );
+
+ iRc += TestMethod( po, "DESCEND(\"ABCDE\", sResult )", x.DESCEND( "ABCDE", sResult ), XB_NO_ERROR );
+
+ char sDescendResult[6]; // = "";
+ sDescendResult[0] = (char) 0xBE;
+ sDescendResult[1] = (char) 0xBD;
+ sDescendResult[2] = (char) 0xBC;
+ sDescendResult[3] = (char) 0xBB;
+ sDescendResult[4] = (char) 0xBA;
+ sDescendResult[5] = (char) 0x00;
+ iRc += TestMethod( po, "DESCEND(\"ABCDE\", sResult )", sResult, sDescendResult, 5 );
+
+ iRc += TestMethod( po, "DESCEND( 12345, dResult )", x.DESCEND( 12345, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DESCEND( 12345, dResult )", dResult, (xbDouble) -12345 );
+ dtIn = "19890303";
+ iRc += TestMethod( po, "DESCEND( dtIn, dtResult )", x.DESCEND( dtIn, dtResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DESCEND( dtIn, dtResult )", dtResult.Str(), "29101031", 8 );
+ dtIn = "20120708";
+ iRc += TestMethod( po, "DESCEND( dtIn, dtResult )", x.DESCEND( dtIn, dtResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DESCEND( dtIn, dtResult )", dtResult.Str(), "28870625" , 8 );
+
+ dtIn = "20171014";
+ iRc += TestMethod( po, "DOW( dtIn, dResult )", x.DOW( dtIn, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DOW(\"20171015\", dResult )", dResult, (xbDouble) 0 );
+ dtIn++;
+ iRc += TestMethod( po, "DOW( dtIn, dResult )", x.DOW( dtIn, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DOW(\"20171016\", dResult )", dResult, (xbDouble) 1 );
+ dtIn++;
+ iRc += TestMethod( po, "DOW( dtIn, dResult )", x.DOW( dtIn, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DOW(\"20171021\", dResult )", dResult, (xbDouble) 2 );
+
+ dtIn = "20000101";
+ iRc += TestMethod( po, "DTOC( dtIn, sResult )", x.DTOC( dtIn, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DTOC( dtIn, sResult )", sResult, "01/01/00", 8 );
+ iRc += TestMethod( po, "DTOS( dtIn, sResult )", x.DTOS( dtIn, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "DTOS( dtIn, sResult )", sResult, "20000101", 8 );
+ iRc += TestMethod( po, "EXP( 1, dResult )", x.EXP( 1, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "EXP( 1, dResult )", dResult, 2.71828, .001 );
+ iRc += TestMethod( po, "x.INT( 621.5, dResult )", x.INT( 621.5, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.INT( 621.5, dResult )", dResult, (xbDouble) 621 );
+ iRc += TestMethod( po, "x.ISALPHA( \"1\", bResult )", x.ISALPHA( "1", bResult ), 0 );
+ iRc += TestMethod( po, "x.ISALPHA( \"1\", bResult )", (xbInt32) bResult, xbFalse );
+ iRc += TestMethod( po, "x.ISALPHA( \"A\", bResult )", x.ISALPHA( "A", bResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.ISALPHA( \"A\", bResult )", (xbInt32) bResult, xbTrue );
+ iRc += TestMethod( po, "x.ISLOWER( \"A\", bResult )", x.ISLOWER( "A", bResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.ISLOWER( \"A\", bResult )", bResult, xbFalse );
+ iRc += TestMethod( po, "x.ISLOWER( \"a\", bResult )", x.ISLOWER( "a", bResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.ISLOWER( \"a\", bResult )", bResult, xbTrue );
+ iRc += TestMethod( po, "x.ISUPPER( \"A\", bResult )", x.ISUPPER( "A", bResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.ISUPPER( \"A\", bResult )", bResult, xbTrue );
+ iRc += TestMethod( po, "x.ISUPPER( \"a\", bResult )", x.ISUPPER( "a", bResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.ISUPPER( \"a\", bResult )", bResult, xbFalse );
+ iRc += TestMethod( po, "x.LEFT( \"STRING\", 3, sResult )", x.LEFT( "STRING", 3, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.LEFT( \"STRING\", 3, sResult )", sResult, "STR", 3 );
+ iRc += TestMethod( po, "x.LEN( \"AAAAA\", dResult )", x.LEN( "AAAAA", dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.LEN( \"AAAAA\", dResult )", dResult, (xbDouble) 5 );
+ iRc += TestMethod( po, "x.LOG( 2, dResult )", x.LOG( 2, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.LOG( 2, dResult )", dResult, (xbDouble) 0.69314700, .0001 );
+ iRc += TestMethod( po, "x.LOWER( \"AAAA\", sResult )", x.LOWER( "AAAA", sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.LOWER( \"AAAA\", sResult )", sResult, "aaaa", 4 );
+ iRc += TestMethod( po, "x.LTRIM( \" xxxxxx\" )", x.LTRIM( " xxxxxx", sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.LTRIM( \" xxxxxx\" )", sResult, "xxxxxx", 6 );
+ iRc += TestMethod( po, "x.MAX( 10, 27, dResult )", x.MAX( 10, 27, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.MAX( 10, 27, dResult )", dResult, (xbDouble) 27 );
+ iRc += TestMethod( po, "x.MIN( 10, 5, dResult )", x.MIN( 10, 5, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.MIN( 10, 5, dResult )", dResult, (xbDouble) 5 );
+ iRc += TestMethod( po, "x.MONTH( dtIn, dResult )", x.MONTH( dtIn, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.MONTH( dtIn, dResult )", dResult, (xbDouble) 1 );
+ iRc += TestMethod( po, "x.RECCOUNT( MyFile, dResult)", x.RECNO( MyFile, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.RECCOUNT( MyFile, dResult)", dResult, (xbDouble) 1 );
+ iRc += TestMethod( po, "x.RECNO( MyFile, dResult)", x.RECNO( MyFile, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.RECNO( MyFile, dResult)", dResult, (xbDouble) 1 );
+ iRc += TestMethod( po, "x.REPLICATE( \"abc\", 3, sResult )", x.REPLICATE( "abc", 3, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.REPLICATE( \"abc\", 3, sResult )", sResult, "abcabcabc", 9 );
+ iRc += TestMethod( po, "x.RIGHT( \"STRING\", 3, sResult )", x.RIGHT( "STRING", 3, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.RIGHT( \"STRING\", 3, sResult )", sResult, "ING", 3 );
+ iRc += TestMethod( po, "x.RIGHT( \"STRING\", 3, sResult )", x.RIGHT( "STRING", 5, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.RIGHT( \"STRING\", 3, sResult )", sResult, "TRING", 5 );
+ iRc += TestMethod( po, "x.RIGHT( \"STRING\", 3, sResult )", x.RIGHT( "STRING", 6, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.RIGHT( \"STRING\", 3, sResult )", sResult, "STRING", 6 );
+ iRc += TestMethod( po, "x.RIGHT( \"STRING\", 3, sResult )", x.RIGHT( "STRING", 7, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.RIGHT( \"STRING\", 3, sResult )", sResult, "STRING", 6 );
+ iRc += TestMethod( po, "x.RTRIM( \"zzz \", sResult )", x.RTRIM( "zzz ", sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.RTRIM( \"zzz \", sResult )", sResult, "zzz", 3 );
+ iRc += TestMethod( po, "x.TRIM( \"aaa \", sResult )", x.TRIM( "aaa ", sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.TRIM( \"aaa \", sResult )", sResult, "aaa", 3 );
+ iRc += TestMethod( po, "x.SPACE( 3, sResult )", x.SPACE( 3, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.SPACE( 3, sResult )", sResult, " ", 3 );
+ iRc += TestMethod( po, "x.SQRT( 9, dResult )", x.SQRT( 9, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.SQRT( 9, dResult )", dResult, (xbDouble) 3 );
+ iRc += TestMethod( po, "x.STOD( \"20000101\", dtResult )", x.STOD( "20000101", dtResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STOD( \"20000101\", dtResult )",dtResult.Str(), "20000101", 8 );
+
+ xbString sPadChar = " ";
+ iRc += TestMethod( po, "x.STR( 2001, 4, 0, sPadChar, sResult )", x.STR( 2001, 4, 0, sPadChar, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STR( 2001, 4, 0, sPadChar, sResult )", sResult, "2001", 4 );
+ iRc += TestMethod( po, "x.STR( 2002, 3, 0, sPadChar, sResult )", x.STR( 2002, 3, 0, sPadChar, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STR( 2002, 3, 0, sPadChar, sResult )", sResult, "***", 3 );
+ iRc += TestMethod( po, "x.STR( 203.2, 6, 2, sPadChar, sResult )", x.STR( 203.2, 6, 2, sPadChar, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STR( 203.2, 6, 2, sPadChar, sResult )", sResult, "203.20", 6 );
+ iRc += TestMethod( po, "x.STR( 204.11, 8, 2, sPadChar, sResult )", x.STR( 204.11, 8, 2, sPadChar, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STR( 204.11, 8, 2, sPadChar, sResult )", sResult, " 204.11", 8 );
+ iRc += TestMethod( po, "x.STR( -205.45, 8, 2, sPadChar, sResult )", x.STR( -205.45, 8, 2, sPadChar, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STR( -205.45, 8, 2, sPadChar, sResult )", sResult, " -205.45", 8 );
+ iRc += TestMethod( po, "x.STR( -306.45, 8, 2, sPadChar, sResult )", x.STR( -306.45, 8, 2, sPadChar, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STR( -306.45, 8, 2, sPadChar, sResult )", sResult, " -306.45", 8 );
+ iRc += TestMethod( po, "x.STR( 6.56, 5, 0, sResult )", x.STR( 6.56, 5, 0, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STR( 6.56, 5, 0, sResult )", sResult, " 7", 5 );
+ iRc += TestMethod( po, "x.STR( 7.77, 5, sResult )", x.STR( 7.77, 5, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STR( 7.77, 5, sResult )", sResult, " 8", 5 );
+ iRc += TestMethod( po, "x.STR( 8, sResult )", x.STR( 8, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STR( 8, sResult )", sResult, " 8", 10 );
+
+ sPadChar = "0";
+ iRc += TestMethod( po, "x.STR( -5.2, 10, 2, sPadChar, sResult )", x.STR( -5.2, 10, 2, sPadChar, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STR( -5.2, 10, 2, sPadChar, sResult )", sResult, "00000-5.20", 10 );
+ iRc += TestMethod( po, "x.STRZERO( 8, 8, 0, sResult )", x.STRZERO( 8, 8, 0, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STRZERO( 8, 8, 0, sResult )", sResult, "00000008", 8 );
+ iRc += TestMethod( po, "x.STRZERO( -8, 8, 0, sResult )", x.STRZERO( -8, 8, 0, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STRZERO( -8, 8, 0, sResult )", sResult, "-0000008", 8 );
+ iRc += TestMethod( po, "x.STRZERO( -205.45, 10, 3 )", x.STRZERO( -205.45, 10, 3, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STRZERO( -205.45, 10, 3 )", sResult, "-00205.450", 10 );
+ iRc += TestMethod( po, "x.STRZERO( -205.45, 3, 1 )", x.STRZERO( -205.45, 3, 1, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.STRZERO( -205.45, 3, 1 )", sResult, "***", 3 );
+ iRc += TestMethod( po, "x.SUBSTR( \"TESTSTRING\", 5, 2, sResult )", x.SUBSTR( "TESTSTRING", 5, 2, sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.SUBSTR( \"TESTSTRING\", 5, 2, sResult )", sResult, "ST", 2 );
+ iRc += TestMethod( po, "x.UPPER( \"abababa\", sResult )", x.UPPER( "abababa", sResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.UPPER( \"abababa\", sResult )", sResult, "ABABABA", 7 );
+ iRc += TestMethod( po, "x.VAL( \"65\", dResult )", x.VAL( "65", dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.VAL( \"65\", dResult )", dResult, (xbDouble) 65 );
+ iRc += TestMethod( po, "x.YEAR( dtIn, dResult )", x.YEAR( dtIn, dResult ), XB_NO_ERROR );
+ iRc += TestMethod( po, "x.YEAR( dtIn, dResult )", dResult, (xbDouble) 2000 );
+
+
+ iRc += TestMethod( po, "Close()", MyFile->Close(), XB_NO_ERROR );
+
+
+ delete MyFile;
+ if( po > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ return iRc;
+}
diff --git a/src/tests/xb_test_linklist.cpp b/src/tests/xb_test_linklist.cpp
new file mode 100755
index 0000000..dc253af
--- /dev/null
+++ b/src/tests/xb_test_linklist.cpp
@@ -0,0 +1,340 @@
+/* xb_test_linklist.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xblnklst and xblnknod
+// usage: xb_test_linklist QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+
+int main( int argCnt, char **av )
+{
+ int rc = 0;
+
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ xbXBase x;
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+ InitTime();
+
+ xbLinkList<xbString> ll;
+ ll.InsertAtFront( "A" );
+ ll.InsertAtFront( "B" );
+ ll.InsertAtFront( "C" );
+ ll.InsertAtFront( "D" );
+ ll.InsertAtFront( "E" );
+ ll.InsertAtFront( "F" );
+ ll.InsertAtFront( "G" );
+ ll.InsertAtFront( "H" );
+ ll.InsertAtFront( "I" );
+ ll.InsertAtFront( "J" );
+ ll.InsertAtFront( "K" );
+ ll.InsertAtFront( "L" );
+ ll.InsertAtFront( "M" );
+ ll.InsertAtFront( "N" );
+ ll.InsertAtFront( "O" );
+
+ xbLinkListNode<xbString> * llN = ll.GetHeadNode();
+ xbString s;
+ xbString s2;
+ xbUInt32 ulCnt = ll.GetNodeCnt();
+ for( xbUInt32 i = 0; i < ulCnt; i++ ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetNextNode();
+ }
+ rc += TestMethod( po, "InsertAtFront()", s, "ONMLKJIHGFEDCBA", 15 );
+
+ s = "";
+ llN = ll.GetHeadNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetNextNode();
+ }
+ rc += TestMethod( po, "GetNextNode()", s, "ONMLKJIHGFEDCBA", 15 );
+
+ s = "";
+ llN = ll.GetEndNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetPrevNode();
+ }
+ rc += TestMethod( po, "GetNextNode()", s, "ABCDEFGHIJKLMNO", 15 );
+
+
+ ll.RemoveFromFront( s );
+ rc += TestMethod( po, "RemoveFromFront()", s, "O", 1 );
+
+ llN = ll.GetHeadNode();
+ ulCnt = ll.GetNodeCnt();
+ rc += TestMethod( po, "RemoveFromFront()", (xbInt32) ulCnt, 14 );
+
+ s = "";
+ for( xbUInt32 i = 0; i < ulCnt; i++ ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetNextNode();
+ }
+ rc += TestMethod( po, "RemoveFromFront()", s, "NMLKJIHGFEDCBA", 14 );
+
+
+ s = "";
+ llN = ll.GetHeadNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetNextNode();
+ }
+ rc += TestMethod( po, "RemoveFromFront()", s, "NMLKJIHGFEDCBA", 14 );
+
+
+ s = "";
+ llN = ll.GetEndNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetPrevNode();
+ }
+ rc += TestMethod( po, "RemoveFromFront()", s, "ABCDEFGHIJKLMN", 14 );
+
+
+ ll.RemoveFromEnd( s );
+ rc = TestMethod( po, "RemoveFromEnd()", s, "A", 1 );
+ ulCnt = ll.GetNodeCnt();
+ rc += TestMethod( po, "RemoveFromFront()", (xbInt32) ulCnt, 13 );
+
+ s = "";
+ llN = ll.GetHeadNode();
+ for( xbUInt32 i = 0; i < ulCnt; i++ ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetNextNode();
+ }
+ rc += TestMethod( po, "RemoveFromEnd()", s, "NMLKJIHGFEDCB", 13 );
+
+ s = "";
+ llN = ll.GetHeadNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetNextNode();
+ }
+ rc += TestMethod( po, "RemoveFromEnd()", s, "NMLKJIHGFEDCB", 13 );
+
+ s = "";
+ llN = ll.GetEndNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetPrevNode();
+ }
+ rc += TestMethod( po, "RemoveFromEnd()", s, "BCDEFGHIJKLMN", 13 );
+
+ s = "J";
+ ll.RemoveByVal( s );
+ rc += TestMethod( po, "RemoveByVal()", s, "J", 1 );
+ ulCnt = ll.GetNodeCnt();
+ rc += TestMethod( po, "RemoveByVal()", (xbInt32) ulCnt, 12 );
+
+ llN = ll.GetHeadNode();
+ s = "";
+ for( xbUInt32 i = 0; i < ulCnt; i++ ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetNextNode();
+ }
+ rc += TestMethod( po, "RemoveByVal()", s, "NMLKIHGFEDCB", 12 );
+
+ s = "";
+ llN = ll.GetHeadNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetNextNode();
+ }
+ rc += TestMethod( po, "RemoveByVal()", s, "NMLKIHGFEDCB", 12 );
+
+ s = "";
+ llN = ll.GetEndNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ s.Sprintf( "%s%s", s.Str(), s2.Str() );
+ llN = llN->GetPrevNode();
+ }
+ rc += TestMethod( po, "RemoveByVal()", s, "BCDEFGHIKLMN", 12 );
+
+
+// ordered link list
+ xbLinkListOrd<xbString> llO;
+ llO.SetDupKeys( 0 );
+ rc += TestMethod( po, "InsertKey( J )", llO.InsertKey( "J" ), 0);
+ rc += TestMethod( po, "InsertKey( J )", llO.InsertKey( "J" ), XB_KEY_NOT_UNIQUE );
+ rc += TestMethod( po, "InsertKey( M )", llO.InsertKey( "M" ), 0 );
+ rc += TestMethod( po, "InsertKey( C )", llO.InsertKey( "C" ), 0 );
+ rc += TestMethod( po, "InsertKey( F )", llO.InsertKey( "F" ), 0 );
+ rc += TestMethod( po, "InsertKey( Q )", llO.InsertKey( "Q" ), 0 );
+ rc += TestMethod( po, "InsertKey( A )", llO.InsertKey( "A" ), 0 );
+ rc += TestMethod( po, "InsertKey( T )", llO.InsertKey( "T" ), 0 );
+
+ if( po > 1 ){
+ std::cout << "dumping node chain from beginning to end\n";
+ llN = llO.GetHeadNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ std::cout << "node = " << s2.Str() << "\n";
+ llN = llN->GetNextNode();
+ }
+
+ std::cout << "dumping node chain from beginning to beginning\n";
+ llN = llO.GetHeadNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ std::cout << "node = " << s2.Str() << "\n";
+ llN = llN->GetPrevNode();
+ }
+
+ std::cout << "dumping node chain from end to end\n";
+ llN = llO.GetEndNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ std::cout << "node = " << s2.Str() << "\n";
+ llN = llN->GetNextNode();
+ }
+
+ std::cout << "dumping node chain from end to beginning\n";
+ llN = llO.GetEndNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ std::cout << "node = " << s2.Str() << "\n";
+ llN = llN->GetPrevNode();
+ }
+
+
+ }
+
+ // xbLinkListNode<xbString> * psN;
+ s2 = "A";
+ rc += TestMethod( po, "KeyExists('A')", llO.KeyExists( s2 ), xbTrue );
+ rc += TestMethod( po, "RemoveKey('A')", llO.RemoveKey( s2 ), 0 );
+ s2 = "J";
+ rc += TestMethod( po, "RemoveKey('J')", llO.RemoveKey( s2 ), 0 );
+ s2 = "T";
+ rc += TestMethod( po, "RemoveKey('T')", llO.RemoveKey( s2 ), 0 );
+ rc += TestMethod( po, "RemoveKey('T')", llO.RemoveKey( s2 ), XB_NOT_FOUND );
+ rc += TestMethod( po, "KeyExists('T')", llO.KeyExists( s2 ), xbFalse );
+
+
+
+ xbLinkListOrd<xbUInt32> lloi;
+ lloi.SetDupKeys( 0 );
+ xbUInt32 i = 3;
+
+ rc += TestMethod( po, "InsertKey( 1 )", lloi.InsertKey( i ), 0 );
+ rc += TestMethod( po, "RemoveKey( 1 )", lloi.RemoveKey( i ), 0 );
+ rc += TestMethod( po, "RemoveKey( 1 )", lloi.RemoveKey( i ), XB_NOT_FOUND );
+
+
+ if( po > 1 ){
+ std::cout << "dumping node chains after delete\n";
+ std::cout << "dumping node chain from beginning to end\n";
+ llN = llO.GetHeadNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ std::cout << "node = " << s2.Str() << "\n";
+ llN = llN->GetNextNode();
+ }
+
+ std::cout << "dumping node chain from beginning to beginning\n";
+ llN = llO.GetHeadNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ std::cout << "node = " << s2.Str() << "\n";
+ llN = llN->GetPrevNode();
+ }
+
+ std::cout << "dumping node chain from end to end\n";
+ llN = llO.GetEndNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ std::cout << "node = " << s2.Str() << "\n";
+ llN = llN->GetNextNode();
+ }
+
+ std::cout << "dumping node chain from end to beginning\n";
+ llN = llO.GetEndNode();
+ while( llN ){
+ s2 = llN->GetKey();
+ std::cout << "node = " << s2.Str() << "\n";
+ llN = llN->GetPrevNode();
+ }
+ }
+
+
+ xbLinkListOrd<xbUInt32> ll32;
+ // xbLinkListNode<xbUInt32> * ll32n;
+
+// for( xbUInt32 ul = 0; ul < 1; ul++ )
+// ll32.InsertKey( ul, ul );
+
+
+ xbUInt32 ul3 = 0;
+// ll32.InsertKey( 1, "1" );
+
+ ll32.InsertKey( ul3, ul3 );
+
+ ll.Clear();
+
+
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], rc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ if( po > 0 || rc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", rc * -1 );
+
+ return rc;
+}
+
+
+
+
diff --git a/src/tests/xb_test_lock.cpp b/src/tests/xb_test_lock.cpp
new file mode 100755
index 0000000..7e9865b
--- /dev/null
+++ b/src/tests/xb_test_lock.cpp
@@ -0,0 +1,874 @@
+/* xb_test_lock.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the locking functions of xbase
+// usage: xb_test_lock QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+/****************************************************************/
+int main( int argCnt, char **av )
+{
+ xbInt16 iRc = 0;
+ xbInt16 iRc2;
+ xbInt16 po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ xbInt16 iErrorStop = 0;
+ xbString sLockFile = "locktest.txt";
+ xbString sLockCmd;
+ xbString sResult;
+
+ xbXBase x;
+ xbDbf * MyFile;
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ xbSchema MyRecord[] =
+ {
+ { "LOCKTEST", XB_CHAR_FLD, 5, 0 },
+ #ifdef XB_MEMO_SUPPORT
+ { "MEMOTEST", XB_MEMO_FLD, 10, 0 },
+ #endif
+ { "",0,0,0 }
+ };
+
+
+ #ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po > 0 ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ InitTime();
+ #ifdef XB_DBF4_SUPPORT
+ MyFile = new xbDbf4( &x ); /* version 4 dbf file */
+ #else
+ MyFile = new xbDbf3( &x ); /* version 3 dbf file */
+ #endif
+
+ iRc2 = MyFile->CreateTable( "LockTest.DBF", "LockTest", MyRecord, XB_OVERLAY, XB_MULTI_USER );
+ iRc += TestMethod( po, "CreateTable()", iRc2, XB_NO_ERROR );
+ iRc += TestMethod( po, "PutField()", MyFile->PutField( "LOCKTEST", "TEST" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AppendRecord()", MyFile->AppendRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "Close()", MyFile->Close(), XB_NO_ERROR );
+ MyFile->Close();
+
+ //unlink( sLockFile );
+ remove( sLockFile );
+
+ #if defined (HAVE_FORK_F)
+ pid_t pid;
+ if(( pid = fork()) < 0 ){
+ std::cout << "fork error\n";
+ exit(1);
+ }
+
+ if( pid == 0 ){
+ // child task
+ xbDbf * MyFileChld;
+ xbInt16 iRcChld = 0;
+ xbBool bTblOpenChld = xbFalse;
+ xbInt32 iChildLoop = 0;
+ xbBool bDone = xbFalse;
+ xbString sLastLockCmd;
+
+ #ifdef XB_DBF4_SUPPORT
+ MyFileChld = new xbDbf4( &x ); /* version 4 dbf file */
+ #else
+ MyFileChld = new xbDbf3( &x ); /* version 3 dbf file */
+ #endif
+
+ x.xbSleep( 250 );
+
+ while( !bDone ){
+ iRc2 = GetCmd( x, sLockFile, sLockCmd, 'C', po );
+
+ if( sLockCmd == sLastLockCmd )
+ iChildLoop++;
+ else
+ sLastLockCmd = sLockCmd;
+
+ #ifdef XB_LOGGING_SUPPORT
+ if( sLockCmd != "OK" && sLockCmd != "FAIL" ){
+ sMsg.Sprintf( "Program [%s] Child task retrieved command=[%s] RC=[%d]", av[0], sLockCmd.Str(), iRc2 );
+ x.WriteLogMessage( sMsg );
+ }
+ #endif
+
+ if( iRc2 == 0 ){
+
+ if( sLockCmd == "OK" || sLockCmd == "FAIL" )
+ x.xbSleep( 250 );
+
+ else if( sLockCmd == "EXIT" ){
+ bDone = xbTrue;
+
+ } else if( sLockCmd == "START" && bTblOpenChld ){
+ // came back before the parent task could process the result
+ x.xbSleep( 250 );
+
+ } else {
+
+ if( sLockCmd == "START" ){
+ // begin the process
+ iRcChld = MyFileChld->Open( "LockTest.DBF" );
+ if( iRcChld != XB_NO_ERROR ){
+ sResult = "FAIL";
+ } else {
+ sResult = "OK";
+ bTblOpenChld = xbTrue;
+ }
+
+ } else if( sLockCmd == "TL" ){
+ // table lock
+ if(( iRcChld = MyFileChld->LockTable( XB_LOCK )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+
+ } else if( sLockCmd == "TU" ){
+ // table unlock
+ if(( iRcChld = MyFileChld->LockTable( XB_UNLOCK )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+
+ } else if( sLockCmd == "RL" ){
+ // record lock
+ if(( iRcChld = MyFileChld->LockRecord( XB_LOCK, 1 )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+
+ } else if( sLockCmd == "RU" ){
+ // record unlock
+ if(( iRcChld = MyFileChld->LockRecord( XB_UNLOCK, 1 )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+
+ } else if( sLockCmd == "ML" ){
+ // memo lock
+ #ifdef XB_MEMO_SUPPORT
+ if(( iRcChld = MyFileChld->LockMemo( XB_LOCK )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+ #else
+ sLockCmd = "OK";
+ #endif
+
+ } else if( sLockCmd == "MU" ){
+ // memo unlock
+ #ifdef XB_MEMO_SUPPORT
+ if(( iRcChld = MyFileChld->LockMemo( XB_UNLOCK )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+ #else
+ sLockCmd = "OK";
+ #endif
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Child task [%s] Result [%s] RC = [%d]", av[0], sLockCmd.Str(), sResult.Str(), iRcChld );
+ x.WriteLogMessage( sMsg );
+ #endif
+ SetCmd( x, sLockFile, sResult, 'C', po );
+ if( sResult == "FAIL" ){
+ bDone = xbTrue;
+ MyFileChld->Close();
+ delete MyFileChld;
+ }
+ }
+
+ } else {
+ iRc = iRc2;
+ bDone = xbTrue;
+ }
+ //std::cout << "clc [" << iChildLoop++ << "][" << bDone << "][" << sLockCmd.Str() << "]\n";
+ x.xbSleep( 250 );
+ if( iChildLoop > 15 )
+ bDone = xbTrue;
+ }
+ MyFileChld->Close();
+ delete MyFile;
+ delete MyFileChld;
+
+ if( po > 0 )
+ std::cout << "Exiting child\n";
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Child task terminating", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+
+ } else {
+
+ // parent logic
+ xbInt16 iLoopCtr = 0;
+
+ try{
+
+ // start
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing START command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "START";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 10;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ // table lock
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing TL command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "TL";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 20;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ // attempt to lock table, should fail
+ if(( iRc2 = MyFile->Open( "LockTest.DBF" )) != XB_NO_ERROR ){
+ iErrorStop = 30;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockTable( XB_LOCK )) == XB_NO_ERROR ){
+ iErrorStop = 40;
+ throw iRc2;
+ }
+
+ if( po > 0 )
+ std::cout << "[PASS] LockTable Test 1\n";
+
+ // table unlock
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing TU command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "TU";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 50;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 60;
+ throw iRc2;
+ }
+ if( po > 0 )
+ std::cout << "[PASS] LockTable Test 2\n";
+
+ if(( iRc2 = MyFile->LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 70;
+ throw iRc2;
+ }
+
+ /* record lock */
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing RL command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "RL";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 80;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockRecord( XB_LOCK, 1 )) == XB_NO_ERROR ){
+ iErrorStop = 90;
+ throw iRc2;
+ }
+ if( po > 0 )
+ std::cout << "[PASS] LockRecord Test 1\n";
+
+ /* record unlock */
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing RU command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "RU";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 100;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockRecord( XB_LOCK, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 110;
+ throw iRc2;
+ }
+
+ std::cout << "[PASS] LockRecord Test 2\n";
+ if(( iRc2 = MyFile->LockRecord( XB_UNLOCK, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 120;
+ throw iRc2;
+ }
+
+
+ /* memo lock */
+ #ifdef XB_MEMO_SUPPORT
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing ML command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "ML";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 130;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockMemo( XB_LOCK )) == XB_NO_ERROR ){
+ iErrorStop = 140;
+ throw iRc2;
+ }
+ if( po > 0 )
+ std::cout << "[PASS] LockMemo Test 1\n";
+
+ /* memo unlock */
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing MU command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "MU";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 30 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 150;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockMemo( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 160;
+ throw iRc2;
+ }
+
+ std::cout << "[PASS] LockMemo Test 2\n";
+ if(( iRc2 = MyFile->LockMemo( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 170;
+ throw iRc2;
+ }
+ #endif
+
+ // exit
+ sLockCmd = "EXIT";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+
+ } catch (xbInt16 iRc3 ){
+ iRc = iRc3;
+ if( po > 0 )
+ std::cout << "Parent lock task exiting on failure [" << sLockCmd.Str() << "][" << iErrorStop << "]\n";
+
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task terminating with errors [%s][%d][%d][%d]...", av[0], sLockCmd.Str(), iErrorStop, iLoopCtr, iRc3 );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task terminating", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( po > 0 )
+ std::cout << "Exiting parent\n";
+
+ sLockCmd = "EXIT";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ MyFile->Close();
+ delete MyFile;
+ }
+ #elif defined (HAVE_CREATEPROCESSW_F)
+
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ ZeroMemory( &si, sizeof( si ));
+ si.cb = sizeof( si );
+ ZeroMemory( &pi, sizeof( pi ));
+
+ xbString strCmdLine = "xb_test_lock2";
+ if( argCnt > 1 ){
+ strCmdLine += " ";
+ strCmdLine += av[1];
+ }
+
+ char sCmdLineBuf[25];
+ memset( sCmdLineBuf, 0x00, 25 );
+ for( xbUInt32 i = 0; i < strCmdLine.Len(); i++ )
+ sCmdLineBuf[i] = strCmdLine[i+1];
+
+ if( !CreateProcess( NULL, sCmdLineBuf, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi )){
+ sMsg.Sprintf( "Program [%s] error in CreateProcess call. Processing aborted" );
+ #ifdef XB_LOGGING_SUPPORT
+ x.WriteLogMessage( sMsg );
+ #endif
+ std::cout << sMsg.Str() << "\n";
+ iRc -=1;
+ } else {
+
+ xbInt16 iLoopCtr = 0;
+
+ try{
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing START command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+
+ sLockCmd = "START";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ // table lock
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing TL command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "TL";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 200;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ // attempt to lock table, should fail
+ if(( iRc2 = MyFile->Open( "LockTest.DBF" )) != XB_NO_ERROR ){
+ iErrorStop = 210;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockTable( XB_LOCK )) == XB_NO_ERROR ){
+ iErrorStop = 220;
+ throw iRc2;
+ }
+
+ if( po > 0 ){
+ std::cout << "[PASS] LockTable Test 1\n";
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task LockTable Test 1 Success.", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+ }
+
+ // table unlock
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing TU command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "TU";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 230;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockTable( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 240;
+ throw iRc2;
+ }
+ if( po > 0 ){
+ std::cout << "[PASS] LockTable Test 2\n";
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task LockTable Test 1 Success.", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+ }
+
+ if(( iRc2 = MyFile->LockTable( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 250;
+ throw iRc2;
+ }
+
+ /* record lock */
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing RL command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "RL";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 260;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockRecord( XB_LOCK, 1 )) == XB_NO_ERROR ){
+ iErrorStop = 270;
+ throw iRc2;
+ }
+ if( po > 0 )
+ std::cout << "[PASS] LockRecord Test 1\n";
+
+ /* record unlock */
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing RU command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "RU";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 280;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockRecord( XB_LOCK, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 290;
+ throw iRc2;
+ }
+
+ std::cout << "[PASS] LockRecord Test 2\n";
+ if(( iRc2 = MyFile->LockRecord( XB_UNLOCK, 1 )) != XB_NO_ERROR ){
+ iErrorStop = 300;
+ throw iRc2;
+ }
+
+
+ /* memo lock */
+ #ifdef XB_MEMO_SUPPORT
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing ML command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "ML";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 310;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockMemo( XB_LOCK )) == XB_NO_ERROR ){
+ iErrorStop = 320;
+ throw iRc2;
+ }
+ if( po > 0 )
+ std::cout << "[PASS] LockMemo Test 1\n";
+
+ /* memo unlock */
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task issuing MU command", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "MU";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ sResult = "";
+
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ while( sResult != "OK" && sResult != "FAIL" && iLoopCtr < 10 ){
+ GetCmd( x, sLockFile, sResult, 'P', po );
+ x.xbSleep( 250 );
+ iLoopCtr++;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task retrieved result [%s]", av[0], sResult.Str() );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( sResult != "OK" ){
+ iErrorStop = 330;
+ iRc2 = -1;
+ throw iRc2;
+ }
+
+ if(( iRc2 = MyFile->LockMemo( XB_LOCK )) != XB_NO_ERROR ){
+ iErrorStop = 340;
+ throw iRc2;
+ }
+
+ std::cout << "[PASS] LockMemo Test 2\n";
+ if(( iRc2 = MyFile->LockMemo( XB_UNLOCK )) != XB_NO_ERROR ){
+ iErrorStop = 350;
+ throw iRc2;
+ }
+ #endif
+
+ // exit
+ sLockCmd = "EXIT";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+
+ } catch (xbInt16 iRc3 ){
+ if( po > 0 )
+ std::cout << "Parent lock task exiting on failure [" << sLockCmd.Str() << "][" << iErrorStop << "]\n";
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Parent task terminating with errors [%s][%d][%d][%d]...", av[0], sLockCmd.Str(), iErrorStop, iLoopCtr, iRc3 );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ sLockCmd = "EXIT";
+ SetCmd( x, sLockFile, sLockCmd, 'P', po );
+ MyFile->Close();
+ delete MyFile;
+ }
+ }
+
+ #else
+ iRc--;
+ sMsg.Sprintf( "Program [%s] not executed. Library does not support 'fork' or 'CreateProcess' function call", av[0] );
+ #ifdef XB_LOGGING_SUPPORT
+ x.WriteLogMessage( sMsg );
+ #endif
+ if( po > 0 )
+ std::cout << sMsg.Str() << "\n";
+ #endif
+
+ if( po > 0 || iRc < 0 )
+ fprintf( stdout, "[%s] Total Errors = %d\n", av[0], iRc * -1 );
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ return iRc;
+}
+
diff --git a/src/tests/xb_test_lock2.cpp b/src/tests/xb_test_lock2.cpp
new file mode 100755
index 0000000..3dd4b57
--- /dev/null
+++ b/src/tests/xb_test_lock2.cpp
@@ -0,0 +1,208 @@
+/* xb_test_lock2.cpp
+
+XBase Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the locking functions
+// This program is the child process that is called if used
+// in an environment that supports the CreateProcess library function (ie Windows)
+
+// usage: xb_test_lock QUITE|NORMAL|VERBOSE
+
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+/****************************************************************/
+int main( int argCnt, char **av )
+{
+ xbInt16 iRc = 0;
+ xbInt16 iRc2;
+ xbInt16 po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ xbBool bDone = xbFalse;
+// xbInt16 iErrorStop = 0;
+ xbString sLockFile = "locktest.txt";
+ xbString sLockCmd;
+ xbString sResult;
+ xbInt32 iChildLoop = 0;
+
+ xbXBase x;
+ xbDbf * MyFile;
+
+ xbBool bTblOpen = xbFalse;
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ #ifdef XB_LOGGING_SUPPORT
+ xbString sLogFileName = x.GetLogFqFileName().Str();
+
+ sLogFileName.Resize( sLogFileName.Len() - 3 );
+ sLogFileName += "_l2.txt";
+ x.SetLogFileName( sLogFileName );
+ x.EnableMsgLogging();
+ if( po > 0 ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ InitTime();
+
+ #ifdef XB_DBF4_SUPPORT
+ MyFile = new xbDbf4( &x ); /* version 4 dbf file */
+ #else
+ MyFile = new xbDbf3( &x ); /* version 3 dbf file */
+ #endif
+
+ x.xbSleep( 250 );
+ while( !bDone ){
+ iRc2 = GetCmd( x, sLockFile, sLockCmd, 'C', po );
+
+ #ifdef XB_LOGGING_SUPPORT
+ if( sLockCmd != "OK" && sLockCmd != "FAIL" ){
+ sMsg.Sprintf( "Program [%s] Child task retrieved command=[%s] RC=[%d]", av[0], sLockCmd.Str(), iRc2 );
+ x.WriteLogMessage( sMsg );
+ }
+ #endif
+
+ if( iRc2 == 0 ){
+
+ if( sLockCmd == "OK" || sLockCmd == "FAIL" )
+ x.xbSleep( 250 );
+
+ else if( sLockCmd == "EXIT" ){
+ bDone = xbTrue;
+
+ } else if( sLockCmd == "START" && bTblOpen ){
+ // came back before the parent task could process the result
+ x.xbSleep( 250 );
+
+ } else {
+
+ if( sLockCmd == "START" ){
+
+ // begin the process
+ iRc2 = MyFile->Open( "LockTest.DBF" );
+ if( iRc2 != XB_NO_ERROR ){
+ sResult = "FAIL";
+ } else {
+ sResult = "OK";
+ bTblOpen = xbTrue;
+ }
+
+ } else if( sLockCmd == "TL" ){
+ // table lock
+ if(( iRc2 = MyFile->LockTable( XB_LOCK )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+
+ } else if( sLockCmd == "TU" ){
+ // table unlock
+ if(( iRc2 = MyFile->LockTable( XB_UNLOCK )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+
+ } else if( sLockCmd == "RL" ){
+ // record lock
+ if(( iRc2 = MyFile->LockRecord( XB_LOCK, 1 )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+
+
+ } else if( sLockCmd == "RU" ){
+ // record unlock
+ if(( iRc2 = MyFile->LockRecord( XB_UNLOCK, 1 )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+
+ } else if( sLockCmd == "ML" ){
+ // memo lock
+ #ifdef XB_MEMO_SUPPORT
+ if(( iRc2 = MyFile->LockMemo( XB_LOCK )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+ #else
+ sLockCmd = "OK";
+ #endif
+
+ } else if( sLockCmd == "MU" ){
+ // memo unlock
+ #ifdef XB_MEMO_SUPPORT
+ if(( iRc2 = MyFile->LockMemo( XB_UNLOCK )) != XB_NO_ERROR )
+ sResult = "FAIL";
+ else
+ sResult = "OK";
+ #else
+ sLockCmd = "OK";
+ #endif
+ }
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Child task [%s] Result [%s] RC = [%d]", av[0], sLockCmd.Str(), sResult.Str(), iRc2 );
+ x.WriteLogMessage( sMsg );
+ #endif
+ SetCmd( x, sLockFile, sResult, 'C', po );
+ }
+ } else {
+ iRc = iRc2;
+ bDone = xbTrue;
+ }
+
+ // std::cout << "clc [" << iChildLoop++ << "][" << bDone << "][" << sLockCmd << "]\n";
+ x.xbSleep( 250 );
+ if( iChildLoop > 10 )
+ bDone = xbTrue;
+ }
+ MyFile->Close();
+ delete MyFile;
+ if( po > 0 )
+ std::cout << "Exiting child\n";
+
+ remove( sLockFile );
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] Child task terminating", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if( po > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+ #ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ ExitProcess( iRc );
+}
+
diff --git a/src/tests/xb_test_log.cpp b/src/tests/xb_test_log.cpp
new file mode 100755
index 0000000..613b7dd
--- /dev/null
+++ b/src/tests/xb_test_log.cpp
@@ -0,0 +1,88 @@
+/* xb_test_log.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xbLog
+
+// usage: xb_test_log QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+
+int main( int argCnt, char **av )
+{
+ int rc = 0;
+
+#ifdef XB_LOGGING_SUPPORT
+
+
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ xbXBase x;
+ x.EnableMsgLogging();
+ InitTime();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+
+
+ xbString sNewLogFileName = "Logfile2.txt";
+ sMsg.Sprintf( "Switching to logfile [%s]", sNewLogFileName.Str() );
+ x.WriteLogMessage( sMsg );
+
+
+ x.DisableMsgLogging();
+ rc += TestMethod( po, "Set/Get Log Status()", x.GetLogStatus(), xbFalse );
+ x.SetLogFileName( sNewLogFileName );
+ x.EnableMsgLogging();
+
+ rc += TestMethod( po, "Set/Get Log Status()", x.GetLogStatus(), 1 );
+ rc += TestMethod( po,"WriteLogMessage()", x.WriteLogMessage( "Test log message........" ), XB_NO_ERROR );
+
+
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], rc * -1 );
+ x.WriteLogMessage( sMsg );
+
+ if( po > 0 || rc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", rc * -1 );
+
+
+ #endif /* XB_LOGGING_SUPPORT */
+
+
+ return rc;
+}
+
+
+
+
diff --git a/src/tests/xb_test_mdx.cpp b/src/tests/xb_test_mdx.cpp
new file mode 100755
index 0000000..9351e4d
--- /dev/null
+++ b/src/tests/xb_test_mdx.cpp
@@ -0,0 +1,243 @@
+/* xb_test_ndx.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xbIxNdx
+
+// usage: xb_test_ndx QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+int main( int argCnt, char **av )
+{
+ int iRc = 0;
+ int iRc2;
+ int iPo = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ xbString sMsg;
+ char c;
+ xbString s;
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ iPo = 0;
+ else if( av[1][0] == 'V' )
+ iPo = 2;
+ }
+
+
+ xbSchema MyV4Record[] =
+ {
+ { "CITY", XB_CHAR_FLD, 100, 0 },
+ { "STATE", XB_CHAR_FLD, 2, 0 },
+ { "ZIP", XB_NUMERIC_FLD, 9, 0 },
+ { "DATE1", XB_DATE_FLD, 8, 0 },
+ { "",0,0,0 }
+ };
+
+
+ xbXBase x;
+
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( iPo ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ x.SetMultiUser( false );
+ InitTime();
+
+ if( iPo > 0 )
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+
+
+ xbFile f( &x );
+ xbIx *pIx;
+ void *pTag;
+ xbDate dt = "19890209";
+ xbString sKey;
+
+ xbDbf *V4DbfX1 = new xbDbf4( &x );
+
+
+ iRc2 = V4DbfX1->CreateTable( "TMDXDB01.DBF", "TestMdxX2", MyV4Record, XB_OVERLAY, XB_MULTI_USER );
+ iRc += TestMethod( iPo, "CreateTable(1)", iRc2, 0 );
+
+ /*
+ CreateTag( const xbString &sIxType, const xbString &sName, const xbString &sKey, const xbString &sFilter,
+ xbInt16 iDescending, xbInt16 iUnique, xbInt16 iOverLay, xbIx **xbIxOut, void **vpTagOut );
+ */
+
+ iRc2 = V4DbfX1->CreateTag( "MDX", "CITY_TAGA", "CITY", "", 0, 0, XB_OVERLAY, &pIx, &pTag );
+ iRc += TestMethod( iPo, "CreateTag(1)", iRc2, 0 );
+
+ iRc2 = V4DbfX1->CreateTag( "MDX", "ZIP_TAG", "ZIP", "", xbTrue, 0, XB_OVERLAY, &pIx, &pTag );
+ iRc += TestMethod( iPo, "CreateTag(2)", iRc2, 0 );
+
+ iRc2 = V4DbfX1->CreateTag( "MDX", "DATE_TAG", "DATE1", "", 0, xbTrue, XB_OVERLAY, &pIx, &pTag );
+ iRc += TestMethod( iPo, "CreateTag(3)", iRc2, 0 );
+
+
+ // std::cout << "Cur Tag Name = " << V4DbfX1->GetCurTagName().Str() << "\n";
+
+ // xbDouble d = 4000;
+// iRc2 = V4DbfX1->Find( d );
+// std::cout << iRc2 << "\n";
+
+
+// something in th following block of code causing issues
+
+ xbInt32 uZip = 10000;
+ for( xbUInt16 i = 0; i < 35; i++ ){
+ for( xbUInt16 j = 0; j < 14; j++ ){
+
+ c = j + 65;
+ s = c;
+ s.PadRight( c, (xbUInt32) i + 1 );
+ //std::cout << "*********** adding s=[" << s.Str() << "] length = " << s.Len() << "\n";
+ iRc2 = V4DbfX1->BlankRecord();
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "BlankRecord()", iRc2, XB_NO_ERROR );
+
+ iRc2 = V4DbfX1->PutField( "CITY", s );
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "PutField()", iRc2, XB_NO_ERROR );
+
+ iRc2 = V4DbfX1->PutLongField( "ZIP", uZip++ );
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "PutField()", iRc2, XB_NO_ERROR );
+
+ iRc2 = V4DbfX1->PutDateField( "DATE1", dt );
+ dt++;
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "PutField()", iRc2, XB_NO_ERROR );
+
+ iRc2 = V4DbfX1->AppendRecord();
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "AppendRecord()", iRc2, XB_NO_ERROR );
+
+ iRc2 = V4DbfX1->Commit();
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "Commit()", iRc2, XB_NO_ERROR );
+ }
+ }
+
+
+ iRc += TestMethod( iPo, "CheckTagIntegrity()", V4DbfX1->CheckTagIntegrity( 1, 2 ), XB_NO_ERROR );
+
+ // attempt to add a dup key, should fail with XB_KEY_NOT_UNIQUE
+ iRc2 = V4DbfX1->BlankRecord();
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "BlankRecord()", iRc2, XB_NO_ERROR );
+
+ iRc2 = V4DbfX1->PutField( "CITY", "Tampa" );
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "PutField()", iRc2, XB_NO_ERROR );
+
+ iRc2 = V4DbfX1->PutLongField( "ZIP", uZip++ );
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "PutField()", iRc2, XB_NO_ERROR );
+
+ dt.Set( "19890209" );
+ iRc2 = V4DbfX1->PutDateField( "DATE1", dt );
+ dt++;
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "PutField()", iRc2, XB_NO_ERROR );
+
+ iRc2 = V4DbfX1->AppendRecord();
+ if( iRc2 != XB_KEY_NOT_UNIQUE )
+ iRc += TestMethod( iPo, "AppendRecord()", iRc2, XB_NO_ERROR );
+
+ iRc2 = V4DbfX1->Abort();
+ if( iRc2 != XB_NO_ERROR )
+ iRc += TestMethod( iPo, "Abort()", iRc2, XB_NO_ERROR );
+
+ iRc += TestMethod( iPo, "DeleteTag()", V4DbfX1->DeleteTag( "MDX", "CITY_TAGA" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "CheckTagIntegrity()", V4DbfX1->CheckTagIntegrity( 1, 2 ), XB_NO_ERROR );
+
+ iRc2 = V4DbfX1->CreateTag( "MDX", "CITY_TAGF", "CITY", ".NOT. DELETED()", 0, 0, XB_OVERLAY, &pIx, &pTag );
+ iRc += TestMethod( iPo, "CreateTag(4)", iRc2, 0 );
+
+ iRc2 = V4DbfX1->SetCurTag( "CITY_TAGF" );
+ iRc += TestMethod( iPo, "SetCurTag()", iRc2, XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurTagName()", V4DbfX1->GetCurTagName().Str(), "CITY_TAGF", 9 );
+
+ iRc += TestMethod( iPo, "CheckTagIntegrity()", V4DbfX1->CheckTagIntegrity( 1, 2 ), XB_INVALID_INDEX );
+
+ iRc2 = V4DbfX1->Reindex( 0 );
+ iRc += TestMethod( iPo, "Reindex( 0 )", iRc2, XB_NO_ERROR );
+ iRc += TestMethod( iPo, "CheckTagIntegrity()", V4DbfX1->CheckTagIntegrity( 1, 2 ), XB_NO_ERROR );
+
+ iRc += TestMethod( iPo, "GetCurTagName()", V4DbfX1->GetCurTagName().Str(), "CITY_TAGF", 9 );
+
+ iRc2 = V4DbfX1->Reindex( 1 );
+ iRc += TestMethod( iPo, "Reindex( 1 )", iRc2, XB_NO_ERROR );
+ iRc += TestMethod( iPo, "CheckTagIntegrity()", V4DbfX1->CheckTagIntegrity( 1, 2 ), XB_NO_ERROR );
+
+ // delete everything, all keys should be removed from the filtered index
+ iRc += TestMethod( iPo, "DeleteAll(0)", V4DbfX1->DeleteAll( 0 ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "Commit()", V4DbfX1->Commit(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "CheckTagIntegrity()", V4DbfX1->CheckTagIntegrity( 1, 2 ), XB_NO_ERROR );
+
+ // undelete everything, all keys should be added back into the filtered index
+ iRc += TestMethod( iPo, "DeleteAll(1)", V4DbfX1->DeleteAll( 1 ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "Commit()", V4DbfX1->Commit(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "CheckTagIntegrity()", V4DbfX1->CheckTagIntegrity( 1, 2 ), XB_NO_ERROR );
+
+ // std::cout << "Cur Tag Name = " << V4DbfX1->GetCurTagName().Str() << "\n";
+ sKey = "abc";
+ iRc += TestMethod( iPo, "Find()", V4DbfX1->Find( sKey ), XB_NOT_FOUND );
+ sKey = "EEEEE";
+ iRc += TestMethod( iPo, "Find()", V4DbfX1->Find( sKey ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4DbfX1->GetCurRecNo(), (xbInt32) 61 );
+
+ iRc += TestMethod( iPo, "GetNextKey()", V4DbfX1->GetNextKey(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4DbfX1->GetCurRecNo(), (xbInt32) 75 );
+
+ iRc += TestMethod( iPo, "GetPrevKey()", V4DbfX1->GetPrevKey(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4DbfX1->GetCurRecNo(), (xbInt32) 61 );
+
+ iRc += TestMethod( iPo, "GetLastKey()", V4DbfX1->GetLastKey(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4DbfX1->GetCurRecNo(), (xbInt32) 490 );
+
+ iRc += TestMethod( iPo, "GetFirstKey()", V4DbfX1->GetFirstKey(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurRecNo()", (xbInt32) V4DbfX1->GetCurRecNo(), (xbInt32) 1 );
+
+
+ x.CloseAllTables();
+ delete V4DbfX1;
+
+ if( iPo > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return iRc;
+}
diff --git a/src/tests/xb_test_ndx.cpp b/src/tests/xb_test_ndx.cpp
new file mode 100755
index 0000000..31306c0
--- /dev/null
+++ b/src/tests/xb_test_ndx.cpp
@@ -0,0 +1,330 @@
+/* xb_test_ndx.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xbIxNdx
+
+// usage: xb_test_ndx QUITE|NORMAL|VERBOSE
+
+
+
+// fix me - this program needs to test GetUnique
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+int main( int argCnt, char **av )
+{
+ int iRc = 0;
+ int iRc2 = 0;
+ int iPo = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ iPo = 0;
+ else if( av[1][0] == 'V' )
+ iPo = 2;
+ }
+
+
+ xbSchema MyV3Record[] =
+ {
+ { "CFLD", XB_CHAR_FLD, 30, 0 },
+ { "DFLD", XB_DATE_FLD, 8, 0 },
+ { "NFLD", XB_NUMERIC_FLD, 12, 0 },
+ { "",0,0,0 }
+ };
+
+
+ xbXBase x;
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( iPo ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ x.SetLogSize( 1000000 );
+#endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+// x.DisableDefaultAutoLock();
+ InitTime();
+
+ char c;
+ xbString s;
+ xbInt32 lRecCnt = 0;
+ iRc = 0;
+
+
+ if( iPo > 0 )
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+
+ xbDbf *V3Dbf = new xbDbf3( &x );
+
+ xbIx *ixPtr;
+ void *ndx;
+
+ iRc2 = V3Dbf->CreateTable( "TestNdx.DBF", "TestNdx", MyV3Record, XB_OVERLAY, XB_MULTI_USER );
+ iRc += TestMethod( iPo, "CreateTable()", (xbInt32) iRc2, XB_NO_ERROR );
+
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+
+
+ iRc2 = V3Dbf->CreateTag( "NDX", "TestNdxC.NDX", "CFLD", "", 0, 0, XB_OVERLAY, &ixPtr, &ndx );
+ iRc += TestMethod( iPo, "CreateTag()", (xbInt32) iRc2, XB_NO_ERROR );
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+
+ iRc2 = V3Dbf->AssociateIndex( "NDX", "TestNdxC.NDX", 0 );
+ iRc += TestMethod( iPo, "Associate()", (xbInt32) iRc2, XB_NO_ERROR );
+
+ iRc2 = V3Dbf->CreateTag( "NDX", "TestNdxD.NDX", "DFLD", "", 0, 0, XB_OVERLAY, &ixPtr, &ndx );
+ iRc += TestMethod( iPo, "CreateTag()", (xbInt32) iRc2, XB_NO_ERROR );
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+
+ iRc2 = V3Dbf->AssociateIndex( "NDX", "TestNdxD.NDX", 0 );
+ iRc += TestMethod( iPo, "Associate()", (xbInt32) iRc2, XB_NO_ERROR );
+
+ iRc2 = V3Dbf->CreateTag( "NDX", "TestNdxN.NDX", "NFLD", "", 0, 0, XB_OVERLAY, &ixPtr, &ndx );
+ iRc += TestMethod( iPo, "CreateTag()", (xbInt32) iRc2, XB_NO_ERROR );
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+
+ iRc2 = V3Dbf->AssociateIndex( "NDX", "TestNdxN.NDX", 0 );
+ iRc += TestMethod( iPo, "Associate()", (xbInt32) iRc2, XB_NO_ERROR );
+
+
+ iRc += TestMethod( iPo, "GetCurTagName()", V3Dbf->GetCurTagName().Str(), "TestNdxC", 8 );
+ iRc += TestMethod( iPo, "SetCurTag()", V3Dbf->SetCurTag( "TestNdxN" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurTagName()", V3Dbf->GetCurTagName().Str(), "TestNdxN", 8 );
+ xbDouble dbl = 100;
+ iRc += TestMethod( iPo, "Find( 100 )", V3Dbf->Find( dbl ), XB_NOT_FOUND );
+
+ iRc += TestMethod( iPo, "SetCurTag()", V3Dbf->SetCurTag( "TestNdxD" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurTagName()", V3Dbf->GetCurTagName().Str(), "TestNdxD", 8 );
+ xbDate dt;
+ iRc += TestMethod( iPo, "Find( dt )", V3Dbf->Find( dt ), XB_NOT_FOUND );
+
+ iRc += TestMethod( iPo, "GetFirstKey()", ixPtr->GetFirstKey(), XB_EMPTY );
+ iRc += TestMethod( iPo, "GetNextKey()", ixPtr->GetFirstKey(), XB_EMPTY );
+ iRc += TestMethod( iPo, "GetLasttKey()", ixPtr->GetLastKey(), XB_EMPTY );
+ iRc += TestMethod( iPo, "GetPrevKey()", ixPtr->GetPrevKey(), XB_EMPTY );
+ iRc += TestMethod( iPo, "FindKey()", ixPtr->FindKey( NULL, "19611101", 8, 0 ), XB_NOT_FOUND );
+
+ iRc += TestMethod( iPo, "BlankRecord()", V3Dbf->BlankRecord(), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "Putfield()", V3Dbf->PutField( "CFLD", "AAA" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "Putfield()", V3Dbf->PutField( "DFLD", "19611109" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "PutfieldDouble()", V3Dbf->PutDoubleField( "NFLD", 50 ), XB_NO_ERROR );
+
+ iRc += TestMethod( iPo, "AppendRecord()", V3Dbf->AppendRecord(), XB_NO_ERROR );
+
+ xbDate d( "19890209" );
+
+ //for( xbUInt16 i = 0; i < 35 && iRc == XB_NO_ERROR; i++ ){
+ for( xbUInt16 i = 0; i < 2 && iRc == XB_NO_ERROR; i++ ){
+ for( xbUInt16 j = 0; j < 35 && iRc == XB_NO_ERROR; j++ ){
+ c = j + 65;
+ s = c;
+ s.PadRight( c, (xbUInt32) i + 1 );
+ V3Dbf->BlankRecord();
+ V3Dbf->PutField( "CFLD", s );
+ V3Dbf->PutLongField( "NFLD", ++lRecCnt );
+ V3Dbf->PutField( "DFLD", d.Str() );
+ d++;
+
+ iRc = V3Dbf->AppendRecord();
+ }
+ }
+
+ iRc += TestMethod( iPo, "SetCurTag()", V3Dbf->SetCurTag( "TestNdxN" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurTagName()", V3Dbf->GetCurTagName().Str(), "TestNdxN", 8 );
+
+ dbl = 55.0;
+ iRc += TestMethod( iPo, "Find( 55.0 )", V3Dbf->Find( dbl ), XB_NO_ERROR );
+
+ iRc += TestMethod( iPo, "SetCurTag()", V3Dbf->SetCurTag( "TestNdxC" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurTagName()", V3Dbf->GetCurTagName().Str(), "TestNdxC", 8 );
+
+ s = "AAA";
+ iRc += TestMethod( iPo, "Find( 'AAA' )", V3Dbf->Find( s ), XB_NO_ERROR );
+
+ s = "AzAA";
+ iRc += TestMethod( iPo, "Find( 'AzAA' )", V3Dbf->Find( s ), XB_NOT_FOUND );
+
+ iRc += TestMethod( iPo, "SetCurTag()", V3Dbf->SetCurTag( "TestNdxD" ), XB_NO_ERROR );
+ iRc += TestMethod( iPo, "GetCurTagName()", V3Dbf->GetCurTagName().Str(), "TestNdxD", 8 );
+
+ std::cout << d.Str() << "\n";
+ iRc += TestMethod( iPo, "Find( '19890420' )", V3Dbf->Find( d ), XB_NOT_FOUND );
+
+ V3Dbf->GetRecord( 26 );
+ V3Dbf->PutField( "CFLD", "AAA" );
+ V3Dbf->PutRecord( 26 );
+
+ V3Dbf->GetRecord( 14 );
+ V3Dbf->PutField( "CFLD", "AAAA" );
+ V3Dbf->PutRecord( 14 );
+
+ V3Dbf->GetRecord( 11 );
+ V3Dbf->PutField( "CFLD", "III" );
+ V3Dbf->PutRecord( 11 );
+
+ V3Dbf->GetRecord( 25 );
+ V3Dbf->PutField( "CFLD", "DDD" );
+ V3Dbf->PutRecord( 25 );
+
+ V3Dbf->GetRecord( 12 );
+ V3Dbf->PutField( "CFLD", "EEE" );
+ V3Dbf->PutRecord( 12 );
+
+ V3Dbf->GetRecord( 26 );
+ V3Dbf->PutField( "CFLD", "CCC" );
+ V3Dbf->PutRecord( 26 );
+
+ V3Dbf->GetRecord( 13 );
+ V3Dbf->PutField( "CFLD", "CCCC" );
+ V3Dbf->PutRecord( 13 );
+
+ V3Dbf->GetRecord( 27 );
+ V3Dbf->PutField( "CFLD", "AAA" );
+ V3Dbf->PutRecord( 27 );
+
+ V3Dbf->GetRecord( 28 );
+ V3Dbf->PutField( "CFLD", "CCC" );
+ V3Dbf->PutRecord( 28 );
+
+ V3Dbf->GetRecord( 24 );
+ V3Dbf->PutField( "CFLD", "FFF" );
+ V3Dbf->PutRecord( 24 );
+
+ V3Dbf->GetRecord( 10 );
+ V3Dbf->PutField( "CFLD", "HHH" );
+ V3Dbf->PutRecord( 10 );
+
+
+ for( xbUInt16 i = 0; i < 35 && iRc == XB_NO_ERROR; i++ ){
+ for( xbUInt16 j = 0; j < 14 && iRc == XB_NO_ERROR; j++ ){
+ c = j + 65;
+ s = c;
+ s.PadRight( c, (xbUInt32) i + 1 );
+ V3Dbf->BlankRecord();
+ V3Dbf->PutField( "CFLD", s );
+ V3Dbf->PutLongField( "NFLD", ++lRecCnt );
+ V3Dbf->PutField( "DFLD", d.Str() );
+ d++;
+ iRc = V3Dbf->AppendRecord();
+ }
+ }
+
+ for( xbUInt16 i = 0; i < 2 && iRc == XB_NO_ERROR; i++ ){
+ for( xbUInt16 j = 0; j < 14 && iRc == XB_NO_ERROR; j++ ){
+ c = j + 65;
+ s = c;
+ s.PadRight( c, (xbUInt32) i + 1 );
+
+ V3Dbf->BlankRecord();
+ V3Dbf->PutField( "CFLD", s );
+ V3Dbf->PutLongField( "NFLD", ++lRecCnt );
+ V3Dbf->PutField( "DFLD", d.Str() );
+ d++;
+
+ iRc = V3Dbf->AppendRecord();
+ }
+ }
+
+ V3Dbf->GetRecord( 26 );
+ V3Dbf->PutField( "CFLD", "AAA" );
+ V3Dbf->PutRecord( 26 );
+
+ V3Dbf->GetRecord( 14 );
+ V3Dbf->PutField( "CFLD", "AAAA" );
+ V3Dbf->PutRecord( 14 );
+
+ V3Dbf->GetRecord( 11 );
+ V3Dbf->PutField( "CFLD", "III" );
+ V3Dbf->PutRecord( 11 );
+
+ V3Dbf->GetRecord( 25 );
+ V3Dbf->PutField( "CFLD", "DDD" );
+ V3Dbf->PutRecord( 25 );
+
+ V3Dbf->GetRecord( 12 );
+ V3Dbf->PutField( "CFLD", "EEE" );
+ V3Dbf->PutRecord( 12 );
+
+ V3Dbf->GetRecord( 26 );
+ V3Dbf->PutField( "CFLD", "CCC" );
+ V3Dbf->PutRecord( 26 );
+
+ V3Dbf->GetRecord( 13 );
+ V3Dbf->PutField( "CFLD", "CCCC" );
+ V3Dbf->PutRecord( 13 );
+
+ V3Dbf->GetRecord( 27 );
+ V3Dbf->PutField( "CFLD", "AAA" );
+ V3Dbf->PutRecord( 27 );
+
+ V3Dbf->GetRecord( 28 );
+ V3Dbf->PutField( "CFLD", "CCC" );
+ V3Dbf->PutRecord( 28 );
+
+ V3Dbf->GetRecord( 24 );
+ V3Dbf->PutField( "CFLD", "FFF" );
+ V3Dbf->PutRecord( 24 );
+
+ V3Dbf->GetRecord( 10 );
+ V3Dbf->PutField( "CFLD", "HHH" );
+ V3Dbf->PutRecord( 10 );
+
+ // just in case there are any issues outstanding
+ V3Dbf->Abort();
+
+ xbIxList *ixl = V3Dbf->GetIxList();
+ xbIxNdx *ix;
+ xbString sTagName;
+ while( ixl ){
+ if( *ixl->sFmt == "NDX" ){
+ ix = (xbIxNdx *) ixl->ix;
+ //ix->GetTagName( 0, sTagName );
+ sMsg.Sprintf( "CheckTagIntegrity() - [%s]", ix->GetTagName(ix->GetCurTag()).Str());
+ iRc += TestMethod( iPo, sMsg, ix->CheckTagIntegrity( ix->GetCurTag(), 2 ), XB_NO_ERROR );
+ ixl = ixl->next;
+ }
+ }
+
+ iRc += TestMethod( iPo, "Close()", V3Dbf->Close(), XB_NO_ERROR );
+ delete V3Dbf;
+
+ if( iPo > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg, 2 );
+#endif
+
+ return iRc;
+}
diff --git a/src/tests/xb_test_ndx2.cpp b/src/tests/xb_test_ndx2.cpp
new file mode 100755
index 0000000..f406b05
--- /dev/null
+++ b/src/tests/xb_test_ndx2.cpp
@@ -0,0 +1,145 @@
+/* xb_test_ndx2.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014, 2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xbIxNdx
+
+// usage: xb_test_ndx QUITE|NORMAL|VERBOSE
+
+
+
+// fix me - this program needs to test GetUnique
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+int main( int argCnt, char **av )
+{
+ int iRc = 0;
+ int iRc2 = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+
+ xbSchema MyV3Record[] =
+ {
+ { "CFLD", XB_CHAR_FLD, 30, 0 },
+ { "DFLD", XB_DATE_FLD, 8, 0 },
+ { "NFLD", XB_NUMERIC_FLD, 12, 0 },
+ { "",0,0,0 }
+ };
+
+
+ xbXBase x;
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ x.SetLogSize( 1000000 );
+#endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+// x.DisableDefaultAutoLock();
+
+ x.SetUniqueKeyOpt( XB_EMULATE_DBASE );
+ InitTime();
+ xbString s;
+ iRc = 0;
+
+ if( po > 0 )
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+
+ xbDbf *V3Dbf = new xbDbf3( &x );
+ xbIx *ixPtr;
+ void *ndx;
+
+ iRc2 = V3Dbf->CreateTable( "TestNdx.DBF", "TestNdx", MyV3Record, XB_OVERLAY, XB_MULTI_USER );
+ iRc += TestMethod( po, "CreateTable()", (xbInt32) iRc2, XB_NO_ERROR );
+
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+
+ iRc2 = V3Dbf->CreateTag( "NDX", "TestNdxC.NDX", "CFLD", "", 0, xbTrue, XB_OVERLAY, &ixPtr, &ndx );
+ iRc += TestMethod( po, "CreateTag()", (xbInt32) iRc2, XB_NO_ERROR );
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+
+ iRc2 = V3Dbf->AssociateIndex( "NDX", "TestNdxC.NDX", 0 );
+ iRc += TestMethod( po, "Associate()", (xbInt32) iRc2, XB_NO_ERROR );
+
+
+ iRc += TestMethod( po, "BlankRecord()", V3Dbf->BlankRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "Putfield()", V3Dbf->PutField( "CFLD", "AAA" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "Putfield()", V3Dbf->PutField( "DFLD", "19611109" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutfieldDouble()", V3Dbf->PutDoubleField( "NFLD", 50 ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AppendRecord()", V3Dbf->AppendRecord(), XB_NO_ERROR );
+
+
+ iRc += TestMethod( po, "BlankRecord()", V3Dbf->BlankRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "Putfield()", V3Dbf->PutField( "CFLD", "BBB" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "Putfield()", V3Dbf->PutField( "DFLD", "19611109" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutfieldDouble()", V3Dbf->PutDoubleField( "NFLD", 50 ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AppendRecord()", V3Dbf->AppendRecord(), XB_NO_ERROR );
+
+ iRc += TestMethod( po, "BlankRecord()", V3Dbf->BlankRecord(), XB_NO_ERROR );
+ iRc += TestMethod( po, "Putfield()", V3Dbf->PutField( "CFLD", "BBB" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "Putfield()", V3Dbf->PutField( "DFLD", "19611109" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "PutfieldDouble()", V3Dbf->PutDoubleField( "NFLD", 50 ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AppendRecord()", V3Dbf->AppendRecord(), XB_NO_ERROR );
+
+
+ xbIxList *ixl = V3Dbf->GetIxList();
+ xbIxNdx *ix;
+ xbString sTagName;
+ while( ixl ){
+ if( *ixl->sFmt == "NDX" ){
+ ix = (xbIxNdx *) ixl->ix;
+ //ix->GetTagName( 0, sTagName );
+ sMsg.Sprintf( "CheckTagIntegrity() - [%s]", ix->GetTagName(ix->GetCurTag()).Str());
+ iRc += TestMethod( po, sMsg, ix->CheckTagIntegrity( ix->GetCurTag(), 2 ), XB_NO_ERROR );
+ ixl = ixl->next;
+ }
+ }
+
+ iRc += TestMethod( po, "Close()", V3Dbf->Close(), XB_NO_ERROR );
+ delete V3Dbf;
+
+ if( po > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg, 2 );
+#endif
+
+ return iRc;
+}
diff --git a/src/tests/xb_test_sql.cpp b/src/tests/xb_test_sql.cpp
new file mode 100755
index 0000000..630cc89
--- /dev/null
+++ b/src/tests/xb_test_sql.cpp
@@ -0,0 +1,107 @@
+/* xb_test_sql.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014, 2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+// This program tests the SQL functions
+
+// usage: xb_test_sql QUITE|NORMAL|VERBOSE
+
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+int main( int argCnt, char **av )
+{
+ int iRc = 0;
+ int iRc2 = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+
+ xbSchema MySqlRecord[] =
+ {
+ { "CITY", XB_CHAR_FLD, 30, 0 },
+ { "STATE", XB_CHAR_FLD, 2, 0 },
+ { "ZIPCODE", XB_NUMERIC_FLD, 9, 0 },
+ { "NOTES", XB_MEMO_FLD, 10, 0 },
+ { "LASTUPDATE", XB_DATE_FLD, 8, 1 },
+ { "ACTIVE", XB_LOGICAL_FLD, 1, 0 },
+ { "",0,0,0 }
+ };
+
+
+ xbXBase x;
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+
+
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+ InitTime();
+
+ xbSql sql( &x );
+
+ if( po > 0 )
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+
+ xbDbf4 SqlDbf( &x ); // version 4 dbf file
+ iRc2 = SqlDbf.CreateTable( "TestSQL.DBF", "TestSQL", MySqlRecord, XB_OVERLAY, XB_MULTI_USER );
+ iRc += TestMethod( po, "CreateTable()", (xbInt32) iRc2, XB_NO_ERROR );
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+
+
+ xbString sSql = "INSERT INTO TestSQL (CITY, STATE, ZIPCODE, NOTES, LASTUPDATE, ACTIVE ) VALUES ( 'San Diego', 'CA', 92007, 'San Diego is a cool place', '1989-02-09', 'Y')";
+
+ iRc2 = sql.ExecuteNonQuery( sSql );
+ iRc += TestMethod( po, "Insert()", (xbInt32) iRc2, XB_NO_ERROR );
+ if( iRc2 )
+ x.DisplayError( iRc2 );
+
+ iRc += TestMethod( po, "Close()", SqlDbf.Close(), XB_NO_ERROR );
+
+ if( po > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return iRc;
+}
+
diff --git a/src/tests/xb_test_string.cpp b/src/tests/xb_test_string.cpp
new file mode 100755
index 0000000..f39c101
--- /dev/null
+++ b/src/tests/xb_test_string.cpp
@@ -0,0 +1,397 @@
+/* xb_test_string.cpp
+
+XBase63 Software Library
+
+Copyright (c) 1997,2003,2014, 2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the string class xbString
+
+// usage: xb_test_string QUIET|NORMAL|VERBOSE
+
+#define VERBOSE
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+int main( int argCnt, char **av = NULL )
+
+//int main( int argCnt, char *argv[] )
+{
+ int rc = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ xbXBase x;
+
+ #ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+
+ InitTime();
+
+ // create a string, assign a value
+ xbString s1;
+ s1 = "Test String 1";
+ rc += TestMethod( po, "Constructor s1" , s1, "Test String 1", 13 );
+
+ // create another string, copy the value from s1 into it
+ xbString s2;
+ s2 = s1;
+ rc += TestMethod( po, "Operator '=' " , s2, "Test String 1", 13 );
+
+ // create another string with a single character
+ xbString s3( 'X' );
+
+ //std::cout << "s3 = [" << s3 << "]" << std::endl;
+ rc += TestMethod( po, "Constructor s3" , s3, "X", 1 );
+
+ // create another string and assign data to it yet another way
+ xbString s4( "Class constructor test 4" );
+ rc += TestMethod( po, "Constructor s4" , s4, "Class constructor test 4", 24 );
+
+ // create another string with a size limit
+ xbString s5( "Class constructor test 4", 7 );
+ rc += TestMethod( po, "Constructor s5" , s5, "Class c", 7 );
+
+ // create another string from a string
+ xbString s6( s5 );
+ rc += TestMethod( po, "Constructor s6" , s6, "Class c", 7 );
+
+ // create 15 byte string with nothing in it
+ xbString s7( (xbUInt32) 15 );
+ rc += TestMethod( po, "Constructor s7" , s7, "", 0 );
+
+ xbString s8( "some test data", 6 );
+ rc += TestMethod( po, "Constructor s8" , s8, "some t", 6 );
+
+ xbString s9( "some test data", 30 );
+ rc += TestMethod( po, "Constructor s9" , s9, "some test data", 14 );
+
+ // Extract character from a particular position in the string
+ rc += TestMethod( po, "Operator [] ", s1[7], 't' );
+ rc += TestMethod( po, "Operator [] ", s1.GetCharacter(7), 't' );
+
+ s1[6] = 'X';
+ rc += TestMethod( po, "Operator assignment [] ", s1.GetCharacter(6), 'X' );
+
+ // set string 7 to a character
+ s7 = 'Z';
+ rc += TestMethod( po, "Operator =", s7.Str(), "Z", 1 );
+
+ // Concatenation tests - I
+ s1 = " part 1 ";
+ s1 += " part 2 ";
+ s2 = " part 3 ";
+ s1 += s2;
+ s1 += 'Z';
+ rc += TestMethod( po, "Concatenation test 1", s1, " part 1 part 2 part 3 Z", 25 );
+
+ // Concatenation tests - II
+ s1 = "part 1 ";
+ s1 -= "part 2 ";
+ s1 -= 'X';
+ s1 -= s2;
+ rc += TestMethod( po, "Concatenation test 2", s1, "part 1part 2X part 3", 20 );
+
+ // Concatenation tests - III
+ s1 = "s1data ";
+ s2 = "s2data ";
+ s3 = s1 - s2;
+ rc += TestMethod( po, "Concatenation test 3", s3, "s1datas2data", 12 );
+
+ // Concatenation tests - IV
+ s3 = s1 + s2;
+ rc += TestMethod( po, "Concatenation test 4", s3, "s1data s2data ", 15 );
+
+ // Concatenation tests - V
+ s3 = s1 + " (char * data) " + "xyz " + s2 + 'z';
+ rc += TestMethod( po, "Concatenation test 1", s3, "s1data (char * data) xyz s2data z", 36 );
+
+ //Operator tests
+ s1 = "aaa";
+ s2 = "bbb";
+ rc += TestMethod( po, "Operator == ", s1 == s2, 0 );
+ rc += TestMethod( po, "Operator != ", s1 != s2, 1 );
+ rc += TestMethod( po, "Operator < ", s1 < s2, 1 );
+ rc += TestMethod( po, "Operator > ", s1 > s2, 0 );
+ rc += TestMethod( po, "Operator < ", s1 <= s2, 1 );
+ rc += TestMethod( po, "Operator > ", s1 >= s2, 0 );
+
+ s1 = s2;
+ rc += TestMethod( po, "Operator == ", s1 == s2, 1 );
+ rc += TestMethod( po, "Operator != ", s1 == s2, 1 );
+ rc += TestMethod( po, "Operator < ", s1 < s2, 0 );
+ rc += TestMethod( po, "Operator > ", s1 > s2, 0 );
+ rc += TestMethod( po, "Operator < ", s1 <= s2, 1 );
+ rc += TestMethod( po, "Operator > ", s1 >= s2, 1 );
+
+ s1 = "XYZ";
+ rc += TestMethod( po, "Operator * ", (const char *) s1, "XYZ", 3 );
+
+ s1 = 'Z';
+ rc += TestMethod( po, "Operator = ", s1, "Z", 1 );
+
+ s1 = "ABC,xyz";
+ rc += TestMethod( po, "CountChar(c,1) ", (xbInt32) s1.CountChar( ',',1 ), 1 );
+
+ s1 = "ABC,xy,z";
+ rc += TestMethod( po, "CountChar(c,1) ", (xbInt32) s1.CountChar( ',',1 ), 2 );
+
+ s1 = "ABC,xy,z'asad,as'adss";
+ rc += TestMethod( po, "CountChar(c,1) ", (xbInt32) s1.CountChar( ',',1 ), 2 );
+
+ s1 = "ABADFDSGA";
+ rc += TestMethod( po, "CountChar() ", (xbInt32) s1.CountChar( 'A' ), 3 );
+
+ s1.Ltrunc( 4 );
+ rc += TestMethod( po, "Ltrunc(4) ", s1, "FDSGA", 5 );
+
+ s1.PutAt( 3, 'Z' );
+ rc += TestMethod( po, "PutAt(3,'Z') ", s1, "FDZGA", 5 );
+
+ s1.AddBackSlash( 'Z' );
+ rc += TestMethod( po, "AddBackSlash( 'Z' ) ", s1, "FD\\ZGA", 6 );
+
+ s1 = "ABCDEFG";
+ rc += TestMethod( po, "s1.Append( 'Z' )", s1.Append( 'Z' ).Str(), "ABCDEFGZ", 8 );
+ rc += TestMethod( po, "s1.Append( '999' )", s1.Append( "999" ), "ABCDEFGZ999", 11 );
+ s2 = "!@#";
+ rc += TestMethod( po, "s1.Append( '!@#' )", s1.Append( s2 ), "ABCDEFGZ999!@#", 14 );
+
+ rc += TestMethod( po, "s1.Assign( 'ABCDE', 3, 2 )", s1.Assign( "ABCDE", 3, 2 ), "CD", 2 );
+ rc += TestMethod( po, "s1.Assign( 'ABCDE', 2, 7 )", s1.Assign( "ABCDE", 2, 7 ), "BCDE", 4 );
+ rc += TestMethod( po, "s1.Assign( 'ABCDE', 1, 4 )", s1.Assign( "ABCDE", 1, 4 ), "ABCD", 4 );
+ rc += TestMethod( po, "s1.Assign( 'ABCDE', 5, 5 )", s1.Assign( "ABCDE", 5, 5 ), "E", 1 );
+ rc += TestMethod( po, "s1.Assign( 'ABCDE', 15, 5 )", s1.Assign( "ABCDE", 15, 5 ), "", 0 );
+
+ rc += TestMethod( po, "s1.Assign( 'ABCDE', 1 )", s1.Assign( "ABCDE", 1 ), "ABCDE", 5 );
+ rc += TestMethod( po, "s1.Assign( 'ABCDE', 3 )", s1.Assign( "ABCDE", 3 ), "CDE", 3 );
+ rc += TestMethod( po, "s1.Assign( 'ABCDE', 10 )", s1.Assign( "ABCDE", 10 ), "", 0 );
+
+ s2 = "ABCDE";
+ rc += TestMethod( po, "s1.Assign( s2, 3, 2 )", s1.Assign( s2, 3, 2 ), "CD", 2 );
+ rc += TestMethod( po, "s1.Assign( s2, 2, 7 )", s1.Assign( s2, 2, 7 ), "BCDE", 4 );
+ rc += TestMethod( po, "s1.Assign( s2, 1, 4 )", s1.Assign( s2, 1, 4 ), "ABCD", 4 );
+ rc += TestMethod( po, "s1.Assign( s2, 5, 5 )", s1.Assign( s2, 5, 5 ), "E", 1 );
+ rc += TestMethod( po, "s1.Assign( s2, 15, 5 )", s1.Assign( s2, 15, 5 ), "", 0 );
+
+ rc += TestMethod( po, "s1.Assign( s2, 1 )", s1.Assign( s2, 1 ), "ABCDE", 5 );
+ rc += TestMethod( po, "s1.Assign( s2, 3 )", s1.Assign( s2, 3 ), "CDE", 3 );
+ rc += TestMethod( po, "s1.Assign( s2, 10 )", s1.Assign( s2, 10 ), "", 0 );
+
+ s2 = "1234567890";
+ s1 = s2.Copy();
+ rc += TestMethod( po, "Copy() ", s1, "1234567890", 10 );
+
+ s1 = "0x35";
+ char hexChar;
+ s1.CvtHexChar( hexChar );
+ rc += TestMethod( po, "CvtHexChar(hexChar) ", hexChar, '5' );
+
+ s1 = "0x610x620x630x640x65";
+ s1.CvtHexString( s2 );
+ rc += TestMethod( po, "CvtHexString() ", s2, "abcde", 5 );
+
+ s1 = "123";
+ s2 = "ABC";
+ rc += TestMethod( po, "HasAlphaChars()", s1.HasAlphaChars(), 0 );
+ rc += TestMethod( po, "HasAlphaChars()", s2.HasAlphaChars(), 1 );
+
+ s1 = "\\ABC\\XYZ";
+ rc += TestMethod( po, "GetPathSeparator()", s1.GetPathSeparator(), '\\' );
+
+ s1 = "/ABC/XYZ";
+ rc += TestMethod( po, "GetPathSeparator()", s1.GetPathSeparator(), '/' );
+
+ s2 = "";
+ rc += TestMethod( po, "IsEmpty()", s2.IsEmpty(), 1 );
+
+ // trim tests
+ s1 = " ABC ";
+ rc += TestMethod( po, "Ltrim()", s1.Ltrim(), "ABC ", 6 );
+ s1 = " ABC ";
+ rc += TestMethod( po, "Rtrim()", s1.Rtrim(), " ABC", 6 );
+ s1 = " ABC ";
+ rc += TestMethod( po, "Trim() ", s1.Trim(), "ABC", 3 );
+
+ s1 = "ABC ";
+ rc += TestMethod( po, "Ltrim()", s1.Ltrim(), "ABC ", 6 );
+
+ s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ rc += TestMethod( po, "Mid(3,0) ", s1.Mid(3,0), "", 0 );
+
+ s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ rc += TestMethod( po, "Mid(4,5) ", s1.Mid(4,5), "DEFGH", 5 );
+
+ rc += TestMethod( po, "Pos('G') ", (xbInt32) s1.Pos( 'G' ), 4 );
+ rc += TestMethod( po, "Pos(\"EFG\") ", (xbInt32) s1.Pos( "EFG" ), 2 );
+
+ rc += TestMethod( po, "Pos('0') ", (xbInt32) s1.Pos( '0' ), 0 );
+ rc += TestMethod( po, "Pos(\"000\") ", (xbInt32) s1.Pos( "000" ), 0 );
+ rc += TestMethod( po, "Pos(\"DEF\") ", (xbInt32) s1.Pos( "DEF" ), 1 );
+
+ s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ rc += TestMethod( po, "Remove(3,5) ", s1.Remove( 3, 5 ), "ABHIJKLMNOPQRSTUVWXYZ", 21 );
+
+ s1 = "ABCABCABZ";
+ s1.SwapChars( 'A', '9' );
+ rc += TestMethod( po, "SwapChars() ", s1, "9BC9BC9BZ", 9 );
+
+ s1.ToLowerCase();
+ rc += TestMethod( po, "ToLowerCase() ", s1, "9bc9bc9bz", 9 );
+
+ s1.ToUpperCase();
+ rc += TestMethod( po, "ToUpperCase() ", s1, "9BC9BC9BZ", 9 );
+
+ s1.ZapChar( '9' );
+ rc += TestMethod( po, "ZapChar('9') ", s1, "BCBCBZ", 6 );
+
+ s1.ZapLeadingChar( 'B' );
+ rc += TestMethod( po, "ZapLeadingChar('B') ", s1, "CBCBZ", 5 );
+
+ s1.ZapTrailingChar( 'Z' );
+ rc += TestMethod( po, "ZapLeadingChar('B') ", s1, "CBCB", 4 );
+
+ s1.ExtractElement( "aaaa|bbbb|cccc|dddd", '|', 2, 0 );
+ rc += TestMethod( po, "ExtractElement() ", s1, "bbbb", 4 );
+
+ s1.ExtractElement( "aaaa|b'bb|c'ccc|dddd", '|', 3, 1 );
+ rc += TestMethod( po, "ExtractElement() ", s1, "dddd", 4 );
+
+ s1 = "123";
+ s1.PadLeft( '0', 9 );
+ rc += TestMethod( po, "PadLeft() ", s1, "000000123", 9 );
+
+ s1 = "abc";
+ s1.PadRight( 'Z', 9 );
+ rc += TestMethod( po, "PadRight() ", s1, "abcZZZZZZ", 9 );
+
+ s1.Left( 4 );
+ rc += TestMethod( po, "Left(4) ", s1, "abcZ", 4 );
+
+ s1.Left( 1 );
+ rc += TestMethod( po, "Left(1) ", s1, "a", 1 );
+
+ s1.Left( 0 );
+ rc += TestMethod( po, "Left(0) ", s1, "", 0 );
+
+
+ char buf[5];
+ buf[0] = 'W';
+ buf[1] = 'X';
+ buf[2] = 'Y';
+ buf[3] = 'Z';
+ buf[4] = 0x00;
+ xbInt32 l = 1234567;
+ xbFloat f = (xbFloat) 12.35;
+ s2 = "test string";
+
+ rc += TestMethod( po, "s1.Sprintf()", s1.Sprintf( "%s %d %s %ld", buf, 12, s2.Str(), l ), "WXYZ 12 test string 1234567", 27 );
+
+ // %f format varies depending on compiler
+ s1.Sprintf( "%6.2f", f );
+ s1.Ltrim();
+ rc += TestMethod( po, "s1.Sprintf()/s.Trim()", s1, "12.35", 5 );
+
+ s1.SetNum( (long) 123456 );
+ rc += TestMethod( po, "SetNum() ", s1, "123456", 6 );
+
+ s1 = "T";
+ rc += TestMethod( po, "ValidLogicalValue", s1.ValidLogicalValue(), 1 );
+
+ s1 = "xyz";
+ rc += TestMethod( po, "ValidLogicalValue", s1.ValidLogicalValue(), 0 );
+
+ s1 = "-123456.89";
+ rc += TestMethod( po, "ValidNumericValue", s1.ValidNumericValue(), 1 );
+
+ s1 = "ABC-123456.89";
+ rc += TestMethod( po, "ValidNumericValue", s1.ValidNumericValue(), 0 );
+
+ s1 = "abcabcabx";
+ rc += TestMethod( po, "GetLastPos", (xbInt16) s1.GetLastPos( 'b' ), 8 );
+ s1 = "abcabcabx";
+ rc += TestMethod( po, "GetLastPos", (xbInt16) s1.GetLastPos( 'x' ), 9 );
+ s1 = "abcabcabx";
+ rc += TestMethod( po, "GetLastPos", (xbInt16) s1.GetLastPos( '$' ), 0 );
+ rc += TestMethod( po, "GetLastPos", (xbInt16) s1.GetLastPos( "ab" ), 7 );
+
+ s1 = ")";
+ rc += TestMethod( po, "GetLastPos", (xbInt16) s1.GetLastPos( ')' ), 1 );
+ s1 = "))))";
+ rc += TestMethod( po, "GetLastPos", (xbInt16) s1.GetLastPos( ')' ), 4 );
+
+ char * p;
+ p = (char *) malloc( 5 );
+ p[0] = '1';
+ p[1] = '2';
+ p[2] = '3';
+ p[3] = '4';
+ p[4] = 0x00;
+ s1.Set( p, 5 );
+ free( p );
+ rc += TestMethod( po, "Set", s1, "1234", 4 );
+
+
+ xbDouble d = 12345678.876543;
+ xbString sD( d );
+ rc += TestMethod( po, "xbDouble Constructor", sD, "12345678.876543", 15 );
+
+ xbString sSet;
+ sSet.Set( sD );
+ rc += TestMethod( po, "Set", sD, sD, 15 );
+ sSet.Set( s2 );
+ rc += TestMethod( po, "Set", sSet, s2, 11 );
+ sSet.Set( "" );
+ rc += TestMethod( po, "Set", sSet, "", 0 );
+
+ s1.Sprintf( "string %d", 1 );
+ s2.Sprintf( "string %1.1f", 2.0 );
+ s3.Sprintf( "%s and %s", s1.Str(), s2.Str());
+ rc += TestMethod( po, "Sprintf", s3, "string 1 and string 2.0", 23 );
+
+ xbInt16 iErrorStop = 10;
+ xbInt16 iRc = -100;
+ sMsg.Sprintf( "class::method() Exception Caught. Error Stop = [%d] iRc = [%d] Expression = [%s]", iErrorStop, iRc, s3.Str() );
+
+ if( po > 0 || rc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", rc * -1 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], rc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return rc;
+}
+
diff --git a/src/tests/xb_test_tblmgr.cpp b/src/tests/xb_test_tblmgr.cpp
new file mode 100755
index 0000000..26ec96a
--- /dev/null
+++ b/src/tests/xb_test_tblmgr.cpp
@@ -0,0 +1,167 @@
+/* xb_test_tblmgr.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014, 2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xbXBase
+// usage: xb_test_tblmgr QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+int main( int argCnt, char **av )
+{
+ int rc = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+ xbXBase x;
+
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+ InitTime();
+
+ if( po == 2 ){
+ std::cout << "DisplayError Test ==> ";
+ x.DisplayError( 0 );
+ #ifdef WIN32
+ std::cout << "WIN32 environment" << std::endl;
+ #else
+ std::cout << "Not WIN32 environment" << std::endl;
+ #endif
+ }
+
+ xbDbf * d1;
+ xbDbf * d2;
+
+ #if defined (XB_DBF3_SUPPORT )
+ d1 = new xbDbf3( &x );
+ #elif defined( XB_DBF4_SUPPORT )
+ d1 = new xbDbf4( &x );
+ #else
+ std::cout << "No dbf file support built into library" << std::endl;
+ return -1;
+ #endif
+
+ rc += TestMethod( po, "AddTblToTblLst()", x.AddTblToTblList( d1, "TestTableC" ), 0 );
+ rc += TestMethod( po, "AddTblToTblLst()", x.AddTblToTblList( d1, "TestTableA" ), 0 );
+ rc += TestMethod( po, "AddTblToTblLst()", x.AddTblToTblList( d1, "TestTableB" ), 0 );
+ rc += TestMethod( po, "AddTblToTblLst()", x.AddTblToTblList( d1, "TestTableD" ), 0 );
+
+
+ // Next line should generate an exception
+ rc += TestMethod( po, "AddTblToTblLst()", x.AddTblToTblList( d1, "TestTableC" ), XB_DUP_TABLE_OR_ALIAS );
+
+ std::cout << "**** Next list should have one each of TestTableA, B, C, D sorted in alpha order ****" << std::endl;
+ x.DisplayTableList();
+
+ d2 = (xbDbf *) x.GetDbfPtr( "TestTableA" );
+ if( d2 )
+ std::cout << "[PASS] GetDbfPtr()" << std::endl;
+ else{
+ std::cout << "[FAIL] GetDbfPtr()" << std::endl;
+ rc--;
+ }
+
+
+std::cout << "cp0\n";
+ x.SetDataDirectory( "/ABCDEFG/" );
+
+ #ifdef WIN32
+ rc += TestMethod( po, "Set/GetDataDirectory()", x.GetDataDirectory(), "\\ABCDEFG\\", 9 );
+ #else
+ rc += TestMethod( po, "Set/GetDataDirectory()", x.GetDataDirectory(), "/ABCDEFG/", 9 );
+ #endif
+std::cout << "cp1\n";
+ x.SetDataDirectory( "/ABCDEFG" );
+ #ifdef WIN32
+ rc += TestMethod( po, "Set/GetDataDirectory()", x.GetDataDirectory(), "\\ABCDEFG", 8 );
+ #else
+ rc += TestMethod( po, "Set/GetDataDirectory()", x.GetDataDirectory(), "/ABCDEFG", 8 );
+ #endif
+
+
+ std::cout << "cp2\n";
+
+
+ x.SetDataDirectory( "\\ABCDEFG\\");
+ #ifdef WIN32
+ rc += TestMethod( po, "Set/GetDataDirectory()", x.GetDataDirectory(), "\\ABCDEFG\\", 9 );
+ #else
+ rc += TestMethod( po, "Set/GetDataDirectory()", x.GetDataDirectory(), "/ABCDEFG/", 9 );
+ #endif
+
+ std::cout << "cp3\n";
+
+
+ x.SetDataDirectory( "\\ABCDEFG" );
+ #ifdef WIN32
+ rc += TestMethod( po, "Set/GetDataDirectory()", x.GetDataDirectory(), "\\ABCDEFG", 8 );
+ #else
+ rc += TestMethod( po, "Set/GetDataDirectory()", x.GetDataDirectory(), "/ABCDEFG", 8 );
+ #endif
+
+
+ std::cout << "cp4\n";
+
+
+ x.SetDataDirectory( "ABCDEFG" );
+ rc += TestMethod( po, "Set/GetDataDirectory()", x.GetDataDirectory(), "ABCDEFG", 7 );
+
+
+ rc += TestMethod( po, "RemoveTblFromDbList()", x.RemoveTblFromTblList( "TestTableB" ), 0 );
+ rc += TestMethod( po, "RemoveTblFromDbList()", x.RemoveTblFromTblList( "TestTableB" ), XB_NOT_FOUND );
+ std::cout << "**** Next list should not have TestTableB in it ****" << std::endl;
+ x.DisplayTableList();
+
+
+ rc += TestMethod( po, "RemoveTblFromDbList()", x.RemoveTblFromTblList( "TestTableA" ), 0 );
+ rc += TestMethod( po, "RemoveTblFromDbList()", x.RemoveTblFromTblList( "TestTableC" ), 0 );
+ rc += TestMethod( po, "RemoveTblFromDbList()", x.RemoveTblFromTblList( "TestTableD" ), 0 );
+
+
+ delete d1;
+
+ if( po > 0 || rc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", rc * -1 );
+
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], rc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+
+ return rc;
+}
+
diff --git a/src/tests/xb_test_uda.cpp b/src/tests/xb_test_uda.cpp
new file mode 100755
index 0000000..dec41fa
--- /dev/null
+++ b/src/tests/xb_test_uda.cpp
@@ -0,0 +1,98 @@
+/* xb_test_uda.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014, 2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the uda (user data area) functions
+
+// usage: xb_test_uda QUITE|NORMAL|VERBOSE
+
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+
+int main( int argCnt, char **av )
+{
+ int iRc = 0;
+ //int iRc2 = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+
+
+ xbXBase x;
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+
+
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ x.EnableMsgLogging();
+
+ xbUda uda;
+ iRc += TestMethod( po, "GetTokencCnt()", uda.GetTokenCnt(), 0 );
+ xbString s1;
+ xbString s2;
+ iRc += TestMethod( po, "AddTokenForKey()", uda.AddTokenForKey( "B", "BBBB" ), XB_NO_ERROR );
+ s1 = "C";
+ iRc += TestMethod( po, "AddTokenForKey()", uda.AddTokenForKey( s1, "CCCC" ), XB_NO_ERROR );
+ s2 = "DDDD";
+ iRc += TestMethod( po, "AddTokenForKey()", uda.AddTokenForKey( "D", s2 ), XB_NO_ERROR );
+
+ s1 = "A";
+ s2 = "AAAA";
+ iRc += TestMethod( po, "AddTokenForKey()", uda.AddTokenForKey( s1, s2 ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AddTokenForKey()", uda.AddTokenForKey( "AA", "AAAAA" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AddTokenForKey()", uda.AddTokenForKey( "BB", "BBBBB" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AddTokenForKey()", uda.AddTokenForKey( "CC", "CCCCC" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "AddTokenForKey()", uda.AddTokenForKey( "DD", "DDDDD" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetTokencCnt()", uda.GetTokenCnt(), 8);
+
+ iRc += TestMethod( po, "UpdTokenForKey()", uda.UpdTokenForKey( "BB", "9999" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "UpdTokenForKey()", uda.DelTokenForKey( "CC" ), XB_NO_ERROR );
+ iRc += TestMethod( po, "GetTokencCnt()", uda.GetTokenCnt(), 7 );
+
+#ifdef XB_DEBUG_SUPPORT
+ uda.DumpUda();
+#endif // XB_DEBUG_SUPPORT
+
+ uda.Clear();
+ iRc += TestMethod( po, "GetTokencCnt()", uda.GetTokenCnt(), 0 );
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return iRc;
+}
diff --git a/src/tests/xb_test_xbase.cpp b/src/tests/xb_test_xbase.cpp
new file mode 100755
index 0000000..6dad3f7
--- /dev/null
+++ b/src/tests/xb_test_xbase.cpp
@@ -0,0 +1,106 @@
+/* xb_test_xbase.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014, 2022 Gary A Kunkel
+
+The xb64 software library is covered under the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ XDB-devel@lists.sourceforge.net
+ XDB-users@lists.sourceforge.net
+
+*/
+
+// This program tests the class xbXBase
+
+// usage: xb_test_xbase QUITE|NORMAL|VERBOSE
+
+
+#include "xbase.h"
+
+using namespace xb;
+
+#include "tstfuncs.cpp"
+
+int main( int argCnt, char **av )
+{
+ int iRc = 0;
+ int po = 1; /* print option */
+ /* 0 - QUIET */
+ /* 1 - NORMAL */
+ /* 2 - VERBOSE */
+
+ if( argCnt > 1 ) {
+ if( av[1][0] == 'Q' )
+ po = 0;
+ else if( av[1][0] == 'V' )
+ po = 2;
+ }
+
+
+ xbXBase x;
+
+
+#ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ if( po ){
+ std::cout << "Logfile is [" << x.GetLogFqFileName().Str() << "]" << std::endl;
+ }
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+#endif
+ InitTime();
+
+
+ x.SetDefaultDateFormat( "YY-MM-DD" );
+ iRc += TestMethod( po, "SetDefaultDateFormat", x.GetDefaultDateFormat(), "YY-MM-DD", 8 );
+
+ if( po == 2 ){
+ if( x.GetEndianType() == 'L' )
+ std::cout << "Little Endian Architecture" << std::endl;
+ else if( x.GetEndianType() == 'B' )
+ std::cout << "Big Endian Architecture" << std::endl;
+ else
+ std::cout << "Undefine Endian Architecture" << std::endl;
+ }
+
+ iRc += TestMethod( po, "GetErrorMessage", x.GetErrorMessage( XB_DBF_FILE_NOT_OPEN ), "DBF File Not Open", 17 );
+
+
+#ifdef XB_LOGGING_SUPPORT
+ xbString sLogDir = PROJECT_LOG_DIR;
+ iRc += TestMethod( po, "GetDefaultLogDirectory()", x.GetDefaultLogDirectory(), sLogDir, sLogDir.Len());
+
+ xbString sLogName = CMAKE_SYSTEM_NAME;
+ sLogName += "_";
+ sLogName += XB_PLATFORM;
+ sLogName += ".xbLog.txt";
+ iRc += TestMethod( po, "GetDefaultLogFileName()", x.GetDefaultLogFileName(), sLogName, sLogName.Len());
+
+ x.WriteLogMessage( "test" );
+#endif
+
+ x.xbSleep( 250 );
+
+
+
+ if( po == 2 ){
+ std::cout << "DisplayError Test ==> ";
+ x.DisplayError( 0 );
+ }
+
+ if( po > 0 || iRc < 0 )
+ fprintf( stdout, "Total Errors = %d\n", iRc * -1 );
+
+
+#ifdef XB_LOGGING_SUPPORT
+ sMsg.Sprintf( "Program [%s] terminating with [%d] errors...", av[0], iRc * -1 );
+ x.WriteLogMessage( sMsg );
+#endif
+
+ return iRc;
+}
+
diff --git a/bin/checkndx.cpp b/src/utils/checkndx.cpp
index 35d6add..adb5e1c 100755
--- a/bin/checkndx.cpp
+++ b/src/utils/checkndx.cpp
@@ -18,22 +18,17 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
-
+
Email:
-
+
xbase64-devel@lists.sourceforge.net
xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
*/
+
+// FIXME - program needs to be updated
+
#include <xbase64/xbase64.h>
int main(int ac,char** av)
@@ -42,7 +37,7 @@ int main(int ac,char** av)
xbXBase x;
xbDbf d( &x );
xbNdx i( &d );
- xbShort rc;
+ xbInt16 rc;
if( 3 != ac ){
std::cout <<
@@ -50,7 +45,7 @@ int main(int ac,char** av)
return 1;
}
- if(( rc = d.OpenDatabase( av[1] )) != XB_NO_ERROR )
+ if(( rc = d.Open( av[1] )) != XB_NO_ERROR )
{
std::cout << "\nCould not open file " << av[1] << " rc = " << rc << "\n";
return 2;
@@ -68,7 +63,7 @@ int main(int ac,char** av)
i.DumpHdrNode(0);
- d.CloseDatabase();
+ d.Close();
#else
std::cout << "\nXBASE_DEBUG is not compiled in\n";
#endif
diff --git a/bin/dbfxtrct.cpp b/src/utils/dbfxtrct.cpp
index 5d36b1e..17752c1 100755
--- a/bin/dbfxtrct.cpp
+++ b/src/utils/dbfxtrct.cpp
@@ -24,24 +24,19 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
-
+
Email:
-
+
xbase64-devel@lists.sourceforge.net
xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
*/
#include <xbase64/xbase64.h>
+
+// FIXME - program need to be updated
+
/*************************************************************************/
void Usage();
void Usage()
@@ -60,7 +55,7 @@ int main(int ac,char** av)
{
xbXBase x;
xbDbf d( &x );
- xbShort rc, FieldOption = 0;
+ xbInt16 rc, FieldOption = 0;
xbIndex *ix = 0;
xbNdx z(&d);
@@ -113,7 +108,7 @@ int main(int ac,char** av)
/* open the database file */
- if(( rc = d.OpenDatabase( dbfname )) != XB_NO_ERROR )
+ if(( rc = d.Open( dbfname )) != XB_NO_ERROR )
{
std::cout << "\nCould not open file " << dbfname << " rc = " << rc
<< "\n";
@@ -182,7 +177,6 @@ int main(int ac,char** av)
std::cout << std::endl;
}
-/* close everything */
- d.CloseDatabase();
+ d.Close();
return 0;
}
diff --git a/src/utils/preamble.txt b/src/utils/preamble.txt
new file mode 100755
index 0000000..e2aeda8
--- /dev/null
+++ b/src/utils/preamble.txt
@@ -0,0 +1,19 @@
+/* xbXXXXX.XXX
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2017 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+
+namespace xb{
+
diff --git a/bin/reindex.cpp b/src/utils/reindex.cpp
index 94f56d4..3013167 100755
--- a/bin/reindex.cpp
+++ b/src/utils/reindex.cpp
@@ -20,22 +20,16 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
-
+
Email:
-
+
xbase64-devel@lists.sourceforge.net
xbase64-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
*/
+
+// FIXME - program needs to be updated
+
#include <xbase64/xbase64.h>
static void
@@ -53,24 +47,24 @@ int main(int ac,char** av)
;
return 1;
}
-
+
char* filename = av[1];
char* filename2 = av[2];
- xbXBase x;
- xbDbf MyFile( &x );
- xbNdx MyIndex( &MyFile );
+ xbXBase x;
+ xbDbf MyFile( &x );
+ xbNdx MyIndex( &MyFile );
- if( MyFile.OpenDatabase( filename )) {
+ if( MyFile.Open( filename )) {
std::cout << "Could not open file " << filename << "\n";
return 0;
- }
+ }
if( MyIndex.OpenIndex( filename2 )) {
std::cout << "Could not open index file " << filename2 << "\n";
return 0;
- }
+ }
- xbShort rc = MyIndex.ReIndex(showStatus);
+ xbInt16 rc = MyIndex.ReIndex(showStatus);
printf("\n");
if( rc != XB_NO_ERROR ) {
std::cout << "\nError reindexing index ==> " << filename2;
@@ -84,7 +78,6 @@ int main(int ac,char** av)
std::cout << "\nReturn Code = " << rc;
}
*/
- MyFile.CloseDatabase(); /* close database */
-
+ MyFile.Close();
return 0;
-}
+}
diff --git a/src/utils/xb_cfg_check.cpp b/src/utils/xb_cfg_check.cpp
new file mode 100755
index 0000000..25ca46c
--- /dev/null
+++ b/src/utils/xb_cfg_check.cpp
@@ -0,0 +1,370 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "xbase.h"
+
+using namespace xb;
+
+
+int main()
+{
+
+ fprintf( stdout, "\n%s version %d.%d.%d build options\n", CMAKE_PROJECT_NAME, xbase_VERSION_MAJOR,
+ xbase_VERSION_MINOR, xbase_VERSION_PATCH );
+ // fprintf( stdout, "Usage: xb_cfg_check\n\n" );
+ fprintf( stdout, "These options were in effect at library build time:\n" );
+
+ fprintf( stdout, "\nGeneral system variables:\n" );
+ fprintf( stdout, "SYSTEM_NAME = [%s]\n", CMAKE_SYSTEM_NAME );
+ fprintf( stdout, "SYSTEM_PROCESSOR = [%s]\n", CMAKE_SYSTEM_PROCESSOR );
+ fprintf( stdout, "SYSTEM_VERSION = [%s]\n", CMAKE_SYSTEM_VERSION );
+ fprintf( stdout, "PLATFORM = [%s]\n", XB_PLATFORM );
+ fprintf( stdout, "BUILD TYPE = [%s]\n", CMAKE_BUILD_TYPE );
+ fprintf( stdout, "CMAKE C FLAGS = [%s]\n", CMAKE_C_FLAGS );
+ fprintf( stdout, "CMAKE C FLAGS DEBUG = [%s]\n", CMAKE_C_FLAGS_DEBUG );
+ fprintf( stdout, "CMAKE C FLAGS RELEASE = [%s]\n", CMAKE_C_FLAGS_RELEASE );
+
+
+ #ifdef XB_PLATFORM_32
+ fprintf( stdout, "XB_PLATFORM_32 = [TRUE]\n" );
+ #endif
+ #ifdef XB_PLATFORM_64
+ fprintf( stdout, "XB_PLATFORM_64 = [TRUE]\n" );
+ #endif
+ fprintf( stdout, "COMPILER = [%s]\n", CMAKE_COMPILER );
+ #ifdef WIN32
+ fprintf( stdout, "WIN32 = [ON]\n" );
+ #else
+ fprintf( stdout, "WIN32 = [OFF]\n" );
+ #endif
+
+ /*
+ #ifdef XBDLLEXPORT
+ fprintf( stdout, "XBDLLEXPORT = [%s]\n", XBDLLEXPORT );
+ #endif
+ */
+ printf( "\n" );
+
+
+ #ifdef CMAKE_COMPILER_IS_GNUCC
+ fprintf( stdout, "CMAKE_COMPILER_IS_GNUCC = [ON]\n" );
+ #else
+ fprintf( stdout, "CMAKE_COMPILER_IS_GNUCC = [OFF]\n" );
+ #endif
+
+ #ifdef _FILE_OFFSET_BITS
+ fprintf( stdout, "_FILE_OFFSET_BITS = [DEFINED]\n" );
+ #endif
+
+ fprintf( stdout, "User controlled build options:\n" );
+
+
+ #ifdef XB_DEBUG_SUPPORT
+ fprintf( stdout, "XB_DEBUG_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_DEBUG_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_LOGGING_SUPPORT
+ fprintf( stdout, "XB_LOGGING_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_LOGGING_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_MEMO_SUPPORT
+ fprintf( stdout, "XB_MEMO_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_MEMO_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_DBF3_SUPPORT
+ fprintf( stdout, "XB_DBF3_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_DBF3_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_DBF4_SUPPORT
+ fprintf( stdout, "XB_DBF4_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_DBF4_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_LINKLIST_SUPPORT
+ fprintf( stdout, "XB_LINKLIST_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_LINKLIST_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_LOCKING_SUPPORT
+ fprintf( stdout, "XB_LOCKING_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_LOCKING_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_EXPRESSION_SUPPORT
+ fprintf( stdout, "XB_EXPRESSION_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_EXPRESSION_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_LOCKING_SUPPORT
+ fprintf( stdout, "XB_EXAMPLES_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_EXAMPLES_SUPPORT = [OFF]\n" );
+ #endif
+ #ifdef XB_LOCKING_SUPPORT
+ fprintf( stdout, "XB_UTILS_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_UTILS_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_INDEX_SUPPORT
+ fprintf( stdout, "XB_INDEX_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_INDEX_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_INDEX_SUPPORT
+ fprintf( stdout, "XB_NDX_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_NDX_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_INDEX_SUPPORT
+ fprintf( stdout, "XB_MDX_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_MDX_SUPPORT = [OFF]\n" );
+ #endif
+
+ #ifdef XB_SQL_SUPPORT
+ fprintf( stdout, "XB_SQL_SUPPORT = [ON]\n" );
+ #else
+ fprintf( stdout, "XB_SQL_SUPPORT = [OFF]\n" );
+ #endif
+
+
+ fprintf( stdout, "\nDirectories:\n" );
+ fprintf( stdout, "HOME_DIRECTORY = [%s]\n", CMAKE_HOME_DIRECTORY );
+ fprintf( stdout, "PROJECT_PARENT_DIR = [%s]\n", PROJECT_PARENT_DIR );
+ fprintf( stdout, "PROJECT_BINARY_DIR = [%s]\n", PROJECT_BINARY_DIR );
+ fprintf( stdout, "PROJECT_DATA_DIR = [%s]\n", PROJECT_DATA_DIR );
+ fprintf( stdout, "PROJECT_LOG_DIR = [%s]\n", PROJECT_LOG_DIR );
+ fprintf( stdout, "PROJECT_DFLT_LOGFILE = [%s]\n", PROJECT_DFLT_LOGFILE );
+ fprintf( stdout, "PROJECT_SOURCE_DIR = [%s]\n", PROJECT_SOURCE_DIR );
+ fprintf( stdout, "CMAKE_RUNTIME_OUTPUT_DIRECTORY = [%s]\n\n", CMAKE_RUNTIME_OUTPUT_DIRECTORY );
+
+ fprintf( stdout, "Libraries:\n" );
+ fprintf( stdout, "BUILD_SHARED_LIBS = [%s]\n", BUILD_SHARED_LIBS );
+ fprintf( stdout, "EXTRA_LIBS = [%s]\n\n", EXTRA_LIBS );
+
+ fprintf( stdout, "Field sizes:\n" );
+ fprintf( stdout, "SIZEOF_VOID_P = [%s]\n", CMAKE_SIZEOF_VOID_P );
+ fprintf( stdout, "sizeof(char *) = [%ld]\n", sizeof( char *));
+ fprintf( stdout, "sizeof(int) = [%ld]\n", sizeof( int ));
+ fprintf( stdout, "sizeof(long) = [%ld]\n", sizeof( long ));
+ fprintf( stdout, "sizeof(char) = [%ld]\n", sizeof( char ));
+ #ifdef HAVE_WCHAR_H
+ fprintf( stdout, "sizeof(wchar_t) = [%ld]\n", sizeof( wchar_t ));
+ #endif
+
+ #ifdef HAVE_WINDOWS_H
+ fprintf( stdout, "sizeof(DWORD) = [%ld]\n", sizeof( DWORD ));
+ #endif
+
+ fprintf( stdout, "sizeof(double) = [%ld]\n", sizeof( double ));
+ fprintf( stdout, "sizeof(float) = [%ld]\n", sizeof( float ));
+ fprintf( stdout, "sizeof(size_t) = [%ld]\n", sizeof( size_t ));
+ fprintf( stdout, "sizeof(off_t) = [%ld]\n\n", sizeof( off_t ));
+
+ fprintf( stdout, "sizeof(xbBool) = [%ld]\n", sizeof( xbBool ));
+ fprintf( stdout, "sizeof(xbInt16) = [%ld]\n", sizeof( xbInt16 ));
+ fprintf( stdout, "sizeof(xbUInt16) = [%ld]\n", sizeof( xbUInt16 ));
+ fprintf( stdout, "sizeof(xbInt32) = [%ld]\n", sizeof( xbInt32 ));
+ fprintf( stdout, "sizeof(xbUInt32) = [%ld]\n", sizeof( xbUInt32 ));
+ fprintf( stdout, "sizeof(xbInt64) = [%ld]\n", sizeof( xbInt64 ));
+ fprintf( stdout, "sizeof(xbUInt64) = [%ld]\n", sizeof( xbUInt64 ));
+ fprintf( stdout, "sizeof(xbFloat) = [%lu]\n", sizeof( xbFloat ));
+ fprintf( stdout, "sizeof(xbDouble) = [%lu]\n", sizeof( xbDouble ));
+
+
+ fprintf( stdout, "\nHeader files:\n" );
+ #ifdef HAVE_CTYPE_H
+ fprintf( stdout, "HAVE_CTYPE_H = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_CTYPE_H = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_DIRENT_H
+ fprintf( stdout, "HAVE_DIRENT_H = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_DIRENT_H = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_FCNTL_H
+ fprintf( stdout, "HAVE_FCNTL_H = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_FCNTL_H = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_INTTYPES_H
+ fprintf( stdout, "HAVE_INTTYPES_H = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_INTTYPES_H = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_STDARG_H
+ fprintf( stdout, "HAVE_STDARG_H = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_STDARG_H = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_STRING_H
+ fprintf( stdout, "HAVE_STRING_H = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_STRING_H = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_STRINGS_H
+ fprintf( stdout, "HAVE_STRINGS_H = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_STRINGS_H = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_STAT_H
+ fprintf( stdout, "HAVE_STAT_H = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_STAT_H = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_UNISTD_H
+ fprintf( stdout, "HAVE_UNISTD_H = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_UNISTD_H = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_WINDOWS_H
+ fprintf( stdout, "HAVE_WINDOWS_H = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_WINDOWS_H = [NO]\n" );
+ #endif
+
+
+ fprintf( stdout, "\nC Library functions:\n" );
+
+ #ifdef HAVE__CLOSE_F
+ fprintf( stdout, "HAVE__CLOSE_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE__CLOSE_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_CREATEPROCESSW_F
+ fprintf( stdout, "HAVE_CREATEPROCESSW_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_CREATEPROCESSW_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_FCNTL_F
+ fprintf( stdout, "HAVE_FCNTL_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_FCNTL_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE__FDOPEN_F
+ fprintf( stdout, "HAVE__FDOPEN_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE__FDOPEN_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_FOPEN_S_F
+ fprintf( stdout, "HAVE_FOPEN_S_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_FOPEN_S_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE__FSOPEN_F
+ fprintf( stdout, "HAVE__FSOPEN_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE__FSOPEN_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE__FILENO_F
+ fprintf( stdout, "HAVE__FILENO_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE__FILENO_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_FORK_F
+ fprintf( stdout, "HAVE_FORK_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_FORK_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE__FSEEKI64_F
+ fprintf( stdout, "HAVE__FSEEKI64_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE__FSEEKI64_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_FSEEKO_F
+ fprintf( stdout, "HAVE_FSEEKO_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_FSEEKO_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_FTRUNCATE_F
+ fprintf( stdout, "HAVE_FTRUNCATE_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_FTRUNCATE_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE__LOCALTIME_S_F
+ fprintf( stdout, "HAVE__LOCALTIME_S_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE__LOCALTIME_S_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_LOCKFILE_F
+ fprintf( stdout, "HAVE_LOCKFILE_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_LOCKFILE_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_LOCKING_F
+ fprintf( stdout, "HAVE_LOCKING_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_LOCKING_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE__LOCKING_F
+ fprintf( stdout, "HAVE__LOCKING_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE__LOCKING_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE__OPEN_F
+ fprintf( stdout, "HAVE__OPEN_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE__OPEN_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_SETENDOFFILE_F
+ fprintf( stdout, "HAVE_SETENDOFFILE_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_SETENDOFFILE_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_VSNPRINTF_F
+ fprintf( stdout, "HAVE_VSNPRINTF_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_VSNPRINTF_F = [NO]\n" );
+ #endif
+
+ #ifdef HAVE_VSNPRINTF_S_F
+ fprintf( stdout, "HAVE_VSNPRINTF_S_F = [YES]\n" );
+ #else
+ fprintf( stdout, "HAVE_VSNPRINTF_S_F = [NO]\n" );
+ #endif
+
+ return 0;
+}
+
diff --git a/src/utils/xb_copydbf.cpp b/src/utils/xb_copydbf.cpp
new file mode 100755
index 0000000..1f88eb9
--- /dev/null
+++ b/src/utils/xb_copydbf.cpp
@@ -0,0 +1,62 @@
+/* xb_copydbf.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2019 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+#include <xbase.h>
+using namespace xb;
+
+int main(int ac,char** av)
+{
+ if (3 != ac) {
+ std::cout <<
+ "\nUsage: xb_copydbf filename1 filename2\n"
+ "This program copies the structure of one dbf file to another\n";
+ return 1;
+ }
+
+ char* sFileName = av[1];
+ char* tFileName = av[2];
+
+ xbXBase x;
+ xbInt16 iRc;
+ xbDbf *MyFile = NULL;
+ xbDbf *MyNewFile = NULL;
+
+ #ifdef XB_LOGGING_SUPPORT
+ x.EnableMsgLogging();
+ xbString sMsg;
+ sMsg.Sprintf( "Program [%s] initializing...", av[0] );
+ x.WriteLogMessage( sMsg );
+ #endif
+
+ if(( iRc = x.OpenHighestVersion( sFileName, "", &MyFile )) != XB_NO_ERROR ){
+ std::cout << "Could not open file iRc = " << iRc << " file = " << sFileName << std::endl;
+ x.DisplayError( iRc );
+ return 0;
+ }
+
+ if(( iRc = MyFile->CopyDbfStructure( MyNewFile, tFileName, tFileName, XB_DONTOVERLAY, XB_SINGLE_USER )) != XB_NO_ERROR ){
+ std::cout << "Could not copy file " << tFileName << " Error = " << iRc << "\n";
+ return 3;
+ }
+
+ MyFile->Close();
+ return 0;
+}
+
+
+
+
+
diff --git a/src/utils/xb_dbfutil.cpp b/src/utils/xb_dbfutil.cpp
new file mode 100755
index 0000000..e008155
--- /dev/null
+++ b/src/utils/xb_dbfutil.cpp
@@ -0,0 +1,3719 @@
+/* xb_dbfutil.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2021 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+#include "xbase.h"
+
+#ifdef HAVE_DIRENT_H
+#include <dirent.h>
+#endif
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+using namespace xb;
+
+///@cond DOXYOFF
+class xbUtil{
+ public:
+ xbUtil();
+ ~xbUtil();
+ xbDbf *GetTablePtr( const char * cTitle );
+ void DisplayActiveTable() const;
+
+ // menus
+ xbInt16 GetOption();
+ xbInt32 GetLong();
+ void ProcessOption( const xbString & sOption );
+ void MainMenu();
+ void SystemMenu();
+ void FileMenu();
+ void RecordMenu();
+ void FieldMenu();
+ void IndexMenu();
+ void LockingMenu();
+ void ExpressionMenu();
+ void DebugMenu();
+ void FilterMenu();
+
+ #ifdef XB_SQL_SUPPORT
+ void SqlMenu();
+ #endif // XB_SQL_MENU
+
+ #ifdef XB_NDXINF_SUPPORT
+ void InfFileMenu();
+ #endif // XB_NDXINF_SUPPORT
+
+ // 2 - SystemMenu options
+ void ListSystemSettings();
+ void UpdateDataDirectory();
+ void ToggleDefaultAutoCommit();
+ #ifdef XB_MEMO_SUPPORT
+ void UpdateDefaultMemoBlockSize();
+ #endif
+ void UpdateLogDirectory();
+ void UpdateLogFileName();
+ void ToggleLoggingStatus();
+ void WriteLogMessage();
+ #ifdef XB_LOCKING_SUPPORT
+ void UpdateDefaultLockRetries();
+ void ToggleDefaultAutoLock();
+ void UpdateDefaultLockFlavor();
+ void UpdateDefaultLockWait();
+ void ToggleMultiUserMode();
+ #endif
+
+ // 3 - FileMenu options
+ void ListFilesInDataDirectory();
+ void Open();
+ void Close();
+ void CloseAllTables();
+ void DisplayTableStats();
+ void Pack();
+ void ZapTable();
+ void CopyDbfStructure();
+ void UpdateTableAutoCommit();
+ void DisplayTableInfo();
+
+ // 4 - RecordMenu options
+ void GetRecord();
+ void BlankRecord();
+ void AppendRecord();
+ void PutRecord();
+ void DeleteRecord();
+ void UndeleteRecord();
+ void SelectActiveTable();
+ void GetFirstRecord();
+ void GetNextRecord();
+ void GetPrevRecord();
+ void GetLastRecord();
+ void DumpRecord();
+ void AbortRecord();
+ void CommitRecord();
+
+ #ifdef XB_FILTER_SUPPORT
+ void SetFilter();
+ void GetFirstFilterRec();
+ void GetNextFilterRec();
+ void GetPrevFilterRec();
+ void GetLastFilterRec();
+ #endif // XB_FILTER_SUPPORT
+
+ // 5 - FieldMenu options
+ void ListFieldInfo();
+ void UpdateFieldData();
+ #ifdef XB_MEMO_SUPPORT
+ void ShowMemoFieldData();
+ void UpdateMemoFieldData();
+ void DeleteMemoField();
+ #endif
+
+ // 6 - LockMenu options
+ #ifdef XB_LOCKING_SUPPORT
+ void DisplayFileLockSettings();
+ void UpdateFileLockRetryCount();
+ void UpdateFileLockFlavor();
+ void UpdateFileAutoLock();
+ void LockDbf();
+ void UnlockDbf();
+ void LockRecord();
+ void UnlockRecord();
+ void LockAppend();
+ void UnlockAppend();
+ #ifdef XB_INDEX_SUPPORT
+ void LockIndices();
+ void UnlockIndices();
+ #endif // XB_INDEX_SUPPORT
+
+ #ifdef XB_MEMO_SUPPORT
+ void LockMemo();
+ void UnlockMemo();
+ #endif
+
+ void LockHeader();
+ void UnlockHeader();
+ void xbFileLock();
+ void xbFileUnlock();
+ #endif
+
+ // 7 - Expression Menu options
+ #ifdef XB_EXPRESSION_SUPPORT
+ void ParseExpression( xbInt16 iOption );
+ void ProcessParsedExpression( xbInt16 iOption );
+ void ParseAndProcessExpression();
+ void JulToDate8();
+ void Date8ToJul();
+ void IsLeapYear();
+ #ifdef XB_DEBUG_SUPPORT
+ void DumpExpressionTree();
+ #endif
+ #endif
+
+ // 8 - Index Menu Options
+ #ifdef XB_INDEX_SUPPORT
+ void DisplayOpenIndexFiles();
+ void DisplaySupportedIndexTypes();
+ void SelectTag();
+ void OpenIndex();
+ void CloseIndexFile();
+ void CreateIndexTag();
+
+ void GetFirstKey();
+ void GetNextKey();
+ void GetPrevKey();
+ void GetLastKey();
+ void FindKey();
+
+ void CheckIntegrity();
+ void Reindex();
+ void DeleteTag();
+ void AssociateNonProdIx();
+
+ void DumpIxHeader();
+ void DumpIxNode();
+ void DumpIxNodeChain();
+ void DumpRecsByIx( xbInt16 iOpt );
+ void DumpFreeBlocks();
+
+ #endif // XB_INDEX_SUPPORT
+
+
+ // 9 - SQL Menu Options
+ #ifdef XB_SQL_SUPPORT
+ void ExecSqlNonQuery();
+ void ExecSqlQuery();
+ #endif // XB_SQL_SUPPORT
+
+
+ // 10 - DebugMenu options
+ #ifdef XB_MEMO_SUPPORT
+ void DumpDbtHeader();
+ void DumpMemoFreeChain();
+ #endif
+
+ // 11 - InfFileMenu options
+ #ifdef XB_NDXINF_SUPPORT
+ void ListInfFileData();
+ void AddInfFileData();
+ void DeleteInfFileData();
+ void InfFileHelp();
+ #endif
+
+
+ private:
+ xbXBase x;
+ xbDbf * dActiveTable;
+
+ #ifdef XB_EXPRESSION_SUPPORT
+ xbExp *exp;
+ #endif // XB_EXPRESSION_SUPPORT
+
+ #ifdef XB_SQL_SUPPORT
+ xbSql *sql;
+ #endif // XB_SQL_SUPPORT
+
+ #ifdef XB_FILTER_SUPPORT
+ xbFilter *filt;
+ #endif // XB_FILTER_SUPPORT
+
+};
+
+/*************************************************************************************/
+xbUtil::xbUtil()
+{
+ dActiveTable = NULL;
+ x.EnableMsgLogging();
+ x.SetLogSize( 10000000L );
+
+ #ifdef XB_EXPRESSION_SUPPORT
+ exp = NULL;
+ #endif
+
+ #ifdef XB_SQL_SUPPORT
+ sql = new xbSql( &x );
+ #endif // XB_SQL_SUPPORT
+
+ #ifdef XB_FILTER_SUPPORT
+ filt = NULL;
+ #endif // XB_FILTER_SUPPORT
+}
+
+
+/*************************************************************************************/
+xbUtil::~xbUtil(){
+
+ x.CloseAllTables();
+
+ if( dActiveTable )
+ delete dActiveTable;
+
+ #ifdef XB_SQL_SUPPORT
+ if( sql )
+ delete sql;
+ #endif // XB_SQL_SUPPORT
+
+ #ifdef XB_FILTER_SUPPORT
+ if( filt )
+ delete filt;
+ #endif // XB_FILTER_SUPPORT
+}
+
+/*************************************************************************************/
+#ifdef XB_NDXINF_SUPPORT
+
+void xbUtil::ListInfFileData()
+{
+ xbLinkListNode<xbString> *llN = dActiveTable->GetNdxInfList();
+
+ xbString s;
+ while( llN ){
+ s = llN->GetKey();
+ std::cout << s.Str() << std::endl;
+ llN = llN->GetNextNode();
+ }
+
+}
+
+void xbUtil::AddInfFileData()
+{
+ char cBuf[128];
+ std::cout << "Enter NDX index file name (FILENAME.NDX)" << std::endl;
+ std::cin.getline( cBuf, 128 );
+ xbInt16 iRc = dActiveTable->AssociateIndex( "NDX", cBuf, 0 );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::DeleteInfFileData()
+{
+ char cBuf[128];
+ std::cout << "Enter NDX index file name (FILENAME.NDX)" << std::endl;
+ std::cin.getline( cBuf, 128 );
+ xbInt16 iRc = dActiveTable->AssociateIndex( "NDX", cBuf, 1 );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::InfFileHelp()
+{
+ std::cout << std::endl;
+ std::cout << "Xbase64 uses an .INF file to link non production (NDX) index files to their associated DBF data file" << std::endl;
+}
+#endif // XB_NDXINF_SUPPORT
+
+
+/*************************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+#ifdef XB_LOCKING_SUPPORT
+
+void xbUtil::LockIndices(){
+
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc = dActiveTable->LockIndices( XB_LOCK );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::UnlockIndices(){
+
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc = dActiveTable->LockIndices( XB_UNLOCK );
+ x.DisplayError( iRc );
+}
+
+#endif // XB_LOCKING_SUPPORT
+
+
+/*************************************************************************************/
+void xbUtil::ParseExpression( xbInt16 iOption ){
+
+ if( iOption == 0 )
+ std::cout << "ParseExpression()\n";
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+ char sExpression[256];
+ memset( sExpression, 0x00, 256 );
+
+ std::cout << "Enter expresion:\n";
+ std::cin.getline( sExpression, 255 );
+
+ if( strlen( sExpression ) == 0 ){
+ std::cout << "Invalid expression" << std::endl;
+ return;
+ }
+
+ if( exp ){
+ delete exp;
+ exp = NULL;
+ }
+
+ exp = new xbExp( &x, dActiveTable );
+ iRc = exp->ParseExpression( sExpression );
+
+ if( iOption == 0 )
+ x.DisplayError( iRc );
+}
+
+/*************************************************************************************/
+void xbUtil::ProcessParsedExpression( xbInt16 iOption ){
+
+ if( iOption == 0 )
+ std::cout << "ProcessParsedExpression()\n";
+ if( !exp )
+ ParseExpression( iOption );
+ if( !exp )
+ return;
+
+ std::cout << "Dump from w/i dbfutil before processing expression\n";
+ exp->DumpTree( xbTrue );
+ std::cout << "-- end of dumptree in dbfutil before processExpression\n";
+
+ xbInt16 iRc = exp->ProcessExpression();
+ if( iRc != XB_NO_ERROR ){
+ x.DisplayError( iRc );
+ return;
+ }
+
+ std::cout << "Dump from w/i dbfutil after processing expression\n";
+ exp->DumpTree( xbTrue );
+ std::cout << "-- end of dumptree in dbfutil\n";
+
+ xbString sResult;
+ xbDouble dResult;
+ xbDate dtResult;
+ xbBool bResult;
+
+ switch ( exp->GetReturnType()){
+ case XB_EXP_CHAR:
+ exp->GetStringResult( sResult );
+ std::cout << sResult.Str() << "\n";
+ break;
+ case XB_EXP_DATE:
+ exp->GetDateResult( dtResult );
+ std::cout << dtResult.Str() << "\n";
+ break;
+ case XB_EXP_LOGICAL:
+ exp->GetBoolResult( bResult );
+ std::cout << bResult << "\n";
+ break;
+ case XB_EXP_NUMERIC:
+ exp->GetNumericResult( dResult );
+ std::cout << dResult << "\n";
+ break;
+ default:
+ std::cout << "Unknown result type [" << exp->GetReturnType() << std::endl;
+ break;
+ }
+ return;
+}
+
+/*************************************************************************************/
+void xbUtil::ParseAndProcessExpression(){
+ ParseExpression( 1 );
+ if( exp )
+ ProcessParsedExpression( 1 );
+}
+/*************************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+void xbUtil::DumpExpressionTree(){
+
+ if( exp )
+ exp->DumpTree( xbTrue );
+ else
+ std::cout << "No expression defined\n";
+}
+#endif // XB_DEBUG_SUPPORT
+
+
+void xbUtil::JulToDate8(){
+ std::cout << "Convert Julian Date to Date8 (CCYYMMDD) format" << std::endl;
+ std::cout << "Enter Julian Value" << std::endl;
+ xbInt32 l = GetLong();
+ xbDate d( l );
+ std::cout << "Date8 value = [" << d.Str() << "]" << std::endl;
+}
+
+void xbUtil::Date8ToJul(){
+ char cLine[12];
+ std::cout << "Convert Date8 (CCYYMMDD) format to Julian Date value" << std::endl;
+ std::cout << "Enter Date8 value:" << std::endl;
+ memset( cLine, 0x00, 12 );
+ std::cin.getline( cLine, 9 );
+
+ if( strlen( cLine ) == 8 ){
+ xbDate d( cLine );
+ std::cout << "Julian Value = [" << d.JulianDays() << "]" << std::endl;
+ } else {
+ std::cout << "Invalid length, expecting 8 characters" << std::endl;
+ }
+}
+
+void xbUtil::IsLeapYear(){
+ std::cout << "Check leap year status for a given year" << std::endl;
+ std::cout << "Enter a four digit year" << std::endl;
+ xbInt32 l = GetLong();
+ xbDate d( l );
+ if( d.IsLeapYear( (xbInt16) l ))
+ std::cout << l << " is a leap year" << std::endl;
+ else
+ std::cout << l << " is not a leap year" << std::endl;
+}
+#endif // XB_EXPRESSION_SUPPORT
+/*************************************************************************************/
+#ifdef XB_SQL_SUPPORT
+void xbUtil::ExecSqlNonQuery(){
+
+ xbSql sql( &x );
+ std::cout << "ExecSqlNonQuery\n";
+
+ char sSql[2048];
+ std::cout << "Enter an SQL command (2K max byte max)" << std::endl;
+ std::cin.getline( sSql, 2048 );
+
+ xbInt16 iRc = sql.ExecuteNonQuery( sSql );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::ExecSqlQuery(){
+ std::cout << "ExecSqlQuery\n";
+}
+#endif // XB_SQL_SUPPORT
+
+/*************************************************************************************/
+#ifdef XB_LOCKING_SUPPORT
+void xbUtil::DisplayFileLockSettings(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ std::cout << "File Lock Retry Count = [" << dActiveTable->GetLockRetryCount() << "]" << std::endl;
+ std::cout << "File Lock Flavor = [";
+ switch (dActiveTable->GetLockFlavor()){
+ case 1:
+ std::cout << "Dbase]" << std::endl;
+ break;
+ case 2:
+ std::cout << "Clipper]" << std::endl;
+ break;
+ case 3:
+ std::cout << "Fox]" << std::endl;
+ break;
+ case 9:
+ std::cout << "Xbase64]" << std::endl;
+ break;
+ default:
+ std::cout << "Unknown]" << std::endl;
+ break;
+ }
+ std::cout << "File Auto Lock = [";
+
+ if( dActiveTable->GetAutoLock())
+ std::cout << "ON]" << std::endl;
+ else
+ std::cout << "OFF]" << std::endl;
+ if( dActiveTable->GetHeaderLocked())
+ std::cout << "Header Locked = [TRUE]\n";
+ else
+ std::cout << "Header Locked = [FALSE]\n";
+
+ if( dActiveTable->GetTableLocked())
+ std::cout << "Table Locked = [TRUE]\n";
+ else
+ std::cout << "Table Locked = [FALSE]\n";
+
+ if( dActiveTable->GetAppendLocked() > 0 )
+ std::cout << "Append Locked = [" << dActiveTable->GetAppendLocked() << "]\n";
+ else
+ std::cout << "Append Locked = [FALSE]\n";
+
+ #ifdef XB_MEMO_SUPPORT
+ if( dActiveTable->GetMemoLocked())
+ std::cout << "Memo Locked = [TRUE]\n";
+ else
+ std::cout << "Memo Locked = [FALSE]\n";
+ #endif
+
+ xbLinkListNode<xbUInt32> * llN = dActiveTable->GetFirstRecLock();
+ if( llN ){
+ while( llN ){
+ std::cout << "Record Locked = [" << llN->GetKey() << "]\n";
+ llN = llN->GetNextNode();
+ }
+ } else {
+ std::cout << "Record Locked = [None]\n";
+ }
+}
+
+void xbUtil::UpdateFileLockRetryCount(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ char cBuf[15];
+ std::cout << std::endl << "Enter new File Lock Retry Count: " << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "File Lock Retry Count not updated" << std::endl;
+ return;
+ } else {
+ dActiveTable->SetLockRetryCount( atoi( cBuf ));
+ std::cout << "File Lock Retry Count updated to ["
+ << dActiveTable->GetLockRetryCount() << "]" << std::endl;
+ }
+}
+
+void xbUtil::UpdateFileLockFlavor(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ std::cout << std::endl;
+ std::cout << "Enter new File Lock Flavor: " << std::endl;
+ std::cout << "1 = DBase" << std::endl;
+ std::cout << "2 = Clipper (not implemented yet)" << std::endl;
+ std::cout << "3 = Fox (not implemented yet)" << std::endl;
+ std::cout << "9 = XBase64 (not implemented yet)" << std::endl;
+
+ char cBuf[15];
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "File Lock Flavor not updated" << std::endl;
+ return;
+ } else {
+ dActiveTable->SetLockFlavor( atoi( cBuf ));
+ std::cout << "File Lock Flavor updated to ["
+ << dActiveTable->GetLockFlavor() << "]" << std::endl;
+ }
+}
+
+void xbUtil::UpdateFileAutoLock(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ std::cout << "Enter new File Auto Lock: " << std::endl;
+ std::cout << "-1 = Use System Default" << std::endl;
+ std::cout << " 0 = Disable Auto Lock for this DBF file" << std::endl;
+ std::cout << " 1 = Enable Auto Lock for this DBF file" << std::endl;
+
+ char cBuf[15];
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "File Auto Lock Flavor not updated" << std::endl;
+ return;
+ }
+ xbInt16 iOption = atoi( cBuf );
+ if( iOption < -1 || iOption > 1 ){
+ std::cout << "Must be one of:" << std::endl;
+ std::cout << " -1 = Use Default Auto Lock" << std::endl;
+ std::cout << " 0 = File Auto Lock Off" << std::endl;
+ std::cout << " 1 = File Auto Lock On" << std::endl;
+ std::cout << "File Auto Lock Flavor not updated" << std::endl;
+ return;
+ } else {
+ dActiveTable->SetAutoLock( iOption );
+ std::cout << "File Auto Lock updated to ["
+ << dActiveTable->GetAutoLock() << "]" << std::endl;
+ }
+}
+
+void xbUtil::LockDbf(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+ std::cout << std::endl << "Lock Table" << std::endl;
+ iRc = dActiveTable->LockTable( XB_LOCK );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::LockAppend(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+ std::cout << std::endl << "Lock Append" << std::endl;
+ iRc = dActiveTable->LockAppend( XB_LOCK );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::UnlockAppend(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+ std::cout << std::endl << "Unlock Append" << std::endl;
+ iRc = dActiveTable->LockAppend( XB_UNLOCK );
+ x.DisplayError( iRc );
+}
+#ifdef XB_MEMO_SUPPORT
+void xbUtil::LockMemo(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+ std::cout << std::endl << "Lock Memo" << std::endl;
+ iRc = dActiveTable->LockMemo( XB_LOCK );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::UnlockMemo(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+ std::cout << std::endl << "Unlock Memo" << std::endl;
+ iRc = dActiveTable->LockMemo( XB_UNLOCK );
+ x.DisplayError( iRc );
+}
+#endif
+
+void xbUtil::LockRecord(){
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ xbInt16 iRc;
+ std::cout << std::endl << "Lock Record" << std::endl;
+ std::cout << "Enter record number to lock specific record" << std::endl;
+
+ char cBuf[15];
+ std::cin.getline( cBuf, 15 );
+ iRc = dActiveTable->LockRecord( XB_LOCK, atol( cBuf ));
+ x.DisplayError( iRc );
+}
+
+void xbUtil::UnlockRecord(){
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ xbInt16 iRc;
+ std::cout << std::endl << "Unlock Record" << std::endl;
+ std::cout << "Enter record number to unlock specific record" << std::endl;
+
+ char cBuf[15];
+ std::cin.getline( cBuf, 15 );
+ iRc = dActiveTable->LockRecord( XB_UNLOCK, atol( cBuf ));
+ x.DisplayError( iRc );
+}
+
+void xbUtil::UnlockDbf(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ xbInt16 iRc;
+ std::cout << std::endl << "Unlock Table" << std::endl;
+ iRc = dActiveTable->LockTable( XB_UNLOCK );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::UnlockHeader(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ xbInt16 iRc;
+ std::cout << std::endl << "Unlock Table Header" << std::endl;
+ iRc = dActiveTable->LockHeader( XB_UNLOCK );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::LockHeader(){
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ xbInt16 iRc;
+ std::cout << std::endl << "Lock Table Header" << std::endl;
+ iRc = dActiveTable->LockHeader( XB_LOCK );
+ x.DisplayError( iRc );
+}
+
+#ifdef XB_DEBUG_SUPPORT
+
+void xbUtil::xbFileLock(){
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ char cBufOffset[30];
+ char cBufLen[30];
+
+ std::cout << std::endl << "Enter new File Lock Offset (in bytes from BOF): " << std::endl;
+ std::cin.getline( cBufOffset, 30 );
+ std::cout << std::endl << "Enter new File Lock Len (in Bytes): " << std::endl;
+ std::cin.getline( cBufLen, 30 );
+
+ if( strlen( cBufOffset ) == 0 || strlen( cBufLen ) == 0 ){
+ std::cout << "Offset and length required." << std::endl;
+ return;
+ }
+
+ xbInt64 llSpos;
+ xbInt64 llLen;
+ xbString s1 = cBufOffset;
+ s1.CvtLongLong( llSpos );
+ s1 = cBufLen;
+ s1.CvtLongLong( llLen );
+ xbInt16 iRc = dActiveTable->xbLock( XB_LOCK, llSpos, (size_t) llLen );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::xbFileUnlock(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ char cBufOffset[30];
+ char cBufLen[30];
+ std::cout << std::endl << "Enter new File Lock Offset (in bytes from BOF): " << std::endl;
+ std::cin.getline( cBufOffset, 30 );
+ std::cout << std::endl << "Enter new File Lock Len (in Bytes): " << std::endl;
+ std::cin.getline( cBufLen, 30 );
+ if( strlen( cBufOffset ) == 0 || strlen( cBufLen ) == 0 ){
+ std::cout << "Offset and length required." << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+ iRc = dActiveTable->xbLock( XB_UNLOCK, atol( cBufOffset ), (size_t) atol( cBufLen ));
+ x.DisplayError( iRc );
+}
+
+#endif
+#endif
+/*************************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+#ifdef XB_MEMO_SUPPORT
+
+void xbUtil::DumpDbtHeader(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ if( !dActiveTable->MemoFieldsExist()){
+ std::cout << "Table has no memo fields" << std::endl;
+ return;
+ }
+
+ xbMemo * mPtr;
+ mPtr = dActiveTable->GetMemoPtr();
+ mPtr->DumpMemoHeader();
+
+}
+#endif
+#endif
+
+/*************************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+#ifdef XB_MEMO_SUPPORT
+
+void xbUtil::DumpMemoFreeChain(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ if( !dActiveTable->MemoFieldsExist()){
+ std::cout << "Table has no memo fields" << std::endl;
+ return;
+ }
+ xbMemo * mPtr;
+ mPtr = dActiveTable->GetMemoPtr();
+ mPtr->DumpMemoFreeChain();
+}
+#endif
+#endif
+
+/*************************************************************************************/
+void xbUtil::ListFieldInfo(){
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ DisplayActiveTable();
+ dActiveTable->DumpHeader( 2 );
+}
+/*************************************************************************************/
+void xbUtil::UpdateFieldData(){
+ xbInt16 rc;
+ char cFldName[40];
+ char cFldData[256];
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ std::cout << "Enter Field Name " << std::endl;
+ std::cin.getline( cFldName, 40 );
+
+ std::cout << "Enter Field Data " << std::endl;
+ std::cin.getline( cFldData, 256 );
+
+ if(( rc = dActiveTable->PutField( cFldName, cFldData )) != XB_NO_ERROR ){
+ x.DisplayError( rc );
+ return;
+ }
+ std::cout << "Success" << std::endl;
+}
+/*************************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+void xbUtil::ShowMemoFieldData(){
+ xbInt16 rc;
+ char cFldName[40];
+ char cBuf[15];
+ xbString sMemoData;
+ xbUInt32 ulRecNo;
+ xbUInt32 ulFldLen;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ if( !dActiveTable->MemoFieldsExist()){
+ std::cout << "Table has no memo fields" << std::endl;
+ return;
+ }
+ if( dActiveTable->GetCurRecNo() == 0 ){
+ std::cout << "Enter Record number" << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Record number not entered" << std::endl;
+ return;
+ }
+ ulRecNo = atol( cBuf );
+ if(( rc = dActiveTable->GetRecord( ulRecNo )) != XB_NO_ERROR ){
+ x.DisplayError( rc );
+ return;
+ }
+ }
+ std::cout << "Enter Memo Field Name " << std::endl;
+ std::cin.getline( cFldName, 40 );
+ if(( rc = dActiveTable->GetMemoField( cFldName, sMemoData )) != XB_NO_ERROR ){
+ std::cout << "rc = " << rc << std::endl;
+ x.DisplayError( rc );
+ return;
+ }
+ if(( rc = dActiveTable->GetMemoFieldLen( cFldName, ulFldLen )) != XB_NO_ERROR ){
+ std::cout << "rc = " << rc << std::endl;
+ x.DisplayError( rc );
+ return;
+ }
+ std::cout << sMemoData.Str() << std::endl;
+ std::cout << "Data length = [" << ulFldLen << "]" << std::endl;
+}
+#endif
+/*************************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+void xbUtil::UpdateMemoFieldData(){
+
+ xbInt16 rc;
+ char cFldName[40];
+ char cBuf[15];
+ char cMemoData[2048];
+ xbUInt32 ulRecNo;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ if( !dActiveTable->MemoFieldsExist()){
+ std::cout << "Table has no memo fields" << std::endl;
+ return;
+ }
+ if( dActiveTable->GetCurRecNo() == 0 ){
+ std::cout << "Enter Record number" << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Record number not entered" << std::endl;
+ return;
+ }
+ ulRecNo = atol( cBuf );
+ if(( rc = dActiveTable->GetRecord( ulRecNo )) != XB_NO_ERROR ){
+ x.DisplayError( rc );
+ return;
+ }
+ }
+ std::cout << "Enter Memo Field Name " << std::endl;
+ std::cin.getline( cFldName, 40 );
+ std::cout << "Enter Memo Data (2048 bytes max) " << std::endl;
+ std::cin.getline( cMemoData, 2048 );
+ if(( rc = dActiveTable->UpdateMemoField( cFldName, cMemoData )) != XB_NO_ERROR ){
+ std::cout << "rc = " << rc << std::endl;
+ x.DisplayError( rc );
+ return;
+ }
+
+ if(( rc = dActiveTable->PutRecord( dActiveTable->GetCurRecNo())) != XB_NO_ERROR ){
+ std::cout << "rc = " << rc << std::endl;
+ x.DisplayError( rc );
+ return;
+ }
+}
+#endif
+
+/*************************************************************************************/
+#ifdef XB_MEMO_SUPPORT
+void xbUtil::DeleteMemoField(){
+
+ xbInt16 rc;
+ char cFldName[40];
+ char cBuf[15];
+ xbUInt32 ulRecNo;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ if( !dActiveTable->MemoFieldsExist()){
+ std::cout << "Table has no memo fields" << std::endl;
+ return;
+ }
+
+ if( dActiveTable->GetCurRecNo() == 0 ){
+ std::cout << "Enter Record number" << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Record number not entered" << std::endl;
+ return;
+ }
+ ulRecNo = atol( cBuf );
+ if(( rc = dActiveTable->GetRecord( ulRecNo )) != XB_NO_ERROR ){
+ x.DisplayError( rc );
+ return;
+ }
+ }
+ std::cout << "Enter Memo Field Name " << std::endl;
+ std::cin.getline( cFldName, 40 );
+ if(( rc = dActiveTable->UpdateMemoField( cFldName, "" )) != XB_NO_ERROR ){
+ std::cout << "rc = " << rc << std::endl;
+ x.DisplayError( rc );
+ return;
+ }
+ if(( rc = dActiveTable->PutRecord( dActiveTable->GetCurRecNo())) != XB_NO_ERROR ){
+ std::cout << "rc = " << rc << std::endl;
+ x.DisplayError( rc );
+ return;
+ }
+}
+#endif
+/*************************************************************************************/
+void xbUtil::SelectActiveTable(){
+
+ char cBuf[15];
+ xbInt16 iLineNo;
+ if( x.GetOpenTableCount() == 0 ){
+ std::cout << "No open tables" << std::endl;
+ std::cout << "Use menu option =3.4 to open a table" << std::endl;
+ return;
+ }
+
+ x.DisplayTableList();
+ std::cout << std::endl << "Enter line number:" << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ iLineNo = atoi( cBuf );
+ dActiveTable = x.GetDbfPtr( iLineNo );
+}
+
+/*************************************************************************************/
+void xbUtil::CommitRecord(){
+
+ xbInt16 rc = XB_NO_ERROR;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ DisplayActiveTable();
+
+ if(( rc = dActiveTable->Commit()) == XB_NO_ERROR )
+ std::cout << "Success" << std::endl;
+ else
+ x.DisplayError( rc );
+}
+/*************************************************************************************/
+void xbUtil::AbortRecord(){
+
+ xbInt16 rc = XB_NO_ERROR;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ DisplayActiveTable();
+
+
+ if(( rc = dActiveTable->Abort()) == XB_NO_ERROR )
+ std::cout << "Success" << std::endl;
+ else
+ x.DisplayError( rc );
+}
+/*************************************************************************************/
+void xbUtil::DumpRecord(){
+
+ char cBuf[15];
+ xbInt16 rc;
+ xbUInt32 lRecNo;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ DisplayActiveTable();
+
+ if( dActiveTable->GetCurRecNo() == 0 ){
+ std::cout << "Enter Record number" << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Record number not entered" << std::endl;
+ return;
+ }
+ lRecNo = atol( cBuf );
+ if(( rc = dActiveTable->GetRecord( lRecNo )) != XB_NO_ERROR ){
+ x.DisplayError( rc );
+ return;
+ }
+ }
+
+ if(( rc = dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2 )) == XB_NO_ERROR )
+ std::cout << "Success" << std::endl;
+ else
+ x.DisplayError( rc );
+}
+/*************************************************************************************/
+void xbUtil::GetFirstRecord(){
+
+ xbInt16 iRc;
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ if(( iRc = dActiveTable->GetFirstRecord()) == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+/*************************************************************************************/
+void xbUtil::GetNextRecord(){
+
+ xbInt16 iRc;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ if(( iRc = dActiveTable->GetNextRecord()) == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+/*************************************************************************************/
+void xbUtil::GetPrevRecord(){
+
+ xbInt16 iRc;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ if(( iRc = dActiveTable->GetPrevRecord()) == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+/*************************************************************************************/
+void xbUtil::GetLastRecord(){
+
+ xbInt16 iRc;
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ if(( iRc = dActiveTable->GetLastRecord()) == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(),2);
+ else
+ x.DisplayError( iRc );
+}
+
+/*************************************************************************************/
+void xbUtil::UndeleteRecord(){
+
+ char cBuf[15];
+ xbInt16 rc;
+ xbUInt32 lRecNo;
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ DisplayActiveTable();
+
+ if( dActiveTable->GetCurRecNo() == 0 ){
+ std::cout << "Enter Record number" << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Record number not entered" << std::endl;
+ return;
+ }
+ lRecNo = atol( cBuf );
+ if(( rc = dActiveTable->GetRecord( lRecNo )) != XB_NO_ERROR ){
+ x.DisplayError( rc );
+ return;
+ }
+ }
+
+ if(( dActiveTable->RecordDeleted()) == xbFalse )
+ std::cout << "Record is not flagged for deletion" << std::endl;
+ else{
+ if(( rc = dActiveTable->UndeleteRecord()) == XB_NO_ERROR )
+ std::cout << "Success" << std::endl;
+ else
+ x.DisplayError( rc );
+ }
+}
+
+/*************************************************************************************/
+void xbUtil::DeleteRecord(){
+
+ char cBuf[15];
+ xbInt16 rc;
+ xbUInt32 lRecNo;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ DisplayActiveTable();
+ if( dActiveTable->GetCurRecNo() == 0 ){
+ std::cout << "Enter Record number" << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Record number not entered" << std::endl;
+ return;
+ }
+ lRecNo = atol( cBuf );
+ if(( rc = dActiveTable->GetRecord( lRecNo )) != XB_NO_ERROR ){
+ x.DisplayError( rc );
+ return;
+ }
+ }
+
+ if(( dActiveTable->RecordDeleted()) == xbTrue )
+ std::cout << "Record is already flagged for deletion" << std::endl;
+ else{
+ if(( rc = dActiveTable->DeleteRecord()) == XB_NO_ERROR )
+ std::cout << "Success" << std::endl;
+ else
+ x.DisplayError( rc );
+ }
+}
+
+/*************************************************************************************/
+void xbUtil::PutRecord(){
+
+ char cBuf[15];
+ xbInt16 rc;
+ xbUInt32 lRecNo;
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ DisplayActiveTable();
+
+ std::cout << "Enter Record number" << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Record number not entered" << std::endl;
+ return;
+ }
+ lRecNo = atol( cBuf );
+ if(( rc = dActiveTable->PutRecord( lRecNo )) == XB_NO_ERROR )
+ std::cout << "Success" << std::endl;
+ else
+ x.DisplayError( rc );
+}
+
+/*************************************************************************************/
+void xbUtil::AppendRecord(){
+
+ xbInt16 rc;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ if(( rc = dActiveTable->AppendRecord()) == XB_NO_ERROR )
+ std::cout << "Success" << std::endl;
+ else
+ x.DisplayError( rc );
+}
+
+/*************************************************************************************/
+void xbUtil::BlankRecord(){
+
+ xbInt16 rc;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ if(( rc = dActiveTable->BlankRecord()) == XB_NO_ERROR )
+ std::cout << "Success" << std::endl;
+ else
+ x.DisplayError( rc );
+}
+
+/*************************************************************************************/
+void xbUtil::DisplayTableInfo(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ dActiveTable->DumpHeader( 1 );
+}
+
+/*************************************************************************************/
+void xbUtil::GetRecord(){
+
+ char cBuf[15];
+ xbInt16 iRc;
+ xbUInt32 lRecNo;
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ DisplayActiveTable();
+
+ std::cout << "Enter Record number" << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Record number not entered" << std::endl;
+ return;
+ }
+ lRecNo = atol( cBuf );
+ if(( iRc = dActiveTable->GetRecord( lRecNo )) == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+/*************************************************************************************/
+void xbUtil::DisplayActiveTable() const{
+ if( dActiveTable ){
+ std::cout << "Active Table = [" << dActiveTable->GetTblAlias().Str() << "] ";
+ xbUInt32 ulRecCnt = 0;
+ dActiveTable->ReadHeader( 0, 1 );
+ dActiveTable->GetRecordCnt( ulRecCnt );
+ std::cout << "Total Records = [" << ulRecCnt << "] ";
+ std::cout << "Current Record = [" << dActiveTable->GetCurRecNo() << "] ";
+
+ if( dActiveTable->GetAutoCommit())
+ std::cout << " Auto Commit = [Enabled]";
+ else
+ std::cout << " Auto Commit = [Disabled]";
+
+ std::cout << std::endl;
+ #ifdef XB_INDEX_SUPPORT
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( pIx ){
+ void *vpTag = dActiveTable->GetCurTag();
+ std::cout << "Active Tag = [" << pIx->GetTagName( vpTag ).Str() << "] Type = [" << dActiveTable->GetCurIxType().Str() <<
+ "] \tFile Name = [" << pIx->GetFileName().Str() << "] Key = [" << pIx->GetKeyExpression( vpTag ).Str() << "]" << std::endl;
+ }
+ #endif // XB_INDEX_SUPPORT
+ std::cout << std::endl;
+ }
+}
+/*************************************************************************************/
+xbDbf * xbUtil::GetTablePtr( const char * cTitle ){
+
+ xbDbf *d;
+ xbInt16 iOpenTableCnt = x.GetOpenTableCount();
+ char cBuf[15];
+ xbInt16 iLineNo;
+
+ if( iOpenTableCnt == 0 ){
+ std::cout << "No open tables" << std::endl;
+ return NULL;
+ } else if( iOpenTableCnt == 1 ){
+ d = x.GetDbfPtr( 1 );
+ } else {
+ std::cout << "Select file/table " << cTitle << std::endl;
+ x.DisplayTableList();
+ std::cout << std::endl << "Enter line number:" << std::endl;
+ memset( cBuf, 0x00, 15 );
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Table not selected" << std::endl;
+ return NULL;
+ }
+ iLineNo = atoi( cBuf );
+ if( iLineNo < 1 || iLineNo > iOpenTableCnt ){
+ std::cout << "Invalid selection. Valid line numbers are 1 through " << iOpenTableCnt << std::endl;
+ return NULL;
+ }
+ d = x.GetDbfPtr( iLineNo );
+ }
+ return d;
+}
+/*************************************************************************************/
+void xbUtil::UpdateTableAutoCommit(){
+ xbDbf *d;
+ d = GetTablePtr( "" );
+ if( d ){
+ std::cout << "Xbase64 AutoCommit is functionality to determine if table updates should be posted" << std::endl;
+ std::cout << " to the table automatically, even if no xbDbf::PutRecord explicitly executed" << std::endl;
+ std::cout << " If unsure, leave the option turned on at the DBMS level (default)" << std::endl;
+ std::cout << " and don't over ride the setting at the table level" << std::endl << std::endl;
+ std::cout << " -1 ==> Use DBMS setting which is currently [";
+ if( x.GetDefaultAutoCommit() )
+ std::cout << "ON]" << std::endl;
+ else
+ std::cout << "OFF]" << std::endl;
+ std::cout << " 0 ==> Disable Auto Commit for table" << std::endl;
+ std::cout << " 1 ==> Enable Auto Commit for table" << std::endl;
+ std::cout << "Current setting is [" << d->GetAutoCommit() << "]" << std::endl;
+ char cBuf[15];
+ xbInt16 iAuto;
+ std::cout << "Enter new Table Auto Commit: " << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ) {
+ std::cout << "Not updated" << std::endl;
+ return;
+ }
+ iAuto = atoi( cBuf );
+ if( iAuto < -1 || iAuto > 1 ){
+ std::cout << "Invalid value. Must be one of -1, 0 or 1" << std::endl;
+ return;
+ }
+ d->SetAutoCommit( iAuto );
+ std::cout << "Auto Commit set to [" << d->GetAutoCommit(0) << "]" << std::endl;
+ if( d->GetAutoCommit() )
+ std::cout << "Auto Commit enabled for table" << std::endl;
+ else
+ std::cout << "Auto Commit disabled for table" << std::endl;
+ }
+}
+/*************************************************************************************/
+void xbUtil::CopyDbfStructure(){
+ xbDbf *d;
+ xbInt16 rc;
+ char filename[128];
+ xbFile f( &x );
+ xbDbf *dNewTable;
+ d = GetTablePtr( "" );
+
+ if( d ){
+
+ if( d->GetVersion() == 3 ){
+ #ifdef XB_DBF3_SUPPORT
+ dNewTable = new xbDbf3( &x );
+ #else
+ std::cout << "Dbase III file support not build into library. See XB_DBF3_SUPPORT" << std::endl;
+ return;
+ #endif
+ } else if( d->GetVersion() == 4 ){
+ #ifdef XB_DBF4_SUPPORT
+ dNewTable = new xbDbf4( &x );
+ #else
+ std::cout << "Dbase IV file support not build into library. See XB_DBF4_SUPPORT" << std::endl;
+ return;
+ #endif
+ } else {
+ std::cout << "Unsupported file type file = " << d->GetVersion() << std::endl;
+ return;
+ }
+ std::cout << "Copy Table" << std::endl;
+ std::cout << "Enter new DBF file name (ie; myfile.dbf or MYFILE.DBF): ";
+ std::cin.getline( filename, 128 );
+ f.SetFileName( filename );
+ if( strlen( filename ) == 0 ){
+ std::cout << "No file name entered" << std::endl;
+ return;
+ }
+ if(( rc = f.FileExists( f.GetFqFileName() )) == xbTrue ){
+ std::cout << "File [" << f.GetFqFileName().Str() << "] already exists " << std::endl;
+ return;
+ }
+ if(( rc = d->CopyDbfStructure( dNewTable, filename, filename, 0, XB_MULTI_USER )) != XB_NO_ERROR ){
+ std::cout << "Error " << rc << " creating new file" << std::endl;
+ x.DisplayError( rc );
+ return;
+ }
+ std::cout << "Table " << f.GetFqFileName().Str() << " created" << std::endl;
+ if(( rc = dNewTable->Close()) != XB_NO_ERROR ){
+ std::cout << "Error " << rc << " closing new file" << std::endl;
+ x.DisplayError( rc );
+ return;
+ }
+ }
+}
+/*************************************************************************************/
+void xbUtil::ZapTable(){
+
+ xbInt16 iRc;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ DisplayActiveTable();
+
+ iRc = dActiveTable->Zap();
+ if( iRc == XB_NO_ERROR )
+ std::cout << "Table Zapped (all rows deleted)" << std::endl;
+ else
+ x.DisplayError( iRc );
+}
+/*************************************************************************************/
+void xbUtil::Pack(){
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+ DisplayActiveTable();
+ xbInt16 iRc;
+ iRc = dActiveTable->Pack();
+ if( iRc == XB_NO_ERROR )
+ std::cout << "Table Packed" << std::endl;
+ else
+ x.DisplayError( iRc );
+}
+/*************************************************************************************/
+void xbUtil::DisplayTableStats(){
+
+ xbDbf *d;
+ char cBuf[15];
+ xbInt16 iOptionNo;
+ d = GetTablePtr( "" );
+ if( d ){
+ std::cout << "Enter option" << std::endl;
+ std::cout << "1 - Header data only" << std::endl;
+ std::cout << "2 - Field data only" << std::endl;
+ std::cout << "3 - Header and Field data" << std::endl;
+ std::cout << "4 - Header, Field and Memo Header if applicable" << std::endl;
+ std::cout << "5 - DBMS Settings (not stored in the file)" << std::endl << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Option not entered" << std::endl;
+ return;
+ }
+ iOptionNo = atoi( cBuf );
+ if( iOptionNo < 1 || iOptionNo > 5 ){
+ std::cout << "Invalid option [" << cBuf << "] entered. Defaulting to 1" << std::endl;
+ iOptionNo = 1;
+ }
+ if( iOptionNo < 5 ) {
+ d->ReadHeader( xbTrue, 0 );
+ d->DumpHeader( iOptionNo );
+ } else {
+ // DBMS settings
+ if( d->GetAutoCommit( 0 ) == -1 ){
+ std::cout << "Table Auto Commit = [Use DBMS Setting]" << std::endl;
+ if( x.GetDefaultAutoCommit() )
+ std::cout << "DBMS Auto Commit = [ON]" << std::endl;
+ else
+ std::cout << "DBMS Auto Commit = [OFF]" << std::endl;
+ }
+ else if( d->GetAutoCommit( 0 ) == 0 )
+ std::cout << "Table Auto Commit = [OFF]" << std::endl;
+ else
+ std::cout << "Table Auto Commit = [ON]" << std::endl;
+ }
+ }
+}
+/*************************************************************************************/
+void xbUtil::CloseAllTables(){
+
+ xbInt16 sOpenTableCnt = x.GetOpenTableCount();
+ xbInt16 rc;
+ if( sOpenTableCnt == 0 ){
+ std::cout << "No open tables" << std::endl;
+ return;
+ }
+ rc = x.CloseAllTables();
+ if( rc == XB_NO_ERROR )
+ std::cout << "All open tables closed" << std::endl;
+ else
+ x.DisplayError( rc );
+ dActiveTable = NULL;
+}
+
+/*************************************************************************************/
+void xbUtil::Close(){
+ xbDbf *d;
+// xbInt16 sOpenTableCnt = x.GetOpenTableCount();
+
+ d = GetTablePtr( "to close" );
+ if( d ){
+ d->Close();
+ std::cout << "Table closed" << std::endl;
+ if( d == dActiveTable )
+ dActiveTable = NULL;
+ }
+ else
+ printf( "Can't identify table\n");
+}
+/*************************************************************************************/
+void xbUtil::Open(){
+ xbInt16 rc;
+ xbFile f( &x );
+ xbDbf *dTable;
+ char filename[128];
+ unsigned char cFileTypeByte;
+
+ std::cout << "Open Table" << std::endl;
+ std::cout << "Enter DBF file name (.dbf or .DBF): ";
+ std::cin.getline( filename, 128 );
+ f.SetFileName( filename );
+
+ if( strlen( filename ) == 0 ){
+ std::cout << "No file name entered" << std::endl;
+ return;
+ }
+ if(( rc = f.FileExists( f.GetFqFileName() )) != xbTrue ){
+ std::cout << "File [" << f.GetFqFileName().Str() << "] does not exist " << std::endl;
+ return;
+ }
+ if(( rc = f.GetXbaseFileTypeByte( f.GetFqFileName(), cFileTypeByte )) != XB_NO_ERROR ){
+ std::cout << "Could not open file or determine file type rc = " << rc << " file = " << filename << std::endl;
+ x.DisplayError( rc );
+ return;
+ }
+ std:: cout << "File Type Byte ";
+ x.BitDump( cFileTypeByte );
+ std::cout << "\n";
+ std::cout << "Table Type = [" << f.DetermineXbaseTableVersion( cFileTypeByte ) << "]\n";
+ std::cout << "Memo Type = [" << f.DetermineXbaseMemoVersion( cFileTypeByte ) << "]\n";
+
+ if( f.DetermineXbaseTableVersion( cFileTypeByte ) == 4 ){
+ #ifdef XB_DBF4_SUPPORT
+ dTable = new xbDbf4( &x );
+ #else
+ std::cout << "Dbase IV file support not build into library. See XB_DBF4_SUPPORT" << std::endl;
+ return;
+ #endif
+
+ } else if( f.DetermineXbaseTableVersion( cFileTypeByte ) == 3 ){
+ #ifdef XB_DBF3_SUPPORT
+ dTable = new xbDbf3( &x );
+ #else
+ std::cout << "Dbase III file support not build into library. See XB_DBF3_SUPPORT" << std::endl;
+ return;
+ #endif
+ } else {
+ std::cout << "Unsupported file type file = " << filename << " type = ";
+ x.BitDump( cFileTypeByte );
+ std::cout << std::endl;
+ return;
+ }
+
+ if(( rc = dTable->Open( filename )) != 0 ){
+ std::cout << "Could not open file rc = " << rc << " file = " << filename << std::endl;
+ x.DisplayError( rc );
+ return;
+ }
+
+ dActiveTable = dTable;
+ dActiveTable->GetFirstRecord();
+
+ if( dActiveTable )
+ std::cout << dActiveTable->GetTblAlias().Str() << " opened" << std::endl;
+ else
+ std::cout << "dActiveTable not set" << std::endl;
+}
+/*************************************************************************************/
+#ifdef XB_LOCKING_SUPPORT
+void xbUtil::UpdateDefaultLockRetries(){
+ char cBuf[15];
+ std::cout << std::endl << "Enter new Default Lock Retry Count: " << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Default Lock Retry Count not updated" << std::endl;
+ return;
+ } else {
+ x.SetDefaultLockRetries( atoi( cBuf ));
+ std::cout << "Default Lock Retry Count updated to ["
+ << x.GetDefaultLockRetries() << "]" << std::endl;
+ }
+}
+
+void xbUtil::UpdateDefaultLockWait(){
+ char cBuf[15];
+ std::cout << std::endl << "Enter new Default Lock Wait Time (in millisecs 1000=1 second): " << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Default Lock Wait Time not updated" << std::endl;
+ return;
+ } else {
+ x.SetDefaultLockWait( atoi( cBuf ));
+ std::cout << "Default Lock Wait Time updated to ["
+ << x.GetDefaultLockWait() << "]" << std::endl;
+ }
+}
+
+void xbUtil::UpdateDefaultLockFlavor(){
+ char cBuf[15];
+ std::cout << std::endl;
+ std::cout << "Enter new Default Lock Flavor: " << std::endl;
+ std::cout << "1 = DBase" << std::endl;
+ std::cout << "2 = Clipper (not implemented yet)" << std::endl;
+ std::cout << "3 = Fox (not implemented yet)" << std::endl;
+ std::cout << "9 = XBase64 (not implemented yet)" << std::endl;
+ std::cin.getline( cBuf, 15 );
+ if( strlen( cBuf ) == 0 ){
+ std::cout << "Default Lock Flavor not updated" << std::endl;
+ return;
+ } else {
+ x.SetDefaultLockFlavor( atoi( cBuf ));
+ std::cout << "Default Lock Flavor updated to ["
+ << x.GetDefaultLockFlavor() << "]" << std::endl;
+ }
+}
+void xbUtil::ToggleDefaultAutoLock(){
+ if( x.GetDefaultAutoLock()){
+ x.DisableDefaultAutoLock();
+ x.WriteLogMessage( "xb_dbfutil - Default Auto Lock disabled" );
+ std::cout << "Default Auto Lock disabled" << std::endl;
+ } else {
+ x.EnableDefaultAutoLock();
+ x.WriteLogMessage( "xb_dbfutil - Default Auto Lock enabled" );
+ std::cout << "Default Auto Lock enabled" << std::endl;
+ }
+}
+
+void xbUtil::ToggleMultiUserMode(){
+ if( x.GetMultiUser()){
+ x.SetMultiUser( xbFalse );
+ x.WriteLogMessage( "xb_dbfutil - Multi user mode disabled" );
+ std::cout << "Multi user mode disabled" << std::endl;
+ } else {
+ x.SetMultiUser( xbTrue );
+ x.WriteLogMessage( "xb_dbfutil - Multu user mode enabled" );
+ std::cout << "Multi user mode enabled" << std::endl;
+ }
+}
+#endif
+/*************************************************************************************/
+void xbUtil::ListFilesInDataDirectory(){
+ std::cout << "List files for [" << x.GetDataDirectory().Str() << "]" << std::endl << std::endl;
+ xbString s1;
+ xbInt16 iCnt = 0;
+
+#ifdef WIN32
+
+ WIN32_FIND_DATA fData;
+ HANDLE hFile;
+
+ xbString sSearchPath = x.GetDataDirectory();
+ xbUInt32 l = sSearchPath.Len();
+ char cPathSeperator = sSearchPath.GetPathSeparator();
+ char cLastChar = sSearchPath.GetCharacter( l );
+
+ if( cLastChar == cPathSeperator )
+ sSearchPath += "*.*";
+ else if( cPathSeperator ){
+ sSearchPath += cPathSeperator;
+ sSearchPath += "*.*";
+ }
+ else
+ sSearchPath += "\\*.*";
+
+ hFile = FindFirstFile( sSearchPath.Str(), &fData );
+ if( hFile == INVALID_HANDLE_VALUE ){
+ std::cout << "Could not open directory" << std::endl;
+ return;
+ }
+
+ do{
+ s1 = fData.cFileName;
+ if( s1 != "." && s1 != ".." ){
+ std::cout << fData.cFileName << std::endl;
+ iCnt++;
+ }
+ } while( FindNextFile( hFile, &fData ));
+ std::cout << std::endl << iCnt << " entries" << std::endl;
+#else
+ DIR *dir;
+ struct dirent *ent;
+
+ if(( dir = opendir( x.GetDataDirectory() )) != NULL ){
+ while(( ent = readdir( dir )) != NULL ){
+ s1 = ent->d_name;
+ if( s1 != "." && s1 != ".." ){
+ std::cout << ent->d_name << std::endl;
+ iCnt++;
+ }
+ }
+ std::cout << std::endl << iCnt << " entries" << std::endl;
+ closedir( dir );
+ }
+ else
+ std::cout << "Could not open directory" << std::endl;
+#endif
+}
+/*************************************************************************************/
+void xbUtil::UpdateLogDirectory(){
+
+ char cNewDir[256];
+ cNewDir[0] = 0x00;
+ std::cout << std::endl << "Update Log Directory" << std::endl;
+ std::cout << "Current Log File Directory = [" << x.GetLogDirectory().Str() << "]" << std::endl;
+ std::cout << "Enter '1' to erase the Log File Directory" << std::endl;
+ std::cout << "Enter '2' to change Log File Directory to [" << x.GetDefaultLogDirectory().Str() << "]" << std::endl;
+ std::cout << "Enter new log directory. Enter for no updates." << std::endl;
+ std::cin.getline( cNewDir, 256 );
+ if( strlen( cNewDir ) > 0 ){
+ if( cNewDir[0] == '1' )
+ x.SetLogDirectory( "" );
+ else if( cNewDir[0] == '2' )
+ x.SetLogDirectory( x.GetDefaultLogDirectory());
+ else
+ x.SetLogDirectory( cNewDir );
+
+ std::cout << "Log File Directory is [" << x.GetLogDirectory().Str() << "]" << std::endl;
+ }
+ else
+ std::cout << "Log Directory not updated" << std::endl;
+}
+/*************************************************************************************/
+void xbUtil::UpdateLogFileName(){
+ char cNewFile[256];
+ cNewFile[0] = 0x00;
+
+ std::cout << std::endl << "Update Log File Name" << std::endl;
+ std::cout << "Current Log File Name = [" << x.GetLogFileName().Str() << "]" << std::endl;
+ std::cout << "Enter '1' to change change Log File Name to default [" << x.GetDefaultLogFileName().Str() << "]" << std::endl;
+ std::cout << "Enter new Log File Name" << std::endl;
+ std::cin.getline( cNewFile, 256 );
+ if( strlen( cNewFile ) > 0 ){
+ if( cNewFile[0] == '1' )
+ x.SetLogFileName( x.GetDefaultLogFileName());
+ else
+ x.SetLogFileName( cNewFile );
+
+ std::cout << "Log File Name is [" << x.GetLogFileName().Str() << "]" << std::endl;
+ } else
+ std::cout << "Log File Name not updated" << std::endl;
+}
+/*************************************************************************************/
+void xbUtil::WriteLogMessage(){
+ if( x.GetLogStatus()) {
+ char cMsg[256];
+ std::cout << "Enter a message to write to the log file (256 byte max)" << std::endl;
+ std::cin.getline( cMsg, 256 );
+ x.WriteLogMessage( cMsg );
+ } else
+ std::cout << "Logging disabled" << std::endl;
+}
+/*************************************************************************************/
+void xbUtil::ToggleLoggingStatus(){
+ if( x.GetLogStatus()){
+ x.DisableMsgLogging();
+ x.WriteLogMessage( "xb_dbfutil - Logging disabled" );
+ std::cout << "Logging disabled" << std::endl;
+ } else {
+ x.EnableMsgLogging();
+ x.WriteLogMessage( "xb_dbfutil - Logging enabled" );
+ std::cout << "Logging enabled" << std::endl;
+ }
+}
+/*************************************************************************************/
+void xbUtil::ToggleDefaultAutoCommit(){
+ if( x.GetDefaultAutoCommit()){
+ x.SetDefaultAutoCommit( xbFalse );
+ x.WriteLogMessage( "xb_dbfutil - Default Auto Commit disabled" );
+ std::cout << "Default Auto Commit disabled" << std::endl;
+ } else {
+ x.SetDefaultAutoCommit( xbTrue );
+ x.WriteLogMessage( "xb_dbfutil - Default Auto Commit enabled" );
+ std::cout << "Default Auto Commit enabled" << std::endl;
+ }
+}
+/*************************************************************************************/
+void xbUtil::UpdateDataDirectory(){
+ char cNewDir[256];
+ cNewDir[0] = 0x00;
+ std::cout << std::endl << "Update Default Data Directory" << std::endl;
+ std::cout << "Current Default Data Directory = [" << x.GetDataDirectory().Str() << "]" << std::endl;
+ std::cout << "Enter '1' to erase the Default Data Directory" << std::endl;
+ std::cout << "Enter '2' to change Default Data Directory to [" << PROJECT_DATA_DIR << "]" << std::endl;
+ std::cout << "Enter new directory" << std::endl;
+ std::cin.getline( cNewDir, 256 );
+ if( strlen( cNewDir ) > 0 ){
+ if( cNewDir[0] == '1' )
+ x.SetDataDirectory( "" );
+ else if( cNewDir[0] == '2' )
+ x.SetDataDirectory( PROJECT_DATA_DIR );
+ else
+ x.SetDataDirectory( cNewDir );
+ std::cout << "Default Data Directory is [" << x.GetDataDirectory().Str() << "]" << std::endl;
+ }
+ else
+ std::cout << "Default Data Directory not updated" << std::endl;
+}
+/*************************************************************************************/
+void xbUtil::ListSystemSettings(){
+ std::cout << std::endl << "List System Settings" << std::endl;
+ std::cout << "Default Data Directory = [" << x.GetDataDirectory().Str() << "]" << std::endl;
+// std::cout << "Default File Version = [" << x.GetDefaultFileVersion() << "]" << std::endl;
+ #ifdef XB_LOCKING_SUPPORT
+ std::cout << "Default Auto Locking = [";
+ if( x.GetDefaultAutoLock())
+ std::cout << "ON]" << std::endl;
+ else
+ std::cout << "OFF]" << std::endl;
+
+ std::cout << "Default Lock Retries = [" << x.GetDefaultLockRetries() << "]" << std::endl;
+ std::cout << "Default Lock Wait Time = [" << x.GetDefaultLockWait() << "] (millisecs)" << std::endl;
+
+ std::cout << "Default Lock Flavor = [";
+ switch (x.GetDefaultLockFlavor()){
+ case 1:
+ std::cout << "Dbase]" << std::endl;
+ break;
+ case 2:
+ std::cout << "Clipper]" << std::endl;
+ break;
+ case 3:
+ std::cout << "Fox]" << std::endl;
+ break;
+ case 9:
+ std::cout << "Xbase64]" << std::endl;
+ break;
+ default:
+ std::cout << "Unknown]" << std::endl;
+ break;
+ }
+ #endif
+ std::cout << "Default Log Directory = [" << x.GetDefaultLogDirectory().Str() << "]" << std::endl;
+ std::cout << "Default Logfile Name = [" << x.GetDefaultLogFileName().Str() << "]" << std::endl;
+ std::cout << "Default Auto Commit = [";
+ if( x.GetDefaultAutoCommit())
+ std::cout << "ON]" << std::endl;
+ else
+ std::cout << "OFF]" << std::endl;
+
+ std::cout << "Logging Status = [";
+ if( x.GetLogStatus())
+ std::cout << "ON]" << std::endl;
+ else
+ std::cout << "OFF]" << std::endl;
+ std::cout << "Endian Type = [";
+ if( x.GetEndianType() == 'L' )
+ std::cout << "Little Endian]" << std::endl;
+ else
+ std::cout << "Big Endian]" << std::endl;
+
+ if( x.GetMultiUser())
+ std::cout << "Multi User Mode = [ON]";
+ else
+ std::cout << "Multi User Mode = [OFF]";
+}
+/*************************************************************************************/
+/* This method handles all the complex menu option commands */
+void xbUtil::ProcessOption( const xbString &sOption ){
+
+ if( sOption[1] == '=' ){
+ if( sOption == "=0" )
+ MainMenu();
+ else if( sOption == "=0.99" )
+ // exit right now, now cleanup or termination of anything
+ exit(0);
+ else if( sOption == "=2" )
+ SystemMenu();
+ else if( sOption == "=2.1" )
+ ListSystemSettings();
+ else if( sOption == "=2.2" )
+ UpdateDataDirectory();
+ else if( sOption == "=2.3" )
+ ToggleDefaultAutoCommit();
+ else if( sOption == "=2.4" )
+ UpdateLogDirectory();
+ else if( sOption == "=2.5" )
+ UpdateLogFileName();
+ else if( sOption == "=2.6" )
+ ToggleLoggingStatus();
+ else if( sOption == "=2.7" )
+ WriteLogMessage();
+ #ifdef XB_LOCKING_SUPPORT
+ else if( sOption == "=2.8" )
+ UpdateDefaultLockRetries();
+ else if( sOption == "=2.9" )
+ ToggleDefaultAutoLock();
+ else if( sOption == "=2.10" )
+ UpdateDefaultLockFlavor();
+ else if( sOption == "=2.11" )
+ UpdateDefaultLockWait();
+ else if( sOption == "=2.12" )
+ ToggleMultiUserMode();
+ #endif
+ else if( sOption == "=3" )
+ FileMenu();
+ else if( sOption == "=3.1" )
+ ListFilesInDataDirectory();
+ else if( sOption == "=3.2" )
+ UpdateDataDirectory();
+ else if( sOption == "=3.3" )
+ x.DisplayTableList();
+ else if( sOption == "=3.4" )
+ Open();
+ else if( sOption == "=3.5" )
+ Close();
+ else if( sOption == "=3.6" )
+ CloseAllTables();
+ else if( sOption == "=3.7" )
+ SelectActiveTable();
+ else if( sOption == "=3.8" )
+ DisplayTableStats();
+ else if( sOption == "=3.10" )
+ Pack();
+ else if( sOption == "=3.11" )
+ ZapTable();
+ else if( sOption == "=3.12" )
+ CopyDbfStructure();
+ else if( sOption == "=3.13" )
+ UpdateTableAutoCommit();
+ else if( sOption == "=3.14" )
+ DisplayTableInfo();
+ else if( sOption == "=4" )
+ RecordMenu();
+ else if( sOption == "=4.1" )
+ SelectActiveTable();
+ else if( sOption == "=4.2" )
+ GetRecord();
+ else if( sOption == "=4.3" )
+ BlankRecord();
+ else if( sOption == "=4.4" )
+ AppendRecord();
+ else if( sOption == "=4.5" )
+ PutRecord();
+ else if( sOption == "=4.6" )
+ DeleteRecord();
+ else if( sOption == "=4.7" )
+ UndeleteRecord();
+ else if( sOption == "=4.8" )
+ GetFirstRecord();
+ else if( sOption == "=4.9" )
+ GetNextRecord();
+ else if( sOption == "=4.10" )
+ GetPrevRecord();
+ else if( sOption == "=4.11" )
+ GetLastRecord();
+ else if( sOption == "=4.12" )
+ DumpRecord();
+ else if( sOption == "=4.13" )
+ AbortRecord();
+ else if( sOption == "=4.14" )
+ CommitRecord();
+ #ifdef XB_FILTER_SUPPORT
+ else if( sOption == "=4.20" )
+ SetFilter();
+ else if( sOption == "=4.21" )
+ GetFirstFilterRec();
+ else if( sOption == "=4.22" )
+ GetNextFilterRec();
+ else if( sOption == "=4.23" )
+ GetPrevFilterRec();
+ else if( sOption == "=4.24" )
+ GetLastFilterRec();
+ #endif // XB_FILTER_SUPPORT
+ else if( sOption == "=5" )
+ FieldMenu();
+ else if( sOption == "=5.1" )
+ SelectActiveTable();
+ else if( sOption == "=5.2" )
+ ListFieldInfo();
+ else if( sOption == "=5.3" )
+ DumpRecord();
+ else if( sOption == "=5.4" )
+ UpdateFieldData();
+ #ifdef XB_MEMO_SUPPORT
+ else if( sOption == "=5.5" )
+ ShowMemoFieldData();
+ else if( sOption == "=5.6" )
+ UpdateMemoFieldData();
+ else if( sOption == "=5.7" )
+ DeleteMemoField();
+ #endif
+
+ #ifdef XB_LOCKING_SUPPORT
+ else if( sOption == "=6" )
+ LockingMenu();
+ else if( sOption == "=6.1" )
+ DisplayFileLockSettings();
+ else if( sOption == "=6.2" )
+ UpdateFileLockRetryCount();
+ else if( sOption == "=6.3" )
+ UpdateFileLockFlavor();
+ else if( sOption == "=6.4" )
+ UpdateFileAutoLock();
+ else if( sOption == "=6.5" )
+ LockDbf();
+ else if( sOption == "=6.6" )
+ UnlockDbf();
+ else if( sOption == "=6.7" )
+ LockRecord();
+ else if( sOption == "=6.8" )
+ UnlockRecord();
+ else if( sOption == "=6.9" )
+ LockAppend();
+ else if( sOption == "=6.10" )
+ UnlockAppend();
+ else if( sOption == "=6.11" )
+ LockHeader();
+ else if( sOption == "=6.12" )
+ UnlockHeader();
+ #ifdef XB_MEMO_SUPPORT
+ else if( sOption == "=6.13" )
+ LockMemo();
+ else if( sOption == "=6.14" )
+ UnlockMemo();
+ #endif
+
+ #ifdef XB_DEBUG_SUPPORT
+ else if( sOption == "=6.20" )
+ xbFileLock();
+ else if( sOption == "=6.21" )
+ xbFileUnlock();
+ #endif
+ #endif
+
+ #ifdef XB_EXPRESSION_SUPPORT
+ else if( sOption == "=7" )
+ ExpressionMenu();
+ else if( sOption == "=7.1" )
+ ParseExpression( 0 );
+ else if( sOption == "=7.2" )
+ ProcessParsedExpression( 0 );
+ else if( sOption == "=7.3" )
+ ParseAndProcessExpression();
+ #ifdef XB_DEBUG_SUPPORT
+ else if (sOption == "=7.4" )
+ DumpExpressionTree();
+ #endif // XB_DEBUG_SUPPORT
+ else if (sOption == "=7.10" )
+ Date8ToJul();
+ else if (sOption == "=7.11" )
+ JulToDate8();
+ else if (sOption == "=7.12" )
+ IsLeapYear();
+ #endif // XB_EXPRESSION_SUPPORT
+
+ #ifdef XB_INDEX_SUPPORT
+
+ else if( sOption == "=8" )
+ IndexMenu();
+ else if( sOption == "=8.1" )
+ SelectActiveTable();
+ else if( sOption == "=8.2" )
+ DisplayOpenIndexFiles();
+ else if( sOption == "=8.3" )
+ DisplaySupportedIndexTypes();
+ else if( sOption == "=8.4" )
+ SelectTag();
+ else if( sOption == "=8.5" )
+ OpenIndex();
+ else if( sOption == "=8.6" )
+ CloseIndexFile();
+ else if( sOption == "=8.7" )
+ CreateIndexTag();
+ else if( sOption == "=8.8" )
+ GetFirstKey();
+ else if( sOption == "=8.9" )
+ GetPrevKey();
+ else if( sOption == "=8.10" )
+ GetNextKey();
+ else if( sOption == "=8.11" )
+ GetLastKey();
+ else if( sOption == "=8.12" )
+ FindKey();
+
+ else if( sOption == "=8.13" )
+ CheckIntegrity();
+ else if( sOption == "=8.14" )
+ Reindex();
+ else if( sOption == "=8.15" )
+ DeleteTag();
+ else if( sOption == "=8.16" )
+ AssociateNonProdIx();
+
+ #ifdef XB_DEBUG_SUPPORT
+ else if( sOption == "=8.20" )
+ DumpIxHeader();
+ else if( sOption == "=8.21" )
+ DumpIxNode();
+ else if( sOption == "=8.22" )
+ DumpIxNodeChain();
+ else if( sOption == "=8.23" )
+ DumpRecsByIx(0);
+ else if( sOption == "=8.24" )
+ DumpRecsByIx(1);
+ else if( sOption == "=8.25" )
+ DumpFreeBlocks();
+ #endif // XB_DEBUG_SUPPORT
+ #endif // XB_INDEX_SUPPORT
+
+ #ifdef XB_SQL_SUPPORT
+ else if( sOption == "=10" )
+ SqlMenu();
+ else if( sOption == "=10.1" )
+ ExecSqlNonQuery();
+ else if( sOption == "=10.2" )
+ ExecSqlQuery();
+ #endif // XB_SQL_SUPPORT
+
+ #ifdef XB_NDXINF_SUPPORT
+ else if( sOption == "=11" )
+ InfFileMenu();
+ else if( sOption == "=11.1" )
+ ListInfFileData();
+ else if( sOption == "=11.2" )
+ AddInfFileData();
+ else if( sOption == "=11.3" )
+ DeleteInfFileData();
+ else if( sOption == "=11.10" )
+ InfFileHelp();
+ #endif // XB_NDXINF_SUPPORT
+
+ #ifdef XB_DEBUG_SUPPORT
+ else if( sOption == "=20" )
+ DebugMenu();
+ else if( sOption == "=20.1" )
+ SelectActiveTable();
+/*
+ #ifdef XB_MEMO_SUPPORT
+ else if( sOption == "=10.2" )
+ DumpDbtHeader();
+ else if( sOption == "=10.3" )
+ DumpMemoFreeChain();
+ #endif
+*/
+
+ #endif
+ else
+ return;
+ }
+}
+
+/*************************************************************************************/
+xbInt32 xbUtil::GetLong(){
+ char cLine[256];
+ xbString sLine;
+ memset( cLine, 0x00, 256 );
+ std::cin.getline( cLine, 256 );
+ sLine = cLine;
+ sLine.Trim();
+ return atol( cLine );
+}
+/*************************************************************************************/
+xbInt16 xbUtil::GetOption(){
+ char cLine[256];
+ xbString sLine;
+ memset( cLine, 0x00, 256 );
+ std::cin.getline( cLine, 256 );
+ sLine = cLine;
+ sLine.Trim();
+
+ if( sLine[1] == '=' || sLine.Pos(".") != 0 ){
+ ProcessOption( sLine );
+ return 0;
+ }
+ else
+ return atoi( cLine );
+}
+/************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+void xbUtil::IndexMenu()
+{
+ int option = 0;
+
+ while( option != 99 ) {
+
+ std::cout << std::endl << std::endl << " 8 - Index Menu" << std::endl;
+ std::cout << "---------------------" << std::endl;
+ DisplayActiveTable();
+
+ std::cout << " 1 - Select Active Table" << std::endl;
+ std::cout << " 2 - Display Open Index Files" << std::endl;
+ std::cout << " 3 - Display Supported Index Types" << std::endl;
+ std::cout << " 4 - Select Active Tag" << std::endl;
+ std::cout << " 5 - Open Index File" << std::endl;
+ std::cout << " 6 - Close Index File" << std::endl;
+ std::cout << " 7 - Create Index Tag" << std::endl;
+ std::cout << " 8 - Get First Key" << std::endl;
+ std::cout << " 9 - Get Next Key" << std::endl;
+ std::cout << " 10 - Get Prev Key" << std::endl;
+ std::cout << " 11 - Get Last Key" << std::endl;
+ std::cout << " 12 - Find Key" << std::endl;
+ std::cout << " 13 - Check Index Integrity" << std::endl;
+ std::cout << " 14 - Reindex" << std::endl;
+ std::cout << " 15 - Delete Tag" << std::endl;
+ std::cout << " 16 - Associate NDX file" << std::endl;
+
+ #ifdef XB_DEBUG_SUPPORT
+ std::cout << std::endl;
+ std::cout << " 20 - Dump Header" << std::endl;
+ std::cout << " 21 - Dump Node(s)" << std::endl;
+ std::cout << " 22 - Dump Node Chain" << std::endl;
+ std::cout << " 23 - Dump Recs by Tag Fwd" << std::endl;
+ std::cout << " 24 - Dump Recs by Tag Bwd" << std::endl;
+ std::cout << " 25 - Dump Free Blocks / MDX ulBlock2" << std::endl;
+ #endif // XB_DEBUG_SUPPORT
+
+ std::cout << std::endl;
+ std::cout << std::endl;
+
+ std::cout << " 99 - Exit Menu" << std::endl;
+ option = GetOption();
+
+ switch( option ){
+ case 0: break;
+ case 1: SelectActiveTable(); break;
+ case 2: DisplayOpenIndexFiles(); break;
+ case 3: DisplaySupportedIndexTypes(); break;
+ case 4: SelectTag(); break;
+ case 5: OpenIndex(); break;
+ case 6: CloseIndexFile(); break;
+ case 7: CreateIndexTag(); break;
+
+ case 8: GetFirstKey(); break;
+ case 9: GetNextKey(); break;
+ case 10: GetPrevKey(); break;
+ case 11: GetLastKey(); break;
+
+ case 12: FindKey(); break;
+ case 13: CheckIntegrity(); break;
+ case 14: Reindex(); break;
+ case 15: DeleteTag(); break;
+ case 16: AssociateNonProdIx(); break;
+
+ #ifdef XB_DEBUG_SUPPORT
+ case 20: DumpIxHeader(); break;
+ case 21: DumpIxNode(); break;
+ case 22: DumpIxNodeChain(); break;
+ case 23: DumpRecsByIx(0); break;
+ case 24: DumpRecsByIx(1); break;
+ case 25: DumpFreeBlocks(); break;
+ #endif
+
+ case 99: break;
+ default: std::cout << "Invalid option" << std::endl; break;
+ }
+ }
+}
+#endif
+/************************************************************************/
+#ifdef XB_EXPRESSION_SUPPORT
+void xbUtil::ExpressionMenu()
+{
+ int option = 0;
+
+ while( option != 99 ) {
+ std::cout << std::endl << std::endl << " 7 - Expression Menu" << std::endl;
+ std::cout << " --------------" << std::endl;
+ DisplayActiveTable();
+ std::cout << " 1 - Parse Expression" << std::endl;
+ std::cout << " 2 - Process Parsed Expression" << std::endl;
+ std::cout << " 3 - Parse and Process Expression" << std::endl;
+ #ifdef XB_DEBUG_SUPPORT
+ std::cout << " 4 - Dump Expression Internals" << std::endl;
+ #endif
+ std::cout << " 10 - Date8 To Julian Date" << std::endl;
+ std::cout << " 11 - Julian Date to Date8" << std::endl;
+ std::cout << " 12 - Check Leap Year" << std::endl;
+ std::cout << " 99 - Exit Menu" << std::endl;
+ option = GetOption();
+ switch( option ){
+ case 0: break;
+ case 1: ParseExpression( 0 ); break;
+ case 2: ProcessParsedExpression( 0 ); break;
+ case 3: ParseAndProcessExpression(); break;
+ #ifdef XB_DEBUG_SUPPORT
+ case 4: DumpExpressionTree(); break;
+ #endif
+ case 10: Date8ToJul(); break;
+ case 11: JulToDate8(); break;
+ case 12: IsLeapYear(); break;
+ case 99: break;
+ default: std::cout << "Invalid option" << std::endl; break;
+ }
+ }
+}
+#endif
+/************************************************************************/
+#ifdef XB_LOCKING_SUPPORT
+void xbUtil::LockingMenu()
+{
+ int option = 0;
+
+ while( option != 99 ) {
+ std::cout << std::endl << std::endl << " 6 - Locking Menu" << std::endl;
+ std::cout << "-------------" << std::endl;
+ DisplayActiveTable();
+
+ std::cout << " 1 - Display File Specific Settings" << std::endl;
+ std::cout << " 2 - Update File Retry Count" << std::endl;
+ std::cout << " 3 - Update Locking Flavor" << std::endl;
+ std::cout << " 4 - Update Auto Lock" << std::endl;
+ std::cout << " 5 - Lock table (dbf file)" << std::endl;
+ std::cout << " 6 - Unlock table (dbf file)" << std::endl;
+ std::cout << " 7 - Lock Record" << std::endl;
+ std::cout << " 8 - Unlock Record" << std::endl;
+ std::cout << " 9 - Lock Append" << std::endl;
+ std::cout << " 10 - Unlock Append" << std::endl;
+ std::cout << " 11 - Lock Header" << std::endl;
+ std::cout << " 12 - Unlock Header" << std::endl;
+
+
+ #ifdef XB_MEMO_SUPPORT
+ std::cout << " 13 - Lock Memo File" << std::endl;
+ std::cout << " 14 - Unlock Memo File" << std::endl;
+ #endif // XB_MEMO_SUPPORT
+
+ #ifdef XB_INDEX_SUPPORT
+ std::cout << " 15 - Lock Index File(s)" << std::endl;
+ std::cout << " 16 - Unlock Index File(s)" << std::endl;
+ #endif // XB_INDEX_SUPPORT
+
+ #ifdef XB_DEBUG_SUPPORT
+ std::cout << " 20 - Native xbFile - Lock Bytes" << std::endl;
+ std::cout << " 21 - Native xbFile - Unlock Bytes" << std::endl;
+ #endif // XB_DEBUG_SUPPORT
+
+ std::cout << " 99 - Exit Menu" << std::endl;
+ option = GetOption();
+
+ switch( option ) {
+ case 0: break;
+ case 1: DisplayFileLockSettings(); break;
+ case 2: UpdateFileLockRetryCount(); break;
+ case 3: UpdateFileLockFlavor(); break;
+ case 4: UpdateFileAutoLock(); break;
+ case 5: LockDbf(); break;
+ case 6: UnlockDbf(); break;
+ case 7: LockRecord(); break;
+ case 8: UnlockRecord(); break;
+ case 9: LockAppend(); break;
+ case 10: UnlockAppend(); break;
+ case 11: LockHeader(); break;
+ case 12: UnlockHeader(); break;
+
+ #ifdef XB_MEMO_SUPPORT
+ case 13: LockMemo(); break;
+ case 14: UnlockMemo(); break;
+ #endif // XB_MEMO_SUPPORT
+
+ #ifdef XB_INDEX_SUPPORT
+ case 15: LockIndices(); break;
+ case 16: UnlockIndices(); break;
+ #endif // XB_INDEX_SUPPORT
+
+ #ifdef XB_DEBUG_SUPPORT
+ case 20: xbFileLock(); break;
+ case 21: xbFileUnlock(); break;
+ #endif // XB_DEBUG_SUPPORT
+
+ case 99: break;
+ default: std::cout << "Invalid Option" << std::endl;
+ }
+ }
+}
+#endif
+
+/************************************************************************/
+#ifdef XB_SQL_SUPPORT
+void xbUtil::SqlMenu()
+{
+ int option = 0;
+
+ while( option != 99 ) {
+ std::cout << std::endl << std::endl << "9 - Sql Menu" << std::endl;
+ std::cout << "-------------" << std::endl;
+ DisplayActiveTable();
+
+ std::cout << " 1 - Execute SQL Non Query" << std::endl;
+ std::cout << " 2 - Execute SQL Query" << std::endl;
+ std::cout << "99 - Exit Menu" << std::endl;
+
+ option = GetOption();
+ switch( option ){
+ case 0: break;
+ case 1: ExecSqlNonQuery(); break;
+ case 2: ExecSqlQuery(); break;
+ case 99: break;
+ default: std::cout << "Invalid option" << std::endl; break;
+ }
+ }
+}
+#endif // XB_SQL_SUPPORT
+
+/************************************************************************/
+#ifdef XB_DEBUG_SUPPORT
+void xbUtil::DebugMenu()
+{
+ int option = 0;
+
+ while( option != 99 ) {
+ std::cout << std::endl << std::endl << "10 - Debug Menu" << std::endl;
+ std::cout << "-------------" << std::endl;
+ DisplayActiveTable();
+
+ std::cout << " 1 - Select Active Table" << std::endl;
+ #ifdef XB_MEMO_SUPPORT
+ std::cout << " 2 - Dislay Memo Header Info" << std::endl;
+ std::cout << " 3 - Dump Memo Free Chain" << std::endl;
+ #endif
+
+// //std::cout << "4 - Dump index node chains to file xbase.dmp" << std::endl;
+// //std::cout << "5 - Dump index node chain" << std::endl;
+ std::cout << "99 - Exit Menu" << std::endl;
+ option = GetOption();
+ switch( option ){
+ case 0: break;
+ case 1: SelectActiveTable(); break;
+ #ifdef XB_MEMO_SUPPORT
+ case 2: DumpDbtHeader(); break;
+ case 3: DumpMemoFreeChain(); break;
+ #endif
+ case 99: break;
+ default: std::cout << "Invalid option" << std::endl; break;
+ }
+ }
+}
+#endif // XBASE_DEBUG
+/************************************************************************/
+void xbUtil::FieldMenu()
+{
+ int option = 0;
+
+ while( option != 99 ) {
+ std::cout << std::endl << std::endl << " 5 - Field Menu" << std::endl;
+ std::cout << " --------------" << std::endl;
+ DisplayActiveTable();
+ std::cout << " 1 - Select Active Table" << std::endl;
+ std::cout << " 2 - List Field Info" << std::endl;
+ std::cout << " 3 - Show Field Data (non memo field)" << std::endl;
+ std::cout << " 4 - Update Field Data" << std::endl;
+ #ifdef XB_MEMO_SUPPORT
+ std::cout << " 5 - Show Memo Field Data" << std::endl;
+ std::cout << " 6 - Update Memo Field" << std::endl;
+ std::cout << " 7 - Delete Memo Field" << std::endl;
+ #endif
+
+ std::cout << "99 - Exit Menu" << std::endl;
+ option = GetOption();
+ switch( option ){
+ case 0: break;
+ case 1: SelectActiveTable(); break;
+ case 2: ListFieldInfo(); break;
+ case 3: DumpRecord(); break;
+ case 4: UpdateFieldData(); break;
+ #ifdef XB_MEMO_SUPPORT
+ case 5: ShowMemoFieldData(); break;
+ case 6: UpdateMemoFieldData(); break;
+ case 7: DeleteMemoField(); break;
+ #endif
+ case 99: break;
+ default: std::cout << "Invalid option" << std::endl; break;
+ }
+ }
+}
+/************************************************************************/
+void xbUtil::RecordMenu()
+{
+ int option = 0;
+ while( option != 99 ) {
+ std::cout << std::endl << std::endl << " 4 - Record Menu" << std::endl;
+ std::cout << " ---------------" << std::endl;
+ DisplayActiveTable();
+ std::cout << " 1 - Select Active Table" << std::endl;
+ std::cout << " 2 - Get Record" << std::endl;
+ std::cout << " 3 - Blank Record" << std::endl;
+ std::cout << " 4 - Append Record" << std::endl;
+ std::cout << " 5 - Put Record" << std::endl;
+ std::cout << " 6 - Delete Record" << std::endl;
+ std::cout << " 7 - Undelete Record" << std::endl;
+ std::cout << " 8 - First Record" << std::endl;
+ std::cout << " 9 - Next Record" << std::endl;
+ std::cout << "10 - Prev Record" << std::endl;
+ std::cout << "11 - Last Record" << std::endl;
+ std::cout << "12 - Dump Record" << std::endl;
+ std::cout << "13 - Abort Record Updates" << std::endl;
+ std::cout << "14 - Commit Record Updates" << std::endl;
+
+ #ifdef XB_FILTER_SUPPORT
+ std::cout << "20 - Set Filter" << std::endl;
+ std::cout << "21 - Get First Filter Rec" << std::endl;
+ std::cout << "22 - Get Next Filter Rec" << std::endl;
+ std::cout << "23 - Get Prev Filter Rec" << std::endl;
+ std::cout << "24 - Get Last Filter Rec" << std::endl;
+ #endif // XB_FILTER_SUPPORT
+
+ std::cout << "99 - Exit Menu" << std::endl;
+ option = GetOption();
+
+ switch( option ){
+ case 0: break;
+ case 1: SelectActiveTable(); break;
+ case 2: GetRecord(); break;
+ case 3: BlankRecord(); break;
+ case 4: AppendRecord(); break;
+ case 5: PutRecord(); break;
+ case 6: DeleteRecord(); break;
+ case 7: UndeleteRecord(); break;
+ case 8: GetFirstRecord(); break;
+ case 9: GetNextRecord(); break;
+ case 10: GetPrevRecord(); break;
+ case 11: GetLastRecord(); break;
+ case 12: DumpRecord(); break;
+ case 13: AbortRecord(); break;
+ case 14: CommitRecord(); break;
+
+ #ifdef XB_FILTER_SUPPORT
+ case 20: SetFilter(); break;
+ case 21: GetFirstFilterRec(); break;
+ case 22: GetNextFilterRec(); break;
+ case 23: GetPrevFilterRec(); break;
+ case 24: GetLastFilterRec(); break;
+ #endif // XB_FILTER_SUPPORT
+
+ case 99: break;
+ default: std::cout << "Invalid option" << std::endl; break;
+ }
+ }
+}
+
+/************************************************************************/
+void xbUtil::FileMenu()
+{
+ int option = 0;
+
+ while( option != 99 ) {
+ std::cout << std::endl << std::endl << " 3 - File / Table Menu" << std::endl;
+ std::cout << " ---------------------" << std::endl;
+ DisplayActiveTable();
+ std::cout << " 1 - List files in Default Data Directory" << std::endl;
+ std::cout << " 2 - Update Default Data Directory" << std::endl;
+ std::cout << " 3 - List Open Tables/Files" << std::endl;
+ std::cout << " 4 - Open Table/File" << std::endl;
+ std::cout << " 5 - Close Table/File" << std::endl;
+ std::cout << " 6 - Close All Tables/Files" << std::endl;
+ std::cout << " 7 - Select Active Table" << std::endl;
+ std::cout << " 8 - Table/File Information" << std::endl;
+ std::cout << "10 - Pack" << std::endl;
+ std::cout << "11 - Zap Database" << std::endl;
+ std::cout << "12 - Copy Dbf Structure" << std::endl;
+ std::cout << "13 - Update Table Auto Commit Setting" << std::endl;
+ std::cout << "14 - Display Table Info" << std::endl;
+
+ std::cout << "99 - Exit Menu" << std::endl;
+ option = GetOption();
+
+ switch( option ){
+ case 0: break;
+ case 1: ListFilesInDataDirectory(); break;
+ case 2: UpdateDataDirectory(); break;
+ case 3: x.DisplayTableList(); break;
+ case 4: Open(); break;
+ case 5: Close(); break;
+ case 6: CloseAllTables(); break;
+ case 7: SelectActiveTable(); break;
+ case 8: DisplayTableStats(); break;
+ case 10: Pack(); break;
+ case 11: ZapTable(); break;
+ case 12: CopyDbfStructure(); break;
+ case 13: UpdateTableAutoCommit(); break;
+ case 14: DisplayTableInfo(); break;
+ case 99: break;
+
+ default: std::cout << "Invalid Option" << std::endl;
+ }
+ }
+}
+
+/************************************************************************/
+#ifdef XB_NDXINF_SUPPORT
+void xbUtil::InfFileMenu()
+{
+
+
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "No table selected" << std::endl;
+ return;
+ }
+
+ int option = 0;
+ while( option != 99 ) {
+ std::cout << std::endl << std::endl << " 11 - InfFileData Menu" << std::endl;
+ std::cout << " ---------------------" << std::endl;
+ DisplayActiveTable();
+ std::cout << " 1 - List Inf Contents" << std::endl;
+ std::cout << " 2 - Add NDX File association to [" << dActiveTable->GetTblAlias().Str() << "]" << std::endl;
+ std::cout << " 3 - Delete NDX File association from [" << dActiveTable->GetTblAlias().Str() << "]" << std::endl;
+ std::cout << "10 - Inf File Help" << std::endl;
+ std::cout << "99 - Exit Menu" << std::endl;
+ option = GetOption();
+
+ switch( option ){
+ case 0: break;
+ case 1: ListInfFileData(); break;
+ case 2: AddInfFileData(); break;
+ case 3: DeleteInfFileData(); break;
+ case 10: InfFileHelp(); break;
+ case 99: break;
+ default: std::cout << "Invalid Option" << std::endl;
+ }
+ }
+}
+#endif // XB_NDXINF_SUPPORT
+
+/************************************************************************************/
+void xbUtil::SystemMenu()
+{
+ int option = 0;
+ while( option != 99 ) {
+ std::cout << std::endl << std::endl << " 2 - System Menu" << std::endl;
+ std::cout << " ---------------" << std::endl;
+ DisplayActiveTable();
+ std::cout << " 1 - Display System Settings" << std::endl;
+ std::cout << " 2 - Update Default Data Directory" << std::endl;
+
+ std::cout << " 3 - Toggle Default Auto Commit" << std::endl;
+ std::cout << " 4 - Update Default Log Directory" << std::endl;
+ std::cout << " 5 - Update Default Log File Name" << std::endl;
+ std::cout << " 6 - Toggle Logging Status" << std::endl;
+ std::cout << " 7 - Write Test Log Message" << std::endl;
+ #ifdef XB_LOCKING_SUPPORT
+ std::cout << " 8 - Update Default Lock Retries" << std::endl;
+ std::cout << " 9 - Toggle Default Auto Lock" << std::endl;
+ //std::cout << "10 - Update Lock Flavor" << std::endl; 3/20/17, only one flavor working
+ std::cout << "11 - Update Default Lock Wait Time" << std::endl;
+ std::cout << "12 - Toggle Multi User Mode" << std::endl;
+ #endif
+
+ std::cout << "99 - Exit Menu" << std::endl;
+ option = GetOption();
+
+ switch( option ) {
+ case 0: break;
+ case 1: ListSystemSettings(); break;
+ case 2: UpdateDataDirectory(); break;
+ case 3: ToggleDefaultAutoCommit(); break;
+ case 4: UpdateLogDirectory(); break;
+ case 5: UpdateLogFileName(); break;
+ case 6: ToggleLoggingStatus(); break;
+ case 7: WriteLogMessage(); break;
+ #ifdef XB_LOCKING_SUPPORT
+ case 8: UpdateDefaultLockRetries(); break;
+ case 9: ToggleDefaultAutoLock(); break;
+ case 10: UpdateDefaultLockFlavor(); break;
+ case 11: UpdateDefaultLockWait(); break;
+ case 12: ToggleMultiUserMode(); break;
+ #endif
+
+ case 99: break;
+ default: std::cout << "Invalid Option" << std::endl;
+ }
+ }
+}
+/************************************************************************************/
+void xbUtil::MainMenu()
+{
+ int option = 0;
+ std::cout << std::endl<< std::endl << "XBase64 Utility Program";
+ DisplayActiveTable();
+ while( option != 99 ) {
+ std::cout << std::endl << std::endl << " 0 - Main Menu" << std::endl;
+ std::cout << " -------------" << std::endl;
+ std::cout << " 1 - Help" << std::endl;
+ std::cout << " 2 - System Menu" << std::endl;
+ std::cout << " 3 - File / Table Menu" << std::endl;
+ std::cout << " 4 - Record Menu" << std::endl;
+ std::cout << " 5 - Field Menu" << std::endl;
+ //std::cout << " 6 - Index Menu" << std::endl;
+ #ifdef XB_LOCKING_SUPPORT
+ std::cout << " 6 - Locking Menu" << std::endl;
+ #endif
+ #ifdef XB_EXPRESSION_SUPPORT
+ std::cout << " 7 - Expression Menu" << std::endl;
+ #endif
+ #ifdef XB_INDEX_SUPPORT
+ std::cout << " 8 - Index Menu" << std::endl;
+ #endif
+
+ #ifdef XB_FILTERS
+ std::cout << " 9 - Filter Menu" << std::endl;
+ #endif
+
+ #ifdef XB_SQL_SUPPORT
+ std::cout << "10 - SQL Menu" << std::endl;
+ #endif // XB_SQL_SUPPORT
+
+ #ifdef XB_NDXINF_SUPPORT
+ std::cout << "11 - INF File Menu" << std::endl;
+ #endif // XB_NDXINF_SUPPORT
+
+ #ifdef XB_DEBUG_SUPPORT
+ std::cout << "20 - Debug Menu" << std::endl;
+ #endif
+
+ std::cout << "99 - Exit" << std::endl;
+ option = GetOption();
+ switch( option ){
+ case 0: break;
+ case 2: SystemMenu(); break;
+ case 3: FileMenu(); break;
+ case 4: RecordMenu(); break;
+ case 5: FieldMenu(); break;
+
+ #ifdef XB_LOCKING_SUPPORT
+ case 6: LockingMenu(); break;
+ #endif
+
+ #ifdef XB_EXPRESSION_SUPPORT
+ case 7: ExpressionMenu(); break;
+ #endif
+
+ #ifdef XB_INDEX_SUPPORT
+ case 8: IndexMenu(); break;
+ #endif
+
+ #ifdef XB_FILTERS
+ case 9: FilterMenu(); break;
+ #endif
+
+ #ifdef XB_SQL_SUPPORT
+ case 10: SqlMenu(); break;
+ #endif
+
+ #ifdef XB_NDXINF_SUPPORT
+ case 11: InfFileMenu(); break;
+ #endif
+
+ #ifdef XB_DEBUG_SUPPORT
+ case 20: DebugMenu(); break;
+ #endif
+
+ case 99: std::cout << "Bye!! - Thanks for using XBase64" << std::endl; break;
+ default:
+ std::cout << option << " - Invalid function" << std::endl;
+ break;
+ }
+ }
+}
+/*************************************************************************************/
+#ifdef XB_INDEX_SUPPORT
+void xbUtil::DisplayOpenIndexFiles(){
+
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ // if not active indices, display no open NDX indices
+ xbInt32 lIxCnt = dActiveTable->GetPhysicalIxCnt();
+ if( lIxCnt == 0 ){
+ std::cout << "No open index files for table" << std::endl;
+ return;
+ } else {
+ std::cout << " Open Index Files = [" << lIxCnt << "]" << std::endl;
+ std::cout << " FileName\tFile Type\n";
+ std::cout << " ========\t=========\n";
+ }
+ // For each active index
+ // display File Name, Type, Key
+ xbIxList *p = dActiveTable->GetIxList();
+ xbIx *ixp;
+ while( p ){
+ ixp = p->ix;
+ std::cout << " " << ixp->GetFileName().Str() << "\t" << p->sFmt->Str() << std::endl;
+ p = p->next;
+ }
+}
+
+void xbUtil::DisplaySupportedIndexTypes(){
+
+ std::cout << "Supported Index Type" << std::endl;
+ std::cout << "Type MaxTags Asc/Dsc Filters Description" << std::endl;
+ std::cout << "---- ------- -------- ------- --------------------------------" << std::endl;
+ #ifdef XB_NDX_SUPPORT
+ std::cout << "NDX 1 ASC No Dbase III single tag index file" << std::endl;
+ #endif
+ #ifdef XB_MDX_SUPPORT
+ std::cout << "MDX 47 ASC/DSC Yes Dbase IV multiple tag index file" << std::endl;
+ #endif
+}
+
+void xbUtil::SelectTag(){
+ std::cout << "SelectTag" << std::endl;
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+
+ xbLinkListNode<xbTag *> *llN = dActiveTable->GetTagList();
+ xbTag *pTag;
+ xbInt16 i = 1;
+ std::cout << "Line\tType\tUnique\tSort\tName\t\tKey Expression\t\tFilter" << std::endl;
+
+ char cUnique;
+ char cSort;
+ xbString s;
+ while( llN ){
+ pTag = llN->GetKey();
+ pTag->GetUnique() ? cUnique = 'Y' : cUnique = 'N';
+ pTag->GetSort() ? cSort = 'D' : cSort = 'A';
+ s.Sprintf( "%d\t%s\t%c\t%c\t%-12s\t%-20s\t%s \n", i++, pTag->GetType().Str(), cUnique, cSort, pTag->GetTagName().Str(), pTag->GetExpression().Str(), pTag->GetFilter().Str() );
+ std::cout << s.Str();
+// std::cout << i++ << "\t" << pTag->GetType() << "\t " << cUnique << "\t " << cSort << "\t" << pTag->GetTagName() << "\t" << pTag->GetExpression() << "\t" << pTag->GetFilter() << std::endl;
+ llN = llN->GetNextNode();
+ }
+ char cBuf[128];
+ std::cout << std::endl << "Enter Line No:" << std::endl;
+ std::cin.getline( cBuf, 128 );
+
+ xbInt32 iSelection = atol( cBuf );
+ if( iSelection < 1 || iSelection > i ){
+ std::cout << "Invalid selection [" << iSelection << "]" << std::endl;
+ } else {
+ llN = dActiveTable->GetTagList();
+ i = 1;
+ for( i = 1; i < iSelection; i++ )
+ llN = llN->GetNextNode();
+ pTag = llN->GetKey();
+ dActiveTable->SetCurTag( pTag->GetType(), pTag->GetIx(), pTag->GetVpTag() );
+ }
+}
+
+void xbUtil::OpenIndex(){
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+
+ char cBuf[128];
+ std::cout << "Enter index type (NDX or MDX)" << std::endl;
+ std::cin.getline( cBuf, 128 );
+ xbString sIxType = cBuf;
+
+ std::cout << "Enter File Name" << std::endl;
+ std::cin.getline( cBuf, 128 );
+ xbString sIxFileName = cBuf;
+
+ iRc = dActiveTable->OpenIndex( sIxType, sIxFileName );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::CloseIndexFile(){
+
+ std::cout << "CloseIndex\n";
+
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+
+ xbInt16 iRc = dActiveTable->CloseIndexFile( pIx );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::CreateIndexTag(){
+
+ std::cout << "CreateIndexTag\n";
+
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+
+ char cBuf[512];
+ xbString sPrompt = "Enter Index Type (";
+ #ifdef XB_NDX_SUPPORT
+ sPrompt += "NDX";
+ #endif // XB_NDX_SUPPORT
+ #ifdef XB_MDX_SUPPORT
+ sPrompt += " MDX";
+ #endif // XB_MDX_SUPPORT
+ sPrompt += "):";
+ std::cout << sPrompt.Str() << std::endl;
+
+ std::cin.getline( cBuf, 128 );
+ xbString sIxType = cBuf;
+
+ if( sIxType == "NDX" )
+ std::cout << "Enter File Name" << std::endl;
+ else if( sIxType == "MDX" )
+ std::cout << "Enter Tag Name" << std::endl;
+
+ std::cin.getline( cBuf, 128 );
+ xbString sIxName = cBuf;
+
+ if( sIxType != "NDX" && sIxType != "MDX" ){
+ std::cout << "Invalid tag type" << std::endl;
+ return;
+ }
+
+ xbString s;
+ if( sIxType == "NDX" ){
+ s = sIxName;
+ s.ToUpperCase();
+ xbUInt32 lPos = s.Pos( ".NDX" );
+ if( lPos == 0 )
+ sIxName += ".NDX";
+ }
+ if( sIxType == "MDX" ){
+ if( sIxName.Len() > 12 ){
+ std::cout << "Tag name [" << sIxName.Str() << "] to long. Must be 12 bytes or less" << std::endl;
+ return;
+ }
+ }
+
+ xbInt16 iDescending = 0;
+ xbInt16 iUnique = 0;
+
+ std::cout << "Enter Key Expression:" << std::endl;
+ std::cin.getline( cBuf, 512 );
+ xbString sKeyExpression = cBuf;
+
+ xbString sFilter;
+ if( sIxType == "MDX" ){
+ std::cout << "Enter Filter (or enter for none):" << std::endl;
+ std::cin.getline( cBuf, 512 );
+ sFilter = cBuf;
+
+ std::cout << "Descending? (Enter Y for yes):" << std::endl;
+ std::cin.getline( cBuf, 12 );
+ if( cBuf[0] == 'Y' )
+ iDescending = 1;
+ }
+
+ std::cout << "Unique Keys? (Enter Y for yes):" << std::endl;
+ std::cin.getline( cBuf, 12 );
+ if( cBuf[0] == 'Y' )
+ iUnique = 1;
+
+ xbIx *pIx;
+ void *vpTag;
+
+ xbInt16 iRc = dActiveTable->CreateTag( sIxType, sIxName, sKeyExpression, sFilter, iDescending, iUnique, 0, &pIx, &vpTag );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::GetFirstKey(){
+ std::cout << "GetFirstKey\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ void *vpCurTag = dActiveTable->GetCurTag();
+ xbInt16 iRc = pIx->GetFirstKey( vpCurTag, 1 );
+ if( iRc == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+
+void xbUtil::GetNextKey(){
+ std::cout << "GetNextKey\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ void *vpCurTag = dActiveTable->GetCurTag();
+ xbInt16 iRc = pIx->GetNextKey( vpCurTag, 1 );
+ if( iRc == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+
+void xbUtil::GetPrevKey(){
+ std::cout << "GetPrevKey\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ void *vpCurTag = dActiveTable->GetCurTag();
+ xbInt16 iRc = pIx->GetPrevKey( vpCurTag, 1 );
+ if( iRc == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+
+void xbUtil::GetLastKey(){
+ std::cout << "GetLastKey\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "Table selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ void *vpCurTag = dActiveTable->GetCurTag();
+ xbInt16 iRc = pIx->GetLastKey( vpCurTag, 1 );
+ if( iRc == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+
+void xbUtil::FindKey(){
+ std::cout << "FindKey\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ void *vpCurTag = dActiveTable->GetCurTag();
+ char cKeyType = pIx->GetKeyType( vpCurTag );
+
+ switch( cKeyType ){
+ case 'C':
+ std::cout << "Enter character key value:";
+ break;
+ case 'F':
+ case 'N':
+ std::cout << "Enter numeric key value:";
+ break;
+ case 'D':
+ std::cout << "Enter date (YYYYMMDD) key value:";
+ break;
+ default:
+ std::cout << "Unknown key type [" << cKeyType << "]" << std::endl;
+ return;
+ break;
+ }
+
+ char cBuf[128];
+ std::cin.getline( cBuf, 128 );
+ xbInt16 iRc = 0;
+
+ if( cKeyType == 'C' ){
+ iRc = pIx->FindKey( vpCurTag, cBuf, (xbInt32) strlen( cBuf ), 1 );
+
+ } else if( cKeyType == 'F' || cKeyType == 'N' ){
+ xbDouble d = atof( cBuf );
+ iRc = pIx->FindKey( vpCurTag, d, 1 );
+
+ } else if( cKeyType == 'D' ){
+ xbDate dt( cBuf );
+ iRc = pIx->FindKey( vpCurTag, dt, 1 );
+ }
+
+ if( iRc == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+
+void xbUtil::CheckIntegrity(){
+ std::cout << "CheckIntegrity\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ void *vpCurTag = dActiveTable->GetCurTag();
+
+ xbInt16 iRc = pIx->CheckTagIntegrity( vpCurTag, 2 );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::Reindex(){
+ std::cout << "Reindex\n";
+
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ void *vpCurTag = dActiveTable->GetCurTag();
+ xbInt16 iRc = pIx->Reindex( &vpCurTag );
+ x.DisplayError( iRc );
+}
+
+void xbUtil::DeleteTag(){
+ std::cout << "DeleteTag\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ void *vpCurTag = dActiveTable->GetCurTag();
+ xbInt16 iRc = dActiveTable->DeleteTag( dActiveTable->GetCurIxType(), pIx->GetTagName( vpCurTag ));
+ x.DisplayError( iRc );
+}
+
+void xbUtil::AssociateNonProdIx(){
+ std::cout << "See InfFile menu option, option 11 from the main menu or =11 from here\n";
+}
+
+#ifdef XB_DEBUG_SUPPORT
+
+void xbUtil::DumpRecsByIx( xbInt16 iOpt ){
+ // iDirection = 0 - Forward - MDX
+ // = 1 - Reverse - MDX
+
+ std::cout << "DumpRecsByIx\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ std::cout << "Select destination:" << std::endl;
+ std::cout << "0 - Logfile" << std::endl;
+ std::cout << "1 - Screen" << std::endl;
+ std::cout << "2 - Both" << std::endl;
+ xbInt16 iDispOpt = GetOption();
+ std::cout << "Select format:" << std::endl;
+ std::cout << "0 - With Field Names" << std::endl;
+ std::cout << "1 - 1 line per record" << std::endl;
+ xbInt16 iDispFmt = GetOption();
+
+ x.WriteLogMessage( "--------- Dump Recs By Index -------------", iDispOpt );
+ void *vpCurTag = dActiveTable->GetCurTag();
+ xbUInt32 lRecCnt = 0;
+ xbInt16 iRc = 0;
+
+ if( iOpt == 0 ){
+ iRc = pIx->GetFirstKey( vpCurTag, 1 );
+ if( iRc == XB_NO_ERROR ){
+ lRecCnt++;
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), iDispOpt, iDispFmt );
+ while(( iRc = pIx->GetNextKey( vpCurTag, 1 )) == XB_NO_ERROR ){
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), iDispOpt, iDispFmt );
+ lRecCnt++;
+ }
+ } else {
+ x.DisplayError( iRc );
+ }
+ } else if( iOpt == 1 ) {
+ iRc = pIx->GetLastKey( vpCurTag, 1 );
+ if( iRc == XB_NO_ERROR ){
+ lRecCnt++;
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), iDispOpt, iDispFmt );
+ while(( iRc = pIx->GetPrevKey( vpCurTag, 1 )) == XB_NO_ERROR ){
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), iDispOpt, iDispFmt );
+ lRecCnt++;
+ }
+ }
+ } else {
+ std::cout << "Invalid option " << iOpt << std::endl;
+ return;
+ }
+ std::cout << lRecCnt << " record(s) dumped" << std::endl;
+}
+
+void xbUtil::DumpIxHeader(){
+ std::cout << "DumpIxHeader\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ std::cout << "0 - Logfile" << std::endl;
+ std::cout << "1 - Screen" << std::endl;
+ std::cout << "2 - Both" << std::endl;
+ xbInt16 iDispOpt = GetOption();
+ pIx->DumpHeader( iDispOpt, 3 );
+
+}
+
+void xbUtil::DumpIxNode(){
+ std::cout << "DumpIxNode\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ std::cout << "0 - Logfile" << std::endl;
+ std::cout << "1 - Screen" << std::endl;
+ std::cout << "2 - Both" << std::endl;
+ xbInt16 iDispOpt = GetOption();
+// std::cout << std::endl << "0 - All Blocks" << std::endl;
+// std::cout << "NNN - Specific block number, 0=All" << std::endl;
+// xbUInt32 iBlockOpt = (xbUInt32) GetOption();
+// if( iBlockOpt == 0 ) // dump the header if dumping all blocks
+ // pIx->DumpHeader( iDispOpt );
+ pIx->DumpTagBlocks( iDispOpt, dActiveTable->GetCurTag() );
+}
+
+void xbUtil::DumpIxNodeChain(){
+
+ std::cout << "DumpIxNodeChain\n";
+
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+
+ std::cout << "0 - Logfile" << std::endl;
+ std::cout << "1 - Screen" << std::endl;
+ std::cout << "2 - Both" << std::endl;
+ xbInt16 iDispOpt = GetOption();
+
+ void *vpCurTag = dActiveTable->GetCurTag();
+ pIx->DumpIxNodeChain( vpCurTag, iDispOpt );
+}
+
+
+void xbUtil::DumpFreeBlocks(){
+ std::cout << "Dump ulBlock2 - (Free Block or Split From Page) for MDX Index file\n";
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbIx *pIx = dActiveTable->GetCurIx();
+ if( !pIx )
+ SelectTag();
+ pIx = dActiveTable->GetCurIx();
+ if( !pIx ){
+ std::cout << "Tag not selected" << std::endl;
+ return;
+ }
+ std::cout << "0 - Logfile" << std::endl;
+ std::cout << "1 - Screen" << std::endl;
+ std::cout << "2 - Both" << std::endl;
+ xbInt16 iDispOpt = GetOption();
+ pIx->DumpFreeBlocks( iDispOpt );
+
+}
+
+
+
+#endif // XB_DEBUG_SUPPORT
+#endif // XB_INDEX_SUPPORT
+
+#ifdef XB_FILTER_SUPPORT
+void xbUtil::SetFilter()
+{
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+
+ char cBuf[128];
+ std::cout << "Enter filter expression:" << std::endl;
+ std::cin.getline( cBuf, 128 );
+ xbString s( cBuf );
+
+ if( filt )
+ delete filt;
+
+ filt = new xbFilter( &x, dActiveTable );
+ xbInt16 iRc = filt->Set( s );
+
+ x.DisplayError( iRc );
+}
+
+void xbUtil::GetFirstFilterRec()
+{
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+
+ xbInt16 iRc;
+ if(( iRc = filt->GetFirstRecord()) == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+
+void xbUtil::GetNextFilterRec()
+{
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+ if(( iRc = filt->GetNextRecord()) == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+
+void xbUtil::GetPrevFilterRec()
+{
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+ if(( iRc = filt->GetPrevRecord()) == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+
+void xbUtil::GetLastFilterRec()
+{
+ // verify active table selected, if not, select one
+ if( !dActiveTable )
+ dActiveTable = GetTablePtr( " - select table" );
+
+ if( !dActiveTable ){
+ std::cout << "Table not selected" << std::endl;
+ return;
+ }
+ xbInt16 iRc;
+ if(( iRc = filt->GetLastRecord()) == XB_NO_ERROR )
+ dActiveTable->DumpRecord( dActiveTable->GetCurRecNo(), 2);
+ else
+ x.DisplayError( iRc );
+}
+#endif // XB_FILTER_SUPPORT
+
+///@endcond DOXYOFF
+
+/*************************************************************************************/
+int main(int, char**)
+{
+ std::cout << "xb_dbfutil initializing" << std::endl;
+ xbUtil u;
+ u.MainMenu();
+ return 0;
+}
diff --git a/src/utils/xb_deletall.cpp b/src/utils/xb_deletall.cpp
new file mode 100755
index 0000000..720710f
--- /dev/null
+++ b/src/utils/xb_deletall.cpp
@@ -0,0 +1,55 @@
+/* xb_deletall.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2017,2019 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+
+
+This program sets the delete flag on all records in a dbf file
+
+*/
+
+
+#include <xbase.h>
+
+
+using namespace xb;
+
+int main(int ac,char** av)
+{
+ xbXBase x;
+ xbDbf *MyFile = NULL;
+ xbFile f( &x );
+ xbInt16 iRc = 0;
+
+ if (ac <= 1) {
+ std::cout << "\nUsage: xb_deletall filename...\n";
+ return 1;
+ }
+
+ if(( iRc = x.OpenHighestVersion( av[1], "", &MyFile )) != XB_NO_ERROR ){
+ std::cout << "Could not open file iRc = " << iRc << " file = " << av[1] << std::endl;
+ x.DisplayError( iRc );
+ return 0;
+ }
+
+ iRc = MyFile->DeleteAllRecords();
+ if( iRc != XB_NO_ERROR ) {
+ std::cout << "Error Deleting all records - database ==> " << av[1] << "\n";
+ std::cout << " Return Code = " << iRc;
+ }
+ MyFile->Close();
+ std::cout << "\nDone...\n\n";
+
+ return 0;
+
+} \ No newline at end of file
diff --git a/src/utils/xb_dumpdbt.cpp b/src/utils/xb_dumpdbt.cpp
new file mode 100755
index 0000000..bc95ab7
--- /dev/null
+++ b/src/utils/xb_dumpdbt.cpp
@@ -0,0 +1,87 @@
+/* xb_dumpdbt.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2017 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+
+#include <xbase.h>
+
+using namespace xb;
+
+int main( int ac, char **av )
+{
+
+
+#ifdef XB_MEMO_SUPPORT
+ xbXBase x;
+
+ xbInt16 iRc;
+ char cFieldType;
+ xbDbf *MyFile = NULL;
+ xbUInt32 ulMemoFieldLen;
+ xbString sFldName;
+ xbInt32 lBlockPtr;
+ xbString sMemoFldData;
+
+ if( ac <= 1 ){
+ std::cout << "\nUsage: dumpdbt filename...\n";
+ return 1;
+ }
+
+ if(( iRc = x.OpenHighestVersion( av[1], "", &MyFile )) != XB_NO_ERROR ){
+ std::cout << "Could not open file iRc = " << iRc << " file = " << av[1] << std::endl;
+ x.DisplayError( iRc );
+ return 0;
+ }
+
+ if( MyFile->GetMemoFieldCnt() == 0 ) {
+ std::cout << "No memo fields exist in " << av[1] << std::endl;
+ } else {
+
+ xbUInt32 ulRecCnt = 0;
+ iRc = MyFile->GetRecordCnt( ulRecCnt );
+
+ for( xbUInt32 ul = 1; ul <= ulRecCnt; ul++ ){
+ MyFile->GetRecord( ul );
+ std::cout << "\nRecord # " << MyFile->GetCurRecNo();
+ if( MyFile->RecordDeleted())
+ std::cout << " (deleted) ";
+
+ for( int j = 0; j < MyFile->GetFieldCnt(); j++ ) {
+ MyFile->GetFieldType( j, cFieldType );
+
+ if( cFieldType == 'M' ) {
+ MyFile->GetMemoFieldLen( j, ulMemoFieldLen );
+ MyFile->GetFieldName( j, sFldName );
+ MyFile->GetLongField( j, lBlockPtr );
+ std::cout << "\nMemo field [" << sFldName.Str()
+ << "] length = [" << ulMemoFieldLen;
+ std::cout << "] Head Block = [" << lBlockPtr << "]\n";
+
+ MyFile->GetMemoField( j, sMemoFldData );
+ std::cout << sMemoFldData.Str() << "\n";
+ }
+ }
+ }
+ std::cout << "\n";
+ MyFile->Close();
+ delete MyFile;
+ }
+
+#else
+ std::cout << "\nXB_MEMO_SUPPORT is OFF\n";
+#endif
+
+ return 0;
+}
diff --git a/src/utils/xb_dumphdr.cpp b/src/utils/xb_dumphdr.cpp
new file mode 100755
index 0000000..267f4c5
--- /dev/null
+++ b/src/utils/xb_dumphdr.cpp
@@ -0,0 +1,45 @@
+/* xb_dumphdr.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+
+#include <xbase.h>
+
+using namespace xb;
+
+int main( int ac, char ** av ){
+
+
+ xbInt16 iRc;
+ xbXBase x;
+ xbDbf *MyFile = NULL;
+
+ if( ac <= 1 ) {
+ std::cout << "\nUsage: xb_dumphdr filename...\n";
+ return 1;
+ }
+
+ if(( iRc = x.OpenHighestVersion( av[1], "", &MyFile )) != XB_NO_ERROR ){
+ std::cout << "Could not open file iRc = " << iRc << " file = " << av[1] << std::endl;
+ x.DisplayError( iRc );
+ return 0;
+ }
+
+ MyFile->DumpHeader( 4 );
+ MyFile->Close();
+ delete MyFile;
+
+ return 0;
+}
diff --git a/src/utils/xb_dumpix.cpp b/src/utils/xb_dumpix.cpp
new file mode 100755
index 0000000..afd8764
--- /dev/null
+++ b/src/utils/xb_dumpix.cpp
@@ -0,0 +1,56 @@
+/* xb_dumpix.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+
+// This program dumps an index file's internal data blocks.
+// This program is for index development and debugging purposes
+
+
+#include <xbase.h>
+
+using namespace xb;
+
+int main( int ac, char ** av ){
+
+
+ xbInt16 iRc;
+ xbXBase x;
+ xbDbf *MyFile = NULL;
+ x.EnableMsgLogging();
+ x.SetLogSize( 1000000L );
+
+ if( ac <= 1 ) {
+ std::cout << "\nUsage: xb_dumphdr filename...\n";
+ return 1;
+ }
+ if(( iRc = x.OpenHighestVersion( av[1], "", &MyFile )) != XB_NO_ERROR ){
+ std::cout << "Could not open file iRc = " << iRc << " file = " << av[1] << std::endl;
+ x.DisplayError( iRc );
+ return 0;
+ }
+ xbIx *pIx = MyFile->GetCurIx();
+ if( pIx ){
+ // pIx->DumpHeader( 2, 3 );
+ pIx->DumpTagBlocks( 2 );
+ } else {
+ std::cout << av[1] << "No current index found" << std::endl;
+ }
+
+ MyFile->Close();
+ delete MyFile;
+
+ return 0;
+}
diff --git a/src/utils/xb_dumprecs.cpp b/src/utils/xb_dumprecs.cpp
new file mode 100755
index 0000000..0a85f45
--- /dev/null
+++ b/src/utils/xb_dumprecs.cpp
@@ -0,0 +1,62 @@
+/* xb_dumprecs.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2019 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+#include <xbase.h>
+using namespace xb;
+
+int main(int ac,char** av)
+{
+ xbXBase x;
+ xbInt16 iRc;
+ x.EnableMsgLogging();
+ x.SetLogSize( 1000000L );
+// xbUInt32 ulRecCnt = 0;
+
+ if (ac <= 1) {
+ std::cout << "Usage: xb_dumprecs filename..." << std::endl;
+ return 1;
+ }
+
+ xbDbf *MyFile = NULL;
+ if(( iRc = x.OpenHighestVersion( av[1], "", &MyFile )) != XB_NO_ERROR ){
+ std::cout << "Could not open file iRc = " << iRc << " file = " << av[1] << std::endl;
+ x.DisplayError( iRc );
+ return 0;
+ }
+
+// std::cout << "Processing file sequentially from beginning..." << std::endl;
+
+ xbUInt32 j = 0;
+ xbUInt32 ulRecCnt = 0;
+
+ iRc = MyFile->GetRecordCnt( ulRecCnt );
+
+ if( iRc < XB_NO_ERROR )
+ return iRc;
+ while( j < ulRecCnt ){
+ if( j == 0 )
+ iRc = MyFile->DumpRecord(++j, 2, 2 );
+ else
+ iRc = MyFile->DumpRecord(++j, 2, 1 );
+ if( iRc != XB_NO_ERROR ){
+ x.DisplayError( iRc );
+ return 1;
+ }
+ }
+// std::cout << j << " Records written to logile" << std::endl;
+ MyFile->Close();
+ return 0;
+}
diff --git a/src/utils/xb_execsql.cpp b/src/utils/xb_execsql.cpp
new file mode 100755
index 0000000..d474593
--- /dev/null
+++ b/src/utils/xb_execsql.cpp
@@ -0,0 +1,95 @@
+/* xb_execsql.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+#include <xbase.h>
+
+using namespace xb;
+
+xbInt16 GetNextSqlCmd( xbFile &f, xbString &sCmd );
+xbInt16 GetNextSqlCmd( xbFile &f, xbString &sCmd )
+{
+ sCmd = "";
+ xbString sLine;
+ xbInt16 iRc = XB_NO_ERROR;
+ xbUInt32 lPos = 0;
+ xbBool bDone = xbFalse;
+ while( !bDone ){
+ if(( iRc = f.xbFgets( 256, sLine )) != XB_NO_ERROR ){
+ bDone = xbTrue;
+ } else {
+
+ // don't need CR/LF chars
+ sLine.ZapChar( 0x0a );
+ sLine.ZapChar( 0x0d );
+
+ // if comment, zap out everything to the right of the hash
+ lPos = sLine.Pos( '#' );
+ if( lPos > 0 )
+ sLine.Left( lPos - 1);
+
+ if( sLine.Pos( ';' ) > 0 ){
+ bDone = xbTrue;
+ sLine.ZapChar( ';' );
+ }
+ }
+ sCmd += sLine;
+ }
+ return iRc;
+}
+
+int main(int ac,char** av)
+{
+
+ if (ac <= 1) {
+ std::cout << "Usage: xb_execsql filename..." << std::endl;
+ return 1;
+ }
+
+ xbXBase x;
+ x.EnableMsgLogging();
+ xbSql sql( &x );
+ xbFile f( sql.GetXbasePtr() );
+ xbInt16 iRc = XB_NO_ERROR;
+ xbString sFileName;
+ xbString sSqlLine;
+
+ sFileName = av[1];
+
+ if(( iRc = f.xbFopen( "r", sFileName, XB_SINGLE_USER )) != XB_NO_ERROR ){
+ xbString sMsg;
+ sMsg.Sprintf( "Error opening [%s]\n", sFileName.Str() );
+ std::cout << sMsg.Str();
+ sql.GetXbasePtr()->DisplayError( iRc );
+ return 1;
+ }
+
+ while( iRc == XB_NO_ERROR ){
+ iRc = GetNextSqlCmd( f, sSqlLine );
+
+ if( iRc == XB_NO_ERROR ){
+
+ sSqlLine.Trim();
+ std::cout << "Processing line [" << sSqlLine.Str() << "]\n";
+ iRc = sql.ExecuteNonQuery( sSqlLine );
+ if( iRc != XB_NO_ERROR )
+ x.DisplayError( iRc );
+ }
+ }
+
+ f.xbFclose();
+ return 0;
+}
+
diff --git a/src/utils/xb_pack.cpp b/src/utils/xb_pack.cpp
new file mode 100755
index 0000000..ba61837
--- /dev/null
+++ b/src/utils/xb_pack.cpp
@@ -0,0 +1,55 @@
+/* xb_pack.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2017 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+#include <xbase.h>
+using namespace xb;
+
+int main(int ac,char** av)
+{
+ if (ac <= 1) {
+ std::cout <<
+ "\nUsage: xb_pack filename...\n"
+ "\nThis program does not automatically reindex any NDX indexes."
+ "\nUse the reindex program to reindex any indexes associated"
+ "\nwith the database, or build your own program which executes "
+ "\nthe Pack() method after opening all the index files "
+ "\nassociated with the database.\n\n";
+ return 1;
+ }
+
+ xbXBase x;
+ xbInt16 iRc;
+ xbDbf * MyFile = NULL;
+ if(( iRc = x.OpenHighestVersion( av[1], "", &MyFile )) != XB_NO_ERROR ){
+ std::cout << "Could not open file iRc = " << iRc << " file = " << av[1] << std::endl;
+ x.DisplayError( iRc );
+ return 0;
+ }
+
+ if(( iRc = MyFile->Pack()) != XB_NO_ERROR ) {
+ std::cout << "\nError packing DBF database ==> " << av[1] << std::endl;
+ std::cout << " Return Code = " << iRc << std::endl;
+ }
+
+ MyFile->Close();
+ delete MyFile;
+
+ std::cout << "\nPack Database complete...\n\n";
+ return 0;
+}
+
+
+
diff --git a/src/utils/xb_tblinfo.cpp b/src/utils/xb_tblinfo.cpp
new file mode 100755
index 0000000..884ce5e
--- /dev/null
+++ b/src/utils/xb_tblinfo.cpp
@@ -0,0 +1,91 @@
+/* xb_dumpmdx.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2021 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+
+#include <xbase.h>
+
+using namespace xb;
+
+int main( int ac, char ** av ){
+
+ xbXBase x;
+ xbBool bHdr = xbFalse;
+ xbBool bMdxFound = xbFalse;
+ xbInt16 iRc;
+ xbString sTagName;
+ xbDbf *MyFile = NULL;
+
+ x.EnableMsgLogging();
+ x.SetLogSize( 1000000L );
+
+
+ if( ac <= 1 ) {
+ std::cout << "\nUsage: xb_dumpmdx filename.DBF -h -tTAGNAME...\n";
+ std::cout << "-h dump mdx file header (default)\n";
+ std::cout << "-tTAGNAME where TAGNAME is the name of a tag for extract\n";
+ return 1;
+ }
+
+ if( ac > 2 ){
+ for( int i = 1; i< ac; i++ ){
+ if( strstr( av[i], "-h" ))
+ bHdr = xbTrue;
+ else if( strstr( av[i], "-t" ))
+ sTagName.Set( av[i]+2 );
+ }
+ }
+
+ if( bHdr == xbFalse && sTagName == "" )
+ bHdr = xbTrue;
+
+
+ // std::cout << "Hdr = " << bHdr << std::endl;
+ if( sTagName != "" )
+ std::cout << "Tag = " << sTagName.Str() << std::endl;
+
+ if(( iRc = x.OpenHighestVersion( av[1], "", &MyFile )) != XB_NO_ERROR ){
+ std::cout << "Could not open file iRc = " << iRc << " file = " << av[1] << std::endl;
+ x.DisplayError( iRc );
+ return 0;
+ }
+ MyFile->DumpHeader( 4 );
+
+ // for each mdx file, dump the header
+ xbIxList *ixl = MyFile->GetIxList();
+ xbIx *ixp;
+ xbString sFileType;
+ while( ixl ){
+ ixp = ixl->ix;
+ ixp->GetFileType( sFileType );
+
+ if( sFileType == "MDX" ){
+ bMdxFound = xbTrue;
+ if( bHdr ){
+ // std::cout << "MDX header\n";
+ ixp->DumpHeader( 1, 3 );
+ }
+ }
+ ixl = ixl->next;
+ }
+
+ if( !bMdxFound )
+ std::cout << "No MDX index for file." << std::endl;
+
+ MyFile->Close();
+ delete MyFile;
+
+ return 0;
+}
diff --git a/src/utils/xb_undelall.cpp b/src/utils/xb_undelall.cpp
new file mode 100755
index 0000000..4f1af12
--- /dev/null
+++ b/src/utils/xb_undelall.cpp
@@ -0,0 +1,55 @@
+/* xb_deletall.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2017 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+
+
+This program sets the delete flag on all records in a dbf file
+
+*/
+
+
+#include <xbase.h>
+
+
+using namespace xb;
+
+int main(int ac,char** av)
+{
+
+ xbXBase x;
+ xbDbf *MyFile = NULL;
+ xbInt16 iRc = 0;
+
+ if (ac <= 1) {
+ std::cout << "\nUsage: xb_deletall filename...\n";
+ return 1;
+ }
+
+ if(( iRc = x.OpenHighestVersion( av[1], "", &MyFile )) != XB_NO_ERROR ){
+ std::cout << "Could not open file iRc = " << iRc << " file = " << av[1] << std::endl;
+ x.DisplayError( iRc );
+ return 0;
+ }
+
+ iRc = MyFile->UndeleteAllRecords();
+ if( iRc != XB_NO_ERROR ) {
+ std::cout << "Error Undeleting all records - database ==> " << av[1] << "\n";
+ std::cout << " Return Code = " << iRc;
+ }
+ MyFile->Close();
+ delete MyFile;
+ std::cout << "\nDone...\n\n";
+
+ return 0;
+} \ No newline at end of file
diff --git a/src/utils/xb_zap.cpp b/src/utils/xb_zap.cpp
new file mode 100755
index 0000000..4660cd8
--- /dev/null
+++ b/src/utils/xb_zap.cpp
@@ -0,0 +1,52 @@
+/* xb_zap.cpp
+
+XBase64 Software Library
+
+Copyright (c) 1997,2003,2014,2017 Gary A Kunkel
+
+The xb64 software library is covered under
+the terms of the GPL Version 3, 2007 license.
+
+Email Contact:
+
+ xb64-devel@lists.sourceforge.net
+ xb64-users@lists.sourceforge.net
+
+*/
+
+#include <xbase.h>
+using namespace xb;
+
+int main(int ac,char** av)
+{
+ if (ac <= 1) {
+ std::cout <<
+ "\nUsage: zap filename...\n"
+ "\nThis program does not automatically reindex any indices."
+ "\nUse the reindex program to reindex any indexes associated"
+ "\nwith the database, or build your own program which executes "
+ "\nthe PackDatabase() method after opening all the index files "
+ "\nassociated with the database.\n\n"
+ ;
+ return 1;
+ }
+
+ xbXBase x;
+ xbInt16 iRc;
+ xbDbf *MyFile = NULL;
+
+ if(( iRc = x.OpenHighestVersion( av[1], "", &MyFile )) != XB_NO_ERROR ){
+ std::cout << "Could not open file " << av[1] << std::endl;
+ return iRc;
+ }
+
+ if(( iRc = MyFile->Zap()) != XB_NO_ERROR ) {
+ std::cout << "\nError packing DBF database ==> " << av[1] << std::endl;
+ std::cout << " Return Code = " << iRc << std::endl;
+ }
+ MyFile->Close();
+ delete MyFile;
+
+ std::cout << "\nZap Database complete..." << std::endl;
+ return 0;
+}
diff --git a/todo b/todo
deleted file mode 100755
index 7884912..0000000
--- a/todo
+++ /dev/null
@@ -1,123 +0,0 @@
-
-Last updated 2/20/04 - gk
-
-Xbase64 TODO's (not necessarily in this order!)
------------------------------------------------
-
-1) Current updates/fixes as documented on source forge
-
-2) Additional expression support
-
- a) Close out ticket on source forge
-
- b) RECNO
- Requires the concept of current DB or USE
-
- - Set Current table open, create, select and set, use
- - Update documentation with new functions
-
- c) IIF
- S/b same as a function
-
- d) RECNO is broke
- e) STR( "ccc", 2 ) -> returns "ccc" even though length is 2
- f) STR( -52.345, 3 ) -> return -52.345 even though length is 3
- g) DESCEND does not work, not sure what is should do
- h) DTOC function in testdate program does not work
- i) Date: Wed, 10 Feb 1999 16:10:41 +0500 (YEKT)
- From: Vitaly Fedrushkov <willy@snowyowl.csu.ac.ru>
-
- Expressions like these are not supported:
-
- DATE - DATE (= NUM)
- DATE - NUM (= DATE)
- DATE + NUM (= DATE)
-
- j) Empty date (like CTOD(" / / ") ) is not handled in many cases.
- In fact, EMPTY() function is not implemented either.
-
- k) Any other tickets regarding expression logic?
-
-3) rename files
- dbf.cpp ==> xbdbf.cpp
-
-4) Real deletes
-
- - test this functionality
- - incorporate into dbfutil1
- - update documentation
- - impact on indices
-
-5) dbfutil1
-
- - update to support table and indice name at open
-
-
-
-2) 64 bit support
-
-3) Finish up multi user locking support for multiple environments
-
-4) Locking
-
-5) Release 3.0
-
-6) Additional index support
- - Additional index types (.IDX,.MDX) support
-
-7) Re-install exeception handling
-
-8) Transaction support
- Create a logging routine -
- put hooks in the PutRecord function to log data
-9) Build an SQL front end / module
-10) Add client/server support
-11) Create library front end for perl.
-12) PHP Support
-13) Xbase environment programming language/support/command processing
- environment
-
-14) Create Xbase How To
-15) Create Xbase FAQ
-
-16) map the xbase function names to standard Dbase names
-
- opendatabase ==> OpenTable
- CreateDatabase ==>CreateTable
-
-
-
-
-Documentation
-==============
-
-
-
-
-Design
-======
-
-1) Extended version of tables to support:
-
- maybe put info in file with name of filename.xbi, also use same file for
- xbase locking purposes
-
- a) auto index opening closing
- b) indicator if real delete is on
- c) 30 byte field names
-
-2) Think thru design of field names / AUDA storage for expressions
-
-
-
-Website
-=======
-
-Proposed Website Functionality
-
-- documentation - migrate all documentation to source forge
-- other xbase links
-- contribute
-- purchase support
-- quick reference page
-
diff --git a/xbase64-config.in b/xbase64-config.in
deleted file mode 100755
index 5aa75de..0000000
--- a/xbase64-config.in
+++ /dev/null
@@ -1,74 +0,0 @@
-#!/bin/sh
-
-prefix=@prefix@
-exec_prefix=@exec_prefix@
-exec_prefix_set=no
-CC="@CC@"
-CXX="@CXX@"
-LD="@SHARED_LD@"
-
-usage="\
-Usage: xbase-config [--prefix[=DIR]] [--exec-prefix[=DIR]] [--version] [--libs] [--cflags] [--cc] [--cxx] [--ld]"
-
-if test $# -eq 0; then
- echo "${usage}" 1>&2
- exit 1
-fi
-
-while test $# -gt 0; do
- case "$1" in
- -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
- *) optarg= ;;
- esac
-
- case $1 in
- --prefix=*)
- prefix=$optarg
- if test $exec_prefix_set = no ; then
- exec_prefix=$optarg
- fi
- ;;
- --prefix)
- echo $prefix
- ;;
- --exec-prefix=*)
- exec_prefix=$optarg
- exec_prefix_set=yes
- ;;
- --exec-prefix)
- echo $exec_prefix
- ;;
- --version)
- echo @VERSION@
- ;;
- --cflags)
- if test @includedir@ != /usr/include ; then
- if test @includedir@ != /usr/include/c++ ; then
- includes=-I@includedir@
- fi
- fi
- echo $includes
- ;;
- --libs)
- if test @libdir@ != /usr/lib ; then
- libs="-L@libdir@"
- fi
- echo $libs -lxbase
- ;;
- --cc)
- echo $CC
- ;;
- --cxx)
- echo $CXX
- ;;
- --ld)
- echo $LD
- ;;
- *)
- echo "${usage}" 1>&2
- exit 1
- ;;
- esac
- shift
-done
-
diff --git a/xbase64.spec.in b/xbase64.spec.in
deleted file mode 100755
index 1ac9edf..0000000
--- a/xbase64.spec.in
+++ /dev/null
@@ -1,67 +0,0 @@
-# $Id: xbase.spec.in,v 1.10 2003/02/08 03:02:22 dbryson Exp $
-%define xbase_ver @VERSION@
-
-Summary: Xbase dBase database file library
-Name: xbase-@RHREL@-@GXXVER@
-Provides: xbase-@RELEASE@
-Version: %{xbase_ver}
-Release: 1
-Source: xbase-@VERSION@.tar.gz
-Copyright: LGPL
-Group: Development/Libraries
-Packager: Derry Bryson <derry@techass.com>
-Vendor: Xbase Development Team (linux.techass.com/projects/xdb)
-
-%description
-Library for accessing dBase .dbf, .ndx, .dbt, and Clipper .ntx files.
-
-%package -n xbase-devel-@RHREL@-@GXXVER@
-Version: %{xbase_ver}
-Summary: Xbase development package
-Group: Development/Libraries
-Provides: xbase-devel-@RELEASE@
-Requires: xbase-@RELEASE@
-
-%description -n xbase-devel-@RHREL@-@GXXVER@
-Headers and such for compiling programs that use the Xbase library.
-
-%prep
-%setup -n xbase-@VERSION@
-CFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=/usr --enable-static
-
-%build
-make
-
-%install
-rm -rf $RPM_BUILD_ROOT
-make DESTDIR=$RPM_BUILD_ROOT install
-
-%post
-/sbin/ldconfig
-
-%postun
-/sbin/ldconfig
-
-%files -n xbase-@RHREL@-@GXXVER@
-/usr/bin/checkndx
-/usr/bin/copydbf
-/usr/bin/deletall
-/usr/bin/dumphdr
-/usr/bin/dumprecs
-/usr/bin/packdbf
-/usr/bin/reindex
-/usr/bin/undelall
-/usr/bin/zap
-/usr/bin/dbfutil1
-/usr/lib/libxbase.so
-/usr/lib/libxbase-@RELEASE@.so.*
-
-%doc NEWS README TODO AUTHORS COPYING ChangeLog
-
-%files -n xbase-devel-@RHREL@-@GXXVER@
-/usr/include/xbase
-/usr/bin/xbase-config
-/usr/lib/libxbase.la
-/usr/lib/libxbase.a
-
-%doc docs/html docs/latex
diff --git a/xbase64/Makefile.am b/xbase64/Makefile.am
deleted file mode 100755
index b0dff24..0000000
--- a/xbase64/Makefile.am
+++ /dev/null
@@ -1,55 +0,0 @@
-# This file is part of the xbase64 libraries
-# Copyright (C) 1998 Denis Pershin (dyp@inetlab.com)
-#
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Contact:
-#
-# Email:
-#
-# xbase64-dev@lists.sourceforge.net
-# xbase64-users@lists.sourceforge.net
-#
-#
-
-INCLUDES = -I$(topdir)
-
-lib_LTLIBRARIES = libxbase64.la
-
-pkginclude_HEADERS = xbdbf.h xbexp.h xbndx.h xbretcod.h xbase64.h xbdate.h \
- xbtypes.h xbstring.h xbindex.h xbntx.h xbconfig.h xbfilter.h \
- xblock.h xbfile.h xbcdx.h xbwincfg.h xbmindex.h xbnode.h
-
-#install-data-hook:
-# (cd $(includedir); rm -f xbase64.h; ln -s xbase64/xbase64.h xbase64.h)
-
-libxbase64_la_SOURCES = xbdbf.cpp xbexp.cpp xbexpfnc.cpp xbexpprc.cpp \
- xbfields.cpp xbmemo.cpp xbndx.cpp xbase64.cpp xbdate.cpp \
- xbstring.cpp xbindex.cpp xbntx.cpp xbfilter.cpp xblock.cpp \
- xbfile.cpp xbcdx.cpp xbnode.cpp
-
-EXTRA_DIST = makebcc.bat
-# makefile.g95 \
-# makebcc.bat \
-# xbase.ide
-
-
-libxbase64_la_LDFLAGS = -version-info 1:0:0
-libxbase64_la_LIBADD =
-
-MAINTAINERCLEANFILES = Makefile.in stamp-h.in
-CLEANFILES = *.obj *.BAK *.bak *.tds *.lib compout
-
diff --git a/xbase64/Makefile.in b/xbase64/Makefile.in
deleted file mode 100755
index 981a6b9..0000000
--- a/xbase64/Makefile.in
+++ /dev/null
@@ -1,475 +0,0 @@
-# Makefile.in generated by automake 1.6.3 from Makefile.am.
-# @configure_input@
-
-# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
-# Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-# This file is part of the xbase64 libraries
-# Copyright (C) 1998 Denis Pershin (dyp@inetlab.com)
-#
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Contact:
-#
-# Email:
-#
-# xbase64-dev@lists.sourceforge.net
-# xbase64-users@lists.sourceforge.net
-#
-#
-SHELL = @SHELL@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-
-bindir = @bindir@
-sbindir = @sbindir@
-libexecdir = @libexecdir@
-datadir = @datadir@
-sysconfdir = @sysconfdir@
-sharedstatedir = @sharedstatedir@
-localstatedir = @localstatedir@
-libdir = @libdir@
-infodir = @infodir@
-mandir = @mandir@
-includedir = @includedir@
-oldincludedir = /usr/include
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ..
-
-ACLOCAL = @ACLOCAL@
-AUTOCONF = @AUTOCONF@
-AUTOMAKE = @AUTOMAKE@
-AUTOHEADER = @AUTOHEADER@
-
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_DATA = @INSTALL_DATA@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = @program_transform_name@
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-host_alias = @host_alias@
-host_triplet = @host@
-
-EXEEXT = @EXEEXT@
-OBJEXT = @OBJEXT@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-AMTAR = @AMTAR@
-AS = @AS@
-AWK = @AWK@
-CC = @CC@
-CXX = @CXX@
-DEPDIR = @DEPDIR@
-DLLTOOL = @DLLTOOL@
-ECHO = @ECHO@
-GXXVER = @GXXVER@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LIBTOOL = @LIBTOOL@
-LN_S = @LN_S@
-OBJDUMP = @OBJDUMP@
-PACKAGE = @PACKAGE@
-RANLIB = @RANLIB@
-RELEASE = @RELEASE@
-RHREL = @RHREL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-XSUBDIRS = @XSUBDIRS@
-am__include = @am__include@
-am__quote = @am__quote@
-doxygen = @doxygen@
-install_sh = @install_sh@
-topdir = @topdir@
-
-INCLUDES = -I$(topdir)
-
-lib_LTLIBRARIES = libxbase64.la
-
-pkginclude_HEADERS = xbdbf.h xbexp.h xbndx.h xbretcod.h xbase64.h xbdate.h \
- xbtypes.h xbstring.h xbindex.h xbntx.h xbconfig.h xbfilter.h \
- xblock.h xbfile.h xbcdx.h xbwincfg.h xbmindex.h xbnode.h
-
-
-
-#install-data-hook:
-# (cd $(includedir); rm -f xbase64.h; ln -s xbase64/xbase64.h xbase64.h)
-libxbase64_la_SOURCES = xbdbf.cpp xbexp.cpp xbexpfnc.cpp xbexpprc.cpp \
- xbfields.cpp xbmemo.cpp xbndx.cpp xbase64.cpp xbdate.cpp \
- xbstring.cpp xbindex.cpp xbntx.cpp xbfilter.cpp xblock.cpp \
- xbfile.cpp xbcdx.cpp xbnode.cpp
-
-
-EXTRA_DIST = makebcc.bat
-
-# makefile.g95 \
-# makebcc.bat \
-# xbase.ide
-libxbase64_la_LDFLAGS = -version-info 1:0:0
-libxbase64_la_LIBADD =
-
-MAINTAINERCLEANFILES = Makefile.in stamp-h.in
-CLEANFILES = *.obj *.BAK *.bak *.tds *.lib compout
-subdir = xbase64
-mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
-CONFIG_HEADER = xbconfig.h
-CONFIG_CLEAN_FILES =
-LTLIBRARIES = $(lib_LTLIBRARIES)
-
-libxbase64_la_DEPENDENCIES =
-am_libxbase64_la_OBJECTS = xbdbf.lo xbexp.lo xbexpfnc.lo xbexpprc.lo \
- xbfields.lo xbmemo.lo xbndx.lo xbase64.lo xbdate.lo xbstring.lo \
- xbindex.lo xbntx.lo xbfilter.lo xblock.lo xbfile.lo xbcdx.lo \
- xbnode.lo
-libxbase64_la_OBJECTS = $(am_libxbase64_la_OBJECTS)
-
-DEFS = @DEFS@
-DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
-CPPFLAGS = @CPPFLAGS@
-LDFLAGS = @LDFLAGS@
-LIBS = @LIBS@
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/xbase64.Plo ./$(DEPDIR)/xbcdx.Plo \
-@AMDEP_TRUE@ ./$(DEPDIR)/xbdate.Plo ./$(DEPDIR)/xbdbf.Plo \
-@AMDEP_TRUE@ ./$(DEPDIR)/xbexp.Plo ./$(DEPDIR)/xbexpfnc.Plo \
-@AMDEP_TRUE@ ./$(DEPDIR)/xbexpprc.Plo ./$(DEPDIR)/xbfields.Plo \
-@AMDEP_TRUE@ ./$(DEPDIR)/xbfile.Plo ./$(DEPDIR)/xbfilter.Plo \
-@AMDEP_TRUE@ ./$(DEPDIR)/xbindex.Plo ./$(DEPDIR)/xblock.Plo \
-@AMDEP_TRUE@ ./$(DEPDIR)/xbmemo.Plo ./$(DEPDIR)/xbndx.Plo \
-@AMDEP_TRUE@ ./$(DEPDIR)/xbnode.Plo ./$(DEPDIR)/xbntx.Plo \
-@AMDEP_TRUE@ ./$(DEPDIR)/xbstring.Plo
-CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
- $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
-LTCXXCOMPILE = $(LIBTOOL) --mode=compile $(CXX) $(DEFS) \
- $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
- $(AM_CXXFLAGS) $(CXXFLAGS)
-CXXLD = $(CXX)
-CXXLINK = $(LIBTOOL) --mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
- $(AM_LDFLAGS) $(LDFLAGS) -o $@
-CXXFLAGS = @CXXFLAGS@
-DIST_SOURCES = $(libxbase64_la_SOURCES)
-HEADERS = $(pkginclude_HEADERS)
-
-DIST_COMMON = $(pkginclude_HEADERS) Makefile.am Makefile.in xbconfig.in
-SOURCES = $(libxbase64_la_SOURCES)
-
-all: xbconfig.h
- $(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .cpp .lo .o .obj
-$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && \
- $(AUTOMAKE) --gnu xbase64/Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)
-
-xbconfig.h: stamp-h1
- @if test ! -f $@; then \
- rm -f stamp-h1; \
- $(MAKE) stamp-h1; \
- else :; fi
-
-stamp-h1: $(srcdir)/xbconfig.in $(top_builddir)/config.status
- @rm -f stamp-h1
- cd $(top_builddir) && $(SHELL) ./config.status xbase64/xbconfig.h
-
-$(srcdir)/xbconfig.in: $(top_srcdir)/configure.in $(ACLOCAL_M4)
- cd $(top_srcdir) && $(AUTOHEADER)
- touch $(srcdir)/xbconfig.in
-
-distclean-hdr:
- -rm -f xbconfig.h stamp-h1
-libLTLIBRARIES_INSTALL = $(INSTALL)
-install-libLTLIBRARIES: $(lib_LTLIBRARIES)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(libdir)
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- if test -f $$p; then \
- f="`echo $$p | sed -e 's|^.*/||'`"; \
- echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f"; \
- $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f; \
- else :; fi; \
- done
-
-uninstall-libLTLIBRARIES:
- @$(NORMAL_UNINSTALL)
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- p="`echo $$p | sed -e 's|^.*/||'`"; \
- echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p"; \
- $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \
- done
-
-clean-libLTLIBRARIES:
- -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
- @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
- dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
- test -z "$dir" && dir=.; \
- echo "rm -f \"$${dir}/so_locations\""; \
- rm -f "$${dir}/so_locations"; \
- done
-libxbase64.la: $(libxbase64_la_OBJECTS) $(libxbase64_la_DEPENDENCIES)
- $(CXXLINK) -rpath $(libdir) $(libxbase64_la_LDFLAGS) $(libxbase64_la_OBJECTS) $(libxbase64_la_LIBADD) $(LIBS)
-
-mostlyclean-compile:
- -rm -f *.$(OBJEXT) core *.core
-
-distclean-compile:
- -rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbase64.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbcdx.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbdate.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbdbf.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbexp.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbexpfnc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbexpprc.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbfields.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbfile.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbfilter.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbindex.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xblock.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbmemo.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbndx.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbnode.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbntx.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xbstring.Plo@am__quote@
-
-distclean-depend:
- -rm -rf ./$(DEPDIR)
-
-.cpp.o:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(CXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-
-.cpp.obj:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(CXXCOMPILE) -c -o $@ `cygpath -w $<`
-
-.cpp.lo:
-@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
-@AMDEP_TRUE@ $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
- $(LTCXXCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
-CXXDEPMODE = @CXXDEPMODE@
-
-mostlyclean-libtool:
- -rm -f *.lo
-
-clean-libtool:
- -rm -rf .libs _libs
-
-distclean-libtool:
- -rm -f libtool
-uninstall-info-am:
-pkgincludeHEADERS_INSTALL = $(INSTALL_HEADER)
-install-pkgincludeHEADERS: $(pkginclude_HEADERS)
- @$(NORMAL_INSTALL)
- $(mkinstalldirs) $(DESTDIR)$(pkgincludedir)
- @list='$(pkginclude_HEADERS)'; for p in $$list; do \
- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
- f="`echo $$p | sed -e 's|^.*/||'`"; \
- echo " $(pkgincludeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(pkgincludedir)/$$f"; \
- $(pkgincludeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(pkgincludedir)/$$f; \
- done
-
-uninstall-pkgincludeHEADERS:
- @$(NORMAL_UNINSTALL)
- @list='$(pkginclude_HEADERS)'; for p in $$list; do \
- f="`echo $$p | sed -e 's|^.*/||'`"; \
- echo " rm -f $(DESTDIR)$(pkgincludedir)/$$f"; \
- rm -f $(DESTDIR)$(pkgincludedir)/$$f; \
- done
-
-ETAGS = etags
-ETAGSFLAGS =
-
-tags: TAGS
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
- list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- mkid -fID $$unique
-
-TAGS: $(HEADERS) $(SOURCES) xbconfig.in $(TAGS_DEPENDENCIES) \
- $(TAGS_FILES) $(LISP)
- tags=; \
- here=`pwd`; \
- list='$(SOURCES) $(HEADERS) xbconfig.in $(LISP) $(TAGS_FILES)'; \
- unique=`for i in $$list; do \
- if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
- done | \
- $(AWK) ' { files[$$0] = 1; } \
- END { for (i in files) print i; }'`; \
- test -z "$(ETAGS_ARGS)$$tags$$unique" \
- || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
- $$tags $$unique
-
-GTAGS:
- here=`$(am__cd) $(top_builddir) && pwd` \
- && cd $(top_srcdir) \
- && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
- -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-
-top_distdir = ..
-distdir = $(top_distdir)/$(PACKAGE)-$(VERSION)
-
-distdir: $(DISTFILES)
- @list='$(DISTFILES)'; for file in $$list; do \
- if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
- dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
- if test "$$dir" != "$$file" && test "$$dir" != "."; then \
- dir="/$$dir"; \
- $(mkinstalldirs) "$(distdir)$$dir"; \
- else \
- dir=''; \
- fi; \
- if test -d $$d/$$file; then \
- if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
- cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
- fi; \
- cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
- else \
- test -f $(distdir)/$$file \
- || cp -p $$d/$$file $(distdir)/$$file \
- || exit 1; \
- fi; \
- done
-check-am: all-am
-check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS) xbconfig.h
-
-installdirs:
- $(mkinstalldirs) $(DESTDIR)$(libdir) $(DESTDIR)$(pkgincludedir)
-
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
- @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
- $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
- INSTALL_STRIP_FLAG=-s \
- `test -z '$(STRIP)' || \
- echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
- -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
-
-distclean-generic:
- -rm -f Makefile $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
- @echo "This command is intended for maintainers to use"
- @echo "it deletes files that may require special tools to rebuild."
- -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
-clean: clean-am
-
-clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
- mostlyclean-am
-
-distclean: distclean-am
-
-distclean-am: clean-am distclean-compile distclean-depend \
- distclean-generic distclean-hdr distclean-libtool \
- distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-info: info-am
-
-info-am:
-
-install-data-am: install-pkgincludeHEADERS
-
-install-exec-am: install-libLTLIBRARIES
-
-install-info: install-info-am
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic \
- mostlyclean-libtool
-
-uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \
- uninstall-pkgincludeHEADERS
-
-.PHONY: GTAGS all all-am check check-am clean clean-generic \
- clean-libLTLIBRARIES clean-libtool distclean distclean-compile \
- distclean-depend distclean-generic distclean-hdr \
- distclean-libtool distclean-tags distdir dvi dvi-am info \
- info-am install install-am install-data install-data-am \
- install-exec install-exec-am install-info install-info-am \
- install-libLTLIBRARIES install-man install-pkgincludeHEADERS \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- tags uninstall uninstall-am uninstall-info-am \
- uninstall-libLTLIBRARIES uninstall-pkgincludeHEADERS
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/xbase64/makebcc.bat b/xbase64/makebcc.bat
deleted file mode 100755
index efdad66..0000000
--- a/xbase64/makebcc.bat
+++ /dev/null
@@ -1,32 +0,0 @@
-
-rem 2/14/04
-rem This batch file builds the xbase64 library using Borland C++ 5.5
-rem use -v for source level debugging
-
-del *.bak
-del *.obj
-
-bcc32 -c -I.. -Id:\borland\bcc55\include xbdate.cpp > compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xblock.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbdbf.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbexp.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbexpfnc.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbexpprc.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbfields.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbindex.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbase64.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbmemo.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbstring.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbfilter.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbndx.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbntx.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbcdx.cpp >> compout
-bcc32 -c -I.. -Id:\borland\bcc55\include xbfile.cpp >> compout
-
-
-del xbase64.lib
-tlib xbase64.lib /C +xbdbf.obj +xbexp.obj +xbexpfnc.obj >> compout
-tlib xbase64.lib /C +xbndx.obj +xbntx.obj +xbexpprc.obj >> compout
-tlib xbase64.lib /C +xbfields.obj +xbfile.obj +xbcdx.obj >> compout
-tlib xbase64.lib /C +xbindex.obj +xbfilter.obj +xbase64.obj >> compout
-tlib xbase64.lib /C +xbmemo.obj +xbdate.obj +xbstring.obj >> compout
diff --git a/xbase64/xbase64.cpp b/xbase64/xbase64.cpp
deleted file mode 100755
index fc5613d..0000000
--- a/xbase64/xbase64.cpp
+++ /dev/null
@@ -1,766 +0,0 @@
-/* xbase64.cpp
-
- Xbase64 project source code
-
- This file contains logic for the basic Xbase class.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xbase64.h"
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-#include <ctype.h>
-#include <string.h>
-
-//#include <xbase64/xbexcept.h>
-
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#ifdef HAVE_IO_H // windows locking
-#include <io.h>
-#endif
-
-#ifdef HAVE_DOS_H // windows _sleep
-#include <dos.h>
-#endif
-
-
-/*! \file xbase64.cpp
-*/
-
-/*************************************************************************/
-//! Constructor.
-/*!
-*/
-xbXBase::xbXBase()
-{
- xbShort e = 1;
- EndianType = *(char *) &e;
- if( EndianType )
- EndianType = 'L';
- else
- EndianType = 'B';
- DbfList = NULL;
- FreeDbfList = NULL;
-
-#ifdef XB_LOCKING_ON
- LockRetryCount = 5;
- LockMode = XB_SINGLE_USER_MODE;
-#endif
-
- DefaultDateFormat = "MM/DD/YY";
-}
-/*************************************************************************/
-//! Get pointer to named dbf.
-/*!
- Looks up an open DBF file by Name.
-
- \param Name
- \returns A pointer to the xbDbf class instance if found or NULL if
- not found.
-*/
-xbDbf *xbXBase::GetDbfPtr(const char *Name) {
- xbDbList *t;
-
- t = DbfList;
- xbShort len = strlen(Name);
-
- /* check for -> embedded in the name */
- for( xbShort i = 0; i < (len-1); i++ )
- if( Name[i] == '-' && Name[i+1] == '>' )
- len = i-1;
-
- while (t) {
- if (strncmp(Name, t->DbfName, len) == 0 )
- return t->dbf;
- t = t->NextDbf;
- }
- return NULL;
-}
-
-/*************************************************************************/
-//! Destructor.
-/*!
-*/
-xbXBase::~xbXBase()
-{
- xbDbList *i = FreeDbfList;
- while (i) {
- xbDbList *t = i->NextDbf;
- if (i->DbfName) {
- free(i->DbfName);
- }
- free(i);
- i = t;
- }
-}
-/*************************************************************************/
-//! Add dbf to dbf list.
-/*!
- Adds an xbDbf class instance to the list of dbf's.
-
- \param d the xbDbf instance to be added
- \param DatabaseName name of the database
-
- \returns One of the following return codes:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_NO_MEMORY</td><td>Out of memory</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No Error \\ \hline
- XB\_NO\_MEMORY & Out of memory \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbXBase::AddDbfToDbfList(xbDbf *d, const char *DatabaseName) {
- xbDbList *i, *s, *t;
-
- if(!FreeDbfList) {
- if((i = (xbDbList *)malloc(sizeof(xbDbList))) == NULL) {
- return XB_NO_MEMORY;
- }
- } else {
- i = FreeDbfList;
- FreeDbfList = i->NextDbf;
- }
- memset(i, 0x00, sizeof(xbDbList));
-
- i->DbfName = strdup(DatabaseName);
- i->dbf = d;
-
- /* insert new dbf into the list of open dbf files, sorted by dbf name */
- s = NULL;
- t = DbfList;
- while(t && strcmp(t->DbfName, DatabaseName) < 0) {
- s = t;
- t = t->NextDbf;
- }
- i->NextDbf = t;
- if (s == NULL)
- DbfList = i;
- else
- s->NextDbf = i;
-
- return 0;
-}
-/***********************************************************************/
-//! Remove dbf from dbf list.
-/*!
- Removes the specified xbDbf class instance from the list of dbf's.
-
- \param d xbDbf to be removed
-
- \returns One of the following return codes:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No Error \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbXBase::RemoveDbfFromDbfList(xbDbf *d) {
- xbDbList *i, *s;
-
- i = DbfList;
- s = NULL;
-
- while (i) {
- if(i->dbf == d) {
- /* remove it from current chain */
- if(s)
- s->NextDbf = i->NextDbf;
- else
- DbfList = i->NextDbf;
-
- /* add i to the current free chain */
- i->NextDbf = FreeDbfList;
- FreeDbfList = i;
- free(FreeDbfList->DbfName);
- FreeDbfList->DbfName = NULL;
- break;
- } else {
- s = i;
- i = i->NextDbf;
- }
- }
- return XB_NO_ERROR;
-}
-
-// FIXME: byte reverse methods are awful, compared to bitwise shifts -- willy
-
-/************************************************************************/
-//! Get a portable short value.
-/*!
- Converts a short (16 bit integer) value stored at p from a portable
- format to the machine format.
-
- \param p pointer to memory containing the portable short value
-
- \returns the short value.
-*/
-/* This routine returns a short value from a 2 byte character stream */
-xbShort xbXBase::GetShort(const char *p) {
- xbShort s, i;
- const char *sp;
- char *tp;
-
- s = 0;
- tp = (char *) &s;
- sp = p;
- if( EndianType == 'L' )
- for( i = 0; i < 2; i++ ) *tp++ = *sp++;
- else
- {
- sp++;
- for( i = 0; i < 2; i++ ) *tp++ = *sp--;
- }
- return s;
-}
-/*************************************************************************/
-//! Get a portable long value.
-/*!
- Converts a long (32 bit integer) value stored at p from a portable
- format to the machine format.
-
- \param p pointer to memory containing the portable long value
-
- \returns the long value.
-*/
-/* This routine returns a long value from a 4 byte character stream */
-xbLong xbXBase::GetLong( const char *p )
-{
- xbLong l;
- const char *sp;
- char *tp;
- xbShort i;
-
- tp = (char *) &l;
- sp = p;
- if( EndianType == 'L' )
- for( i = 0; i < 4; i++ ) *tp++ = *sp++;
- else
- {
- sp+=3;
- for( i = 0; i < 4; i++ ) *tp++ = *sp--;
- }
- return l;
-}
-/*************************************************************************/
-//! Get a portable unsigned long value.
-/*!
- Converts an unsigned long (32 bit integer) value stored at p from a portable
- format to the machine format.
-
- \param p pointer to memory containing the portable unsigned long value
-
- \returns the unsigned long value.
-*/
-/* This routine returns a long value from a 4 byte character stream */
-xbULong xbXBase::GetULong( const char *p )
-{
- xbULong l;
- char *tp;
- xbShort i;
-
- tp = (char *) &l;
- if( EndianType == 'L' )
- for( i = 0; i < 4; i++ ) *tp++ = *p++;
- else{
- p+=3;
- for( i = 0; i < 4; i++ ) *tp++ = *p--;
- }
- return l;
-}
-
-/************************************************************************/
-//! Get a high byte first short value.
-/*!
- Converts a short (16 bit integer) value stored at p from a high byte first
- format to the machine format.
-
- \param p pointer to memory containing the high byte first short value
-
- \returns the short value.
-*/
-/* This routine returns a short value from a 2 byte character stream */
-xbShort xbXBase::GetHBFShort(const char *p) {
- xbShort s, i;
- const char *sp;
- char *tp;
-
- s = 0;
- tp = (char *) &s;
- sp = p;
- if( EndianType == 'B' )
- for( i = 0; i < 2; i++ ) *tp++ = *sp++;
- else
- {
- sp++;
- for( i = 0; i < 2; i++ ) *tp++ = *sp--;
- }
- return s;
-}
-
-/*************************************************************************/
-//! Get a high byte first unsigned long value.
-/*!
- Converts an unsigned long (32 bit integer) value stored at p from a high byte first
- format to the machine format.
-
- \param p pointer to memory containing the high byte first unsigned long value
-
- \returns the unsigned long value.
-*/
-/* This routine returns a long value from a 4 byte character stream */
-xbULong xbXBase::GetHBFULong( const char *p )
-{
- xbULong l;
- char *tp;
- xbShort i;
-
- tp = (char *) &l;
- if( EndianType == 'B' )
- for( i = 0; i < 4; i++ ) *tp++ = *p++;
- else{
- p+=3;
- for( i = 0; i < 4; i++ ) *tp++ = *p--;
- }
- return l;
-}
-/*************************************************************************/
-//! Get a portable double value.
-/*!
- Converts a double (64 bit floating point) value stored at p from a portable
- format to the machine format.
-
- \param p pointer to memory containing the portable double value
-
- \returns the double value.
-*/
-/* This routine returns a double value from an 8 byte character stream */
-xbDouble xbXBase::GetDouble( const char *p )
-{
- xbDouble d;
- const char *sp;
- char *tp;
- xbShort i;
-
- tp = (char *) &d;
- sp = p;
- if( EndianType == 'L' )
- for( i = 0; i < 8; i++ ) *tp++ = *sp++;
- else
- {
- sp+=7;
- for( i = 0; i < 8; i++ ) *tp++ = *sp--;
- }
-
- return d;
-}
-/*************************************************************************/
-//! Put a portable short value.
-/*!
- Converts a short (16 bit integer) value from machine format to a
- portable format and stores the converted value in the memory referenced
- by c.
-
- \param c pointer to memory to hold converted value
- \param s value to be converted
-*/
-/* This routine puts a short value to a 2 byte character stream */
-void xbXBase::PutShort( char * c, xbShort s )
-{
- const char *sp;
- char *tp;
- xbShort i;
-
- tp = c;
- sp = (const char *) &s;
-
- if( EndianType == 'L' )
- {
- for( i = 0; i < 2; i++ ) *tp++ = *sp++;
- }
- else /* big endian */
- {
- sp++;
- for( i = 0; i < 2; i++ ) *tp++ = *sp--;
- }
- return;
-}
-
-/*************************************************************************/
-//! Put a portable long value.
-/*!
- Converts a long (32 bit integer) value from machine format to a
- portable format and stores the converted value in the memory referenced
- by c.
-
- \param c pointer to memory to hold converted value
- \param l value to be converted
-*/
-/* This routine puts a long value to a 4 byte character stream */
-void xbXBase::PutLong( char * c, xbLong l )
-{
- const char *sp;
- char *tp;
- xbShort i;
-
- tp = c;
- sp = (const char *) &l;
- if( EndianType == 'L' )
- for( i = 0; i < 4; i++ ) *tp++ = *sp++;
- else
- {
- sp+=3;
- for( i = 0; i < 4; i++ ) *tp++ = *sp--;
- }
- return;
-}
-/*************************************************************************/
-//! Put a portable unsigned short value.
-/*!
- Converts an unsigned long (16 bit integer) value from machine format to a
- portable format and stores the converted value in the memory referenced
- by c.
-
- \param c pointer to memory to hold converted value
- \param s value to be converted
-*/
-/* This routine puts a short value to a 2 byte character stream */
-void xbXBase::PutUShort( char * c, xbUShort s )
-{
- const char *sp;
- char *tp;
- xbShort i;
-
- tp = c;
- sp = (const char *) &s;
- if( EndianType == 'L' )
- for( i = 0; i < 2; i++ ) *tp++ = *sp++;
- else
- {
- sp++;
- for( i = 0; i < 2; i++ ) *tp++ = *sp--;
- }
- return;
-}
-/*************************************************************************/
-//! Put a portable unsigned long value.
-/*!
- Converts an unsigned long (32 bit integer) value from machine format to a
- portable format and stores the converted value in the memory referenced
- by c.
-
- \param c pointer to memory to hold converted value
- \param l value to be converted
-*/
-/* This routine puts a long value to a 4 byte character stream */
-void xbXBase::PutULong( char * c, xbULong l )
-{
- const char *sp;
- char *tp;
- xbShort i;
-
- tp = c;
- sp = (const char *) &l;
- if( EndianType == 'L' )
- for( i = 0; i < 4; i++ ) *tp++ = *sp++;
- else
- {
- sp+=3;
- for( i = 0; i < 4; i++ ) *tp++ = *sp--;
- }
- return;
-}
-/*************************************************************************/
-//! Put a portable double value.
-/*!
- Converts a double (64 floating point) value from machine format to a
- portable format and stores the converted value in the memory referenced
- by c.
-
- \param c pointer to memory to hold converted value
- \param d value to be converted
-*/
-/* This routine puts a double value to an 8 byte character stream */
-void xbXBase::PutDouble( char * c, xbDouble d )
-{
- const char *sp;
- char *tp;
- xbShort i;
-
- tp = c;
- sp = (const char *) &d;
- if( EndianType == 'L' )
- for( i = 0; i < 8; i++ ) *tp++ = *sp++;
- else
- {
- sp+=7;
- for( i = 0; i < 8; i++ ) *tp++ = *sp--;
- }
- return;
-}
-/************************************************************************/
-//! Get offset of last PATH_SEPARATOR in Name.
-/*!
- Scans the specified Name for the last occurance of PATH_SEPARATOR.
-
- \param Name string to be scanned.
-
- \returns offset of last occurance of PATH_SEPARATOR
-*/
-xbShort xbXBase::DirectoryExistsInName( const char * Name )
-{
- /* returns the offset in the string of the last directory slash */
-
- xbShort Count, Mark;
- char Delim;
- const char *p;
-
- Delim = PATH_SEPARATOR;
-
- Count = Mark = 0;
- p = Name;
-
- while( *p )
- {
- Count++;
- if( *p++ == Delim ) Mark = Count;
- }
- return Mark;
-}
-
-/************************************************************************/
-//! Display description of error code.
-/*!
- Displays a text description of an XBase error code.
-
- \param ErrorCode error to be displayed
-*/
-void xbXBase::DisplayError( xbShort ErrorCode ) const
-{
- std::cout << GetErrorMessage( ErrorCode ) << std::endl;
-}
-/************************************************************************/
-//! Get description of error code.
-/*!
- Returns a pointer to string containing a text description of an
- error code.
-
- \param ErrorCode error number of description to be returned
-*/
-const char* xbXBase::GetErrorMessage( xbShort ErrorCode )
-{
- switch( ErrorCode ) {
- case 0: return "No Error";
- case -100: return "End Of File";
- case -101: return "Beginning Of File";
- case -102: return "No Memory";
- case -103: return "File Already Exists";
- case -104: return "Database or Index Open Error";
- case -105: return "Error writing to disk drive";
- case -106: return "Unknown Field Type";
- case -107: return "Database already open";
- case -108: return "Not an Xbase type database";
- case -109: return "Invalid Record Number";
- case -110: return "Invalid Option";
- case -111: return "Database not open";
- case -112: return "Disk Drive Seek Error";
- case -113: return "Disk Drive Read Error";
- case -114: return "Search Key Not Found";
- case -115: return "Search Key Found";
- case -116: return "Invalid Key";
- case -117: return "Invalid Node Link";
- case -118: return "Key Not Unique";
- case -119: return "Invalid Key Expression";
- case -120: return "DBF File Not Open";
- case -121: return "Invalid Key Type";
- case -122: return "Invalid Node No";
- case -123: return "Node Full";
- case -124: return "Invalid Field Number";
- case -125: return "Invalid Data";
- case -126: return "Not a leaf node";
- case -127: return "Lock Failed";
- case -128: return "Close Error";
- case -129: return "Invalid Schema";
- case -130: return "Invalid Name";
- case -131: return "Invalid Block Size";
- case -132: return "Invalid Block Number";
- case -133: return "Not a Memo field";
- case -134: return "No Memo Data";
- case -135: return "Expression syntax error";
- case -136: return "Parse Error";
- case -137: return "No Data";
- case -138: return "Unknown Token Type";
- case -140: return "Invalid Field";
- case -141: return "Insufficient Parms";
- case -142: return "Too Many Parms";
- case -143: return "Invalid or Undefined Function";
- case -144: return "Invalid Field Length";
- case -145: return "Harvest Node";
- case -146: return "Invalid Date";
- case -147: return "Invalid Lock Option";
- default: return "Unknown error code";
- }
-}
-/************************************************************************/
-#ifdef XB_LOCKING_ON
-
-//! File lock routine
-/*!
- Lowest level lock routine
- Locks/unlocks a database,memo or index file.
- This function assumes the file position has been correctly set
-
- \param fn file to lock/unlock
- \param LockType lock type, one of: XB_LOCK or XB_UNLOCK
- \param lockLen byte count to lock
-*/
-
-#ifdef __WIN32__
-xbShort xbXBase::LockFile( int fn, xbShort LockType, xbOffT lockLen)
-{
-
- int mode;
- int rc;
- int tries = 0;
-
- /* convert the xbase locking command into a windows locking command */
- if( LockType == XB_UNLOCK )
- mode = LK_UNLCK;
- else if( LockType == XB_LOCK || LockType == XB_LOCK_HOLD )
- mode = LK_NBLCK;
- else
- return XB_INVALID_LOCK_OPTION;
-
- do{
- rc = locking( fn, mode, lockLen );
- if( rc )
- _sleep( 1 );
- } while( rc == -1 && tries++ < GetLockRetryCount());
-
- if( rc )
- return XB_LOCK_FAILED;
-
- return 0;
-}
-
-#elif HAVE_FCNTL_H
-
-xbShort xbXBase::LockFile( int fn, xbShort LockType, xbOffT lockLen )
-{
- xbShort cmd, rc;
- xbShort tries = 0;
-
-/* convert cross platform xbase lock type to unix lock type */
- if( LockType == XB_UNLOCK )
- cmd = F_ULOCK;
- else if( LockType == XB_LOCK || LockType == XB_LOCK_HOLD )
- cmd = F_TLOCK;
- else
- return XB_INVALID_LOCK_OPTION;
-
-/* do the actual lock */
- do{
- #ifdef _LARGEFILE64_SOURCE
- rc = lockf64( fn, cmd, lockLen );
- #else
- rc = lockf( fn, cmd, lockLen );
- #endif
- if( rc == -1 && errno != EINTR ){
- tries++;
- sleep(1);
- }
- } while( rc == -1 && tries < GetLockRetryCount());
-
- if( rc )
- return XB_LOCK_FAILED;
-
- return XB_NO_ERROR;
-}
-#endif // HAVE_FCNTL
-#endif // XB_LOCKING_ON
-
-/************************************************************************/
-#ifdef XB_LOCKING_ON
-
-//! Set high level lock mode
-/*!
-
- \param nlm New lock mode
-*/
-
-xbShort xbXBase::SetLockMode( xbShort nlm )
-{
- if( nlm != XB_SINGLE_USER_MODE && nlm != XB_XBASE_LOCK_MODE &&
- nlm != XB_DBASE5_LOCK_MODE && nlm != XB_CLIPPER5_LOCK_MODE &&
- nlm != XB_FOXPRO3_LOCK_MODE )
- return XB_INVALID_LOCK_OPTION;
-
- LockMode = nlm;
- return XB_NO_ERROR;
-}
-
-#endif // XB_LOCKING_ON
-
-
-
diff --git a/xbase64/xbase64.h b/xbase64/xbase64.h
deleted file mode 100755
index 7267299..0000000
--- a/xbase64/xbase64.h
+++ /dev/null
@@ -1,239 +0,0 @@
-/* xbase64.h
-
- Xbase project source code
-
- This file contains a header file for the xbXBase class, which is the
- base class for using the Xbase DBMS library.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifndef __XB_XBASE_H__
-#define __XB_XBASE_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <string.h>
-
-#if defined(__WIN32__)
-#include "windows.h"
-
-// ripped from wxWindows
-
-// _declspec works in BC++ 5 and later, as well as VC++
-#if defined(__VISUALC__) || defined(__BORLANDC__) || defined(__GNU LesserC__)
-# ifdef XBMAKINGDLL
-# define XBDLLEXPORT __declspec( dllexport )
-# define XBDLLEXPORT_DATA(type) __declspec( dllexport ) type
-# define XBDLLEXPORT_CTORFN
-# elif defined(XBUSINGDLL)
-# define XBDLLEXPORT __declspec( dllimport )
-# define XBDLLEXPORT_DATA(type) __declspec( dllimport ) type
-# define XBDLLEXPORT_CTORFN
-# else
-# define XBDLLEXPORT
-# define XBDLLEXPORT_DATA(type) type
-# define XBDLLEXPORT_CTORFN
-# endif
-
-#else
-
-# define XBDLLEXPORT
-# define XBDLLEXPORT_DATA(type) type
-# define XBDLLEXPORT_CTORFN
-#endif
-
-#else // !Windows
-# define XBDLLEXPORT
-# define XBDLLEXPORT_DATA(type) type
-# define XBDLLEXPORT_CTORFN
-#endif // Win/!Win
-
-
-#define XB_SINGLE_USER_MODE 0
-#define XB_UNLOCK 200
-#define XB_LOCK 201
-#define XB_LOCK_HOLD 202
-
-#ifdef XB_LOCKING_ON
-
- #ifdef HAVE_SYS_LOCKING_H
- #include <sys/locking.h>
- #ifdef __MINGW32__
- #defibe locking _locking
- #endif
- #endif
-
- #ifdef HAVE_FCNTL_H
- #include <fcntl.h>
- #endif
-
- #ifdef HAVE_UNISTD_H
- #include <unistd.h>
- #endif
-
- #define XB_XBASE_LOCK_MODE 200
- #define XB_DBASE5_LOCK_MODE 201
- #define XB_CLIPPER5_LOCK_MODE 202
- #define XB_FOXPRO3_LOCK_MODE 203
-
-#endif // XB_LOCKING_ON
-
-#include "xbtypes.h"
-#include "xbretcod.h"
-#include "xbdate.h"
-#include "xbstring.h"
-
-#ifndef XB_MIN
-#define XB_MIN(a, b) (((a) < (b)) ? (a) : (b))
-#endif /* XB_MIN */
-
-// 3/18/04 next macro isn't currently used in the library - GK
-//#ifndef XB_MAX
-//#define XB_MAX(a, b) (((a) < (b)) ? (b) : (a))
-//#endif /* XB_MAX */
-
-/*! \file xbase64.h
-*/
-
-class XBDLLEXPORT xbDbf;
-
-//! xbDbList struct
-/*!
-*/
-struct XBDLLEXPORT xbDbList{
- xbDbList * NextDbf;
- char * DbfName;
- xbDbf * dbf;
-};
-
-//! xbXBase class
-/*!
-*/
-class XBDLLEXPORT xbXBase {
- public:
- ~xbXBase();
- xbXBase();
- xbShort AddDbfToDbfList(xbDbf *d, const char *DatabaseName);
- xbDbf * GetDbfPtr( const char *Name );
- xbShort DirectoryExistsInName( const char *Name );
- xbShort GetEndianType() { return EndianType; }
- void DisplayError( xbShort ErrorCode ) const;
- static const char* GetErrorMessage( xbShort ErrorCode );
- xbString & GetDefaultDateFormat() { return DefaultDateFormat; }
- void SetDefaultDateFormat( const xbString & f ){ DefaultDateFormat = f; }
-
- /* next 6 routines handle both big endian and little endian machines */
- xbDouble GetDouble( const char *p );
- xbLong GetLong ( const char *p );
- xbULong GetULong ( const char *p );
- xbShort GetShort ( const char *p );
- xbULong GetHBFULong( const char *p );
- xbShort GetHBFShort ( const char *p );
-
- void PutLong ( char *p, const xbLong l );
- void PutShort ( char *p, const xbShort s );
- void PutULong ( char *p, const xbULong l );
- void PutUShort( char *p, const xbUShort s );
- void PutDouble( char *p, const xbDouble d );
-
- xbShort RemoveDbfFromDbfList( xbDbf * );
-
-#ifdef XB_LOCKING_ON
- xbShort GetLockRetryCount(){ return LockRetryCount; }
- void SetLockRetryCount( xbShort lrc ) { LockRetryCount = lrc; }
- xbShort LockFile( int fn, xbShort type, xbOffT len );
- xbShort GetLockMode() { return LockMode; }
- xbShort SetLockMode( xbShort nlm );
-#endif
-
-protected:
- xbDbList * DbfList;
- xbDbList * FreeDbfList;
- xbShort EndianType; /* B = Big Endian, L = Little Endian */
-
-private:
- xbString DefaultDateFormat;
-
-#ifdef XB_LOCKING_ON
- xbShort LockRetryCount;
- xbShort LockMode;
-#endif
-};
-
-#include "xbdbf.h"
-
-#if defined(XB_EXPRESSIONS)
-#include "xbexp.h"
-#endif
-
-#if defined(XB_INDEX_ANY)
-#include "xbindex.h"
-#include "xbmindex.h"
-#endif
-
-#ifdef XB_LOCKING_ON
-#include "xblock.h"
-#endif
-
-#ifdef XB_INDEX_NDX
-#include "xbndx.h"
-#endif
-
-#ifdef XB_INDEX_NTX
-#include "xbntx.h"
-#endif
-
-#ifdef XB_INDEX_CDX
-#include "xbcdx.h"
-#endif
-
-#if defined(XB_FILTERS) && !defined(XB_INDEX_ANY)
-#error XB_FILTERS cant be used without index support
-#elif defined(XB_FILTERS)
-#include "xbfilter.h"
-#endif
-
-#endif // __XB_XBASE_H__
-
-
-
diff --git a/xbase64/xbcdx.cpp b/xbase64/xbcdx.cpp
deleted file mode 100755
index 83a69df..0000000
--- a/xbase64/xbcdx.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#include "xbtypes.h"
-#include "xbcdx.h"
-
-xbShort xbCdx::CreateIndex(const char* filename, const char *expr,
- xbShort unique, xbShort overwrite)
-{
- return CreateIndex(filename, "NoName", expr, unique, overwrite);
-}
-
-xbShort xbCdx::CreateIndex(const char* filename, const char *tagName,
- const char *expr, xbShort unique, xbShort overwrite)
-{
- if (IsOpen()) CloseIndex();
- SetFileName(filename);
-
- indexfp=fopen(GetFileName(), "wb+");
- WriteTagHeader(tagName);
- WriteTagRoot(tagName);
- WriteIndexHeader(expr);
- WriteIndexRoot();
- return 0;
-}
-
-const char* xbCdx::GetExtWithDot(bool lower)
-{
- return lower? ".cdx": ".CDX";
-}
-
-void xbCdx::WriteTagHeader(const char* tagName)
-{
- memset(&tagHeader_, 0, sizeof(tagHeader_));
- tagHeader_.rootNode=0x400;
- tagHeader_.keyLen=strlen(tagName)+1;
- tagHeader_.features.feature=0xe0;
- tagHeader_.signature=1;
- tagHeader_.totalExprLen=1;
- tagHeader_.forExprLen=1;
- tagHeader_.keyExprLen=1;
- fwrite(&tagHeader_, sizeof(tagHeader_), 1, indexfp);
-}
-
-void xbCdx::WriteTagRoot(const char* tagName)
-{
- memset(&tagRootNode_, 0, sizeof(tagRootNode_));
- tagRootNode_.attr=3;
- tagRootNode_.keyCount=1;
- tagRootNode_.leftSibling=-1;
- tagRootNode_.rightSibling=-1;
- tagRootNode_.freeSpace=476;
- tagRootNode_.recNumberMask=0xffff;
- tagRootNode_.dupByteCounterMask=0xf;
- tagRootNode_.tailByteCounterMask=0xf;
- tagRootNode_.recBitUsing=16;
- tagRootNode_.dupBitUsing=4;
- tagRootNode_.tailBitUsing=4;
- tagRootNode_.byteCount=3;
- xbShort indexHeadOffset=0x600;
- int len=sizeof(indexHeadOffset);
- memcpy(tagRootNode_.keys, &indexHeadOffset, len);
- tagRootNode_.keys[len]=16;
- len=strlen(tagName);
- xbString tag=tagName;
- tag.toUpperCase();
- memcpy(tagRootNode_.keys+sizeof(tagRootNode_.keys)-len, tag.c_str(), len);
- fwrite(&tagRootNode_, sizeof(tagRootNode_), 1, indexfp);
-}
-
-void xbCdx::WriteIndexHeader(const char* expr)
-{
- memset(&indexHeader_, 0, sizeof(indexHeader_));
- indexHeader_.rootNode=0xa00;
- indexHeader_.keyLen=33;
- indexHeader_.features.feature=0x60;
- indexHeader_.signature=1;
- indexHeader_.totalExprLen=strlen(expr)+1;
- indexHeader_.forExprLen=1;
- indexHeader_.keyExprLen=strlen(expr)+1;
- xbString exprn=expr;
- exprn.toUpperCase();
- memcpy(indexHeader_.keyforBuffer, exprn.c_str(), indexHeader_.keyExprLen);
- fwrite(&indexHeader_, sizeof(indexHeader_), 1, indexfp);
-}
-
-void xbCdx::WriteIndexRoot()
-{
- memset(&indexRootNode_, 0, sizeof(indexRootNode_));
- indexRootNode_.attr=3;
- indexRootNode_.keyCount=0;
- indexRootNode_.leftSibling=-1;
- indexRootNode_.rightSibling=-1;
- indexRootNode_.freeSpace=488;
- indexRootNode_.recNumberMask=0x0fff;
- indexRootNode_.dupByteCounterMask=0x3f;
- indexRootNode_.tailByteCounterMask=0x3f;
- indexRootNode_.recBitUsing=12;
- indexRootNode_.dupBitUsing=6;
- indexRootNode_.tailBitUsing=6;
- indexRootNode_.byteCount=3;
- fwrite(&indexRootNode_, sizeof(indexRootNode_), 1, indexfp);
-}
-
-xbShort xbCdx::GetHeadNode()
-{
- ReadTagHeader();
- ReadIndexHeader(GetIndexTagOffset());
- return XB_NO_ERROR;
-}
-
-void xbCdx::ReadTagHeader()
-{
- _fseek(indexfp, 0, SEEK_SET);
- fread(&tagHeader_, sizeof(tagHeader_), 1, indexfp);
-}
diff --git a/xbase64/xbcdx.h b/xbase64/xbcdx.h
deleted file mode 100755
index f76a45f..0000000
--- a/xbase64/xbcdx.h
+++ /dev/null
@@ -1,150 +0,0 @@
-#ifndef cdx_h
-#define cdx_h
-
-#include "xbmindex.h"
-
-struct CdxHeader
-{
- xbLong rootNode;
- xbLong freeNode;
- xbLong reserved;
- xbShort keyLen;
- union cdxFeatures
- {
- struct Features
- {
- bool unique:1;
- int:2;
- bool hasFor:1;
- bool:1;
- bool cdxHeader:1;
- bool cdxFmt:1;
- bool cdxTagHeader:1;
- } features;
- char feature;
- } features;
- char signature;
- xbLong reserved1[5];
- char reserved2[466];
- xbShort descending;
- xbShort totalExprLen;
- xbShort forExprLen;
- xbShort reserved4;
- xbShort keyExprLen;
- char keyforBuffer[512];
-};
-
-struct CdxNode
-{
- xbShort attr;
- xbShort keyCount;
- xbLong leftSibling;
- xbLong rightSibling;
-}
-#ifdef __GNU LesserC__
- __attribute__((packed))
-#endif
-;
-
-struct CdxInnerNode: public CdxNode
-{
- char keys[500];
-}
-#ifdef __GNU LesserC__
- __attribute__((packed))
-#endif
-;
-
-struct CdxLeafNode: public CdxNode
-{
- xbShort freeSpace;
- xbLong recNumberMask;
- char dupByteCounterMask;
- char tailByteCounterMask;
- char recBitUsing;
- char dupBitUsing;
- char tailBitUsing;
- char byteCount;
- char keys[488];
-}
-#ifdef __GNU LesserC__
- __attribute__((packed))
-#endif
-;
-
-class XBDLLEXPORT xbCdx: public xbMultiIndex
-{
- public:
-// xbCdx() {} I don't like to make empty object with no protection
-// to method method call. And I don't see any need of it.
- xbCdx(xbDbf* dbf): xbMultiIndex(dbf)
- {
- memset(&indexHeader_, 0, sizeof(indexHeader_));
- memset(&tagHeader_, 0, sizeof(tagHeader_));
- }
-
- virtual ~xbCdx() {CloseIndex();}
-
- virtual xbShort CreateIndex(const char *filename, const char *expr,
- xbShort unique, xbShort overwrite);
- virtual xbShort CreateIndex(const char *filename, const char* tagname,
- const char *expr, xbShort unique, xbShort overwrite);
-
- virtual xbShort AddTag(const char* tagname, const char *expr,
- xbShort unique, xbShort overwrite) {return 0;}
-
- virtual xbLong GetTotalNodes() {return 0;}
- virtual xbULong GetCurDbfRec() {return 0;}
- virtual xbShort CreateKey( xbShort, xbShort ) {return 0;}
- virtual xbShort GetCurrentKey(char *key) {return 0;}
- virtual xbShort AddKey( xbLong ) {return 0;}
- virtual xbShort UniqueIndex() {return 0;}
- virtual xbShort DeleteKey( xbLong ) {return 0;}
- virtual xbShort KeyWasChanged() {return 0;}
- virtual xbShort FindKey( const char * ) {return 0;}
- virtual xbShort FindKey() {return 0;}
- virtual xbShort FindKey( xbDouble ) {return 0;}
- virtual xbShort GetNextKey() {return 0;}
- virtual xbShort GetLastKey() {return 0;}
- virtual xbShort GetFirstKey() {return 0;}
- virtual xbShort GetPrevKey() {return 0;}
- virtual xbShort ReIndex(void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0) {return 0;}
- virtual xbShort KeyExists( xbDouble ) {return 0;}
- virtual void GetExpression(char *buf, int len) {}
-#ifdef XBASE_DEBUG
- virtual void DumpHdrNode( xbShort Option ) {};
- virtual void DumpNodeRec( xbLong ) {};
- virtual void DumpNodeChain() {};
- virtual xbShort CheckIndexIntegrity( xbShort ) {return 0;};
-#endif
-
-// static xbString CreateIndexName(const xbString& dbfName);
- virtual const char* GetExtWithDot(bool lower);
- const CdxHeader& GetIndexHeader() {return indexHeader_;}
- const CdxHeader& GetTagHeader() {return tagHeader_;}
-
- protected:
- virtual xbShort GetHeadNode();
- virtual xbUShort GetKeyLen() {return 0;}
- virtual const char* GetKeyExpression() {return "";}
- virtual void FreeNodesMemory() {}
- void ReadTagHeader();
- xbLong GetIndexTagOffset() {return 0;}
- void ReadIndexHeader(xbLong) {}
-
- private:
- xbCdx(const xbCdx&);
- xbCdx& operator=(const xbCdx&);
- void WriteTagHeader(const char* tagName);
- void WriteTagRoot(const char* tagName);
- void WriteIndexHeader(const char* expr);
- void WriteIndexRoot();
-
- private:
- CdxHeader tagHeader_;
- CdxLeafNode tagRootNode_;
- CdxHeader indexHeader_;
- CdxLeafNode indexRootNode_;
-};
-
-#endif
diff --git a/xbase64/xbconfig.h b/xbase64/xbconfig.h
deleted file mode 100644
index 15a3e69..0000000
--- a/xbase64/xbconfig.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/* xbase64/xbconfig.h. Generated by configure. */
-/* xbase64/xbconfig.in. Generated from configure.in by autoheader. */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#define HAVE_DLFCN_H 1
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define to 1 if you have the `fseeko' function. */
-#define HAVE_FSEEKO 1
-
-/* Define to 1 if you have the `ftello' function. */
-#define HAVE_FTELLO 1
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#define HAVE_INTTYPES_H 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#define HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#define HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#define HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#define HAVE_STRCASECMP 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#define HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#define HAVE_SYS_STAT_H 1
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#define HAVE_SYS_TYPES_H 1
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#define HAVE_UNISTD_H 1
-
-/* Define to 1 if you have the `vsnprintf' function. */
-#define HAVE_VSNPRINTF 1
-
-/* Define to 1 if you have the `vsprintf' function. */
-#define HAVE_VSPRINTF 1
-
-/* Name of package */
-#define PACKAGE "xbase64"
-
-/* Define to the address where bug reports for this package should be sent. */
-#define PACKAGE_BUGREPORT "xdb-devel@lists.sourceforge.net"
-
-/* Define to the full name of this package. */
-#define PACKAGE_NAME "xbase64"
-
-/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "xbase64 3.1.2"
-
-/* Define to the one symbol short name of this package. */
-#define PACKAGE_TARNAME "xbase64"
-
-/* Define to the version of this package. */
-#define PACKAGE_VERSION "3.1.2"
-
-#define PATH_SEPARATOR '/'
-
-/* Define to 1 if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Version number of package */
-#define VERSION "3.1.2"
-
-/* XB_DEBUG */
-#define XBASE_DEBUG 1
-
-#define XB_DBT_BLOCK_SIZE 512
-
-/* XB_EXPRESSIONS */
-#define XB_EXPRESSIONS 1
-
-/* XB_FILTERS */
-#define XB_FILTERS 1
-
-/* XB_INDEX_ANY */
-#define XB_INDEX_ANY 1
-
-/* XB_INDEX_NDX */
-#define XB_INDEX_NDX 1
-
-/* XB_INDEX_NTX */
-#define XB_INDEX_NTX 1
-
-/* XB_LARGEFILE_SUPPORT */
-#define XB_LARGEFILE_SUPPORT 1
-
-/* XB_LOCKING_ON */
-#define XB_LOCKING_ON 1
-
-/* XB_MEMO_FIELDS */
-#define XB_MEMO_FIELDS 1
-
-/* XB_REAL_DELETE */
-#define XB_REAL_DELETE 1
-
-/* Define to 1 if on AIX 3.
- System headers sometimes define this.
- We just want to avoid a redefinition error message. */
-#ifndef _ALL_SOURCE
-/* # undef _ALL_SOURCE */
-#endif
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-#define _FILE_OFFSET_BITS 64
-
-/* Define for large files, on AIX-style hosts. */
-/* #undef _LARGE_FILES */
-
-/* Define to 1 if on MINIX. */
-/* #undef _MINIX */
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
- this defined. */
-/* #undef _POSIX_1_SOURCE */
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-/* #undef _POSIX_SOURCE */
diff --git a/xbase64/xbconfig.in b/xbase64/xbconfig.in
deleted file mode 100755
index 8c25663..0000000
--- a/xbase64/xbconfig.in
+++ /dev/null
@@ -1,130 +0,0 @@
-/* xbase64/xbconfig.in. Generated from configure.in by autoheader. */
-
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#undef HAVE_DLFCN_H
-
-/* Define to 1 if you have the <fcntl.h> header file. */
-#undef HAVE_FCNTL_H
-
-/* Define to 1 if you have the `fseeko' function. */
-#undef HAVE_FSEEKO
-
-/* Define to 1 if you have the `ftello' function. */
-#undef HAVE_FTELLO
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the `strcasecmp' function. */
-#undef HAVE_STRCASECMP
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to 1 if you have the `vsnprintf' function. */
-#undef HAVE_VSNPRINTF
-
-/* Define to 1 if you have the `vsprintf' function. */
-#undef HAVE_VSPRINTF
-
-/* Name of package */
-#undef PACKAGE
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-#define PATH_SEPARATOR '/'
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
-
-/* Version number of package */
-#undef VERSION
-
-/* XB_DEBUG */
-#undef XBASE_DEBUG
-
-#define XB_DBT_BLOCK_SIZE 512
-
-/* XB_EXPRESSIONS */
-#undef XB_EXPRESSIONS
-
-/* XB_FILTERS */
-#undef XB_FILTERS
-
-/* XB_INDEX_ANY */
-#undef XB_INDEX_ANY
-
-/* XB_INDEX_NDX */
-#undef XB_INDEX_NDX
-
-/* XB_INDEX_NTX */
-#undef XB_INDEX_NTX
-
-/* XB_LARGEFILE_SUPPORT */
-#undef XB_LARGEFILE_SUPPORT
-
-/* XB_LOCKING_ON */
-#undef XB_LOCKING_ON
-
-/* XB_MEMO_FIELDS */
-#undef XB_MEMO_FIELDS
-
-/* XB_REAL_DELETE */
-#undef XB_REAL_DELETE
-
-/* Define to 1 if on AIX 3.
- System headers sometimes define this.
- We just want to avoid a redefinition error message. */
-#ifndef _ALL_SOURCE
-# undef _ALL_SOURCE
-#endif
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-#undef _FILE_OFFSET_BITS
-
-/* Define for large files, on AIX-style hosts. */
-#undef _LARGE_FILES
-
-/* Define to 1 if on MINIX. */
-#undef _MINIX
-
-/* Define to 2 if the system does not provide POSIX.1 features except with
- this defined. */
-#undef _POSIX_1_SOURCE
-
-/* Define to 1 if you need to in order for `stat' and other things to work. */
-#undef _POSIX_SOURCE
diff --git a/xbase64/xbdate.cpp b/xbase64/xbdate.cpp
deleted file mode 100755
index fd26438..0000000
--- a/xbase64/xbdate.cpp
+++ /dev/null
@@ -1,851 +0,0 @@
-/* xbdate.cpp
-
- Xbase64 project source code
-
- These functions are used for processing dates.
- All functions assume a standard date format of CCYYMMDD
- for Century,Year,Month and Day
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xbdate.h"
-#endif
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-#include <xbase64/xbase64.h>
-#include <xbase64/xbdate.h>
-//#include <xbase64/retcodes.h>
-
-/*! \file xbdate.cpp
-*/
-
-int xbDate::DaysInMonths[2][13];
-int xbDate::AggregatedDaysInMonths[2][13];
-
-#define EPOCH_MIN 100
-#define EPOCH_MAX 3000
-#define DAYS_AD(year) ((year) *365L + (year) / 4 - (year) / 100 + (year) / 400)
-
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-xbDate::xbDate( const xbString & Date8 ) {
- if( DateIsValid( Date8 ))
- cDate8 = Date8;
- else
- Sysdate();
- SetDateTables();
-}
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-xbDate::xbDate( const char * Date8 ) {
- if( DateIsValid( Date8 ))
- cDate8 = Date8;
- else
- Sysdate(); /* if invalid date, set class to sysdate */
- SetDateTables();
-}
-/***************************************************************/
-//! Short description.
-/*!
-*/
-xbDate::xbDate()
-{
- Sysdate();
- SetDateTables();
-}
-
-/***************************************************************/
-//! Destructor
-/*!
-*/
-xbDate::~xbDate()
-{
-}
-/***************************************************************/
-//! Short description.
-/*!
-*/
-void xbDate::SetDateTables() {
- if( AggregatedDaysInMonths[1][12] != 366 ){ /* first time called ? */
- AggregatedDaysInMonths[0][0] = 0;
- AggregatedDaysInMonths[0][1] = 31;
- AggregatedDaysInMonths[0][2] = 59;
- AggregatedDaysInMonths[0][3] = 90;
- AggregatedDaysInMonths[0][4] = 120;
- AggregatedDaysInMonths[0][5] = 151;
- AggregatedDaysInMonths[0][6] = 181;
- AggregatedDaysInMonths[0][7] = 212;
- AggregatedDaysInMonths[0][8] = 243;
- AggregatedDaysInMonths[0][9] = 273;
- AggregatedDaysInMonths[0][10] = 304;
- AggregatedDaysInMonths[0][11] = 334;
- AggregatedDaysInMonths[0][12] = 365;
- AggregatedDaysInMonths[1][0] = 0;
- AggregatedDaysInMonths[1][1] = 31;
- AggregatedDaysInMonths[1][2] = 60;
- AggregatedDaysInMonths[1][3] = 91;
- AggregatedDaysInMonths[1][4] = 121;
- AggregatedDaysInMonths[1][5] = 152;
- AggregatedDaysInMonths[1][6] = 182;
- AggregatedDaysInMonths[1][7] = 213;
- AggregatedDaysInMonths[1][8] = 244;
- AggregatedDaysInMonths[1][9] = 274;
- AggregatedDaysInMonths[1][10] = 305;
- AggregatedDaysInMonths[1][11] = 335;
- AggregatedDaysInMonths[1][12] = 366;
-
- DaysInMonths[0][0] = 0;
- DaysInMonths[0][1] = 31;
- DaysInMonths[0][2] = 28;
- DaysInMonths[0][3] = 31;
- DaysInMonths[0][4] = 30;
- DaysInMonths[0][5] = 31;
- DaysInMonths[0][6] = 30;
- DaysInMonths[0][7] = 31;
- DaysInMonths[0][8] = 31;
- DaysInMonths[0][9] = 30;
- DaysInMonths[0][10] = 31;
- DaysInMonths[0][11] = 30;
- DaysInMonths[0][12] = 31;
- DaysInMonths[1][0] = 0;
- DaysInMonths[1][1] = 31;
- DaysInMonths[1][2] = 29;
- DaysInMonths[1][3] = 31;
- DaysInMonths[1][4] = 30;
- DaysInMonths[1][5] = 31;
- DaysInMonths[1][6] = 30;
- DaysInMonths[1][7] = 31;
- DaysInMonths[1][8] = 31;
- DaysInMonths[1][9] = 30;
- DaysInMonths[1][10] = 31;
- DaysInMonths[1][11] = 30;
- DaysInMonths[1][12] = 31;
- }
-}
-
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-/* this function returns century and year from a CCYYMMDD date */
-int xbDate::CenturyOf( const char * Date8 ) const
-{
- char Century[3];
- Century[0] = Date8[0];
- Century[1] = Date8[1];
- Century[2] = 0x00;
- return( atoi( Century ));
-}
-
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-/* this function returns century and year from a CCYYMMDD date */
-int xbDate::YearOf( const char * Date8 ) const
-{
- char year[5];
- year[0] = Date8[0];
- year[1] = Date8[1];
- year[2] = Date8[2];
- year[3] = Date8[3];
- year[4] = 0x00;
- return( atoi( year ));
-}
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-/* this function returns the month from a CCYYMMDD date */
-int xbDate::MonthOf( const char * Date8 ) const
-{
- char month[3];
- month[0] = Date8[4];
- month[1] = Date8[5];
- month[2] = 0x00;
- return( atoi( month ));
-}
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-/* this function returns TRUE if a CCYYMMDD date is a leap year*/
-
-int xbDate::IsLeapYear( const char * Date8 ) const
-{
- int year;
- year = YearOf( Date8 );
- if(( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0 )
- return 1;
- else
- return 0;
-}
-
-/***************************************************************/
-//! Short description.
-/*!
- \param CalcYear
-*/
-/* this function returns TRUE if a CCYYMMDD date is a leap year*/
-
-int xbDate::CalcRollingCenturyForYear( int CalcYear ) const
-{
- /* this routine calculates a century for a year - it uses
- an 80/20 rolling date window to calculate the century */
-
- xbDate d;
- int ThisYear = YearOf( d.Sysdate() );
- int ThisCentury = CenturyOf( d.Sysdate() );
-
- ThisYear -= (ThisCentury * 100);
-
- if( ThisYear < 80 && CalcYear < (ThisYear+20) )
- return ThisCentury;
-
- else if( ThisYear >= 80 &&
- CalcYear < ThisYear &&
- CalcYear >= (ThisYear-80))
- return ThisCentury;
-
- else
- return ThisCentury - 1;
-}
-/***************************************************************/
-//! Short description.
-/*!
- \param Format
- \param Date8
-*/
-/* this function returns the "day of" from a CCYYMMDD date */
-
-/* format = XB_FMT_WEEK Number of day in WEEK 0-6 ( Sun - Sat )
- format = XB_FMT_MONTH Number of day in MONTH 1-31
- format = XB_FMT_YEAR Number of day in YEAR 1-366
-*/
-
-int xbDate::DayOf( int Format, const char * Date8 ) const
-{
- char day[3];
- int iday, imonth, iyear, iday2;
-
- /* check for valid format switch */
-
- if( Format!=XB_FMT_WEEK && Format!=XB_FMT_MONTH && Format!=XB_FMT_YEAR )
- return XB_INVALID_OPTION;
-
- if( Format == XB_FMT_WEEK )
- {
- iday = DayOf( XB_FMT_MONTH, Date8 );
- imonth = MonthOf( Date8 );
- iyear = YearOf ( Date8 );
-
- /* The following formula uses Zeller's Congruence to determine
- the day of the week */
-
- if( imonth > 2 ) /* init to February */
- imonth -= 2;
- else
- {
- imonth += 10;
- iyear--;
- }
-
- iday2 = ((13 * imonth - 1) / 5) +iday + ( iyear % 100 ) +
- (( iyear % 100 ) / 4) + ((iyear /100 ) / 4 ) - 2 *
- ( iyear / 100 ) + 77 ;
-
- return( iday2 - 7 * ( iday2 / 7 ));
- }
-
- else if( Format == XB_FMT_MONTH )
- {
- day[0] = Date8[6];
- day[1] = Date8[7];
- day[2] = 0x00;
- return( atoi( day ));
- }
- else
- return(
- AggregatedDaysInMonths[IsLeapYear(Date8)][MonthOf(Date8)-1]+
- DayOf(XB_FMT_MONTH, Date8));
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-/* this method sets the class date & returns the system date */
-
-xbString& xbDate::Sysdate()
-{
- char dt[9];
- time_t timer;
- struct tm *tblock;
- timer = time( NULL );
- tblock = localtime( &timer );
- tblock->tm_year += 1900;
- tblock->tm_mon++;
- sprintf( dt,"%4d%02d%02d",tblock->tm_year,tblock->tm_mon,tblock->tm_mday );
- dt[8] = 0x00;
- cDate8 = dt;
- return cDate8;
-}
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-/* this function checks a date for validity - returns 1 if OK */
-
-int xbDate::DateIsValid( const char * Date8 ) const
-{
- int year, month, day;
-
- if(!isdigit( Date8[0] ) || !isdigit( Date8[1] ) || !isdigit( Date8[2] ) ||
- !isdigit( Date8[3] ) || !isdigit( Date8[4] ) || !isdigit( Date8[5] ) ||
- !isdigit( Date8[6] ) || !isdigit( Date8[7] ) )
- return 0;
-
- year = YearOf ( Date8 );
- month = MonthOf( Date8 );
- day = DayOf ( XB_FMT_MONTH, Date8 );
-
- /* check the basics */
- if( year == 0 || month < 1 || month > 12 || day < 1 || day > 31 )
- return 0;
-
- /* April, June, September and November have 30 days */
- if(( month==4 || month==6 || month==9 || month==11 )&& day > 30 )
- return 0;
-
- /* check for February with leap year */
- if( month == 2 )
- if( IsLeapYear( Date8 ))
- {
- if( day > 29 )
- return 0;
- }
- else
- {
- if( day > 28 )
- return 0;
- }
- return 1;
-}
-
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-int xbDate::SetDate( const char * Date8 )
-{
- if( DateIsValid( Date8 ))
- {
- cDate8 = Date8;
- return 1;
- }
- return 0;
-}
-
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-/* this returns the number of days since 1/1/EPOCH_MIN */
-long xbDate::JulianDays( const char * Date8 ) const
-{
- int year = YearOf( Date8 );
- if(( year < EPOCH_MIN ) || (year >= EPOCH_MAX))
- return XB_INVALID_DATE;
-
- long days = 0;
- for (long y = EPOCH_MIN; y < year; y++ )
- days += 365 + ( ( ( y%4==0 && y%100!=0 ) || y%400==0 ) ? 1 : 0 );
-
- days += (long) DayOf( XB_FMT_YEAR, Date8 ) -1;
-
- return days;
-}
-/***************************************************************/
-//! Short description.
-/*!
- \param days
-*/
-/* this function does the opposite of the JulianDays function */
-/* it converts a julian based date into a Date8 format */
-
-xbString& xbDate::JulToDate8( long days )
-{
- char Date8[9];
- int year, leap, month;
-
- year = EPOCH_MIN;
- leap = 0; /* EPOCH_MIN of 100 is not a leap year */
-
-/* this while loop calculates the year of the date by incrementing
- the years counter as it decrements the days counter */
-
- while( days > ( 364+leap ))
- {
- days -= 365+leap;
- year++;
- if(( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0 )
- leap = 1;
- else
- leap = 0;
- }
-
-/* this for loop calculates the month and day of the date by
- comparing the number of days remaining to one of the tables */
-
- for( month = 12; month >= 1; month-- )
- if( days >= (long)AggregatedDaysInMonths[leap][month] ) {
- days -= AggregatedDaysInMonths[leap][month];
- break;
- }
-
- sprintf( Date8, "%4d%02d%02ld", year, month+1, days+1 );
-
- Date8[8] = 0x00;
- cDate8 = Date8;
- return cDate8;
-}
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-/* this routine returns a pointer to the day of the week(Sun-Sat)*/
-xbString& xbDate::CharDayOf( const char * Date8 )
-{
- struct tm tblock;
- char buf[25];
-
- tblock.tm_year = YearOf( Date8 ) - 1900;
- tblock.tm_mon = MonthOf( Date8 ) - 1;
- tblock.tm_mday = DayOf( XB_FMT_MONTH, Date8 );
- tblock.tm_hour = 0;
- tblock.tm_min = 0;
- tblock.tm_sec = 1;
- tblock.tm_isdst = -1;
- if( mktime( &tblock ) == -1 )
- fDate = "????";
- else
- {
- strftime( buf, 25, "%A", &tblock );
- fDate = buf;
- }
- return fDate;
-}
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-/* this routine returns a pointer to the month */
-
-xbString& xbDate::CharMonthOf( const char * Date8 )
-{
- struct tm tblock;
- char buf[25];
-
- tblock.tm_year = YearOf( Date8 ) - 1900;
- tblock.tm_mon = MonthOf( Date8 ) - 1;
- tblock.tm_mday = DayOf( XB_FMT_MONTH, Date8 );
- tblock.tm_hour = 0;
- tblock.tm_min = 0;
- tblock.tm_sec = 1;
- tblock.tm_isdst = -1;
- if( mktime( &tblock ) == -1 )
- fDate = "????";
- else
- {
- strftime( buf, 25, "%B", &tblock );
- fDate = buf;
- }
- return fDate;
-}
-
-/***************************************************************/
-//! Short description.
-/*!
- \param indate in the format of MM/DD/YY
-*/
-/* This function formats a date and returns a pointer to a */
-/* static buffer containing the date */
-
-xbString& xbDate::FormatCTODdate( const char * indate )
-{
- xbDate d;
- char cbuf[3];
- char odate[9];
- fDate = "";
- if( indate[0] == ' ' || indate[1] == ' ' ) // empty date
- return fDate;
-
- sprintf( cbuf, "%02d",
- d.CalcRollingCenturyForYear( atoi( indate+6 )));
- odate[0] = cbuf[0];
- odate[1] = cbuf[1];
- odate[2] = indate[6];
- odate[3] = indate[7];
- odate[4] = indate[0];
- odate[5] = indate[1];
- odate[6] = indate[3];
- odate[7] = indate[4];
- odate[8] = 0x00;
-
- fDate = odate;
- return fDate;
-}
-/***************************************************************/
-//! Short description.
-/*!
- \param Format
- \param Date8
-*/
-/* This function formats a date and returns a pointer to a */
-/* static buffer containing the date */
-
-xbString& xbDate::FormatDate( const char * Format, const char * Date8 )
-{
- const char *FmtPtr; /* format pointer */
- char *BufPtr; /* buffer pointer */
- char type;
- char cbuf[10];
- int type_ctr, i;
- char buf[50];
- xbString s;
-
- memset( buf, 0x00, 50 );
- if( strstr( Format, "YYDDD" ))
- {
- buf[0] = Date8[2];
- buf[1] = Date8[3];
- sprintf( buf+2, "%03d", DayOf( XB_FMT_YEAR, Date8 ));
- }
- else
- {
- BufPtr = buf;
- FmtPtr = Format;
- memset( cbuf, 0x00, 10 );
- while( *FmtPtr )
- {
- if( *FmtPtr != 'D' && *FmtPtr != 'M' && *FmtPtr != 'Y' )
- {
- *BufPtr = *FmtPtr;
- BufPtr++;
- FmtPtr++;
- }
- else
- {
- type = *FmtPtr;
- type_ctr = 0;
- while( *FmtPtr == type )
- {
- type_ctr++;
- FmtPtr++;
- }
- switch( type )
- {
- case 'D':
- if( type_ctr == 1 )
- {
- sprintf( cbuf, "%d", DayOf( XB_FMT_MONTH, Date8 ));
- strcat( buf, cbuf );
- BufPtr += strlen( cbuf );
- }
- else if( type_ctr == 2 )
- {
- cbuf[0] = Date8[6];
- cbuf[1] = Date8[7];
- cbuf[2] = 0x00;
- strcat( buf, cbuf );
- BufPtr += 2;
- }
- else
- {
- s = CharDayOf( Date8 );
- if( type_ctr == 3 )
- {
- strncat( buf, s.getData(), 3 );
- BufPtr += 3;
- }
- else
- {
- strcpy( cbuf, CharDayOf( Date8 ));
- for( i = 0; i < 9; i++ )
- if( cbuf[i] == 0x20 ) cbuf[i] = 0x00;
- strcat( buf, cbuf );
- BufPtr += strlen( cbuf );
- }
- }
- break;
-
- case 'M':
- if( type_ctr == 1 )
- {
- sprintf( cbuf, "%d", MonthOf( Date8 ));
- strcat( buf, cbuf );
- BufPtr += strlen( cbuf );
- }
- else if( type_ctr == 2 )
- {
- cbuf[0] = Date8[4];
- cbuf[1] = Date8[5];
- cbuf[2] = 0x00;
- strcat( buf, cbuf );
- BufPtr += 2;
- }
- else
- {
- s = CharMonthOf( Date8 );
- if( type_ctr == 3 )
- {
- strncat( buf, s.getData(), 3 );
- BufPtr += 3;
- }
- else
- {
- strcpy( cbuf, CharMonthOf( Date8 ));
- for( i = 0; i < 9; i++ )
- if( cbuf[i] == 0x20 ) cbuf[i] = 0x00;
- strcat( buf, cbuf );
- BufPtr += strlen( cbuf );
- }
- }
- break;
-
- case 'Y':
- if( type_ctr == 2 )
- {
- cbuf[0] = Date8[2];
- cbuf[1] = Date8[3];
- cbuf[2] = 0x00;
- strcat( buf, cbuf );
- BufPtr += 2;
- }
- else if( type_ctr == 4 )
- {
- cbuf[0] = Date8[0];
- cbuf[1] = Date8[1];
- cbuf[2] = Date8[2];
- cbuf[3] = Date8[3];
- cbuf[4] = 0x00;
- strcat( buf, cbuf );
- BufPtr += 4;
- }
- break;
-
- default:
- break;
- }
- }
- }
- }
- fDate = buf;
- return fDate;
-}
-/***************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-/* this routine returns the Date8 format of the last day of the
- month for the given input Date8 */
-
-xbString & xbDate::LastDayOfMonth( const char * Date8 )
-{
- char tmp[9];
- sprintf( tmp, "%4.4d%2.2d%2.2d",
- YearOf( Date8 ), MonthOf( Date8 ),
- DaysInMonths[IsLeapYear(Date8)][MonthOf(Date8)]);
- cDate8 = tmp;
- return cDate8;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-xbString &xbDate::operator+=( int count )
-{
- JulToDate8( JulianDays() + count );
- return cDate8;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-xbString &xbDate::operator-=( int count )
-{
- JulToDate8( JulianDays() - count );
- return cDate8;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-xbString &xbDate::operator++( int )
-{
- *this+=1;
- return cDate8;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-xbString &xbDate::operator--( int )
-{
- *this-=1;
- return cDate8;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-xbString &xbDate::operator+( int count )
-{
- xbDate d( GetDate() );
- d+=count;
- fDate = d.GetDate();
- return fDate;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-xbString &xbDate::operator-( int count )
-{
- xbDate d( GetDate() );
- d-=count;
- fDate = d.GetDate();
- return fDate;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-long xbDate::operator-( const xbDate & d ) const
-{
- return JulianDays() - d.JulianDays();
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-int xbDate::operator==( const xbDate & d ) const
-{
- if( JulianDays() == d.JulianDays() )
- return 1;
- else
- return 0;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-int xbDate::operator!=( const xbDate & d ) const
-{
- if( JulianDays() != d.JulianDays() )
- return 1;
- else
- return 0;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-int xbDate::operator<( const xbDate & d ) const
-{
- if( JulianDays() < d.JulianDays() )
- return 1;
- else
- return 0;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-int xbDate::operator>( const xbDate & d ) const
-{
- if( JulianDays() > d.JulianDays() )
- return 1;
- else
- return 0;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-int xbDate::operator<=( const xbDate & d ) const
-{
- if( JulianDays() <= d.JulianDays() )
- return 1;
- else
- return 0;
-}
-/**********************************************************************/
-//! Short description.
-/*!
-*/
-int xbDate::operator>=( const xbDate & d ) const
-{
- if( JulianDays() >= d.JulianDays() )
- return 1;
- else
- return 0;
-}
-/**********************************************************************/
diff --git a/xbase64/xbdate.h b/xbase64/xbdate.h
deleted file mode 100755
index 617fe50..0000000
--- a/xbase64/xbdate.h
+++ /dev/null
@@ -1,278 +0,0 @@
-/* xbdate.h
-
- Xbase64 project source code
-
- This file contains a header file for the xbDate object, which is
- used for handling dates.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-/*! \file xbdate.h
-*/
-
-#ifndef __XB_XBDATE_H__
-#define __XB_XBDATE_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbstring.h>
-
-#define XB_FMT_WEEK 1
-#define XB_FMT_MONTH 2
-#define XB_FMT_YEAR 3
-
-//! xbDate class
-/*!
-*/
-
-class XBDLLEXPORT xbDate {
- public:
- xbDate();
- xbDate( const char * Date8 );
- xbDate( const xbString &Date8 );
- virtual ~xbDate();
-
- //! Short description.
- /*!
- */
- const xbString & GetDate() const
- { return cDate8; };
- //! Short description.
- /*!
- */
- xbString & GetDate()
- { return cDate8; };
- //! Short description.
- /*!
- */
- const xbString & GetFormattedDate() const
- { return fDate; };
- //! Short description.
- /*!
- */
- xbString & GetFormattedDate()
- { return fDate; };
-
- int SetDate( const char * Date8 );
- //! Short description.
- /*!
- */
- int SetDate( const xbString & Date8 )
- { return SetDate((const char *) Date8 ); };
-
- long JulianDays ( const char *Date8 ) const;
- //! Short description.
- /*!
- */
- long JulianDays ( const xbString & Date8 ) const
- { return JulianDays((const char *) Date8 ); };
- //! Short description.
- /*!
- */
- long JulianDays () const
- { return JulianDays((const char *) cDate8 ); };
-
- int YearOf ( const char *Date8 ) const;
- //! Short description.
- /*!
- */
- int YearOf ( const xbString & Date8 ) const
- { return YearOf((const char *) Date8 ); };
- //! Short description.
- /*!
- */
- int YearOf () const
- { return YearOf((const char *) cDate8 ); };
-
- //! Short description.
- /*!
- */
- int CenturyOf ( const char *Date8 ) const;
-
- int MonthOf ( const char *Date8 ) const;
- //! Short description.
- /*!
- */
- int MonthOf ( const xbString &Date8 ) const
- { return MonthOf((const char *) Date8 ); };
- //! Short description.
- /*!
- */
- int MonthOf () const
- { return MonthOf(( const char *) cDate8 ); };
-
- int DayOf ( int Format, const char *Date8 ) const;
- //! Short description.
- /*!
- */
- int DayOf ( int Format, const xbString &Date8 ) const
- { return DayOf( Format, (const char *) Date8 ); };
- //! Short description.
- /*!
- */
- int DayOf ( int Format ) const
- { return DayOf( Format, (const char *) cDate8 ); };
-
- int IsLeapYear ( const char *Date8 ) const;
- //! Short description.
- /*!
- */
- int IsLeapYear ( const xbString &Date8 ) const
- { return IsLeapYear((const char *) Date8 ); };
- //! Short description.
- /*!
- */
- int IsLeapYear () const
- { return IsLeapYear((const char *) cDate8 ); };
-
- //! Short description.
- /*!
- */
- int CalcRollingCenturyForYear( int ) const;
-
-
- int DateIsValid ( const char *Date8 ) const;
- //! Short description.
- /*!
- */
- int DateIsValid ( const xbString & Date8 ) const
- { return DateIsValid( (const char *) Date8 ); };
-
- xbString& LastDayOfMonth( const char *Date8 );
- //! Short description.
- /*!
- */
- xbString& LastDayOfMonth( const xbString & Date8 )
- { return LastDayOfMonth((const char *) Date8 ); };
- //! Short description.
- /*!
- */
- xbString& LastDayOfMonth()
- { return LastDayOfMonth((const char *) cDate8 ); };
-
- xbString& Sysdate ();
- xbString& JulToDate8( long );
-
- //! Short description.
- /*!
- */
- xbString& FormatCTODdate( const char * indate );
-
- //! Short description.
- /*!
- */
- xbString& FormatDate( const char *Format, const char *Date8 );
- //! Short description.
- /*!
- */
- xbString& FormatDate( const xbString &Format, const char *Date8 )
- { return FormatDate((const char *) Format, Date8 ); };
- //! Short description.
- /*!
- */
- xbString& FormatDate( const char *Format, const xbString &Date8 )
- { return FormatDate( Format, (const char *) Date8 ); };
- //! Short description.
- /*!
- */
- xbString& FormatDate( const xbString &Format, const xbString &Date8 )
- { return FormatDate((const char *) Format,(const char *) Date8 ); };
- //! Short description.
- /*!
- */
- xbString& FormatDate( const char *Format )
- { return FormatDate( (const char *) Format, (const char *) cDate8 ); };
- //! Short description.
- /*!
- */
- xbString& FormatDate( const xbString &Format )
- { return FormatDate((const char *) Format, (const char *) cDate8 ); };
-
- xbString& CharDayOf ( const char *Date8 );
- //! Short description.
- /*!
- */
- xbString& CharDayOf ( const xbString &Date8 )
- { return CharDayOf((const char *) Date8 ); };
- //! Short description.
- /*!
- */
- xbString& CharDayOf ()
- { return CharDayOf((const char *) cDate8 ); };
-
- xbString& CharMonthOf ( const char *Date8 );
- //! Short description.
- /*!
- */
- xbString& CharMonthOf ( const xbString &Date8 )
- { return CharMonthOf(( const char *) Date8 ); };
- //! Short description.
- /*!
- */
- xbString& CharMonthOf ()
- { return CharMonthOf(( const char *) cDate8 ); };
-
- xbString &operator+=( int );
- xbString &operator-=( int );
- xbString &operator++( int ); /* post increment */
- xbString &operator--( int ); /* post increment */
- xbString &operator+ ( int );
- xbString &operator- ( int );
- long operator-( const xbDate & ) const;
- int operator==( const xbDate & ) const;
- int operator!=( const xbDate & ) const;
- int operator< ( const xbDate & ) const;
- int operator> ( const xbDate & ) const;
- int operator<=( const xbDate & ) const;
- int operator>=( const xbDate & ) const;
-
- protected:
- void SetDateTables();
- xbString cDate8; /* CCYYMMDD date format */
- xbString fDate; /* other date format */
- static int AggregatedDaysInMonths[2][13];
- static int DaysInMonths[2][13];
-};
-
-#endif // __XB_XBDATE_H__
-
diff --git a/xbase64/xbdbf.cpp b/xbase64/xbdbf.cpp
deleted file mode 100755
index d3790cb..0000000
--- a/xbase64/xbdbf.cpp
+++ /dev/null
@@ -1,2671 +0,0 @@
-/* xbdbf.cpp
-
- Xbase64 project source code
-
- This file contains the basic Xbase routines for reading and writing
- Xbase .DBF files.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xbdbf.h"
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-
-#ifdef HAVE_IO_H
-#include <io.h>
-#endif
-#include <errno.h>
-
-/*! \file xbdbf.cpp
-*/
-
-/************************************************************************/
-//! Constructor
-/*!
- \param x pointer to the global xbXbase class
-*/
-xbDbf::xbDbf( xbXBase * x )
-{
- xbase = x;
- InitVars();
-}
-/************************************************************************/
-//! Destructor
-/*!
-*/
-xbDbf::~xbDbf()
-{
- CloseDatabase(true);
-}
-/************************************************************************/
-//! Initialize private data members.
-/*!
- Internal use only.
-*/
-void xbDbf::InitVars()
-{
- SetFileName(NULL);
- NoOfFields = 0;
- DbfStatus = XB_CLOSED;
- fp = NULL;
- CurRec = 0L;
- SchemaPtr = NULL;
- RecBuf = NULL;
- RecBuf2 = NULL;
- Version = 0x00;
- UpdateYY = 0x00;
- UpdateMM = 0x00;
- UpdateDD = 0x00;
- NoOfRecs = 0L;
- HeaderLen = 0x00;
- RecordLen = 0x00;
- NdxList = NULL;
- FreeIxList = NULL;
- XFV = 3; /* Xbase file version */
-
-#ifdef XB_LOCKING_ON
- xblfh = NULL; /* lock file for XB_XBASE_LOCK_MODE */
- LockMode = xbase->GetLockMode();
- TableLockCnt = 0;
- IndexLockCnt = 0;
-#ifdef XB_MEMO_FIELDS
- MemoLockCnt = 0;
-#endif
-
- AutoLock = 1;
- CurLockType = -1;
- CurLockCount = 0;
- CurLockedRecNo = 0L;
- CurRecLockType = -1;
- CurRecLockCount = 0;
- CurMemoLockType = -1;
- CurMemoLockCount = 0;
-#else
- AutoLock = 0;
-#endif
-
-#ifdef XB_MEMO_FIELDS
- MemofileName = "";
- MemoHeader.BlockSize = XB_DBT_BLOCK_SIZE;
- MemoHeader.Version = 0x03;
- mfp = NULL;
- mbb = NULL;
- CurMemoBlockNo = -1;
- mfield1 = 0;
- MStartPos = 0;
- MFieldLen = 0;
- NextFreeBlock = 0L;
- FreeBlockCnt = 0L;
- MNextBlockNo = 0L;
- MNoOfFreeBlocks = 0L;
-#endif
-
-//#ifdef XB_REAL_DELETE
- RealDelete = 0;
- FirstFreeRec = 0L;
- RealNumRecs = 0L;
-//#endif
-}
-/************************************************************************/
-//! Set dbase version for the dbf file.
-/*!
- Set dbase version. Should only be used before creating a database with
- xbDbf::CreateDatabase().
-
- \param v version, either 3 or 4.
-*/
-xbShort xbDbf::SetVersion(xbShort v) {
- if (v == 0)
- return XFV;
- else
- if(v == 3) {
- XFV = 3;
-#ifdef XB_MEMO_FIELDS
- MemoHeader.Version = 0x03;
-#endif
- return XFV;
- } else
- if (v == 4) {
- XFV = 4;
-#ifdef XB_MEMO_FIELDS
- MemoHeader.Version = 0x00;
-#endif
- return XFV;
- }
-
- return XB_INVALID_OPTION;
-}
-/************************************************************************/
-//! Write the dbf header
-/*!
- Internal use only.
-
- \param PositionOption flag that indicates whether file postition should
- be moved. non-zero if so, zero if not.
-*/
-xbShort xbDbf::WriteHeader( xbShort PositionOption )
-{
- char buf[32];
- memset(buf, 0, 32);
- if(PositionOption)
- rewind(fp);
-
- memcpy(&buf[0], &Version, 4);
- xbase->PutLong(&buf[4], NoOfRecs);
- xbase->PutShort(&buf[8], HeaderLen );
- xbase->PutShort(&buf[10], RecordLen );
-
-#ifdef XB_REAL_DELETE
- if(RealDelete){
- xbase->PutULong(&buf[12], FirstFreeRec);
- xbase->PutULong(&buf[16], RealNumRecs);
- }
-#endif
- if(fwrite(buf, 32, 1, fp) != 1)
- return XB_WRITE_ERROR;
-
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Read the dbf header.
-/*!
- Internal use only.
-
- \param PositionOption
-*/
-xbShort xbDbf::ReadHeader( xbShort PositionOption )
-{
-#if 0
- char buf[4];
- if (PositionOption)
- rewind(fp);
- if (fread(&Version, 4, 1, fp) != 1)
- xb_error(XB_READ_ERROR);
-
- if (fread(buf, 4, 1, fp ) != 1)
- xb_error(XB_READ_ERROR);
-
- NoOfRecs = xbase->GetLong( buf );
- if(fread(buf, 2, 1, fp) != 1)
- xb_error(XB_READ_ERROR);
-
- HeaderLen = xbase->GetShort( buf );
- if(fread(buf, 2, 1, fp) != 1)
- xb_error(XB_READ_ERROR);
-
- RecordLen = xbase->GetShort(buf);
-
-#ifdef XB_REAL_DELETE
- if(RealDelete)
- {
- if (fread(buf, 4, 1, fp ) != 1)
- xb_error(XB_READ_ERROR);
- FirstFreeRec = xbase->GetULong( buf );
-
- if (fread(buf, 4, 1, fp ) != 1)
- xb_error(XB_READ_ERROR);
- RealNumRecs = xbase->GetULong( buf );
- }
-#endif
-#else
- char buf[32];
-
- if(PositionOption)
- rewind(fp);
-
- if(fread(buf, 32, 1, fp) != 1)
- return XB_READ_ERROR;
-
- memcpy(&Version, buf, 4);
- NoOfRecs = xbase->GetLong(&buf[4]);
- HeaderLen = xbase->GetShort(&buf[8]);
- RecordLen = xbase->GetShort(&buf[10]);
-
-#ifdef XB_REAL_DELETE
- if(RealDelete)
- {
- FirstFreeRec = xbase->GetULong(&buf[12]);
- RealNumRecs = xbase->GetULong(&buf[16]);
- }
-#endif
-#endif
-
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Determine if file name suffix is missing
-/*!
- Internal use only.
-*/
-xbShort xbDbf::NameSuffixMissing( xbShort type, const char * name )
-{
- /* type 1 is DBF check
- type 2 is NDX check
- type 3 is MDX check
- type 4 is NTX check
-
- Returns 0 if suffix found
- 1 if suffix not found, lower case
- 2 is suffix not found, upper, case
-*/
-
- xbShort len;
-
- len = strlen( name );
- if( len <= 4 )
- if( name[len-1] >= 'A' && name[len-1] <= 'Z' )
- return 2;
- else
- return 1;
-
- if( type == 1 && name[len-4] == '.' &&
- ( name[len-3] == 'd' || name[len-3] == 'D' ) &&
- ( name[len-2] == 'b' || name[len-2] == 'B' ) &&
- ( name[len-1] == 'f' || name[len-1] == 'F' )
- )
- return 0;
-
- if( type == 2 && name[len-4] == '.' &&
- ( name[len-3] == 'n' || name[len-3] == 'N' ) &&
- ( name[len-2] == 'd' || name[len-2] == 'D' ) &&
- ( name[len-1] == 'x' || name[len-1] == 'X' )
- )
- return 0;
-
- if( type == 4 && name[len-4] == '.' &&
- ( name[len-3] == 'n' || name[len-3] == 'N' ) &&
- ( name[len-2] == 't' || name[len-2] == 'T' ) &&
- ( name[len-1] == 'x' || name[len-1] == 'X' )
- )
- return 0;
-
- if( name[len-5] >= 'A' && name[len-5] <= 'Z' )
- return 2;
- else
- return 1;
-}
-/************************************************************************/
-//! Create the dbf file.
-/*!
- This method attempts to create the DBF file with the specified
- name (TableName) and schema (xbSchema s). The OverLay switch is used to determine
- if an existing file should be overwritten or an error flagged if the
- file already exists. The record buffer is blanked (set to spaces).
-
- \param TableName name of the table
- \param s xbSchema
- \param Overlay One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>OverLay</th><th>Description</th></tr>
- <tr><td>XB_OVERLAY</td><td>Overwrite existing file if it exists</td></tr>
- <tr><td>XB_DONTOVERLAY</td><td>Report an error if file exists</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{OverLay} & \textbf{Description} \\ \hline \hline
- XB\_OVERLAY & Overwrite existing file if it exists \\ \hline
- XB\_DONTOVERLAY & Report an error if file exists \\ \hline
- \end{tabular}
- \endlatexonly
- \returns One of the following return codes:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_FILE_EXISTS</td><td>If the file exists and OverLay is XB_DONTOVERLAY</td></tr>
- <tr><td>XB_OPEN_ERROR</td><td>Couldn't open the file</td></tr> <tr><td>XB_NO_MEMORY</td><td>Memory allocation error</td></tr>
- <tr><td>XB_WRITE_ERROR</td><td>Couldn't write to disk</td><tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No Error \\ \hline
- XB\_FILE\_EXISTS & If the file exists and OverLay is XB\_DONTOVERAY \\ \hline
- XB\_OPEN\_ERROR & Couldn't open the file \\ \hline
- XB\_WRITE\_ERROR & Couldn't write to disk \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::CreateDatabase( const char * TableName, xbSchema * s,
- const xbShort Overlay )
-{
- xbShort i, j, k, k2, rc; /* , count; */
-
-#ifdef XB_MEMO_FIELDS
- xbShort MemoSw = 0;
-#endif
-
- DbfStatus = XB_CLOSED;
- SetFileName( TableName );
-
- /* check if the file already exists */
- if((( fp = fopen( GetFileName(), "r" )) != NULL ) && !Overlay ){
- fclose( fp );
- return XB_FILE_EXISTS;
- }
- else if( fp ) fclose( fp );
-
- if(( fp = fopen( GetFileName(), "w+b" )) == NULL )
- return XB_OPEN_ERROR;
-
-#ifdef XB_LOCKING_ON
- /* no buffering in multi user mode */
- setbuf( fp, NULL );
-
- /* open the lock file if XB_XBASE_LOCK_FLAVOR */
-// if( LockMode == XB_XBASE_LOCK_MODE )
-// if(( rc = OpenXbLockFile()) != XB_NO_ERROR )
-// return rc;
-#endif
-
- /* count the number of fields and check paramaters */
- i = 0;
- while( s[i].Type != 0 ){
- NoOfFields++;
-
-#ifdef XB_MEMO_FIELDS
- if(s[i].Type == 'M'){
- s[i].FieldLen = 10;
- s[i].NoOfDecs = 0;
- }
-#endif /* XB_MEMO_FIELDS */
-
- if(s[i].Type == 'D'){
- s[i].FieldLen = 8;
- s[i].NoOfDecs = 0;
- }
-
- if(s[i].Type == 'C')
- s[i].NoOfDecs = 0;
-
- RecordLen += s[i].FieldLen;
-
- if( s[i].Type != 'C' &&
- s[i].Type != 'N' &&
- s[i].Type != 'F' &&
- s[i].Type != 'D' &&
-#ifdef XB_MEMO_FIELDS
- s[i].Type != 'M' &&
-#endif /* XB_MEMO_FIELDS */
- s[i].Type != 'L' )
- {
- fclose( fp );
- InitVars();
- return XB_UNKNOWN_FIELD_TYPE;
- }
-
-#ifdef XB_MEMO_FIELDS
-// 8/18/03 types B and O dont exist yet - gkunkel
-// if( !MemoSw && ( s[i].Type=='M' || s[i].Type=='B' || s[i].Type=='O'))
- if( !MemoSw && ( s[i].Type=='M' ))
- MemoSw++;
-#endif
-
-// check for numeric fields which are too long
- if((s[i].Type == 'N' || s[i].Type == 'F') && s[i].FieldLen > 19 ){
- fclose( fp );
- InitVars();
- return XB_INVALID_FIELD_LEN;
- }
- i++;
- }
- RecordLen++; /* add one byte for 0x0D */
-
- if(( RecBuf = (char *) malloc( RecordLen )) == NULL ){
- fclose( fp );
- InitVars();
- return XB_NO_MEMORY;
- }
-
- if(( RecBuf2 = (char *) malloc( RecordLen )) == NULL ){
- free( RecBuf );
- fclose( fp );
- InitVars();
- return XB_NO_MEMORY;
- }
-
- /* BlankRecord(); */
- memset( RecBuf, 0x20, RecordLen );
- memset( RecBuf2, 0x20, RecordLen );
-
- /* set class variables */
- Version = XFV & 0x7; // file version - bit 0-2
-#ifdef XB_MEMO_FIELDS
- if(MemoSw){
- if((XFV & 0x7) == 3)
- Version |= 0x80; // memo presence - bit 7
- else
- Version = (char) 0x8b;
- }
-#endif
-
- CurRec = 0L;
- HeaderLen = 33 + NoOfFields * 32;
- xbDate d;
- UpdateYY = (d.YearOf() - 1900);
- if((XFV & 0x7) == 3)
- UpdateYY %= 100; // dBASE III seems to do this, but IV does not. DTB
-
- UpdateMM = d.MonthOf();
- UpdateDD = d.DayOf( XB_FMT_MONTH );
-
- /* write the header prolog */
- if(( rc = WriteHeader( 0 )) != XB_NO_ERROR ){
- free( RecBuf );
- free( RecBuf2 );
- fclose( fp );
- InitVars();
- return XB_WRITE_ERROR;
- }
-
- if((SchemaPtr=(xbSchemaRec *)malloc(NoOfFields*sizeof(xbSchemaRec)))==NULL){
- free( RecBuf );
- free( RecBuf2 );
- fclose( fp );
- InitVars();
- return XB_NO_MEMORY;
- }
- memset( SchemaPtr, 0x00, ( NoOfFields * sizeof(xbSchemaRec)));
-
- /* write the field information into the header */
- for( i = 0, k = 1; i < NoOfFields; i++ ){
- memset( SchemaPtr[i].FieldName, 0x00, 11 );
- strncpy( SchemaPtr[i].FieldName, s[i].FieldName, 10 );
-
- SchemaPtr[i].Type = s[i].Type;
- SchemaPtr[i].FieldLen = s[i].FieldLen;
- SchemaPtr[i].NoOfDecs = s[i].NoOfDecs;
-
- if( SchemaPtr[i].NoOfDecs > SchemaPtr[i].FieldLen ) {
- fclose( fp );
- free( SchemaPtr );
- free( RecBuf );
- free( RecBuf2 );
- InitVars();
- return XB_INVALID_SCHEMA;
- }
-
- k2 = k;
- k += SchemaPtr[i].FieldLen;
-
- if(( fwrite( &SchemaPtr[i], 1, 18, fp )) != 18 ) {
- fclose( fp );
- free( SchemaPtr );
- free( RecBuf );
- free( RecBuf2 );
- InitVars();
- return XB_WRITE_ERROR;
- }
-
- for( j = 0; j < 14; j++ ) {
- if(( fwrite( "\x00", 1, 1, fp )) != 1 ) {
- free( SchemaPtr );
- free( RecBuf );
- free( RecBuf2 );
- fclose( fp );
- InitVars();
- return XB_WRITE_ERROR;
- }
- }
- SchemaPtr[i].Address = RecBuf + k2;
- SchemaPtr[i].Address2 = RecBuf2 + k2;
- }
-
- /* write the header terminator */
- if(( fputc( XB_CHARHDR, fp )) != XB_CHARHDR ){
- fclose( fp );
- free( SchemaPtr );
- free( RecBuf );
- free( RecBuf2 );
- InitVars();
- return XB_WRITE_ERROR;
- }
-
-#ifdef XB_MEMO_FIELDS
- if( MemoSw )
- if((rc = CreateMemoFile()) != XB_NO_ERROR){
- fclose(fp);
- free(RecBuf);
- free(RecBuf2);
- InitVars();
- return rc;
- }
-#endif
-
- DbfStatus = XB_OPEN;
- return xbase->AddDbfToDbfList(this, GetFileName());
-}
-/************************************************************************/
-//! Close the dbf file.
-/*!
- This method attempts to close the DBF file which was previously
- opened with either CreateDatabase() or OpenDatabase(). Deletes any
- memory allocated. Automatically closes any open indexes associated
- with this data file.
-
- \param deleteIndexes if TRUE, the indexes (xbIndex instances) will also
- be deleted (index files will not be deleted)
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_NOT_OPEN</td><td>File was not open</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No Error \\ \hline
- XB\_NOT\_OPEN\_ERROR & File was not open \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::CloseDatabase( xbBool deleteIndexes )
-{
-#if defined(XB_INDEX_ANY)
- xbIxList *i, *ti;
-#endif
-
- if(DbfStatus == XB_CLOSED)
- return XB_NO_ERROR;
-
-
-#if defined(XB_INDEX_ANY)
- i = NdxList;
- while (i){
- i->index->CloseIndex();
- if(deleteIndexes)
- delete i->index;
- i = NdxList;
- }
-/* free up unused nodes */
- i = FreeIxList;
- while( i ) {
- ti = i;
- i = i->NextIx;
- free(ti);
- }
-#endif
-
- if(SchemaPtr){
- for( int j = 0; j < NoOfFields; j++ )
- if( SchemaPtr[j].fp ) delete SchemaPtr[j].fp;
- free( SchemaPtr );
- }
- if(RecBuf)
- free( RecBuf );
- if(RecBuf2)
- free( RecBuf2 );
-
-#ifdef XB_MEMO_FIELDS
- if( mbb )
- free( mbb ); /* memo block buffer */
- if( mfp )
- fclose( mfp ); /* memo file pointer */
-#endif
-
-#ifdef XB_LOCKING_ON
- if( xblfh ){
- fclose( xblfh );
- xblfh = NULL;
- }
-#endif
-
- xbase->RemoveDbfFromDbfList( this );
- if(fp)
- fclose( fp );
- InitVars();
- return XB_NO_ERROR;
-}
-/************************************************************************/
-/* options 1 = Print header only
- 2 = Field data only
- 3 = Header and Field data */
-
-//! Dump header information.
-/*!
- \param Option One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Option</th><th>Description</th></tr>
- <tr><td>1</td><td>Print header only</td></tr>
- <tr><td>2</td><td>Field data only</td></tr>
- <tr><td>3</td><td>Header and field data</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Option} & \textbf{Description} \\ \hline \hline
- 1 & Header only \\ \hline
- 2 & Field data only \\ \hline
- 3 & Header and field data \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-#ifdef XBASE_DEBUG
-xbShort xbDbf::DumpHeader( xbShort Option )
-{
- int i;
-
- if( Option < 1 || Option > 3 )
- return XB_INVALID_OPTION;
-
- if( DbfStatus == XB_CLOSED )
- return XB_NOT_OPEN;
-
- std::cout << "\nDatabase file " << GetFileName() << std::endl << std::endl;
-
- if( Option != 2 ){
- std::cout << "File header data:" << std::endl;
- if( Version == 3 )
- std::cout << "Dbase III file" << std::endl;
- else if ( Version == 83 )
- std::cout << "Dbase III file with memo fields" << std::endl << std::endl;
-
- std::cout << "Last update date = "
- << (int) UpdateMM << "/" << (int) UpdateDD << "/" << (int) UpdateYY % 100 << std::endl;
-
- std::cout << "Header length = " << HeaderLen << std::endl;
- std::cout << "Record length = " << RecordLen << std::endl;
- std::cout << "Records in file = " << NoOfRecs << std::endl << std::endl;
-#ifdef XB_REAL_DELETE
- std::cout << "First Free Rec = " << FirstFreeRec << std::endl << std::endl;
-#endif
- }
- if( Option != 1 ){
- std::cout << "Field Name Type Length Decimals" << std::endl;
- std::cout << "---------- ---- ------ --------" << std::endl;
- for( i = 0; i <NoOfFields; i++ ){
- if( SchemaPtr[i].Type == 'C' && SchemaPtr[i].NoOfDecs > 0 )
- printf( "%10s %1c %4d %4d\n", SchemaPtr[i].FieldName,
- SchemaPtr[i].Type, SchemaPtr[i].FieldLen, 0 );
- else
- printf( "%10s %1c %4d %4d\n", SchemaPtr[i].FieldName,
- SchemaPtr[i].Type, SchemaPtr[i].FieldLen, SchemaPtr[i].NoOfDecs );
- }
- }
- std::cout << std::endl;
- return XB_NO_ERROR;
-}
-#endif
-/************************************************************************/
-//! Open the DBF file.
-/*!
- This method attempts to open the DBF file with the specified
- name (TableName). This method does not position to any particular
- record in the file. The record buffer is blanked (set to spaces).
-
- \param TableName Name of table to open
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_OPEN_ERROR</td><td>Couldn't open file</td></tr>
- <tr><td>XB_NO_MEMORY</td><td>Memory allocation error</td></tr>
- <tr><td>XB_NOT_XBASE</td><td>Not an DBF file</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_OPEN\_ERROR & Couldn't open file \\ \hline
- XB\_NO\_MEMORY & Memory allocation error \\ \hline
- XB\_NOT\_XBASE & Not an DBF file \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::OpenDatabase( const char * TableName )
-{
- xbShort i, j, rc;
- char buf[33];
- char *p;
-
-#ifdef XB_MEMO_FIELDS
- xbShort MemoSw = 0;
-#endif
-
- /* verify the file is not already open */
- if( DbfStatus != XB_CLOSED )
- return XB_ALREADY_OPEN;
-
- /* copy the file name to the class variable */
- SetFileName( TableName );
-
- /* open the file */
- if(( fp = fopen(GetFileName(), "r+b")) == NULL ){
- //
- // Try to open read only if failed to open read/write
- //
- if(( fp = fopen(GetFileName(), "rb")) == NULL )
- return XB_OPEN_ERROR;
- }
-
-#ifdef XB_LOCKING_ON
- /* no buffering in multi user mode - may not see what others have updated */
- setbuf( fp, NULL );
-
- /* open the lock file if XB_XBASE_LOCK_MODE */
-// if( LockMode == XB_XBASE_LOCK_MODE )
-// if(( rc = OpenXbLockFile()) != XB_NO_ERROR )
-// return rc;
-#endif
-
-#ifdef XB_LOCKING_ON
-// if( AutoLock )
-// if(( rc = LockDatabase( XB_LOCK, 0L )) != XB_NO_ERROR)
-// return rc;
-#endif
-
- /* copy the header into memory */
- if(( rc = ReadHeader( 1 )) != XB_NO_ERROR ){
- InitVars();
- return rc;
- }
-
- /* check the version */
- if( Version == 3 || Version == (char)0x83 ){ /* dBASE III+ */
- XFV = 3;
-#ifdef XB_MEMO_FIELDS
- MemoHeader.Version = 0x03;
-#endif
- }
- else if( Version == 4 || Version == (char)0x8B ){ /* dBASE IV */
- XFV = 4;
-#ifdef XB_MEMO_FIELDS
- MemoHeader.Version = 0x00;
-#endif
- }
- else if( Version == (char)0xf5 ){ /* FoxPro */
- XFV = 4;
-#ifdef XB_MEMO_FIELDS
- MemoHeader.Version = 0x00;
-#endif
- }
- else if( Version == (char)0x30 ){ /* Visual Foxpro */
- XFV = 4;
-#ifdef XB_MEMO_FIELDS
- MemoHeader.Version = 0x00;
-#endif
- } else {
- InitVars();
- return XB_NOT_XBASE;
- }
-
- // it would seem that dBASE III+ generates an UpdateYY value
- // of 0 for 2000 and dBASE IV uses 100, so I have removed the
- // check for UpdateYY being 0 (which might be valid). DTB
-
- // Not all flavors of database tools use these fields
- // Found a month set to 0 in valid dbf file
- // Commented out this check 2/11/06 - GAK
-
- // if( UpdateMM == 0 || UpdateDD == 0 ){
- // InitVars();
- // return XB_NOT_XBASE;
- // }
-
- /* calculate the number of fields */
- if( Version == (char)0x30 ) {
- NoOfFields = ( HeaderLen - 296 ) / 32 ;
- } else {
- NoOfFields = ( HeaderLen - 33 ) / 32;
- }
-
- if(( RecBuf = (char *) malloc( RecordLen )) == NULL ) {
- fclose( fp );
- InitVars();
- return XB_NO_MEMORY;
- }
- if(( RecBuf2 = (char *) malloc( RecordLen )) == NULL ) {
- fclose( fp );
- free( RecBuf );
- InitVars();
- return XB_NO_MEMORY;
- }
-
- if((SchemaPtr=(xbSchemaRec *)malloc(NoOfFields*sizeof(xbSchemaRec)))==NULL){
- free( RecBuf );
- free( RecBuf2 );
- fclose( fp );
- InitVars();
- return XB_NO_MEMORY;
- }
- memset( SchemaPtr, 0x00, ( NoOfFields * sizeof(xbSchemaRec)));
-
- /* copy field info into memory */
- for( i = 0, j = 1; i < NoOfFields; i++ ){
- _fseek( fp,((xbOffT)i*32+32), 0 );
- fread( &buf, 1, 32, fp );
- p = buf;
- strncpy( SchemaPtr[i].FieldName, p, 10 );
- p += 11;
- SchemaPtr[i].Type = *p++;
-
- SchemaPtr[i].Address = RecBuf + j;
- SchemaPtr[i].Address2 = RecBuf2 + j;
-
- SchemaPtr[i].FieldLen = *( p + 4 );
- SchemaPtr[i].NoOfDecs = *( p + 5 );
-
- if( SchemaPtr[i].Type == 'C' && SchemaPtr[i].NoOfDecs > 0 ){
- SchemaPtr[i].LongFieldLen = xbase->GetShort( p + 4 );
- j += SchemaPtr[i].LongFieldLen;
- }
- else
- j += SchemaPtr[i].FieldLen;
-#ifdef XB_MEMO_FIELDS
- if( !MemoSw && (SchemaPtr[i].Type == 'M' ||
- SchemaPtr[i].Type == 'B' || SchemaPtr[i].Type == 'O' ))
- MemoSw++;
-#endif
- }
- CurRec = 0L;
- BlankRecord();
- DbfStatus = XB_OPEN;
-
-#ifdef XB_MEMO_FIELDS
- if( MemoSw ) /* does this table have memo fields ? */
- if(( rc = OpenMemoFile()) != XB_NO_ERROR ){
- free( RecBuf );
- free( RecBuf2 );
- free( SchemaPtr );
- fclose( fp );
- InitVars();
- return rc;
- }
-#endif
-
-#ifdef XB_LOCKING_ON
-// if( AutoLock )
-// LockDatabase( XB_UNLOCK, 0L );
-#endif /* XB_LOCKING_ON */
-
- return xbase->AddDbfToDbfList( this, GetFileName() );
-}
-/************************************************************************/
-//! Blank the record buffer.
-/*!
- Sets the record to spaces.
-*/
-xbShort xbDbf::BlankRecord()
-{
- if( DbfStatus == XB_CLOSED )
- return XB_NOT_OPEN;
-
- if( DbfStatus != XB_UPDATED ){
- DbfStatus = XB_UPDATED;
- memcpy( RecBuf2, RecBuf, RecordLen );
- }
-
- memset( RecBuf, 0x20, RecordLen );
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Append the current record to the data file
-/*!
- This method attempts to append the contents of the current record buffer
- to the end of the DBF file and updates the file date and number of
- records in the file. Also updates any open indices associated with
- this data file.
-
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr>
- <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_LOCK\_FAILED & Couldn't lock file \\ \hline
- XB\_WRITE\_ERROR & Error writing to file \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::AppendRecord()
-{
- xbShort rc;
- xbULong nextRecNo;
-
-#if defined(XB_INDEX_ANY)
- xbIxList *i;
-#endif
-
-/* lock the database */
-#ifdef XB_LOCKING_ON
-// if( AutoLock )
-// if(( rc = LockDatabase( XB_LOCK, 0L )) != XB_NO_ERROR)
-// return rc;
-
- rc = ReadHeader(1);
-
-// if(AutoLock)
-// LockDatabase( XB_UNLOCK, 0L );
-
- if( rc )
- return rc;
-
-#endif
-
-/* lock any indexes */
-#if defined(XB_INDEX_ANY)
-#ifdef XB_LOCKING_ON
- i = NdxList;
- while( i && AutoLock ){
-// if(( rc = i->index->LockIndex( XB_LOCK )) != XB_NO_ERROR )
-// return rc;
- i = i->NextIx;
- }
-#endif /* XB_LOCKING_ON */
-#endif
-
-// if there are no duplicates, and no records set the CurRec to the
-// last record + 1. This is for EXP::RECNO()
-
-/* check for any duplicate keys */
-#if defined(XB_INDEX_ANY)
- i = NdxList;
- while( i ){
- if( i->index->UniqueIndex() ){
- i->index->CreateKey( 0, 0 );
- if( i->index->FindKey() == XB_FOUND )
- return XB_KEY_NOT_UNIQUE;
- }
- i = i->NextIx;
- }
-#endif
-
-#ifdef XB_REAL_DELETE
- if(RealDelete && FirstFreeRec)
- nextRecNo = FirstFreeRec;
- else
- nextRecNo = NoOfRecs + 1;
-#else
- nextRecNo = NoOfRecs + 1;
-#endif
-
- CurRec = NoOfRecs + 1;
-
-#if defined(XB_INDEX_ANY)
-/* update the indexes */
- i = NdxList;
- while( i ){
- if( !i->index->UniqueIndex() ) /* if we didn't prepare the key */
- if(( rc = i->index->CreateKey( 0, 0 )) != XB_NO_ERROR ) /* then do it before the add */
- return rc;
- if(( rc = i->index->AddKey(nextRecNo)) != XB_NO_ERROR )
- return rc;
- i->index->TouchIndex();
- i = i->NextIx;
- }
-#endif /* XB_INDEX_ANY */
-
-#ifdef XB_REAL_DELETE
- char buf[4];
-
- if(RealDelete && FirstFreeRec){
- /*
- ** Grab the next free rec no and put it in FirstFreeRec
- */
- if(_fseek(fp, (HeaderLen+(((xbOffT)FirstFreeRec-1)*RecordLen)+1), 0) != 0)
- return XB_SEEK_ERROR;
-
- if(fread(buf, 4, 1, fp) != 1)
- return XB_READ_ERROR;
-
- FirstFreeRec = xbase->GetULong(buf);
- }
-
- /*
- ** Okay, seek and write the record out
- */
- if(_fseek(fp, (HeaderLen+(((xbOffT)nextRecNo-1)*RecordLen)), 0) != 0)
- return XB_SEEK_ERROR;
-
- if(fwrite( RecBuf, RecordLen, 1, fp) != 1)
- return XB_WRITE_ERROR;
-
- /*
- ** If we just appended the record to the file, then write the EOF char
- */
- if(nextRecNo == NoOfRecs + 1){
- if( fputc( XB_CHAREOF, fp ) != XB_CHAREOF )
- return XB_WRITE_ERROR;
- }
-#else
- /* write the last record */
- if( _fseek( fp,(HeaderLen+((xbOffT)NoOfRecs*RecordLen)), 0 ) != 0 )
- return XB_SEEK_ERROR;
-
- if( fwrite( RecBuf, RecordLen, 1, fp ) != 1 )
- return XB_WRITE_ERROR;
-
- /* write the end of file marker */
- if( fputc( XB_CHAREOF, fp ) != XB_CHAREOF )
- return XB_WRITE_ERROR;
-#endif
-
- /* calculate the latest header information */
- xbDate d;
- UpdateYY = d.YearOf() - 1900;
- if(XFV == 3)
- UpdateYY %= 100; // dBASE III seems to do this, IV does not. DTB
- UpdateMM = d.MonthOf();
- UpdateDD = d.DayOf( XB_FMT_MONTH );
-#ifndef XB_REAL_DELETE
- NoOfRecs++;
-#else
- if(RealDelete){
- if(nextRecNo == NoOfRecs + 1)
- NoOfRecs++;
- RealNumRecs++;
- }
- else
- NoOfRecs++;
-#endif
- CurRec = nextRecNo;
-
- /* rewrite the header record */
- if(( rc = WriteHeader( 1 )) != XB_NO_ERROR )
- return rc;
-
-#ifdef XB_LOCKING_ON
-// if( AutoLock )
-// LockDatabase( XB_UNLOCK, 0L );
-
-#if defined(XB_INDEX_ANY)
- i = NdxList;
- while( i && AutoLock ){
-// i->index->LockIndex( XB_UNLOCK );
- i = i->NextIx;
- }
-#endif /* XB_INDEX_ANY */
-#endif /* XB_LOCKING_ON */
-
- DbfStatus = XB_OPEN;
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Get a record from the data file
-/*!
- This method attempts to retrieve the record specified by RecNo from the
- data file into the record buffer.
-
- \param RecNo Record number to retrieve
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr>
- <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr>
- <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr>
- <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_LOCK\_FAILED & Couldn't lock file \\ \hline
- XB\_NOT\_OPEN & File is not open \\ \hline
- XB\_INVALID\_RECORD & Invalid record number \\ \hline
- XB\_WRITE\_ERROR & Error writing to file \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::GetRecord( xbULong RecNo )
-{
- xbShort rc;
- if( DbfStatus == XB_CLOSED )
- return XB_NOT_OPEN;
-
-#ifdef XB_LOCKING_ON
-// if( AutoLock )
-// if(( rc = LockDatabase( XB_LOCK, RecNo )) != 0 ) return rc;
-
- rc = ReadHeader(1);
-
-// if(AutoLock)
-// LockDatabase( XB_UNLOCK, RecNo );
-
- if( rc )
- return rc;
-
-#endif
-
- if( RecNo > NoOfRecs || RecNo == 0L )
- return XB_INVALID_RECORD;
-
- if( _fseek( fp, (HeaderLen+(((xbOffT)RecNo-1L)*RecordLen)), SEEK_SET )){
-#ifdef XB_LOCKING_ON
-// LockDatabase( XB_UNLOCK, RecNo );
-#endif
- return XB_SEEK_ERROR;
- }
-
- if( fread( RecBuf, RecordLen, 1, fp ) != 1 ){
-#ifdef XB_LOCKING_ON
-// LockDatabase( XB_UNLOCK, RecNo );
-#endif
- return XB_READ_ERROR;
- }
-
-#ifdef XB_LOCKING_ON
-// if( AutoLock )
-// LockDatabase( XB_LOCK, RecNo );
-#endif
-
- DbfStatus = XB_OPEN;
- CurRec = RecNo;
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Get the first physical record in the data file
-/*!
- Attempts to retrieve the first physical record from the data file into
- the record buffer.
-
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr>
- <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr>
- <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr>
- <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr>
- <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_LOCK\_FAILED & Couldn't lock file \\ \hline
- XB\_NOT\_OPEN & File is not open \\ \hline
- XB\_INVALID\_RECORD & Invalid record number \\ \hline
- XB\_SEEK\_ERROR & Error seeking file \\ \hline
- XB\_WRITE\_ERROR & Error writing to file \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::GetFirstRecord()
-{
- xbShort rc;
- if( NoOfRecs == 0 )
- return XB_INVALID_RECORD;
-
- rc = GetRecord( 1L );
-#ifdef XB_REAL_DELETE
- if(!rc && RealDelete && RecordDeleted())
- rc = GetNextRecord();
-#endif
-
- return rc;
-}
-/************************************************************************/
-//! Get the last phyiscal record in the data file
-/*!
- Attempts to retrieve the last physical record from the data file into
- the record buffer.
-
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr>
- <tr><td>XB_EOF</td><td>At end of file</td></tr>
- <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr>
- <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr>
- <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr>
- <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_LOCK\_FAILED & Couldn't lock file \\ \hline
- XB\_EOF & At end of file \\ \hline
- XB\_NOT\_OPEN & File is not open \\ \hline
- XB\_INVALID\_RECORD & Invalid record number \\ \hline
- XB\_SEEK\_ERROR & Error seeking file \\ \hline
- XB\_WRITE\_ERROR & Error writing to file \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::GetLastRecord()
-{
- xbShort rc;
- if( NoOfRecs == 0 )
- return XB_INVALID_RECORD;
-
- rc = GetRecord( NoOfRecs );
-#ifdef XB_REAL_DELETE
- if(!rc && RealDelete && RecordDeleted())
- rc = GetPrevRecord();
-#endif
-
- return rc;
-}
-/************************************************************************/
-//! Get the next physical record in the data file
-/*!
- Attempts to retrieve the next physical record from the data file into
- the record buffer.
-
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr>
- <tr><td>XB_EOF</td><td>At end of file</td></tr>
- <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr>
- <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr>
- <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr>
- <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_LOCK\_FAILED & Couldn't lock file \\ \hline
- XB\_EOF & At end of file \\ \hline
- XB\_NOT\_OPEN & File is not open \\ \hline
- XB\_INVALID\_RECORD & Invalid record number \\ \hline
- XB\_SEEK\_ERROR & Error seeking file \\ \hline
- XB\_WRITE\_ERROR & Error writing to file \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::GetNextRecord()
-{
- xbShort rc;
- if( NoOfRecs == 0 )
- return XB_INVALID_RECORD;
- else if( CurRec >= NoOfRecs )
- return XB_EOF;
-
- rc = GetRecord( ++CurRec );
-
-#ifdef XB_REAL_DELETE
- while(!rc && RealDelete && RecordDeleted())
- rc = GetRecord(++CurRec);
-#endif
-
- return rc;
-}
-/************************************************************************/
-//! Get the previous physical record in the data file
-/*!
- Attempts to retrieve the previous physical record from the data file into
- the record buffer.
-
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr>
- <tr><td>XB_BOF</td><td>At beginning of file</td></tr>
- <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr>
- <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr>
- <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr>
- <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_LOCK\_FAILED & Couldn't lock file \\ \hline
- XB\_BOF & At beginning of file \\ \hline
- XB\_NOT\_OPEN & File is not open \\ \hline
- XB\_INVALID\_RECORD & Invalid record number \\ \hline
- XB\_SEEK\_ERROR & Error seeking file \\ \hline
- XB\_WRITE\_ERROR & Error writing to file \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::GetPrevRecord()
-{
- xbShort rc;
- if( NoOfRecs == 0 )
- return XB_INVALID_RECORD;
- else if( CurRec <= 1L )
- return XB_EOF;
-
- rc = GetRecord( --CurRec );
-
-#ifdef XB_REAL_DELETE
- while(!rc && RealDelete && RecordDeleted())
- rc = GetRecord(--CurRec);
-#endif
-
- return rc;
-}
-/************************************************************************/
-//! Dump record
-/*!
- Dump the contents of the specified record to stdout.
-
- \param RecNo Record number of record to be dumped.
- \returns An error code (same as GetRecord()).
-*/
-xbShort xbDbf::DumpRecord( xbULong RecNo )
-{
- int i, rc;
- char buf[4096];
-
- if( RecNo == 0 || RecNo > NoOfRecs )
- return XB_INVALID_RECORD;
-
- rc = GetRecord( RecNo );
- if( rc != XB_NO_ERROR )
- return rc;
-
- std::cout << "\nREC NUMBER " << RecNo << "\n";
-
- if( RecordDeleted() )
- std::cout << "\nRecord deleted...\n";
-
- for( i = 0; i < NoOfFields; i++ ){
-#ifdef XB_MEMO_FIELDS
- if(SchemaPtr[i].Type == 'M'){
- if( MemoFieldExists( i )){
- std::cout << SchemaPtr[i].Type << " " << SchemaPtr[i].FieldName
- << " len = " << GetMemoFieldLen( i ) << std::endl;
- memset( buf, 0x00, 4095 );
- rc = GetMemoField(i, 4095, buf, 0);
- if(rc != XB_NO_ERROR)
- return rc;
- } else {
- buf[0] = 0x00;
- }
- }
- else
- GetField( i, buf );
- std::cout << SchemaPtr[i].Type << " " << SchemaPtr[i].FieldName << " = '" << buf << "'\n";
-#else
- GetField( i, buf );
- std::cout << SchemaPtr[i].FieldName << " = '" << buf << "'\n";
-#endif
- }
- std::cout << std::endl;
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Write the current record buffer to the current record in the data file.
-/*!
- Attempts to write the contents of the record buffer to the current
- record in the data file. Updates any open indexes.
-
- \sa PutRecord(xbULong RecNo)
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr>
- <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr>
- <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr>
- <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr>
- <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_LOCK\_FAILED & Couldn't lock file \\ \hline
- XB\_NOT\_OPEN & File is not open \\ \hline
- XB\_INVALID\_RECORD & Invalid record number \\ \hline
- XB\_SEEK\_ERROR & Error seeking file \\ \hline
- XB\_WRITE\_ERROR & Error writing to file \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-
-/************************************************************************/
-xbShort xbDbf::PutRecord() {
- return PutRecord(CurRec);
-}
-
-//! Write the current record buffer to the specified record in the data file.
-/*!
- Attempts to write the contents of the record buffer to the record specified
- by RecNo. Updates any open indexes.
-
- \param RecNo Record number to which data should be written
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_LOCK_FAILED</td><td>Couldn't lock file</td></tr>
- <tr><td>XB_NOT_OPEN</td><td>File is not open</td></tr>
- <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr>
- <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr>
- <tr><td>XB_WRITE_ERROR</td><td>Error writing to file</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_LOCK\_FAILED & Couldn't lock file \\ \hline
- XB\_NOT\_OPEN & File is not open \\ \hline
- XB\_INVALID\_RECORD & Invalid record number \\ \hline
- XB\_SEEK\_ERROR & Error seeking file \\ \hline
- XB\_WRITE\_ERROR & Error writing to file \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::PutRecord(xbULong RecNo)
-{
- xbShort rc;
-
-#if defined(XB_INDEX_ANY)
- xbIxList *i;
-#endif
-
- if( DbfStatus == XB_CLOSED )
- return XB_NOT_OPEN;
-
-/* lock the database */
-#ifdef XB_LOCKING_ON
- if( AutoLock ){
-// if(( rc = LockDatabase( XB_LOCK, RecNo )) != XB_NO_ERROR )
-// return rc;
-// if(( rc = LockDatabase( XB_LOCK, 0L )) != XB_NO_ERROR ){
-// LockDatabase( XB_UNLOCK, RecNo );
-// return rc;
-// }
-
- if((rc = ReadHeader(1)) != XB_NO_ERROR){
-// if(AutoLock){
-// LockDatabase( XB_UNLOCK, RecNo );
-// LockDatabase( XB_UNLOCK, 0L );
-// }
- return rc;
- }
- }
-#endif
-
- if( RecNo > NoOfRecs || RecNo == 0L )
- return XB_INVALID_RECORD;
-
-/* lock the indexes */
-#if defined(XB_INDEX_ANY)
-#ifdef XB_LOCKING_ON
- i = NdxList;
- while( i && AutoLock ){
-// if(( rc = i->index->LockIndex( XB_LOCK )) != XB_NO_ERROR )
-// return rc;
- i = i->NextIx;
- }
-#endif /* XB_LOCKING_ON */
-#endif
-
-#if defined(XB_INDEX_ANY)
- /* for any unique indexes that were updated, verify no unique keys exist */
- i = NdxList;
- while( i ){
- if( i->index->UniqueIndex() ){
- if(( i->KeyUpdated = i->index->KeyWasChanged()) == 1 ){
- i->index->CreateKey(0, 0);
- if( i->index->FindKey() == XB_FOUND && i->index->GetCurDbfRec() != RecNo)
- return XB_KEY_NOT_UNIQUE;
- }
- }
- i = i->NextIx;
- }
-#endif
-
-#if defined(XB_INDEX_ANY)
- /* loop through deleting old index keys and adding new index keys */
- i = NdxList;
- while( i ){
- if( !i->index->UniqueIndex() )
- i->KeyUpdated = i->index->KeyWasChanged();
- if( i->KeyUpdated ){
- i->index->CreateKey( 1, 0 ); /* load key buf w/ old values */
- if((rc = i->index->DeleteKey( CurRec )) != XB_NO_ERROR){
-#ifdef XB_LOCKING_ON
-// if( AutoLock ){
-// LockDatabase( XB_UNLOCK, RecNo );
-// LockDatabase( XB_UNLOCK, 0L );
-// }
-#if defined(XB_INDEX_ANY)
- i = NdxList;
- while( i && AutoLock ){
-// i->index->LockIndex( XB_UNLOCK );
- i = i->NextIx;
- }
-#endif /* XB_INDEX_ANY */
-#endif /* XB_LOCKING_ON */
- return rc;
- }
-
- i->index->CreateKey( 0, 0 );
- if(( rc = i->index->AddKey(CurRec)) != XB_NO_ERROR ){
-#ifdef XB_LOCKING_ON
-// if( AutoLock ){
-// LockDatabase( XB_UNLOCK, RecNo );
-// LockDatabase( XB_UNLOCK, 0L );
-// }
-#if defined(XB_INDEX_ANY)
- i = NdxList;
- while( i && AutoLock ){
-// i->index->LockIndex( XB_UNLOCK );
- i = i->NextIx;
- }
-#endif /* XB_INDEX_ANY */
-#endif /* XB_LOCKING_ON */
- return rc;
- }
- i->index->TouchIndex();
- }
- i = i->NextIx;
- }
-#endif /* XB_INDEX_ANY */
-
- if( _fseek( fp, (HeaderLen+(((xbOffT)RecNo-1L)*RecordLen)),0 ))
- return XB_SEEK_ERROR;
-
- if( fwrite( RecBuf, RecordLen, 1, fp ) != 1 )
- return XB_WRITE_ERROR;
-
- /* calculate the latest header information */
- xbDate d;
- UpdateYY = d.YearOf() - 1900;
- if(XFV == 3)
- UpdateYY %= 100; // dBASE III seems to do this, IV does not. DTB
- UpdateMM = d.MonthOf();
- UpdateDD = d.DayOf( XB_FMT_MONTH );
-
- /* rewrite the header record */
- if(( rc = WriteHeader( 1 )) != XB_NO_ERROR )
- return rc;
-
-#ifdef XB_LOCKING_ON
-// if( AutoLock ){
-// LockDatabase( XB_UNLOCK, RecNo );
-// LockDatabase( XB_UNLOCK, 0L );
-// }
-
-#if defined(XB_INDEX_ANY)
- i = NdxList;
- while( i && AutoLock ){
-// i->index->LockIndex( XB_UNLOCK );
- i = i->NextIx;
- }
-#endif /* XB_INDEX_ANY */
-#endif /* XB_LOCKING_ON */
-
- CurRec = RecNo;
- DbfStatus = XB_OPEN;
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Delete the current record
-/*!
- Marks the current record as deleted or if "real" deletes are turned
- on (xbDbf::RealDeleteOn()) will delete the record and add it to the
- free record list. Normal dBase behavior is to simply mark the record
- as deleted; the record will actually be deleted when the the DBF file
- "packed" (xbDbf::PackDatabase()). If "real" deletes are not on, a
- record may be undeleted using xbDbf::UndeleteRecord().
-
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_INVALID\_RECORD & Invalid record number \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::DeleteRecord()
-{
- xbULong newCurRec = 0;
- xbShort rc = XB_NO_ERROR;
-
-#if defined(XB_INDEX_ANY)
- xbIxList *i;
-#endif
-
- if(!RecBuf)
- return XB_INVALID_RECORD;
-
- if(CurRec < 1 || CurRec > NoOfRecs)
- return XB_INVALID_RECORD;
-
-/* lock the database */
-#ifdef XB_LOCKING_ON
-
- if( AutoLock ){
-/*
- if(( rc = LockDatabase( XB_LOCK, CurRec )) != XB_NO_ERROR )
- return rc;
- if(( rc = LockDatabase( XB_LOCK, 0L )) != XB_NO_ERROR ){
- LockDatabase( XB_UNLOCK, CurRec );
- return rc;
- }
- */
- if((rc = ReadHeader(1)) != XB_NO_ERROR){
-// if(AutoLock){
-// LockDatabase( XB_UNLOCK, CurRec );
-// LockDatabase( XB_UNLOCK, 0L );
-// }
- return rc;
- }
- }
-#endif
-
-/* lock the indexes */
-#if defined(XB_INDEX_ANY) && defined(XB_LOCKING_ON) && defined(XB_REAL_DELETE)
- i = NdxList;
- while( i && AutoLock ){
-// if(( rc = i->index->LockIndex( XB_LOCK )) != XB_NO_ERROR )
-// return rc;
- i = i->NextIx;
- }
-#endif
-
-/* remove keys from indexes */
-#if defined(XB_REAL_DELETE) && defined(XB_INDEX_ANY)
-
- if(RealDelete){
- i = NdxList;
- while(i){
- i->index->CreateKey(0, 0); /* load key buf */
- if(i->index->GetCurDbfRec() == (xbULong)CurRec){
- i->index->DeleteKey(CurRec);
- newCurRec = i->index->GetCurDbfRec();
- }
- else
- i->index->DeleteKey(CurRec);
- i->index->TouchIndex();
- i = i->NextIx;
- }
- }
-
-#endif
-
- RecBuf[0] = 0x2a;
-
-
-#ifdef XB_REAL_DELETE
- if(RealDelete){
-#ifdef XB_MEMO_FIELDS
- //
- // Delete memo data for memo fields.
- //
- for(int f = 0; f < NoOfFields; f++ )
- if(GetFieldType(f) == 'M' && MemoFieldExists(f))
- UpdateMemoData(f, 0, 0, XB_LOCK);
-#endif
- xbase->PutULong(&RecBuf[1], FirstFreeRec);
- FirstFreeRec = CurRec;
- RealNumRecs--;
- WriteHeader(1);
- }
-#endif
-
- if(!RealDelete){
- if( DbfStatus != XB_UPDATED ){
- DbfStatus = XB_UPDATED;
- memcpy( RecBuf2, RecBuf, RecordLen );
- }
- rc = PutRecord( CurRec );
- }
- else
- {
- if(_fseek( fp, (HeaderLen+(((xbOffT)CurRec-1L)*RecordLen)), 0))
- return XB_SEEK_ERROR;
- if(fwrite( RecBuf, RecordLen, 1, fp ) != 1 )
- return XB_WRITE_ERROR;
-
- //
- // Attempt to read in the record for the current location
- // in the active index.
- //
- CurRec = newCurRec;
- if(CurRec)
- rc = GetRecord(CurRec);
- else
- BlankRecord();
- }
-
-#ifdef XB_LOCKING_ON
-// if(AutoLock){
-// LockDatabase( XB_UNLOCK, CurRec );
-// LockDatabase( XB_UNLOCK, 0L );
-// }
-
-#if defined(XB_INDEX_ANY) && defined(XB_REAL_DELETE)
- i = NdxList;
- while( i && AutoLock ){
-// i->index->LockIndex( XB_UNLOCK );
- i = i->NextIx;
- }
-#endif /* XB_INDEX_ANY */
-#endif /* XB_LOCKING_ON */
-
- return rc;
-}
-/************************************************************************/
-//! Undelete the current record
-/*!
- Marks the currect record as not deleted (i.e. removes the flag indicating
- the record is deleted). This method may not be used (and will return
- an error code) if "real" deletes are on.
-
- \returns One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_INVALID_RECORD</td><td>Invalid record number</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No error \\ \hline
- XB\_INVALID\_RECORD & Invalid record number \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::UndeleteRecord()
-{
- xbShort rc;
-
-#ifdef XB_REAL_DELETE
- if(RealDelete)
- return XB_INVALID_RECORD;
-#endif
- if( RecBuf ){
- if( DbfStatus != XB_UPDATED ){
- DbfStatus = XB_UPDATED;
- memcpy( RecBuf2, RecBuf, RecordLen );
- }
-
- RecBuf[0] = 0x20;
- if(( rc = PutRecord( CurRec )) != 0 )
- return rc;
- }
- else
- return XB_INVALID_RECORD;
-
- return 0;
-}
-/************************************************************************/
-//! Determine if current record is deleted
-/*!
- \returns TRUE (1) if the current record is marked as deleted or FALSE
- (0) if not.
-*/
-xbShort xbDbf::RecordDeleted()
-{
- if( RecBuf && RecBuf[0] == 0x2a )
- return 1;
- else
- return 0;
-}
-/************************************************************************/
-//! Create a unique file name
-/*!
-*/
-xbShort xbDbf::CreateUniqueDbfName( xbString & sDbfn, xbString & sDbtn )
-{
- xbShort dnf; /* directory in name flag */
- xbShort unique = 0;
- xbLong l = 1;
- char dbfn[13];
- char dbtn[13];
-
- dnf = xbase->DirectoryExistsInName( GetFileName() );
- sprintf( dbfn, "xb%06d.dbf", l );
- sprintf( dbtn, "xb%06d.dbt", l++ );
-
- if( dnf ){
- sDbfn.assign( GetFileName(), 0, dnf );
- sDbfn += dbfn;
- sDbtn.assign( GetFileName(), 0, dnf );
- sDbtn += dbtn;
- } else {
- sDbfn = dbfn;
- sDbtn = dbtn;
- }
-
- while( !unique ){
- if( access( sDbfn.getData(), 0 ) == -1 &&
- access( sDbtn.getData(), 0 ) == -1 )
- unique++;
- else{
- sprintf( dbfn, "xb%06d.dbf", l );
- sprintf( dbtn, "xb%06d.dbt", l++ );
-
- if( dnf ){
- sDbfn.assign( GetFileName(), 0, dnf );
- sDbfn += dbfn;
- sDbtn.assign( GetFileName(), 0, dnf );
- sDbtn += dbtn;
- } else {
- sDbfn = dbfn;
- sDbtn = dbtn;
- }
- }
- }
- return 0;
-}
-
-/************************************************************************/
-//! Pack data file
-/*!
-*/
-xbShort xbDbf::PackDatafiles(void (*statusFunc)(xbLong itemNum, xbLong numItems))
-{
- xbShort rc, i;
- FILE *t;
- xbLong l;
- char *target, *source;
- xbString TempDbfName;
- xbString TempDbtName;
- char * Buf = 0;
-
-#ifdef XB_MEMO_FIELDS
- char tbuf[4];
-#endif
-
-#ifdef XB_MEMO_FIELDS
- xbLong len, BufSize;
- xbShort MemoFields;
-#endif /* XB_MEMO_FIELDS */
-
- xbDbf Temp( xbase );
- CreateUniqueDbfName( TempDbfName, TempDbtName );
-
- if(( t = fopen( TempDbfName, "w+b" )) == NULL )
- return XB_OPEN_ERROR;
-
- /* copy file header */
- if(( rc = _fseek( fp, 0, SEEK_SET )) != 0 )
- return XB_SEEK_ERROR;
-
- for( i = 0; i < HeaderLen; i++ )
- fputc( fgetc( fp ), t );
- fputc( 0x1a, t );
-
- if( fclose( t ) != 0 )
- return XB_CLOSE_ERROR;
-
-#ifdef XB_MEMO_FIELDS
- if(( MemoFields = MemoFieldsPresent()) > 0 ){
-
- if((t = fopen( TempDbtName, "w+b" )) == NULL)
- return XB_OPEN_ERROR;
-
- l = 1L;
- memset( tbuf, 0x00, 4 );
- xbase->PutLong( tbuf, l );
-
- if((fwrite(&tbuf, 4, 1, t)) != 1)
- return XB_WRITE_ERROR;
-
- if( MemoHeader.Version == 0x03 ){
- for( i = 0; i < 12; i++ ) fputc( 0x00, t );
- fputc( 0x03, t );
- for( i = 0; i < 495; i++ ) fputc( 0x00, t );
- } else {
- for( i = 0; i < 4; i++ ) fputc( 0x00, t );
- if ((fwrite(&MemoHeader.FileName, 8, 1, t)) != 1)
- return XB_WRITE_ERROR;
- for( i = 0; i < 4; i++ ) fputc( 0x00, t );
- memset( tbuf, 0x00, 2 );
- xbase->PutShort( tbuf, MemoHeader.BlockSize );
- if ((fwrite(&tbuf, 2, 1, t)) != 1)
- return XB_WRITE_ERROR;
-
- for( i = 22; i < MemoHeader.BlockSize; i++ ) fputc( 0x00, t );
- }
-
- if( fclose( t ) != 0 )
- return XB_CLOSE_ERROR;
- }
-#endif /* XB_MEMO_FIELDS */
-
- /* reopen as database */
- if(( rc = Temp.OpenDatabase( TempDbfName )) != XB_NO_ERROR )
- return rc;
-
-#ifdef XB_REAL_DELETE
- if(RealDelete)
- Temp.RealDeleteOn();
- Temp.FirstFreeRec = 0;
- Temp.RealNumRecs = 0;
-#endif
- Temp.ResetNoOfRecs();
- Temp.WriteHeader(2); // flush NoOfRecs=0 to disk
- target = Temp.GetRecordBuf();
- source = GetRecordBuf();
-
- for( l = 1; l <= PhysicalNoOfRecords(); l++ ){
- if(statusFunc && (l == 1 || !(l % 100) || l == PhysicalNoOfRecords()))
- statusFunc(l, PhysicalNoOfRecords());
-
- if(( rc = GetRecord( l )) != XB_NO_ERROR )
- return rc;
-
- if( !RecordDeleted() ){
- memcpy( target, source, GetRecordLen());
-
-#ifdef XB_MEMO_FIELDS
- BufSize = 0L;
-// Buf = NULL; Already set to 0, this statement flags as memory leak
-
- for( i = 0; i < NoOfFields; i++ ){
- if( GetFieldType( i ) == 'M' && MemoFieldExists( i )){
- Temp.PutLongField(i, 0L);
- len = GetMemoFieldLen( i );
- if( len > BufSize ){
- if( Buf )
- free( Buf );
- if((Buf = (char *)malloc(len)) == NULL)
- return XB_NO_MEMORY;
- BufSize = len;
- }
- GetMemoField( i, len, Buf, -1 );
- Temp.UpdateMemoData( i, len, Buf, -1 );
- }
- }
-#endif
- if(( rc = Temp.AppendRecord()) != XB_NO_ERROR ){
- if(Buf) free(Buf);
- return rc;
- }
- }
- }
- if( Buf ) free( Buf );
- Temp.CloseDatabase();
-
- if(fclose(fp) != 0)
- return XB_CLOSE_ERROR;
-
- if(remove(GetFileName()) != 0)
- return XB_WRITE_ERROR;
-
- if(rename(TempDbfName, GetFileName()) != 0)
- return XB_WRITE_ERROR;
-
-#ifdef XB_MEMO_FIELDS
- if( MemoFields ){
- if(fclose(mfp) != 0)
- return XB_CLOSE_ERROR;
-
- if(remove(MemofileName) != 0)
- return XB_WRITE_ERROR;
- if( rename( TempDbtName, MemofileName ) != 0 )
- return XB_WRITE_ERROR;
- if(( mfp = fopen( MemofileName, "r+b" )) == NULL )
- return XB_OPEN_ERROR;
- if(( rc = GetDbtHeader(1)) != 0 ){
- fclose( mfp );
- return rc;
- }
-#ifdef XB_LOCKING_ON
- /* no buffering in multi user mode */
- setbuf( mfp, NULL );
-#endif
- }
-
-#endif /* XB_MEMO_FIELDS */
-
- if(( fp = fopen( GetFileName(), "r+b" )) == NULL )
- return XB_OPEN_ERROR;
-
-#ifdef XB_LOCKING_ON
- /* no buffering in multi user mode */
- setbuf( fp, NULL );
-#endif
-
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Pack the database
-/*!
- This method removes all records marked for deletion from an Xbase (.DBF)
- file, reindexes any open index files, and also reorganizes any memo fields
- stored in a .DBT memo file.
-
- \param packStatusFunc status function
- \param indexStatusFunc index status function
-
- \param LockWaitOption One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>LockWaitOption</th><th>Description</th></tr>
- <tr><td>F_SETLK</td><td>Return immediately if the DBF file cannot be locked</td></tr>
- <tr><td>XB_LOCK</td><td>Wait for lock on DBF file to succeed</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{LockWaitOption} & \textbf{Description} \\ \hline \hline
- F\_SETLK & Return immediately if DBF file cannot be locked \\ \hline
- F\_SETLKW & Wait for lock on DBF file to succeed \\ \hline
- \end{tabular}
- \endlatexonly
-
- \returns One of the following return codes:
- \htmlonly
- <p>
- <table border=2><tr><th>Return Code</th><th>Description</th></tr>
- <tr><td>XB_NO_ERROR</td><td>No error</td></tr>
- <tr><td>XB_CLOSE_ERROR</td><td>Unable to close intermediate work file</td></tr>
- <tr><td>XB_OPEN_ERROR</td><td>Could not open file</td></tr>
- <tr><td>XB_NO_MEMORY</td><td>Memory allocation error</td></tr>
- <tr><td>XB_WRITE_ERROR</td><td>Couldn't write to disk</td></tr>
- <tr><td>XB_SEEK_ERROR</td><td>Error seeking file</td></tr>
- <tr><td>XB_LOCK_FAILED</td><td>Unable to lock file or index</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Return Code} & \textbf{Description} \\ \hline \hline
- XB\_NO\_ERROR & No Error \\ \hline
- XB\_CLOSE\_ERROR & Unable to close intermediate work file \\ \hline
- XB\_OPEN\_ERROR & Couldn't open the file \\ \hline
- XB\_NO\_MEMORY & Memory allocation error \\ \hline
- XB\_WRITE\_ERROR & Couldn't write to disk \\ \hline
- XB\_SEEK\_ERROR & Error seeking file \\ \hline
- XB\_LOCK\_FAILED & Unable to lock file or index \\ \hline
- \end{tabular}
- \endlatexonly
-*/
-xbShort xbDbf::PackDatabase(xbShort LockWaitOption,
- void (*packStatusFunc)(xbLong itemNum, xbLong numItems),
- void (*indexStatusFunc)(xbLong itemNum, xbLong numItems))
-{
- xbShort rc;
-
- /* lock all open files and indexes */
-// if(( rc = ExclusiveLock( LockWaitOption )) != XB_NO_ERROR ) return rc;
-
- if(( rc = PackDatafiles(packStatusFunc)) != XB_NO_ERROR ){
-// ExclusiveUnlock();
- return rc;
- }
-
- /* refresh file header */
- if(( rc = ReadHeader(1)) != XB_NO_ERROR )
- return rc;
-
- if(( rc = RebuildAllIndices(indexStatusFunc)) != XB_NO_ERROR )
- return rc;
-
-// ExclusiveUnlock();
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Copy DBF structure
-/*!
-*/
-xbShort xbDbf::CopyDbfStructure(const char *NewFileName, xbShort Overlay) {
-
- xbShort rc, i;
- xbString ndfn; /* new dbf file name */
- char ch;
-
-#ifdef XB_MEMO_FIELDS
- char buf[9];
- xbShort ct, NameLen;
- xbString MemoName;
-#endif
- FILE *t;
-
- /* build the new file name */
- rc = NameSuffixMissing( 1, NewFileName );
- ndfn = NewFileName;
- if( rc == 1 )
- ndfn += ".dbf";
- else if( rc == 2 )
- ndfn += ".DBF";
-
- /* check if the file exists and Overlay is on */
- if(((t = fopen( ndfn, "r" )) != NULL ) && !Overlay) {
- fclose(t);
- return XB_FILE_EXISTS;
- }
-
- /* open new file */
- if((t = fopen(ndfn, "w+b")) == NULL)
- return XB_OPEN_ERROR;
-
- /* copy the file header */
- if(( rc = _fseek( fp, 0, SEEK_SET )) != 0 )
- return XB_SEEK_ERROR;
-
- fputc( fgetc( fp ), t );
-
- /* do the date */
- xbDate d;
- ch = d.YearOf() - 1900;
- if(XFV == 3)
- ch %= 100; // dBASE III+ does this, dBASE IV does not.
- fputc( ch, t );
- ch = d.MonthOf();
- fputc( ch, t );
- ch = d.DayOf( XB_FMT_MONTH );
- fputc( ch, t );
-
- /* record count */
- for( i = 0; i < 4; i++ ) fputc( 0x00, t );
-
- if((rc = _fseek(fp, 7, SEEK_CUR)) != 0) {
- fclose( t );
- return XB_SEEK_ERROR;
- }
- for( i = 0; i < 4; i++ )
- fputc( fgetc( fp ), t );
-
- for( i = 0; i < 17; i++ )
- fputc( 0x00, t );
-
- if((rc = _fseek( fp, 17, SEEK_CUR )) != 0) {
- fclose( t );
- return XB_SEEK_ERROR;
- }
-
- for( i = 29; i < HeaderLen; i++ )
- fputc( fgetc( fp ), t );
-
- fputc( 0x1a, t );
- fclose( t );
-
-#ifdef XB_MEMO_FIELDS
- if( MemoFieldsPresent()){
- MemoName = ndfn;
-
- NameLen = MemoName.len();
- NameLen--;
- if( MemoName.getCharacter( NameLen ) == 'F' )
- MemoName.putAt(NameLen, 'T');
- else
- MemoName.putAt(NameLen, 't');
-
- if(( t = fopen( MemoName, "w+b" )) == NULL )
- return XB_OPEN_ERROR;
-
- memset( buf, 0x00, 4 );
- xbase->PutLong( buf, 1L );
- if(( fwrite( &buf, 4, 1, t )) != 1 ){
- fclose( t );
- return XB_WRITE_ERROR;
- }
- if( MemoHeader.Version == 0x03 ){
- for( i = 0; i < 12; i++ ) fputc( 0x00, t );
- fputc( 0x03, t );
- for( i = 0; i < 495; i++ ) fputc( 0x00, t );
- }
- else
- {
- for( i = 0; i < 4; i++ ) fputc( 0x00, t ); // put 4 bytes 0x00
- memset( buf, 0x00, 9 );
- NameLen = ndfn.len();
- for( i = 0, ct = 0; i < NameLen; i++ )
- if( ndfn.getCharacter( i ) == PATH_SEPARATOR ){
- ct = i;
- ct++;
- }
-
- for( i = 0; i < 8 && ndfn[i+ct] != '.'; i++ )
- buf[i] = ndfn[i+ct];
-
- fwrite( &buf, 8, 1, t );
- for( i = 0; i < 4; i++ ) fputc( 0x00, t );
- memset( buf, 0x00, 2 );
- xbase->PutShort( buf, MemoHeader.BlockSize );
- if(( fwrite( &buf, 2, 1, t )) != 1 ){
- fclose(t);
- return XB_WRITE_ERROR;
- }
- for( i = 22; i < MemoHeader.BlockSize; i++ ) fputc( 0x00, t );
- }
- }
- fclose( t );
-#endif // XB_MEMO_FIELDS
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Add index to list
-/*!
- Adds the specified index to the list of indexes maintained by the
- dbf.
-
- \param n index to add
- \param IndexName name of index
-*/
-#if defined(XB_INDEX_ANY)
-xbShort xbDbf::AddIndexToIxList(xbIndex * n, const char *IndexName)
-{
- xbIxList *i, *s, *t;
-
- if( !FreeIxList ){
- if((i = (xbIxList *) malloc(sizeof(xbIxList))) == NULL)
- return XB_NO_MEMORY;
- }
- else
- {
- i = FreeIxList;
- FreeIxList = i->NextIx;
- }
- memset(i, 0x00, sizeof(xbIxList));
-
- i->IxName = IndexName;
- i->index = n;
-
- s = NULL;
- t = NdxList;
- while( t && strcmp( t->IxName, IndexName ) < 0 ){
- s = t;
- t = t->NextIx;
- }
- i->NextIx = t;
- if( s == NULL )
- NdxList = i;
- else
- s->NextIx = i;
- return 0;
-}
-#endif
-/************************************************************************/
-//! Rebuild all index files
-/*!
-*/
-xbShort xbDbf::RebuildAllIndices(void (*statusFunc)(xbLong itemNum, xbLong numItems))
-{
-#if defined(XB_INDEX_ANY)
- xbShort rc;
- xbIxList *n;
-
- n = NdxList;
- while( n ){
- if(( rc = n->index->ReIndex(statusFunc)) != XB_NO_ERROR ){
-// ExclusiveUnlock();
- return rc;
- }
- n = n->NextIx;
- }
-#endif
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Delete all records
-/*!
-*/
-xbShort xbDbf::DeleteAll( xbShort Option )
-{
- xbShort rc;
-
- if(( NoOfRecords()) == 0 )
- return XB_NO_ERROR;
- if(( rc = GetFirstRecord()) != XB_NO_ERROR )
- return rc;
-
- if( Option == 0 ){ /* delete all option */
- while( 1 ){
- if( !RecordDeleted())
- if(( rc = DeleteRecord()) != XB_NO_ERROR )
- return rc;
- if(( rc = GetNextRecord()) != XB_NO_ERROR )
- break;
- }
- }
- else /* undelete all option */
- {
- while( 1 ){
- if( RecordDeleted())
- if(( rc = UndeleteRecord()) != XB_NO_ERROR )
- return rc;
- if(( rc = GetNextRecord()) != XB_NO_ERROR )
- break;
- }
- }
- if( rc == XB_EOF )
- return XB_NO_ERROR;
- else
- return rc;
-}
-/************************************************************************/
-//! Delete all records and pack data file
-/*!
-*/
-xbShort xbDbf::Zap( xbShort WaitOption )
-{
- xbShort rc;
- xbString TempDbfName, TempDbtName;
-
- CreateUniqueDbfName( TempDbfName, TempDbtName );
- if(( rc = CopyDbfStructure( TempDbfName, 1 )) != XB_NO_ERROR) {
- return rc;
- }
-
- if( fp ){
- fclose( fp );
- fp = 0;
- }
-
- if(( rc = remove( GetFileName() )) != 0 )
- return XB_WRITE_ERROR;
-
- if(( rc = rename( TempDbfName, GetFileName() )) != 0 )
- return XB_WRITE_ERROR;
-
- if((fp = fopen( GetFileName(), "r+b" )) == NULL)
- return XB_OPEN_ERROR;
-
-#ifdef XB_LOCKING_ON
- setbuf( fp, NULL );
-#endif
- ReadHeader( 1 );
-
-#ifdef XB_MEMO_FIELDS
- if( MemoFieldsPresent() ){
- fclose( mfp );
-
- if(( rc = remove( MemofileName )) != 0 )
- return XB_WRITE_ERROR;
-
- if(( rc = rename( TempDbtName, MemofileName )) != 0 )
- return XB_WRITE_ERROR;
-
- if(( mfp = fopen( MemofileName, "r+b" )) == NULL)
- return XB_OPEN_ERROR;
-
- }
-#endif // XB_MEMO_FIELDS
-
- if(( rc = RebuildAllIndices()) != XB_NO_ERROR )
- return rc;
-
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Remove an index from the list
-/*!
-*/
-#if defined(XB_INDEX_ANY)
-xbShort xbDbf::RemoveIndexFromIxList(xbIndex * n) {
- xbIxList *i, *s;
-
- i = NdxList;
- s = NULL;
- while( i ){
- if( i->index == n ){
- /* remove it from current chain */
- if( s )
- s->NextIx = i->NextIx;
- else
- NdxList = i->NextIx;
-
- /* add i to the current free chain */
- i->NextIx = FreeIxList;
- FreeIxList = i;
- FreeIxList->IxName = (const char *)NULL;
- FreeIxList->index = NULL;
- break;
- }
- else
- {
- s = i;
- i = i->NextIx;
- }
- }
- return XB_NO_ERROR;
-}
-#endif
-
-/************************************************************************/
-//! Gets the number of records in the data file
-/*!
-*/
-xbLong xbDbf::NoOfRecords()
-{
- xbLong numRecs;
-
-/* lock the database */
-#ifdef XB_LOCKING_ON
- xbShort rc;
-
- if( AutoLock ){
-// if(( rc = LockDatabase( XB_LOCK, 0L )) != XB_NO_ERROR )
-// return rc;
-
- if((rc = ReadHeader(1)) != XB_NO_ERROR){
-// if(AutoLock)
-// LockDatabase( XB_UNLOCK, 0L );
- return rc;
- }
- }
-#endif
-
-#ifndef XB_REAL_DELETE
- numRecs = NoOfRecs;
-#else
- numRecs = RealDelete ? RealNumRecs : NoOfRecs;
-#endif
-
-#ifdef XB_LOCKING_ON
-// if(AutoLock)
-// LockDatabase( XB_UNLOCK, 0L );
-#endif
-
- return numRecs;
-}
-/************************************************************************/
-//! Get the physical number of records in the data file
-/*!
-*/
-xbLong xbDbf::PhysicalNoOfRecords()
-{
- xbShort rc;
-
-/* lock the database */
-#ifdef XB_LOCKING_ON
-// if( AutoLock )
-// if(( rc = LockDatabase( XB_LOCK, 0L )) != XB_NO_ERROR )
-// return rc;
-#endif
-
- rc = ReadHeader(1);
-
-#ifdef XB_LOCKING_ON
-// if(AutoLock)
-// if(( rc = LockDatabase( XB_UNLOCK, 0L )) != XB_NO_ERROR )
-// return rc;
-#endif
-
- if( rc )
- return rc;
-
- return NoOfRecs;
-}
-
-/************************************************************************/
-#if defined(XB_INDEX_ANY)
-//! Get the number of currently open indexes for data file
-/*!
-*/
-xbShort xbDbf::IndexCount()
-{
- xbShort count;
- xbIxList *i;
-
- for(count = 0, i = NdxList; i; i = i->NextIx, count++) ;
-
- return count;
-}
-/************************************************************************/
-//! Get a specific index
-/*!
-*/
-xbIndex * xbDbf::GetIndex(xbShort indexNum)
-{
- xbIxList *i;
-
- i = NdxList;
- while(indexNum && i){
- indexNum--;
- i = i->NextIx;
- }
-
- if(i)
- return i->index;
-
- return 0;
-}
-
-#endif // XB_INDEX_ANY
-/************************************************************************/
-void xbDbf::Flush()
-{
- if(fp)
- fflush(fp);
-
-#ifdef XB_MEMO_FIELDS
- if(mfp)
- fflush(mfp);
-#endif
-
-#if defined(XB_INDEX_ANY)
- xbIxList
- *i;
-
- i = NdxList;
- while(i) {
- i->index->Flush();
- i = i->NextIx;
- }
-#endif
-}
-/************************************************************************/
-#ifdef XB_LOCKING_ON
-xbShort xbDbf::SetLockMode( xbShort nlm )
-{
-/*
- xbShort rc;
- if( LockMode != XB_XBASE_LOCK_MODE &&
- nlm == XB_XBASE_LOCK_MODE &&
- !xblfh ){
- rc = OpenXbLockFile();
- if( rc )
- return rc;
- }
-*/
- LockMode = nlm;
- return XB_NO_ERROR;
-}
-#endif
-/************************************************************************/
-const char * xbDbf::GetExtWithDot( bool lower )
-{
- return lower ? ".dbf" : ".DBF";
-}
diff --git a/xbase64/xbdbf.h b/xbase64/xbdbf.h
deleted file mode 100755
index ce28e9a..0000000
--- a/xbase64/xbdbf.h
+++ /dev/null
@@ -1,533 +0,0 @@
-/* xbdbf.h
-
- Xbase64 project source code
-
- This file contains the Class definition for a xbDBF object.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifndef __XB_DBF_H__
-#define __XB_DBF_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbtypes.h>
-#include <xbase64/xbdate.h>
-#include <xbase64/xbfile.h>
-
-#include <iostream>
-#include <stdio.h>
-
-/*! \file xbdbf.h
-*/
-
-#if defined(XB_INDEX_ANY)
- class XBDLLEXPORT xbIndex;
- class XBDLLEXPORT xbNdx;
- class XBDLLEXPORT xbNtx;
-#endif
-
-/*****************************/
-/* Field Types */
-
-#define XB_CHAR_FLD 'C'
-#define XB_LOGICAL_FLD 'L'
-#define XB_NUMERIC_FLD 'N'
-#define XB_DATE_FLD 'D'
-#define XB_MEMO_FLD 'M'
-#define XB_FLOAT_FLD 'F'
-
-/*****************************/
-/* File Status Codes */
-
-#define XB_CLOSED 0
-#define XB_OPEN 1
-#define XB_UPDATED 2
-
-/*****************************/
-/* Other defines */
-
-#define XB_OVERLAY 1
-#define XB_DONTOVERLAY 0
-
-#define XB_CHAREOF '\x1A' /* end of DBF */
-#define XB_CHARHDR '\x0D' /* header terminator */
-
-//! Used to define the fields in a database (DBF file).
-/*!
- Generally one would define an xbSchema array to be passed
- to xbDbf::CreateDatabase() to define the fields in the database.
-
- For example, one might create a declaration as follows:
-
- \code
- xbSchema MyRecord[] =
- {
- { "FIRSTNAME", XB_CHAR_FLD, 15, 0 },
- { "LASTNAME", XB_CHAR_FLD, 20, 0 },
- { "BIRTHDATE", XB_DATE_FLD, 8, 0 },
- { "AMOUNT", XB_NUMERIC_FLD, 9, 2 },
- { "SWITCH", XB_LOGICAL_FLD, 1, 0 },
- { "FLOAT1", XB_FLOAT_FLD, 9, 2 },
- { "FLOAT2", XB_FLOAT_FLD, 9, 1 },
- { "FLOAT3", XB_FLOAT_FLD, 9, 2 },
- { "FLOAT4", XB_FLOAT_FLD, 9, 3 },
- { "MEMO1", XB_MEMO_FLD, 10, 0 },
- { "ZIPCODE", XB_NUMERIC_FLD, 5, 0 },
- { "",0,0,0 }
- };
- \endcode
-
- Note that the last xbSchema in an array must be a "null" entry like the
- one above:
-
- \code
- { "",0,0,0 }
- \endcode
-
- To indicate the end of the array.
-*/
-struct XBDLLEXPORT xbSchema {
- char FieldName[11];
- char Type;
-// xbUShort FieldLen; /* does not work */
-// xbUShort NoOfDecs; /* does not work */
- unsigned char FieldLen; /* fields are stored as one byte on record*/
- unsigned char NoOfDecs;
-};
-
-//! Defines a field in an XBase file header (DBF file header)
-/*!
- This structure is only used internally by the xbDbf class.
-*/
-struct XBDLLEXPORT xbSchemaRec {
- char FieldName[11];
- char Type; /* field type */
- char *Address; /* pointer to field in record buffer 1 */
-// xbUShort FieldLen; /* does not work */
-// xbUShort NoOfDecs; /* does not work */
- unsigned char FieldLen; /* fields are stored as one byte on record */
- unsigned char NoOfDecs;
- char *Address2; /* pointer to field in record buffer 2 */
- char *fp; /* pointer to null terminated buffer for field */
- /* see method GetString */
- xbShort LongFieldLen; /* to handle long field lengths */
-};
-
-//! xbIxList struct
-/*!
- Internal use only.
-*/
-struct XBDLLEXPORT xbIxList {
- xbIxList * NextIx;
- xbString IxName;
-#if defined(XB_INDEX_ANY)
- xbIndex * index;
- xbShort Unique;
- xbShort KeyUpdated;
-#endif
-};
-
-//! xbMH struct
-/*!
- Internal use only.
-*/
-
-#ifdef XB_MEMO_FIELDS
-struct XBDLLEXPORT xbMH{ /* memo header */
- xbLong NextBlock; /* pointer to next block to write */
- char FileName[8]; /* name of dbt file */
- char Version; /* not sure */
- xbShort BlockSize; /* memo file block size */
-};
-#endif
-
-//! xbDbf class
-/*!
- The xbDbf class encapsulates an xbase DBF database file. It includes
- all dbf access, field access, and locking methods.
-*/
-class XBDLLEXPORT xbDbf : protected xbFile{
-
-public:
- xbDbf( xbXBase * );
- virtual ~xbDbf();
-
- xbXBase *xbase; /* linkage to main base class */
-
-/* datafile methods */
-#if defined(XB_INDEX_ANY)
- xbShort AddIndexToIxList(xbIndex *, const char *IndexName);
- xbShort RemoveIndexFromIxList( xbIndex * );
-#endif
- xbShort AppendRecord();
- xbShort BlankRecord();
- xbShort CloseDatabase( xbBool deleteIndexes = 0 );
- xbShort CopyDbfStructure( const char *, xbShort );
- xbShort CreateDatabase( const char * Name, xbSchema *, xbShort Overlay );
- //! Delete all records
- /*!
- */
- xbShort DeleteAllRecords() { return DeleteAll(0); }
- xbShort DeleteRecord();
-#ifdef XBASE_DEBUG
- xbShort DumpHeader( xbShort );
-#endif
- xbShort DumpRecord( xbULong );
- //! Return number of fields
- /*!
- */
- xbLong FieldCount() { return NoOfFields; }
- //! Return Dbf name
- /*!
- */
- const xbString& GetDbfName() { return GetFileName(); }
- //! Return status
- /*!
- */
- xbShort GetDbfStatus() { return DbfStatus; }
- xbShort GetFirstRecord();
- xbShort GetLastRecord();
- xbShort GetNextRecord();
- xbShort GetPrevRecord();
- //! Return current record number
- /*!
- */
- xbLong GetCurRecNo() { return CurRec; }
- xbShort GetRecord( xbULong );
- //! Return a pointer to the record buffer
- /*!
- */
- char * GetRecordBuf() { return RecBuf; }
- //! Return record length
- /*!
- */
- xbShort GetRecordLen() { return RecordLen; }
- xbShort NameSuffixMissing( xbShort, const char * );
- xbLong GetRecCnt() { return NoOfRecords(); }
- xbLong NoOfRecords();
- xbLong PhysicalNoOfRecords();
- xbShort OpenDatabase( const char * );
- xbShort PackDatabase(xbShort LockWaitOption,
- void (*packStatusFunc)(xbLong itemNum, xbLong numItems) = 0,
- void (*indexStatusFunc)(xbLong itemNum, xbLong numItems) = 0);
- xbShort PutRecord(); // Put record to current position
- xbShort PutRecord(xbULong);
- xbShort RebuildAllIndices(
- void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0);
- xbShort RecordDeleted();
- //! Set number of records to zero????
- /*!
- */
- void ResetNoOfRecs() { NoOfRecs = 0L; }
- xbShort SetVersion( xbShort );
- //! Undelete all records
- /*!
- */
- xbShort UndeleteAllRecords() { return DeleteAll(1); }
- xbShort UndeleteRecord();
- xbShort Zap( xbShort );
-
-/* field methods */
- const char *GetField(xbShort FieldNo) const; // Using internal static buffer
- const char *GetField(const char *Name) const;
- xbShort GetField( xbShort FieldNo, char *Buf) const;
- xbShort GetRawField( xbShort FieldNo, char *Buf) const;
- xbShort GetField( xbShort FieldNo, char *Buf, xbShort RecBufSw) const;
- xbShort GetField( const char *Name, char *Buf) const;
- xbShort GetRawField(const char *Name, char *Buf) const;
- xbShort GetField( const char *Name, char *Buf, xbShort RecBufSw) const;
- xbShort GetField(xbShort FieldNo, xbString&, xbShort RecBufSw ) const;
- xbShort GetFieldDecimal( xbShort );
- xbShort GetFieldLen( xbShort );
- char * GetFieldName( xbShort );
- xbShort GetFieldNo( const char * FieldName ) const;
- char GetFieldType( xbShort FieldNo ) const;
- xbShort GetLogicalField( xbShort FieldNo );
- xbShort GetLogicalField( const char * FieldName );
- char * GetStringField( xbShort FieldNo );
- char * GetStringField( const char * FieldName );
- xbShort PutField( xbShort, const char * );
- xbShort PutRawField( xbShort FieldNo, const char *buf );
- xbShort PutField( const char *Name, const char *buf);
- xbShort PutRawField( const char *Name, const char *buf );
- xbShort ValidLogicalData( const char * );
- xbShort ValidNumericData( const char * );
-
- xbLong GetLongField( const char *FieldName) const;
- xbLong GetLongField( const xbShort FieldNo) const;
- xbShort PutLongField( const xbShort, const xbLong );
- xbShort PutLongField( const char *, const xbLong);
-
- xbFloat GetFloatField( const char * FieldName );
- xbFloat GetFloatField( xbShort FieldNo );
- xbShort PutFloatField( const char *, const xbFloat);
- xbShort PutFloatField( const xbShort, const xbFloat);
-
- xbDouble GetDoubleField( const char *);
- xbDouble GetDoubleField( xbShort, xbShort RecBufSw = 0);
- xbShort PutDoubleField( const char *, xbDouble);
- xbShort PutDoubleField( const xbShort, xbDouble);
-
-#ifdef XB_LOCKING_ON
- xbShort GetLockMode() { return LockMode; }
- xbShort SetLockMode( xbShort );
-// xbShort OpenXbLockFile();
-// xbShort GetTableLockCnt() { return TableLockCnt; }
-// xbShort LockIndex( xbShort LockType ); /* for XB_XBASE_LOCK_MODE */
- int GetDbfFileNo() { return fileno( fp ); }
- int GetMemoFileNo() { return fileno( mfp ); }
-
-#ifdef XB_MEMO_FIELDS
-// xbShort GetMemoLockCnt() { return MemoLockCnt; }
-#endif
-
-/*
- xbShort LockTable( xbShort LockType );
- xbShort LockXbaseTable( xbShort LockType );
- xbShort LockClipperTable( xbShort LockType );
- xbShort LockFoxproTable( xbShort LockType );
- xbShort LockDbaseTable( xbShort LockType );
-
- xbShort LockRecord( xbShort LockType, xbULong RecNo, xbULong RecCnt );
- xbShort LockXbaseRecord( xbShort LockType, xbULong RecNo, xbULong RecCnt );
- xbShort LockClipperRecord(
- xbShort LockType, xbULong RecNo, xbULong RecCnt );
- xbShort LockFoxproRecord( xbShort LockType, xbULong RecNo, xbULong RecCnt );
- xbShort LockDbaseRecord( xbShort LockType, xbULong RecNo, xbULong RecCnt );
-
- xbShort LockDatabase( xbShort, xbShort, xbULong );
- xbShort ExclusiveLock( xbShort );
- xbShort ExclusiveUnlock();
- xbShort LockDatabase( xbShort cmd, xbULong recNo ) { return 0; }
-*/
-
-#ifndef HAVE_FCNTL
- xbShort UnixToDosLockCommand( xbShort WaitOption,
- xbShort LockType ) const;
-#endif
-
-#else
- xbShort LockDatabase( xbShort, xbShort, xbLong )
- { return XB_NO_ERROR; }
- xbShort ExclusiveLock( xbShort ) { return XB_NO_ERROR; };
- xbShort ExclusiveUnlock() { return XB_NO_ERROR; };
-#endif
-
- //! Turn autolock on
- /*!
- */
- void AutoLockOn() { AutoLock = 1; }
- //! Turn autolock off
- /*!
- */
- void AutoLockOff() { AutoLock = 0; }
- //! Return whether or not autolocking is on or off
- /*!
- */
- xbShort GetAutoLock() { return AutoLock; }
-
-#ifdef XB_MEMO_FIELDS
- xbShort GetMemoField( xbShort FieldNo, xbLong len,
- char * Buf, xbShort LockOption );
- xbLong GetMemoFieldLen( xbShort FieldNo );
- xbShort GetFPTField( xbShort FieldNo, xbLong len,
- char * Buf, xbShort LockOption );
- xbLong GetFPTFieldLen( xbShort FieldNo );
- xbShort UpdateMemoData( xbShort FieldNo, xbLong len,
- const char * Buf, xbShort LockOption );
- xbShort MemoFieldExists( xbShort FieldNo ) const;
- xbShort LockMemoFile( xbShort WaitOption, xbShort LockType );
-
- xbShort MemoFieldsPresent() const;
- xbLong CalcLastDataBlock();
- xbShort FindBlockSetInChain( xbLong BlocksNeeded, xbLong
- LastDataBlock, xbLong & Location, xbLong &PreviousNode );
- xbShort GetBlockSetFromChain( xbLong BlocksNeeded, xbLong
- Location, xbLong PreviousNode );
- xbString & GetDbtName() { return MemofileName; }
-
-#ifdef XBASE_DEBUG
- xbShort DumpMemoFreeChain();
- void DumpMemoHeader() const;
- void DumpMemoBlock() const;
-#endif
-#endif
-
- //! Turn on "real" deletes
- /*!
- This should be done before creating a database (with
- xbDbf::CreateDatatabase()) and thereafter before opening
- a database with xbDbfCreateDatabase().
-
- You cannot "turn on" real deletes once a database has been created
- and records added.
- */
- void RealDeleteOn() { RealDelete = 1; if(fp) ReadHeader(1); }
- /*! Turn off "real" deletes
- */
- void RealDeleteOff() { RealDelete = 0; if(fp) ReadHeader(1); }
- //! Return whether "real" deletes are on or off
- /*!
- Use this to determine if "real deletes" are being used with
-the database.
- */
- xbShort GetRealDelete() { return RealDelete; }
-
-#if defined(XB_INDEX_ANY)
- xbShort IndexCount();
- xbIndex *GetIndex(xbShort indexNum);
-#endif
-
- void Flush();
- virtual const char* GetExtWithDot( bool lower );
-
- private:
-
- xbShort DeleteAll( xbShort );
- void InitVars();
- xbShort PackDatafiles(void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0);
- xbShort ReadHeader( xbShort );
- xbShort WriteHeader( xbShort );
-
-#ifdef XB_MEMO_FIELDS
- xbShort AddMemoData( xbShort FieldNo, xbLong Len, const char * Buf );
- xbShort CreateMemoFile();
- xbShort DeleteMemoField( xbShort FieldNo );
- xbShort GetDbtHeader( xbShort Option );
- xbShort GetMemoBlockSize() { return MemoHeader.BlockSize; }
- xbShort OpenMemoFile();
- xbShort OpenFPTFile();
- xbShort PutMemoData( xbLong StartBlock, xbLong BlocksNeeded,
- xbLong Len, const char * Buf );
- xbShort ReadMemoBlock( xbLong BlockNo, xbShort Option);
- xbShort SetMemoBlockSize( xbShort );
- xbShort UpdateHeadNextNode() const;
- xbShort WriteMemoBlock( xbLong BlockNo, xbShort Option );
- xbShort IsType3Dbt() const { return( Version==(char)0x83 ? 1:0 ); }
- xbShort IsType4Dbt() const
- {return (( Version==(char)0x8B || Version==(char)0x8E ) ? 1:0 );}
- xbShort CreateUniqueDbfName( xbString &, xbString & );
-#endif
-
-
-// xbString DatabaseName;
- xbShort XFV; /* xBASE file version */
- xbShort NoOfFields;
- char DbfStatus; /* 0 = closed
- 1 = open
- 2 = updates pending */
- FILE *fp; /* file pointer */
- xbSchemaRec *SchemaPtr; /* Pointer to field data */
- char *RecBuf; /* Pointer to record buffer */
- char *RecBuf2; /* Pointer to original rec buf */
-
-#ifdef XB_MEMO_FIELDS
- xbString MemofileName; /* memo file name */
- FILE *mfp; /* memo file pointer */
- void *mbb; /* memo block buffer */
- xbMH MemoHeader; /* memo header structure */
- xbShort mfield1; /* memo block field one FF */
- xbShort MStartPos; /* memo start pos of data */
- xbLong MFieldLen; /* memo length of data */
- xbLong NextFreeBlock; /* next free block in free chain */
- xbLong FreeBlockCnt; /* count of free blocks this set */
- xbLong MNextBlockNo; /* free block chain */
- xbLong MNoOfFreeBlocks; /* free block chain */
- xbLong CurMemoBlockNo; /* Current block no loaded */
-#endif
-
-/* Next seven variables are read directly off the database header */
-/* Don't change the order of the following seven items */
- char Version;
- char UpdateYY;
- char UpdateMM;
- char UpdateDD;
-// xbLong NoOfRecs;
-// xbShort HeaderLen;
-// xbShort RecordLen;
-
- xbULong NoOfRecs;
- xbUShort HeaderLen;
- xbUShort RecordLen;
-
-//#ifdef XB_REAL_DELETE
- xbULong FirstFreeRec;
- xbULong RealNumRecs;
-//#endif
-
-// xbIxList * MdxList;
- xbIxList * NdxList;
- xbIxList * FreeIxList;
- xbULong CurRec; /* Current record or zero */
- xbShort AutoLock; /* Auto update option 0 = off */
-
-//#ifdef XB_REAL_DELETE
- xbShort RealDelete; /* real delete option 0 = off */
-//#endif
-
-#ifdef XB_LOCKING_ON
- FILE *xblfh; /* xbase lock file pointer for xbase locking */
- xbShort LockMode; /* lock mode for this table */
- xbString lfn; /* xbase lock file name for xbase locking */
- xbShort TableLockCnt; /* number of table locks */
- xbShort IndexLockCnt; /* no of index locks XB_XBASE_LOCK_MODE only */
-
-#ifdef XB_MEMO_FIELDS
- xbShort MemoLockCnt; /* number of memo file locks */
-#endif
-
- /* old locking stuff */
- xbShort CurLockType; /* current type of file lock */
- xbShort CurLockCount; /* number of current file locks */
- xbULong CurLockedRecNo; /* currently locked record no */
- xbShort CurRecLockType; /* current type of rec lock held (F_RDLOCK or F_WRLCK) */
- xbShort CurRecLockCount; /* number of current record locks */
- xbShort CurMemoLockType; /* current type of memo lock */
- xbShort CurMemoLockCount; /* number of current memo locks */
-#endif
-
-};
-#endif // __XB_DBF_H__
-
-
diff --git a/xbase64/xbexp.cpp b/xbase64/xbexp.cpp
deleted file mode 100755
index a3e1fa5..0000000
--- a/xbase64/xbexp.cpp
+++ /dev/null
@@ -1,1323 +0,0 @@
-/* xbexp.cpp
-
- Xbase64 project source code
-
- This file contains logic for handling Xbase expressions.
-
- Copyright (C) 1997,2003,2004 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xbexp.h"
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-#ifdef XB_EXPRESSIONS
-#include <ctype.h>
-#include <string.h>
-
-//#include <xbase64/xbexcept.h>
-
-
-/*! \file xbexp.cpp
-*/
-
-// set the default date format
-//xbString xbExpn::DefaultDateFormat = "MM/DD/YY";
-
-/************************************************************************/
-/* putting this part in EXP did not work */
-
-/* No of parms
-
- value meaning
-
- 0 0
- 1 1
- 2 2
- 100 0 or more
- 101 1 or more
- 102 2 or more
-
-
- Return Type
- N Numeric
- C Char or string
- 1 Varies, if sibling 1 is C, set to C, otherwise N
-
-
-*/
-
-
-
-
-
-
-static xbFuncDtl FuncList[] =
-{
- /* Func # of Return
- Name parms Type */
- { "ABS", 1, 'N' },
- { "ASC", 1, 'N' },
- { "AT", 2, 'N' },
- { "CDOW", 1, 'C' },
- { "CHR", 1, 'C' },
- { "CMONTH", 1, 'C' },
- { "CTOD", 1, 'C' },
- { "DATE", 0, 'C' },
- { "DAY", 1, 'N' },
- { "DESCEND", 1, '1' },
- { "DOW", 1, 'N' },
- { "DTOC", 1, 'C' },
- { "DTOS", 1, 'C' },
- { "EXP", 1, 'N' },
- { "IIF", 3, 'C' },
- { "INT", 1, 'N' },
- { "ISALPHA", 1, 'L' },
- { "ISLOWER", 1, 'L' },
- { "ISUPPER", 1, 'L' },
- { "LEFT", 2, 'C' },
- { "LEN", 1, 'N' },
- { "LOG", 1, 'N' },
- { "LOWER", 1, 'C' },
- { "LTRIM", 1, 'C' },
- { "MAX", 2, 'N' },
- { "MIN", 2, 'N' },
- { "MONTH", 1, 'N' },
- { "RECNO", 0, 'N' },
- { "REPLICATE", 2, 'C' },
- { "RIGHT", 2, 'C' },
- { "RTRIM", 1, 'C' },
- { "SPACE", 1, 'C' },
- { "SQRT", 1, 'N' },
- { "STR", 101, 'C' },
- { "STRZERO", 1, 'C' },
- { "SUBSTR", 3, 'C' },
- { "TRIM", 1, 'C' },
- { "UPPER", 1, 'C' },
- { "VAL", 1, 'N' },
- { "YEAR", 1, 'N' },
- { 0, 0, 0 },
-};
-
-/*************************************************************************/
-//! xbExpn Constructor
-/*!
-*/
-xbExpn::xbExpn( xbXBase * x )
-{
- xbase = x;
- TokenType = 0;
- Tree = 0;
- TokenLen = 0;
- OpLen1 = 0;
- OpLen2 = 0;
- OpDataLen1 = 0;
- OpDataLen2 = 0;
- Op1 = 0;
- Op2 = 0;
- First = 0;
- Last = 0;
- StackDepth = 0;
- XbaseFuncList = FuncList;
- memset( WorkBuf, 0x00, WorkBufMaxLen+1 );
-}
-/*************************************************************************/
-//! xbExpn Destructor
-/*!
-*/
-xbExpn::~xbExpn()
-{
- InitStack();
-
- delete Tree;
-
- if(Op1)
- free(Op1);
-
- if(Op2)
- free(Op2);
-
-}
-
-/*************************************************************************/
-//! Get information on a function.
-/*!
- Returns the information specifed (Option) for the specified function.
-
- \param Function name of function to get information about
- \param Option One of the following:
- \htmlonly
- <p>
- <table border=2><tr><th>Option</th><th>Description</th></tr>
- <tr><td>1</td><td>Return minimum number of parms</td></tr>
- <tr><td>2</td><td>Return function result type</td></tr>
- <tr><td>?</td><td>Return 0 if valid function</td></tr>
- </table>
- \endhtmlonly
- \latexonly
- \\
- \\
- \begin{tabular}{|l|l|} \hline
- \textbf{Option} & \textbf{Description} \\ \hline \hline
- 1 & Return minimum number of parms \\ \hline
- 2 & Return function result type \\ \hline
- ? & Return 0 if valid function \\ \hline
- \end{tabular}
- \endlatexonly
-
- \returns requested information or -1 on failure.
-*/
-xbShort xbExpn::GetFuncInfo( const char * Function, xbShort Option )
-{
-/* Option =
- 1 - return minimum number of needed parms
- 2 - return function result type
- ? - return 0 if valid function
-*/
- xbFuncDtl * f;
- xbShort i, len;
- const char *s;
-
- if(( Option<1 )||( Option>2 ))
- return XB_INVALID_OPTION;
-
- s = Function;
- len = 0;
- while( *s && *s != '(' ) { s++; len++; }
-
- f = XbaseFuncList;
- i = 0;
- while( f[i].FuncName ){
- if( strncmp( f[i].FuncName, Function, len ) == 0 )
- return( (Option==1) ? f[i].ParmCnt : f[i].ReturnType );
- i++;
- }
- return -1;
-}
-
-/*************************************************************************/
-//! IsWhiteSpace
-/*!
-*/
-xbShort xbExpn::IsWhiteSpace( char c )
-{
- return(( c == 0x20 )? 1 : 0 );
-}
-
-/*************************************************************************/
-//! GetNextToken
-/*!
-*/
-xbShort xbExpn::GetNextToken( const char * s, xbShort MaxLen )
-{
- /* TreeResultType Settings
- Token Action/
- Was Type Result
- Unv N N
- Unv C C
- Unv Function Table Lookup
- Unv Field Field Type
- Not L Any Logical L
- */
-
- xbShort Wctr, Wtype, Wsw, EmptyCtr, MaxCtr, MaxCtrSave;
- const char *sp, *np, *pp; /* save, next and previous pointer */
-
- LogicalType = 0;
- TokenType = 0;
- TokenLen = 0;
- EmptyCtr = 0;
- MaxCtr = 0;
-
- if( !s || ! *s )
- return XB_NO_DATA;
-
- /* go past any initial white space */
- while( s && *s && IsWhiteSpace( *s )){
- s++;
- MaxCtr++;
- if (MaxCtr >= MaxLen)
- return XB_NO_ERROR;
- }
-
-/* 1 - check for parens */
-/* '(', if found go to corresponding ')', if no ')', return -1 */
- if( *s == '(' || *s == '{' ){
- if( *s == '{' ) Wtype = 0; else Wtype = 1;
- Wctr = 1;
- s++;
-
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_PARSE_ERROR;
-
- while( s && *s ){
- if(( *s == ')' && Wtype == 1 ) || (*s == '}' && Wtype == 0 )){
- Wctr--;
- if( Wctr == 0 ){
- if( EmptyCtr != 0 ) {
- TokenType = 'E';
- PreviousType = 'E';
- } else
- return XB_PARSE_ERROR;
-
- TokenLen += 2;
- return XB_NO_ERROR;
- }
- }
- else if(( *s == '(' && Wtype == 1 ) || (*s == '{' && Wtype == 0 )){
- Wctr++;
- EmptyCtr++;
- } else if( *s != ' ' )
- EmptyCtr++;
-
- s++;
- TokenLen++;
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_PARSE_ERROR;
- }
- return XB_PARSE_ERROR;
- }
-
-
-/* 2 - Check for Constants */
-/* check for "'" or """, if no corresponding quote return -1 */
- if( *s == '"' || *s == '\'' ){
- if( *s == '"' ) Wtype = 0; else Wtype = 1;
- TokenType = 'C'; /* set to constant */
- PreviousType = 'C';
- s++;
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_NO_ERROR;
- while( s && *s ){
- if(( *s == '"' && Wtype == 0 ) || (*s == '\'' && Wtype == 1 ))
- return XB_NO_ERROR;
- s++;
- TokenLen++;
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_NO_ERROR;
- }
- return XB_PARSE_ERROR;
- }
-
-
-/* 3 - check for .T. .F. .TRUE. or .FALSE. */
- if( s && *s && *s == '.' ){
- if(( strncmp( s, ".T.", 3 ) == 0 ) || ( strncmp( s, ".F.", 3 ) == 0 )){
- TokenLen = 3;
- TokenType = 'C'; /* constant */
- PreviousType = 'C';
- LogicalType = 1;
- return XB_NO_ERROR;
- } else if( strncmp( s, ".TRUE.", 6 ) == 0 ){
- TokenLen = 6;
- TokenType = 'C'; /* constant */
- PreviousType = 'C';
- LogicalType = 1;
- return XB_NO_ERROR;
- } else if( strncmp( s, ".FALSE.", 7 ) == 0 ){
- TokenLen = 7;
- TokenType = 'C'; /* constant */
- PreviousType = 'C';
- LogicalType = 1;
- return XB_NO_ERROR;
- }
- }
-
-/* 4 - check for positive, negative or decimal number constants */
- if(( *s == '-' && ( PreviousType == 'O' || PreviousType == 0 )) ||
- ( *s == '+' && ( PreviousType == 'O' || PreviousType == 0 )) ||
- *s == '.' || isdigit( *s )){
- sp = s;
- MaxCtrSave = MaxCtr;
- Wsw = Wctr = 0;
- if( *s == '.' ){
- Wctr++;
- s++;
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_PARSE_ERROR;
-
- if( s && *s && isdigit( *s ))
- TokenLen++;
- else
- Wsw++;
- } else if( *s == '-' ){
- s++;
- TokenLen++;
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_PARSE_ERROR;
-
- /* go past any white space between sign and number */
- while( s && *s && IsWhiteSpace( *s )){
- s++;
- TokenLen++;
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_PARSE_ERROR;
- }
- }
-
- if( isdigit( *s ) || (*s == '.' && !Wsw )){
- while(s && *s && ((*s == '.' && Wctr < 2 ) || isdigit(*s)) && !Wsw ){
- if( *s == '.' ) {
- Wctr++;
- if( Wctr > 1 ) break;
- s++;
-
- MaxCtr++;
- if( MaxCtr >= MaxLen ){
- TokenType = 'N';
- PreviousType = 'N';
- return XB_NO_ERROR;
- }
-
- if( s && *s && isdigit( *s ))
- TokenLen++;
- else
- Wsw++;
- } else {
- s++;
- TokenLen++;
- MaxCtr++;
- if( MaxCtr >= MaxLen ) {
- TokenType = 'N';
- PreviousType = 'N';
- return XB_NO_ERROR;
- }
- }
- }
- TokenType = 'N'; /* constant */
- PreviousType = 'N';
- return XB_NO_ERROR;
- } else {
- s = sp;
- MaxCtr = MaxCtrSave;
- }
- }
-
-/* 5 - Check for operators */
- if( *s == '+' || *s == '-' || *s == '/' || *s == '^'){
- TokenLen = 1;
- TokenType = 'O';
- PreviousType = 'O';
- return XB_NO_ERROR;
- }
- if(*s == '=' || *s == '$' || *s == '#' ){
- LogicalType = 1;
- TokenLen = 1;
- TokenType = 'O';
- PreviousType = 'O';
- return XB_NO_ERROR;
- }
- if( strncmp( s, "!=", 2 ) == 0 ){
- LogicalType = 1;
- TokenLen = 2;
- TokenType = 'O';
- PreviousType = 'O';
- return XB_NO_ERROR;
- }
- if( *s == '*' ){
- s++;
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_PARSE_ERROR;
-
- TokenType = 'O';
- PreviousType = 'O';
- if( *s == '*' ){
- TokenLen = 2;
- return XB_NO_ERROR;
- } else {
- TokenLen = 1;
- return XB_NO_ERROR;
- }
- }
- if( *s == '<' || *s == '>' ) {
- s++;
-
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_PARSE_ERROR;
-
- LogicalType = 1; // added 3/25/00 dtb
- TokenType = 'O';
- PreviousType = 'O';
- if( *s == '<' || *s == '>' || *s == '=' ){
- TokenLen = 2;
- return XB_NO_ERROR;
- } else {
- TokenLen = 1;
- return XB_NO_ERROR;
- }
- }
-
-/* check for .NOT. .OR. .AND. */
-
- if( s && *s && *s == '.' ){
- if( strncmp( s, ".NOT.", 5 ) == 0 ){
- TokenLen = 5;
- TokenType = 'O'; /* constant */
- PreviousType = 'O';
- LogicalType = 1;
- return XB_NO_ERROR;
- } else if( strncmp( s, ".AND.", 5 ) == 0 ){
- TokenLen = 5;
- TokenType = 'O'; /* constant */
- PreviousType = 'O';
- LogicalType = 1;
- return XB_NO_ERROR;
- } else if( strncmp( s, ".OR.", 4 ) == 0 ){
- TokenLen = 4;
- TokenType = 'O'; /* constant */
- PreviousType = 'O';
- LogicalType = 1;
- return XB_NO_ERROR;
- }
- }
-
- /* If get this far, must be function or database field */
- while( s && *s ){
- s++;
- TokenLen++;
- MaxCtr++;
- if( MaxCtr >= MaxLen ) {
- TokenType = 'D';
- PreviousType = 'D';
- return XB_NO_ERROR;
- }
-
- if( s && *s && *s == '(' ) {
- /* look for corresponding ) */
- Wctr = 1;
- s++;
- TokenLen++;
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_PARSE_ERROR;
-
- while( s && *s ) {
- if( *s == ')' ) {
- Wctr--;
- if( !Wctr ) {
- TokenType = 'F'; /* function */
- PreviousType = 'F';
- TokenLen++;
- return XB_NO_ERROR;
- }
- }
- if( *s == '(' ) Wctr++;
- s++;
- TokenLen++;
- MaxCtr++;
- if( MaxCtr >= MaxLen )
- return XB_PARSE_ERROR;
- }
- return XB_PARSE_ERROR;
- } else {
- np = s + 1;
- pp = s - 1;
- if( !s || !*s || (IsSeparator( *s ) &&
- !(*s == '-' && *np == '>' ) && !(*s == '>' && *pp == '-' ))) {
- if( TokenLen > 0 ){
- TokenType = 'D'; /* database field */
- PreviousType = 'D';
- return XB_NO_ERROR;
- }
- }
- }
- }
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-//! IsSeparator
-/*!
-*/
-char xbExpn::IsSeparator( char c )
-{
- if( c == '-' || c == '+' || c == '*' || c == '/' || c == '$' ||
- c == ' ' || c == '#' || c == '<' || c == '>' || c == '^' ||
- c == '=' || c == '.' || c == '!' /* || c == ')' */ )
- return c;
- else
- return 0;
-}
-
-/*************************************************************************/
-//! GetExpNode
-/*!
-*/
-/*
-xbExpNode * xbExpn::GetExpNode(xbShort Len) {
- xbExpNode * Temp;
-
- Temp = new xbExpNode;
- if( Temp && Len > 0 )
- Temp->ResultLen = Len;
- return Temp;
-}
-*/
-/*************************************************************************/
-//! LoadExpNode
-/*!
-*/
-xbExpNode * xbExpn::LoadExpNode(
- const char *ENodeText, /* pointer to text data */
- const char EType, /* Operand type */
- const xbShort ELen, /* length of node text data */
- const xbShort BufLen ) /* length needed in the buffer*/
-{
-// xbExpNode * CurNode;
-// if(( CurNode = GetExpNode(BufLen)) == NULL ) return NULL;
-
- xbExpNode * CurNode = new xbExpNode;
- if( !CurNode )
- return NULL;
- CurNode->ResultLen = BufLen;
-
- CurNode->NodeText = strdup( ENodeText );
- CurNode->Type = EType;
- CurNode->Len = ELen;
- CurNode->InTree = 1;
- CurNode->ResultLen = BufLen;
- return CurNode;
-}
-
-/*************************************************************************/
-//! BuildExpressionTree
-/*!
-*/
-xbShort xbExpn::BuildExpressionTree( const char * Expression,
- xbShort MaxTokenLen, xbDbf * d )
-{
- /* previous node is the node to insert under */
- xbExpNode * CurNode = 0;
- xbExpNode * PreviousNode;
- xbShort rc, FieldNo=0, BufLen;
- xbShort TokenLenCtr;
- char c;
- const char *p;
- char TempField[11];
- char TableName[31];
- xbDbf * TempDbf=0;
- int LocTokenLen;
-
- if( Tree ) {
- delete Tree;
- Tree = NULL;
- }
-
- p = Expression;
- PreviousNode = NULL;
- PreviousType = TokenLenCtr = 0;
-
- while( IsWhiteSpace( *p )) {
- p++;
- TokenLenCtr++;
- if(TokenLenCtr >= MaxTokenLen)
- return XB_NO_ERROR;
- }
-
- rc = GetNextToken( p, MaxTokenLen-TokenLenCtr );
- LocTokenLen = TokenLen;
- if( rc != XB_NO_DATA && rc != XB_NO_ERROR )
- return rc;
-
- while( rc == 0 ){
- if( TokenType == 'D' && d ){
- if( TokenLen > 30 )
- strncpy( TableName, p, 30 );
- else
- strncpy( TableName, p, TokenLen );
-
- memset( TempField, 0x00, 11 );
-
- if( strstr( p, "->" ) != NULL ) {
- if(( TempDbf = d->xbase->GetDbfPtr( TableName )) == NULL )
- return XB_INVALID_FIELD;
- xbShort tlen = 0;
- while( TableName[tlen] != '-' && TableName[tlen+1] != '>' )
- tlen++;
- tlen = TokenLen - tlen - 2; // length of field name
- const char * fp = strstr( p, "->" );
- fp += 2; // ptr to beginning of field name
- strncpy( TempField, fp, tlen );
- } else {
- TempDbf = d;
- if( TokenLen > 10 )
- return XB_INVALID_FIELD;
- strncpy( TempField, p, TokenLen );
- }
- if(( FieldNo = TempDbf->GetFieldNo( TempField )) == -1 )
- return XB_INVALID_FIELD;
- BufLen = TempDbf->GetFieldLen( FieldNo ) + 1;
- }
- else if( TokenType == 'C' || TokenType == 'N' )
- BufLen = TokenLen + 1;
- else
- BufLen = 0;
-
- if( TokenType == 'C' ) p++; /* go past first ' */
-
- if( TokenType != 'O' ){
- if( !Tree ) { /* create root node with this token */
- CurNode = LoadExpNode( p, TokenType, TokenLen, BufLen );
- Tree = CurNode;
- } else { /* put as child 2 of previous node */
- CurNode = LoadExpNode( p, TokenType, TokenLen, BufLen );
- PreviousNode->Sibling2 = CurNode;
- CurNode->Node = PreviousNode;
- }
-
- if( TokenType == 'E' ){
- if((rc=ReduceComplexExpression(p,TokenLen,CurNode,d))!=0)
- return rc;
- if(PreviousNode)
- CurNode = PreviousNode->Sibling2;
- else
- CurNode = Tree;
- } else if( TokenType == 'F' ){
- if(( rc = ReduceFunction( p, CurNode, d)) != 0 )
- return rc;
-
- xbShort parmCnt = GetFuncInfo( p, 1 );
- if( (parmCnt == 1 || parmCnt == 101 ) && !CurNode->Sibling1 ||
- (parmCnt == 2 || parmCnt == 201 ) && !CurNode->Sibling2 ||
- (parmCnt == 3 ) && !CurNode->Sibling3 )
- return XB_INSUFFICIENT_PARMS;
- else if( parmCnt == 0 && CurNode->Sibling1 )
- return XB_TOO_MANY_PARMS;
- else if( parmCnt == 1 && CurNode->Sibling2 )
- return XB_TOO_MANY_PARMS;
- else if( parmCnt == 2 && CurNode->Sibling3 )
- return XB_TOO_MANY_PARMS;
-
- CurNode->ExpressionType = GetFuncInfo( p, 2 );
- if( CurNode->ExpressionType == '1' ){
- if( CurNode->Sibling1 )
- if( CurNode->Sibling1->ExpressionType == 'C' )
- CurNode->ExpressionType = 'C';
- else
- CurNode->ExpressionType = 'N';
- else
- return XB_INSUFFICIENT_PARMS;
- }
-
- CurNode->dbf = d;
- }
- else if( TokenType == 'D' && d ) {
- CurNode->DataLen = BufLen - 1;
- CurNode->FieldNo = FieldNo;
- CurNode->dbf = TempDbf;
- c = TempDbf->GetFieldType( FieldNo );
- if( c == 'C' || c == 'M' ) CurNode->ExpressionType = 'C';
- else if( c == 'L' ) CurNode->ExpressionType = 'L';
- else if( c == 'N' || c == 'F' ) CurNode->ExpressionType = 'N';
- else if( c == 'D' ) CurNode->ExpressionType = 'D';
- } else if( TokenType == 'C' || TokenType == 'N' ) {
- CurNode->DataLen = CurNode->Len;
- CurNode->StringResult = CurNode->NodeText;
- CurNode->StringResult.resize( CurNode->DataLen+1 );
- if( TokenType == 'N' ) {
- CurNode->DoubResult = strtod( CurNode->StringResult, 0 );
- CurNode->ExpressionType = 'N';
- } else
- CurNode->ExpressionType = 'C';
- }
- }
- else /* it is an operator */
- {
- if(!Tree){
- if(*p == '-'){
- CurNode = LoadExpNode( p, TokenType, TokenLen, 0 );
- CurNode->ExpressionType = 'C';
- } else
- return XB_EXP_SYNTAX_ERROR;
- } else {
- if( Tree->Type != 'O' ){
- CurNode = LoadExpNode( p, TokenType, TokenLen, 0 );
- Tree->Node = CurNode; /* link the new parent to old tree */
- CurNode->Sibling1 = Tree; /* connect the sibling */
- Tree = CurNode; /* root in tree */
- } else {
- PreviousNode = CurNode->Node;
- CurNode = LoadExpNode( p, TokenType, TokenLen, 0 );
- while( PreviousNode &&
- (( OperatorWeight( PreviousNode->NodeText, TokenLen ) == 0 ) ||
- ( OperatorWeight( CurNode->NodeText, TokenLen ) <=
- OperatorWeight( PreviousNode->NodeText, TokenLen ))))
- PreviousNode = PreviousNode->Node;
-
- if( PreviousNode ) {
- CurNode->Node = PreviousNode;
- CurNode->Sibling1 = PreviousNode->Sibling2;
- PreviousNode->Sibling2 = CurNode;
- CurNode->Sibling1->Node = CurNode;
- } else { /* insert at root */
- CurNode->Sibling1 = Tree;
- Tree = CurNode;
- CurNode->Sibling1->Node = CurNode;
- }
- }
- if( LogicalType )
- CurNode->ExpressionType = 'L';
- }
- }
- PreviousNode = CurNode;
-// p += CurNode->Len; // 2/20/04 - not sure when this was updated - gk
- p += LocTokenLen;
-
-// if( TokenType == 'C' ) { gk - 2/20/04 func("fff") + 4 didn't work
- if( TokenType == 'C' && CurNode->Type != 'F' ){
- p++; /* go past last ' */
- TokenLenCtr+=2; /* add the quotes */
- }
-
-// TokenLenCtr += CurNode->Len; // 2/20/04 - not sure when this was updated - gk
- TokenLenCtr += LocTokenLen;
- if( TokenLenCtr >= MaxTokenLen )
- return XB_NO_ERROR;
- if( p && *p && TokenType == 'E' ) {
- p++;
- TokenLenCtr++;
- }
-
- while( IsWhiteSpace( *p )) {
- p++;
- TokenLenCtr++;
- if( TokenLenCtr >= MaxTokenLen )
- return XB_NO_ERROR;
- }
- rc = GetNextToken( p, MaxTokenLen-TokenLenCtr );
- LocTokenLen = TokenLen;
- if( rc != XB_NO_DATA && rc != XB_NO_ERROR )
- return rc;
- }
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-//! GetExpressionResultType
-/*!
-*/
-char xbExpn::GetExpressionResultType( xbExpNode * e ) {
- xbExpNode * Temp = 0;
- if( e )
- Temp = e;
- else if( !Temp )
- Temp = Tree;
- else
- return 0;
-
- if( e->Type == 'O' &&
- ( *e->NodeText == '<' || *e->NodeText == '>' || *e->NodeText == '=' ||
- *e->NodeText == '#' || *e->NodeText == '$' ||
- strncmp( e->NodeText, "!=", 2 ) == 0 ))
- return 'L';
-
- /* go down to second lowest level */
- while( Temp && Temp->Sibling1 && Temp->Sibling1->Sibling1 )
- Temp = Temp->Sibling1;
-
- /* if subtracting dates, return numeric type */
- if( Temp->Type == 'O' && *Temp->NodeText == '-' &&
- Temp->Sibling1 && Temp->Sibling2 &&
- Temp->Sibling1->ExpressionType == 'D' &&
- Temp->Sibling2->ExpressionType == 'D' )
- return 'N';
-
- /* else return the type of the lowest left node */
- while( Temp && !Temp->ExpressionType && Temp->Sibling1 )
- Temp = Temp->Sibling1;
- return Temp->ExpressionType;
-}
-/*************************************************************************/
-//! GetExpressionHandle
-/*!
-*/
-xbExpNode * xbExpn::GetExpressionHandle() {
- xbExpNode * e;
- e = Tree;
- Tree = NULL;
- return e;
-}
-/*************************************************************************/
-//! OperatorWeight
-/*! This function determines the priority of an operator
-*/
-xbShort xbExpn::OperatorWeight( const char * Oper, xbShort len )
-{
- /* operator precendence
-
- not all are implemented yet, but the structure is here
-
- 10 .AND. .OR. .NOT. (not really an operator)
- 9 > or < (includes <= or >=)
- 6 unary plus or minus (+,-)
- 5 prefix increment and/or decrement (++,--)
- 4 exponentiation ** or ^
- 3 multiplication,division or modulus (*,/,%)
- 2 Addition, subtraction (+,-)
- 1 Postfix increment and/or decrement (++,--)
- */
-
- if( len < 1 || len > 5 ) return 0;
-
-
- if( Oper[0] == '>' || Oper[0] == '<' )
- return 13;
-
- if( strncmp( Oper, ".AND.", 5 ) == 0 ||
- strncmp( Oper, ".OR.", 4 ) == 0 ||
- strncmp( Oper, ".NOT.", 5 ))
- return 10;
-
- if( strncmp( Oper, "**", 2 ) == 0 || Oper[0] == '^' )
- return 4;
-
- if( Oper[0] == '*' || Oper[0] == '/' || Oper[0] == '%' )
- return 3;
-
- if( Oper[0] == '+' || Oper[0] == '-' )
- return 1;
-
- return 0;
-}
-/*************************************************************************/
-//! ReduceComplexExpression
-/*!
-*/
-xbShort xbExpn::ReduceComplexExpression(const char *NextToken, xbShort Len,
- xbExpNode *cn, xbDbf *d) {
- const char *p;
- xbShort rc;
- xbExpNode * SaveTree;
-
- SaveTree = Tree;
- Tree = NULL;
-
- p = NextToken;
- p++;
-
- if(( rc = BuildExpressionTree( p, Len-2, d )) != XB_NO_ERROR )
- return rc;
-
- if(cn->Node) { /* then this is the base tree */
- cn->Node->Sibling2 = Tree;
- Tree->Node = cn->Node;
- delete cn;
- Tree = SaveTree;
- } else
- delete cn;
-
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-//! GetFunctionTokenLen
-/*!
-*/
-xbShort xbExpn::GetFunctionTokenLen( const char * s )
-{
- xbShort cnt, LeftParenCtr;
- const char *p;
-
- cnt = LeftParenCtr = 0;
- p = s;
-
- while( p && ( *p != ',' || ( *p == ',' && LeftParenCtr > 0 )) &&
- !( LeftParenCtr == 0 && *p == ')')) {
- if( *p == '(' )
- LeftParenCtr++;
- else if( *p == ')' )
- LeftParenCtr--;
- p++;
- cnt++;
- }
- return cnt;
-}
-/*************************************************************************/
-//! ReduceFunction
-/*!
-*/
-xbShort xbExpn::ReduceFunction(const char *NextToken, xbExpNode *cn, xbDbf *d)
-{
- const char *p;
- xbShort rc;
- xbShort FuncTokenLen;
- xbExpNode * SaveTree;
-
- p = strchr( NextToken, '(' );
- if (!p)
- return XB_PARSE_ERROR;
-
- p++;
- while( IsWhiteSpace( *p )) p++;
- if (*p == ')')
- return XB_NO_ERROR;
-
- /* do function paramater 1 */
- FuncTokenLen = GetFunctionTokenLen( p );
- SaveTree = Tree;
- Tree = NULL;
- if(( rc = BuildExpressionTree( p, FuncTokenLen, d )) != XB_NO_ERROR )
- return rc;
- cn->Sibling1 = Tree;
- Tree->Node = cn;
- Tree = SaveTree;
-
- /* do function paramater 2 */
-
- p += FuncTokenLen;
- while( IsWhiteSpace( *p )) p++;
- if(*p == ')')
- return XB_NO_ERROR;
- if( *p != ',' )
- return XB_PARSE_ERROR;
-
- p++;
- while( IsWhiteSpace( *p )) p++;
- FuncTokenLen = GetFunctionTokenLen( p );
- SaveTree = Tree;
- Tree = NULL;
- if(( rc = BuildExpressionTree( p, FuncTokenLen, d )) != XB_NO_ERROR )
- return rc;
-
- cn->Sibling2 = Tree;
- Tree->Node = cn;
- Tree = SaveTree;
-
- /* do function paramater 3 */
- p += FuncTokenLen;
- while( IsWhiteSpace( *p )) p++;
- if (*p == ')')
- return XB_NO_ERROR;
- if( *p != ',' )
- return XB_PARSE_ERROR;
-
- p++;
- while( IsWhiteSpace( *p )) p++;
- FuncTokenLen = GetFunctionTokenLen( p );
- SaveTree = Tree;
- Tree = NULL;
- if(( rc = BuildExpressionTree( p, FuncTokenLen, d )) != XB_NO_ERROR )
- return rc;
-
- cn->Sibling3 = Tree;
- Tree->Node = cn;
- Tree = SaveTree;
-
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-//! ParseExpression
-/*!
-*/
-xbShort xbExpn::ParseExpression(const char *exp, xbDbf *d) {
- return BuildExpressionTree(exp, strlen(exp), d);
-}
-/*************************************************************************/
-//! ProcessExpression
-/*!
-*/
-xbShort xbExpn::ProcessExpression(const char *e, xbDbf *d) {
- xbShort rc;
- if(( rc = BuildExpressionTree( e, strlen( e ), d )) != XB_NO_ERROR )
- return rc;
- if(( rc = ProcessExpression( Tree )) != XB_NO_ERROR )
- return rc;
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-#ifdef XBASE_DEBUG
-//! DumpExpressionTree
-/*!
-*/
-void xbExpn::DumpExpressionTree( xbExpNode * E, xbShort printOption )
-{
- if( !E ) E = Tree;
- if( !E ) return;
- DumpExpNode( E, printOption );
-
- if( E->Sibling1 ) DumpExpressionTree( E->Sibling1, printOption );
- if( E->Sibling2 ) DumpExpressionTree( E->Sibling2, printOption );
- if( E->Sibling3 ) DumpExpressionTree( E->Sibling3, printOption );
- return;
-}
-/*************************************************************************/
-//! DumpExpNode
-/*!
-*/
-void xbExpn::DumpExpNode(xbExpNode *e, xbShort printOption)
-{
- xbString ntext;
-
- ntext = e->NodeText;
- ntext.resize( e->Len + 1 );
-
- if( printOption ){
- FILE * dmp;
- if(( dmp = fopen( "xbase64.log", "a" )) == NULL )
- return;
-
- fprintf( dmp, "******* Exp Node *******\n" );
- fprintf( dmp, "Exp Node Address = %x\n", e );
- fprintf( dmp, "Node Text = %s\n", ntext.getData());
- fprintf( dmp, "Type = %c\n", e->Type );
- fprintf( dmp, "Len = %d\n", e->Len );
- fprintf( dmp, "InTree = %d\n", e->InTree );
- fprintf( dmp, "Field No = %d\n", e->FieldNo );
- fprintf( dmp, "ExpressionType = %c\n", e->ExpressionType );
- fprintf( dmp, "StringResult = %s\n", e->StringResult.getData());
- fprintf( dmp, "DoubResult = %d\n", e->DoubResult );
- fprintf( dmp, "IntResult = %d\n", e->IntResult );
- fprintf( dmp, "ResultLen = %d\n", e->ResultLen );
- fprintf( dmp, "DataLen = %x\n", e->DataLen );
-
- if( e->Node )
- fprintf( dmp, "Parent = %x\n", e->Node );
- if( e->Sibling1 )
- fprintf( dmp, "Sibling 1 = %x\n", e->Sibling1 );
- if( e->Sibling2 )
- fprintf( dmp, "Sibling 2 = %x\n", e->Sibling2 );
- if( e->Sibling3 )
- fprintf( dmp, "Sibling 3 = %x\n", e->Sibling3 );
- fprintf( dmp, "\n" );
- fclose( dmp );
- }
- else
- {
- std::cout << "****** Exp Node ******";
- std::cout << "Exp Node Address = " << e << std::endl;
- std::cout << "Node Text = " << ntext << std::endl;
- std::cout << "Type = " << e->Type << std::endl;
- std::cout << "Len = " << e->Len << std::endl;
- std::cout << "InTree = " << e->InTree << std::endl;
- std::cout << "Field No = " << e->FieldNo << std::endl;
- std::cout << "ExpressionType = " << e->ExpressionType << std::endl;
- std::cout << "StringResult = " << e->StringResult << std::endl;
- std::cout << "DoubResult = " << e->DoubResult << std::endl;
- std::cout << "IntResult = " << e->IntResult << std::endl;
- std::cout << "ResultLen = " << e->ResultLen << std::endl;
- std::cout << "DataLen = " << e->DataLen << std::endl;
- if( e->Node )
- std::cout << "Parent = " << e->Node << std::endl;
- if( e->Sibling1 )
- std::cout << "Sibling 1 = " << e->Sibling1 << std::endl;
- if( e->Sibling2 )
- std::cout << "Sibling 2 = " << e->Sibling2 << std::endl;
- if( e->Sibling3 )
- std::cout << "Sibling3 = " << e->Sibling3 << std::endl;
- }
- return;
-}
-#endif
-
-/*************************************************************************/
-//! xbExpNode()
-/*!
-*/
-xbExpNode::xbExpNode() :
- NodeText(0),
- Type(0),
- Len(0),
- InTree(0),
- Node(0),
- Sibling1(0),
- Sibling2(0),
- Sibling3(0),
- DataLen(0),
- ResultLen(0),
- DoubResult(0),
- IntResult(0),
- dbf(0),
- FieldNo(-1),
- ExpressionType(0)
-{
-}
-/*************************************************************************/
-//! ~xbExpNode()
-/*!
-*/
-xbExpNode::~xbExpNode()
-{
- if(NodeText)
- free(NodeText);
-
- if(Sibling1)
- delete Sibling1;
-
- if(Sibling2)
- delete Sibling2;
-
- if(Sibling3)
- delete Sibling3;
-}
-/*************************************************************************/
-//! Constructor.
-/*!
-*/
-xbStackElement::xbStackElement()
-{
- Next = 0;
- Previous = 0;
- NodePtr = 0;
-}
-/*************************************************************************/
-//! Destructor.
-/*!
-*/
-xbStackElement::~xbStackElement()
-{
-}
-/*************************************************************************/
-
-//! Destructor.
-/*!
-*/
-
-/*************************************************************************/
-//! Short description.
-/*!
-*/
-void xbExpn::InitStack()
-{
- xbStackElement *next;
-
- while(First){
- next = First->Next;
-
- if( First->NodePtr->InTree == 0 )
- delete First->NodePtr;
-
- delete First;
- First = next;
- }
-
- Last = 0;
- StackDepth = 0;
- return;
-}
-/*************************************************************************/
-//! Push a value onto the stack.
-/*!
- \param p
-*/
-xbShort xbExpn::Push( xbExpNode *p )
-{
- xbStackElement *Temp = new xbStackElement;
-
- if(!Temp)
- return XB_NO_MEMORY;
-
- Temp->NodePtr = p;
-
- if( !First ){
- First = Temp;
- Last = Temp;
- StackDepth = 1;
- } else {
- Last->Next = Temp;
- Temp->Previous = Last;
- Last = Temp;
- StackDepth++;
- }
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-//! Pop the top value from the stack.
-/*!
-*/
-xbExpNode * xbExpn::Pop()
-{
- xbExpNode *p;
- xbStackElement *Save;
-
- if( StackDepth == 0 )
- return 0;
- else {
- p = Last->NodePtr;
- if( StackDepth == 1 ){
- delete First;
- First = 0;
- Last = 0;
- } else { /* number of items in Stack must be > 1 */
- Last->Previous->Next = 0;
- Save = Last;
- Last = Last->Previous;
- delete Save;
- }
- StackDepth--;
- return p;
- }
-}
-/*************************************************************************/
-//! Short description.
-/*!
-*/
-#ifdef XBASE_DEBUG
-void xbExpn::DumpStack()
-{
- xbStackElement * e;
- if( StackDepth == 0 ){
- std::cout << "\nStack is empty...";
- return;
- }
-
- std::cout << "\nThere are " << StackDepth << " entries.";
- std::cout << "\nFirst = " << First << " Last = " << Last;
-
- e = First;
- while( e ){
- std::cout << "\n*****************************";
- std::cout << "\nThis = " << e;
- std::cout << "\nNext = " << e->Next;
- std::cout << "\nPrevious = " << e->Previous;
- std::cout << "\nNode Ptr = " << e->NodePtr;
- e = e->Next;
- }
- return;
-}
-#endif // XB_EXPRESSIONS
-#endif
-/*************************************************************************/
diff --git a/xbase64/xbexp.h b/xbase64/xbexp.h
deleted file mode 100755
index ec769a9..0000000
--- a/xbase64/xbexp.h
+++ /dev/null
@@ -1,290 +0,0 @@
-/* xbexp.h
-
- Xbase64 project source code
-
- This file contains a header file for the EXP object, which is
- used for expression processing.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifndef __XB_EXP_H__
-#define __XB_EXP_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-#include <xbase64/xbase64.h>
-
-#ifdef XB_EXPRESSIONS /* compile if expression logic on */
-#include <xbase64/xbtypes.h>
-
-/*! \file xbexp.h
-*/
-
-#undef ABS
-#undef MIN
-#undef MAX
-
-class XBDLLEXPORT xbDbf;
-
-/************************************************************************/
-//! xbFuncDtl struct
-/*! This structure defines function information
-*/
-
-struct XBDLLEXPORT xbFuncDtl {
- const char * FuncName; /* function name */
- xbShort ParmCnt; /* no of parms it needs */
- char ReturnType; /* return type of function */
- void (*ExpFuncPtr)(); /* pointer to function routine */
-};
-
-/************************************************************************/
-//! xbExpNode struct
-/*! This class defines a node within a tree of nodes, each token
- in an expression gets placed onto its own node
-*/
-
-class XBDLLEXPORT xbExpNode {
- public:
- xbExpNode();
- virtual ~xbExpNode();
-
- public:
- char * NodeText; /* expression text */
- char Type; /* same as TokenType below */
- xbShort Len; /* length of expression text */
- xbShort InTree; /* this node in the tree? 1=yes */
- xbExpNode * Node; /* pointer to parent */
- xbExpNode * Sibling1; /* pointer to sibling 1 */
- xbExpNode * Sibling2; /* pointer to sibling 2 */
- xbExpNode * Sibling3; /* pointe/r to sibling 3 */
- xbShort DataLen; /* length of data in result buffer */
- xbShort ResultLen; /* length of result buffer */
- xbString StringResult; /* string result */
- xbDouble DoubResult; /* Numeric Result */
- xbShort IntResult; /* logical result */
- xbDbf * dbf; /* pointer to datafile */
- xbShort FieldNo; /* field no if DBF field */
- char ExpressionType; /* used in head node C,N,L or D */
-};
-/************************************************************************/
-//! xbStackElement class
-/*!
-*/
-
-class XBDLLEXPORT xbStackElement
-{
- public:
- xbStackElement();
- ~xbStackElement();
-
- friend class xbExpn;
-
- private:
- xbStackElement *Previous;
- xbStackElement *Next;
- xbExpNode *NodePtr;
-};
-/************************************************************************/
-//! xbExpn class
-/*! This class is used for processing expressions
-*/
-
-/* Expression handler */
-
-class XBDLLEXPORT xbExpn{
- public:
- xbExpn( xbXBase * );
- virtual ~xbExpn();
-
- xbShort GetNextToken( const char *s, xbShort MaxLen );
- xbShort ProcessExpression( xbExpNode *n, xbShort );
- xbShort ProcessExpression( xbShort opt )
- { return ProcessExpression( Tree, opt ); }
-
- xbExpNode * GetTree() { return Tree; }
- void SetTreeToNull() { Tree = NULL; }
- xbExpNode * GetFirstTreeNode( xbExpNode * );
- xbExpNode * GetFirstTreeNode()
- { return GetFirstTreeNode( Tree ); }
- xbShort ProcessExpression( const char *exp, xbDbf * d );
- xbShort ParseExpression( const char *exp, xbDbf * d );
- xbExpNode * GetExpressionHandle();
- char GetExpressionResultType( xbExpNode * );
- char GetExpressionResultType()
- { return GetExpressionResultType( Tree ); }
- char * GetCharResult();
- xbString & GetStringResult();
- xbDouble GetDoubleResult();
- xbLong GetIntResult();
- xbShort ProcessExpression( xbExpNode * );
- xbShort ProcessExpression() { return ProcessExpression( Tree ); }
- xbShort BuildExpressionTree( const char * Expression, xbShort MaxTokenLen,
- xbDbf *d );
-
- /* stack functions */
- void InitStack();
- xbExpNode * Pop();
- xbShort Push(xbExpNode *);
- xbShort GetStackDepth() { return StackDepth; }
- void DumpStack();
- const char * GetValidFuncName( xbShort funcNo )
- { return XbaseFuncList[funcNo].FuncName; }
-
-#ifdef XBASE_DEBUG
- void DumpExpressionTree( xbShort printOption )
- { DumpExpressionTree( Tree, printOption ); }
- void DumpExpressionTree( xbExpNode *, xbShort printOption );
- void DumpExpNode( xbExpNode *, xbShort printOption );
-#endif
-
- /* expression methods */
- xbDouble ABS( xbDouble );
- xbLong ASC( const char * );
- xbLong AT( const char *, const char * );
- char * CDOW( const char * );
- char * CHR( xbLong );
- char * CMONTH( const char * );
- char * CTOD( const char * );
- char * DATE();
- xbLong DAY( const char * );
- char * DESCEND( const char * );
- xbLong DESCEND( const xbDate & );
- xbDouble DESCEND( xbDouble );
- xbLong DOW( const char * );
- char * DTOC( const char * );
- char * DTOS( const char * );
- xbDouble EXP( xbDouble );
- char * IIF( xbShort, const char *, const char * );
- xbLong INT( xbDouble );
- xbLong ISALPHA( const char * );
- xbLong ISLOWER( const char * );
- xbLong ISUPPER( const char * );
- char * LEFT( const char *, xbShort );
- xbLong LEN( const char * );
- xbDouble LOG( xbDouble );
- char * LOWER( const char * );
- char * LTRIM( const char * );
- xbDouble MAX( xbDouble, xbDouble );
- xbLong MONTH( const char * ); /* MONTH() */
- xbDouble MIN( xbDouble, xbDouble );
- xbLong RECNO( xbDbf * );
- char * REPLICATE( const char *, xbShort );
- char * RIGHT( const char *, xbShort );
- char * RTRIM( const char * );
- char * SPACE( xbShort );
- xbDouble SQRT( xbDouble );
- char * STR( const char * );
- char * STR( const char *, xbShort );
- char * STR( const char *, xbShort, xbShort );
- char * STR( xbDouble );
- char * STR( xbDouble, xbShort );
- char * STR(xbDouble, xbUShort length, xbShort numDecimals );
- char * STRZERO( const char * );
- char * STRZERO( const char *, xbShort );
- char * STRZERO( const char *, xbShort, xbShort );
- char * STRZERO( xbDouble );
- char * STRZERO( xbDouble, xbShort );
- char * STRZERO( xbDouble, xbShort, xbShort );
- char * SUBSTR( const char *, xbShort, xbShort );
- char * TRIM( const char * );
- char * UPPER( const char * );
- xbLong VAL( const char * );
- xbLong YEAR( const char * );
-
- protected:
- xbShort IsWhiteSpace( char );
- char IsSeparator( char );
- xbExpNode * LoadExpNode( const char * ENodeText, const char EType,
- const xbShort ELen, const xbShort BufLen );
- xbShort OperatorWeight( const char *Oper, xbShort len );
- xbShort ReduceComplexExpression( const char * NextToken, xbShort Len,
- xbExpNode * cn, xbDbf *d );
- xbShort GetFunctionTokenLen( const char *s );
- xbShort ReduceFunction( const char *NextToken, xbExpNode *cn, xbDbf *d );
- xbExpNode * GetNextTreeNode( xbExpNode * );
- xbShort ProcessOperator( xbShort );
- xbShort ProcessFunction( char * );
- xbShort ValidOperation( char *, char, char );
- char GetOperandType( xbExpNode * );
- xbShort AlphaOperation( char * );
- xbShort NumericOperation( char * );
- xbShort GetFuncInfo( const char *Function, xbShort Option );
- xbDouble GetDoub( xbExpNode * );
- xbLong GetInt( xbExpNode * );
-
- private:
- xbXBase *xbase;
- xbFuncDtl *XbaseFuncList; /* pointer to list of Xbase functions */
- xbExpNode *Tree; /* pointer to tree of parsed nodes */
- xbShort LogicalType; /* set to 1 for logical type nodes */
- char TokenType; /* E - Expression, not in simplest form */
- /* C - Constant */
- /* N - Numeric Constant */
- /* O - Operator */
- /* F - Function */
- /* D - Database Field */
- /* s - character string result */
- /* l - logical or short int result */
- /* d - double result */
- char PreviousType; /* used to see if "-" follows operator */
- char * Op1; /* pointer to operand 1 */
- char * Op2; /* pointer to operand 2 */
- xbDouble Opd1; /* double result 1 */
- xbDouble Opd2; /* double result 2 */
- xbShort OpLen1; /* length of memory allocated to operand 1 */
- xbShort OpLen2; /* length of memory allocated to operand 2 */
- xbShort OpDataLen1; /* length of data in op1 */
- xbShort OpDataLen2; /* length of data in op2 */
- char OpType1; /* type of operand 1 */
- char OpType2; /* type of operand 2 */
- xbShort TokenLen; /* length of token */
-
-// static xbString DefaultDateFormat; /*default date format for DTOC func*/
- enum { WorkBufMaxLen = 200 };
- char WorkBuf[WorkBufMaxLen+1];
-
- /* stack variables */
- xbShort StackDepth;
- xbStackElement *First;
- xbStackElement *Last;
-};
-
-#endif // XB_EXPRESSIONS
-#endif // __XB_EXP_H__
-
-
diff --git a/xbase64/xbexpfnc.cpp b/xbase64/xbexpfnc.cpp
deleted file mode 100755
index 91b6074..0000000
--- a/xbase64/xbexpfnc.cpp
+++ /dev/null
@@ -1,1092 +0,0 @@
-/* xbexpfnc.cpp
-
- Xbase64 project source code
-
- This file contains logic for handling Xbase expressions.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-#ifdef XB_EXPRESSIONS
-
-#include <ctype.h>
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <xbase64/xbexp.h>
-//#include <xbase64/xbexcept.h>
-
-
-/*! \file xbexpfnc.cpp
-*/
-
-/*************************************************************************/
-//! Short description.
-/*!
- \param Func
-*/
-xbShort xbExpn::ProcessFunction( char * Func )
-{
-/* 1 - pop function from stack
- 2 - verify function name and get no of parms needed
- 3 - verify no of parms >= remainder of stack
- 4 - pop parms off stack
- 5 - execute function
- 6 - push result back on stack
-*/
-
-
- char *buf = 0;
- xbExpNode *p1, *p2, *p3, *WorkNode, *FuncNode;
- xbShort ParmsNeeded,len;
- char ptype = 0; /* process type s=string, l=logical, d=double */
- xbDouble DoubResult = 0;
- xbLong IntResult = 0;
- FuncNode = (xbExpNode *) Pop();
-
- ParmsNeeded = GetFuncInfo( Func, 1 );
-
- if( ParmsNeeded == -1 ) {
- return XB_INVALID_FUNCTION;
- }
- else {
- ParmsNeeded = 0;
- if( FuncNode->Sibling1 ) ParmsNeeded++;
- if( FuncNode->Sibling2 ) ParmsNeeded++;
- if( FuncNode->Sibling3 ) ParmsNeeded++;
- }
-
- if( ParmsNeeded > GetStackDepth())
- return XB_INSUFFICIENT_PARMS;
-
- p1 = p2 = p3 = NULL;
- if( ParmsNeeded > 2 ) p3 = (xbExpNode *) Pop();
- if( ParmsNeeded > 1 ) p2 = (xbExpNode *) Pop();
- if( ParmsNeeded > 0 ) p1 = (xbExpNode *) Pop();
- memset( WorkBuf, 0x00, WorkBufMaxLen+1);
-
- if( strncmp( Func, "ABS", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = ABS( GetDoub( p1 ));
- }
- else if( strncmp( Func, "ASC", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = ASC( p1->StringResult );
- }
- else if( strncmp( Func, "AT", 2 ) == 0 ) {
- ptype = 'd';
- DoubResult = AT( p1->StringResult, p2->StringResult );
- }
- else if( strncmp( Func, "CDOW", 4 ) == 0 ) {
- ptype = 's';
- buf = CDOW( p1->StringResult );
- }
- else if( strncmp( Func, "CHR", 3 ) == 0 ) {
- ptype = 's';
- buf = CHR( GetInt( p1 ));
- }
- else if( strncmp( Func, "CMONTH", 6 ) == 0 ) {
- ptype = 's';
- buf = CMONTH( p1->StringResult );
- }
- else if( strncmp( Func, "CTOD", 4 ) == 0 ) {
- ptype = 's';
- buf = CTOD( p1->StringResult );
- }
- else if( strncmp( Func, "DATE", 4 ) == 0 ) {
- ptype = 's';
- buf = DATE();
- }
- else if( strncmp( Func, "DAY", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = DAY( p1->StringResult );
- }
- else if( strncmp( Func, "DESCEND", 7 ) == 0 && p1->ExpressionType == 'C' ) {
- ptype = 's';
- buf = DESCEND( p1->StringResult.c_str() );
- }
- else if( strncmp( Func, "DESCEND", 7 ) == 0 && p1->ExpressionType == 'N' ) {
- ptype = 'd';
- DoubResult = DESCEND( GetDoub( p1 ));
- }
- else if( strncmp( Func, "DESCEND", 7 ) == 0 && p1->ExpressionType == 'D' ) {
- xbDate d( p1->StringResult );
- ptype = 'd';
- DoubResult = DESCEND( d );
- }
- else if( strncmp( Func, "DOW", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = DOW( p1->StringResult );
- }
- else if( strncmp( Func, "DTOC", 4 ) == 0 ) {
- ptype = 's';
- buf = DTOC( p1->StringResult );
- }
- else if( strncmp( Func, "DTOS", 4 ) == 0 ) {
- ptype = 's';
- buf = DTOS( p1->StringResult );
- }
- else if( strncmp( Func, "EXP", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = EXP( GetDoub( p1 ));
- }
- else if( strncmp( Func, "IIF", 3 ) == 0 ){
- ptype = 's';
- buf = IIF( p1->IntResult, p2->StringResult, p3->StringResult );
- }
- else if( strncmp( Func, "INT", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = INT( GetDoub( p1 ));
- }
- else if( strncmp( Func, "ISALPHA", 7 ) == 0 ) {
- ptype = 'l';
- IntResult = ISALPHA( p1->StringResult );
- }
- else if( strncmp( Func, "ISLOWER", 7 ) == 0 ) {
- ptype = 'l';
- IntResult = ISLOWER( p1->StringResult );
- }
- else if( strncmp( Func, "ISUPPER", 7 ) == 0 ) {
- ptype = 'l';
- IntResult = ISUPPER( p1->StringResult );
- }
- else if( strncmp( Func, "LEN", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = LEN( p1->StringResult );
- }
- else if( strncmp( Func, "LEFT", 4 ) == 0 ) {
- ptype = 's';
- buf = LEFT( p1->StringResult, INT( p2->DoubResult ));
- }
- else if( strncmp( Func, "LTRIM", 5 ) == 0 ) {
- ptype = 's';
- buf = LTRIM( p1->StringResult );
- }
- else if( strncmp( Func, "LOG", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = LOG( GetDoub( p1 ));
- }
- else if( strncmp( Func, "LOWER", 5 ) == 0 ) {
- ptype = 's';
- buf = LOWER( p1->StringResult );
- }
- else if( strncmp( Func, "MAX", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = MAX( GetDoub( p1 ), GetDoub( p2 ));
- }
- else if( strncmp( Func, "MIN", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = MIN( GetDoub( p1 ), GetDoub( p2 ));
- }
- else if( strncmp( Func, "MONTH", 5 ) == 0 ) {
- ptype = 'd';
- DoubResult = MONTH( p1->StringResult );
- }
-
- else if( strncmp( Func, "RECNO", 5 ) == 0 )
- {
- ptype = 'd';
- DoubResult = RECNO( FuncNode->dbf );
- }
-
- else if( strncmp( Func, "REPLICATE", 9 ) == 0 ) {
- ptype = 's';
- buf = REPLICATE( p1->StringResult, GetInt( p2 ));
- }
- else if( strncmp( Func, "RIGHT", 5 ) == 0 ) {
- ptype = 's';
- buf = RIGHT( p1->StringResult, GetInt( p2 ));
- }
- else if( strncmp( Func, "RTRIM", 5 ) == 0 ) {
- ptype = 's';
- buf = RTRIM( p1->StringResult );
- }
- else if( strncmp( Func, "SPACE", 5 ) == 0 ) {
- ptype = 's';
- buf = SPACE( INT( GetDoub( p1 )));
- }
- else if( strncmp( Func, "SQRT", 4 ) == 0 ) {
- ptype = 'd';
- DoubResult = SQRT( GetDoub( p1 ));
- }
- else if( strncmp( Func, "STRZERO", 7 ) == 0 && ParmsNeeded == 1 ) {
- ptype = 's';
- buf = STRZERO( p1->StringResult );
- }
- else if( strncmp( Func, "STRZERO", 7 ) == 0 && ParmsNeeded == 2 ) {
- ptype = 's';
- buf = STRZERO( p1->StringResult, GetInt( p2 ));
- }
- else if( strncmp( Func, "STRZERO", 7 ) == 0 && ParmsNeeded == 3 ) {
- ptype = 's';
- buf = STRZERO( p1->StringResult, GetInt( p2 ), GetInt( p3 ));
- }
-
- else if( strncmp( Func, "STR", 3 ) == 0 && p3 ) {
- ptype = 's';
- if(p1->ExpressionType == 'N')
- buf = STR( p1->DoubResult, GetInt( p2 ), GetInt( p3 ));
- else
- buf = STR( p1->StringResult, GetInt( p2 ), GetInt( p3 ));
- }
-
- else if( strncmp( Func, "STR", 3 ) == 0 && p2 ) {
- ptype = 's';
- buf = STR( p1->StringResult, GetInt( p2 ));
- }
-
- else if( strncmp( Func, "STR", 3 ) == 0 && p1 ) {
- ptype = 's';
- buf = STR( p1->StringResult );
- }
-
- else if( strncmp( Func, "SUBSTR", 6 ) == 0 ) {
- ptype = 's';
- buf = SUBSTR( p1->StringResult, GetInt( p2 ), GetInt( p3 ));
- }
- else if( strncmp( Func, "TRIM", 4 ) == 0 ) {
- ptype = 's';
- buf = TRIM( p1->StringResult );
- }
- else if( strncmp( Func, "UPPER", 5 ) == 0 ) {
- ptype = 's';
- buf = UPPER( p1->StringResult );
- }
- else if( strncmp( Func, "VAL", 3 ) == 0 ) {
- ptype = 'd';
- DoubResult = VAL( p1->StringResult );
- }
- else if( strncmp( Func, "YEAR", 4 ) == 0 ) {
- ptype = 'd';
- DoubResult = YEAR( p1->StringResult );
- }
- if( p1 && !p1->InTree ) delete p1;
- if( p2 && !p2->InTree ) delete p2;
- if( p3 && !p3->InTree ) delete p3;
- if( !FuncNode->InTree ) delete FuncNode;
- if( buf ){
- len = strlen( buf );
- WorkNode = new xbExpNode;
- if( !WorkNode )
- return XB_NO_MEMORY;
- WorkNode->ResultLen = len + 1;
-
- } else {
- len = 0;
- WorkNode = new xbExpNode;
- if( !WorkNode )
- return XB_NO_MEMORY;
- WorkNode->ResultLen = 0;
- }
-
- switch( ptype ){
- case 's': /* string or char result */
- WorkNode->DataLen = len;
- WorkNode->ExpressionType = 'C';
- WorkNode->Type = 's';
- WorkNode->StringResult = buf;
- break;
- case 'd': /* numeric result */
- WorkNode->DataLen = 0;
- WorkNode->ExpressionType = 'N';
- WorkNode->Type = 'd';
- WorkNode->DoubResult = DoubResult;
- break;
- case 'l': /* logical result */
- WorkNode->DataLen = 0;
- WorkNode->ExpressionType = 'L';
- WorkNode->Type = 'l';
- WorkNode->IntResult = IntResult;
- break;
- default:
- std::cout << "\nInternal error. " << ptype;
- break;
- }
- Push(WorkNode);
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-//! Short description.
-/*!
-*/
-xbString & xbExpn::GetStringResult()
-{
- xbString *s = 0;
- xbExpNode *e;
- if( GetStackDepth() < 1 ) return *s;
- e = (xbExpNode *) Pop();
- s = &e->StringResult;
- Push(e);
- return *s;
-}
-/*************************************************************************/
-//! Short description.
-/*!
-*/
-xbLong xbExpn::GetIntResult()
-{
- xbLong l;
- xbExpNode * e;
- if( GetStackDepth() < 1 ) return 0L;
- e = (xbExpNode *) Pop();
- l = e->IntResult;
- Push(e);
- return l;
-}
-/*************************************************************************/
-//! Short description.
-/*!
-*/
-xbDouble xbExpn::GetDoubleResult()
-{
- xbDouble d;
- xbExpNode * e;
- if( GetStackDepth() < 1 ) return (xbDouble) 0;
- e = (xbExpNode *) Pop();
- d = e->DoubResult;
- Push(e);
- return d;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param p
-*/
-xbDouble xbExpn::GetDoub( xbExpNode * p )
-{
- if( p->Type == 'd' )
- return p->DoubResult;
- else if( p->Type == 'N' || p->Type == 's' )
- return( strtod( p->StringResult, NULL ));
- else if( p->Type == 'D' )
- return( p->dbf->GetDoubleField( p->FieldNo ));
- else
- return 0;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param p
-*/
-xbLong xbExpn::GetInt( xbExpNode *p )
-{
- if( p->Type == 'l' || p->Type == 'i' )
- return p->IntResult;
- else if( p->Type == 'N' || p->Type == 's' )
- return atoi( p->StringResult );
- else if( p->Type == 'D' )
- return p->dbf->GetLongField( p->FieldNo );
- else
- return 0L;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
-*/
-xbDouble xbExpn::ABS( xbDouble d )
-{
- if( d < (xbDouble) 0 )
- return d * -1;
- else
- return d;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-xbLong xbExpn::ASC( const char * String )
-{
- return *String;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param s1
- \param s2
-*/
-xbLong xbExpn::AT( const char * s1, const char *s2 )
-{
- /* looks for s1 in s2 */
- xbLong cnt;
- const char *p;
- if( strlen( s1 ) > strlen( s2 )) return 0;
- if(( p = strstr( s2, s1 )) == NULL )
- return 0;
- cnt = 1;
- while( s2++ != p ) cnt++;
- return cnt;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-char * xbExpn::CDOW( const char * Date8 )
-{
- static char buf[10];
- xbDate d;
- xbShort len,i;
- strcpy( buf, d.FormatDate( "DDDD", Date8 ));
- len = strlen( buf );
- for( i = len; i < 9; i++ ) buf[i] = 0x20;
- buf[9] = 0x00;
- return buf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param l
-*/
-char * xbExpn::CHR( xbLong l )
-{
- static char buf[2];
- xbShort i;
- i = (xbShort) l;
- buf[0] = i;
- buf[1] = 0x00;
- return buf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-char * xbExpn::CMONTH( const char * Date8 )
-{
- static char buf[10];
- xbShort len,i;
- xbDate d;
- strcpy( buf, d.FormatDate( "MMMM", Date8 ));
- len = strlen( buf );
- for( i = len; i < 9; i++ ) buf[i] = 0x20;
- buf[9] = 0x00;
- return buf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param indate
-*/
-char * xbExpn::CTOD( const char * indate )
-{
- xbDate d;
- strcpy( WorkBuf, d.FormatCTODdate( indate ));
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-xbLong xbExpn::DAY( const char * Date8 )
-{
- xbDate d;
- return d.DayOf( XB_FMT_MONTH, Date8 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param date
-*/
-xbLong xbExpn::DESCEND( const xbDate & date )
-{
- return 2415021 + date.JulianDays( "29991231" ) - date.JulianDays();
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param num
-*/
-xbDouble xbExpn::DESCEND( xbDouble d )
-{
- return d * -1;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param str
-*/
-char * xbExpn::DESCEND( const char * str )
-{
- xbShort i;
- xbShort len = strlen( str );
-
- for( i = 0; i < len; i++ )
- WorkBuf[i] = 255 - str[i];
- WorkBuf[i] = 0x00;
-
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-xbLong xbExpn::DOW( const char * Date8 )
-{
- xbDate d;
- return d.DayOf( XB_FMT_WEEK, Date8 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-char * xbExpn::DTOC( const char * Date8 )
-{
- xbDate d;
- strcpy( WorkBuf, d.FormatDate( xbase->GetDefaultDateFormat(), Date8 ));
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-char * xbExpn::DTOS( const char * Date8 )
-{
- xbDate d;
- strcpy( WorkBuf, d.FormatDate( "YYYYMMDD", Date8 ));
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
-*/
-xbDouble xbExpn::EXP( xbDouble d )
-{
- return exp( d );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param ifCondition
- \param trueRslt
- \param falseRslt
-*/
-char * xbExpn::IIF( xbShort ifCondition,
- const char * trueRslt, const char * falseRslt )
-{
- if( ifCondition )
- strcpy( WorkBuf, trueRslt );
- else
- strcpy( WorkBuf, falseRslt );
-
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
-*/
-xbLong xbExpn::INT( xbDouble d )
-{
- return (xbLong) d;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-xbLong xbExpn::ISALPHA( const char * String )
-{
- if( isalpha(*String) ) return 1;
- else return 0;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-xbLong xbExpn::ISLOWER( const char * String )
-{
- if( islower(*String) ) return 1;
- else return 0;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-xbLong xbExpn::ISUPPER( const char * String )
-{
- if( isupper(*String) ) return 1;
- else return 0;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-xbLong xbExpn::LEN( const char * String )
-{
- xbLong len;
- len = strlen( String );
- len--;
- while( len >= 0 && String[len] == 0x20 ) len--;
- return ++len;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
- \param Len
-*/
-char * xbExpn::LEFT( const char * String, xbShort Len )
-{
- xbShort i;
- for( i = 0; i < Len && i < 100; i++ )
- WorkBuf[i] = String[i];
- WorkBuf[i] = 0x00;
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-/* This method removes any leading spaces from String */
-char * xbExpn::LTRIM( const char *String) {
- WorkBuf[0] = 0x00;
- if (!String)
- return WorkBuf;
-
- xbShort i;
- i = 0;
- while( *String && *String == 0x20 ) String++;
- while( *String && i < WorkBufMaxLen ){
- WorkBuf[i++] = *String;
- String++;
- }
- WorkBuf[i] = 0x00;
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
-*/
-xbDouble xbExpn::LOG( xbDouble d )
-{
- return log( d );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-char *xbExpn::LOWER( const char *String )
-{
- WorkBuf[0] = 0x00;
- if (!String)
- return WorkBuf;
- xbShort i = 0;
- while( *String && i < WorkBufMaxLen) {
- WorkBuf[i++] = tolower( *String );
- String++;
- }
- WorkBuf[i] = 0x00;
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d1
- \param d2
-*/
-xbDouble xbExpn::MAX( xbDouble d1, xbDouble d2 )
-{
- if( d1 > d2 )
- return d1;
- else
- return d2;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d1
- \param d2
-*/
-xbDouble xbExpn::MIN( xbDouble d1, xbDouble d2 )
-{
- if( d1 < d2 )
- return d1;
- else
- return d2;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-xbLong xbExpn::MONTH( const char * Date8 )
-{
- xbDate d;
- return d.MonthOf( Date8 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
-*/
-xbLong xbExpn::RECNO( xbDbf * d ) {
- return d->GetCurRecNo();
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
- \param Cnt
-*/
-char * xbExpn::REPLICATE( const char * String, xbShort Cnt )
-{
- xbShort len, i;
- len = strlen( String );
- if(( len * Cnt ) > 100 ) return NULL;
- memset( WorkBuf, 0x00, len+1 );
- for( i = 0; i < Cnt; i++ )
- strcat( WorkBuf, String );
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
- \paran cnt
-*/
-char * xbExpn::RIGHT( const char * String, xbShort cnt )
-{
- xbShort len;
- strcpy( WorkBuf, String );
- len = strlen( String );
- if( len < cnt ) return WorkBuf;
- len = LEN( String );
- if( len < cnt ) return WorkBuf;
- strcpy( WorkBuf, String + len - cnt );
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-char * xbExpn::RTRIM( const char * String )
-{
- return TRIM( String );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param Cnt
-*/
-char * xbExpn::SPACE( xbShort Cnt )
-{
- if( Cnt > 100 ) return NULL;
- memset( WorkBuf, 0x20, Cnt );
- WorkBuf[Cnt] = 0x00;
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
-*/
-xbDouble xbExpn::SQRT( xbDouble d )
-{
- return sqrt( d );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
- \param length
- \param numDecimals
-*/
-char * xbExpn::STR(xbDouble d, xbUShort length, xbShort numDecimals) {
- // sanity check for length arg
- if (length > WorkBufMaxLen)
- {
- // maybe should generate an error here instead ?
- length = WorkBufMaxLen;
- }
-
- // check the length required
- sprintf(WorkBuf, "%.*f", numDecimals, d);
-
- if ((xbUShort) strlen(WorkBuf) > length) {
- memset(WorkBuf, '*', length);
- WorkBuf[length] = 0x00;
- } else
- sprintf( WorkBuf, "%*.*f", length, numDecimals, d );
-
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
- \param length
-*/
-char * xbExpn::STR( xbDouble d, xbShort length )
-{
- return STR( d, length, 0 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
-*/
-char * xbExpn::STR( xbDouble d )
-{
- return STR( d, 10, 0 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
- \param length
- \param
-*/
-char * xbExpn::STR( const char * String, xbShort length, xbShort dec )
-{
- xbShort len, i;
- double d;
- d = strtod( String, NULL );
- return STR( d, length, dec );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
- \param length
-*/
-char * xbExpn::STR( const char *String, xbShort length )
-{
- return STR( String, length, 0 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-char * xbExpn::STR( const char * String )
-{
- return STR( String, 10, 0 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
- \param length
- \param
-*/
-char * xbExpn::STRZERO( xbDouble d, xbShort length, xbShort )
-{
- xbShort len,i;
- sprintf(WorkBuf, "%*.*g", length, length, d);
-// gcvt( d, length, WorkBuf );
- len = strlen( WorkBuf );
- if( len > length )
- strcpy( WorkBuf, "**********" );
- else if( len < length )
- {
- for( i = len; i < length; i++ )
- WorkBuf[i] = 0x30;
- WorkBuf[i] = 0x00;
- }
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
- \param length
-*/
-char * xbExpn::STRZERO( xbDouble d, xbShort length )
-{
- return STRZERO( d, length, 0 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param d
-*/
-char * xbExpn::STRZERO( xbDouble d )
-{
- return STRZERO( d, 10, 0 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
- \param length
- \param
-*/
-char * xbExpn::STRZERO( const char * String, xbShort length, xbShort )
-{
- xbShort i, len ;
- while( *String == ' ' ) String++;
- len = strlen(String);
- for( i = 0; i < abs( length-len); i++ )
- WorkBuf[i] = 0x30;
- WorkBuf[i] = 0x00;
- strcat( WorkBuf, String );
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
- \param length
-*/
-char * xbExpn::STRZERO( const char * String, xbShort length )
-{
- return STRZERO( String, length, 0 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-char * xbExpn::STRZERO( const char * String )
-{
- return STRZERO( String, 10, 0 );
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
- \param StartPos
- \param Len
-*/
-char * xbExpn::SUBSTR( const char * String, xbShort StartPos, xbShort Len )
-{
- xbShort i;
- if( StartPos < 1 ) return NULL;
- String += (StartPos - 1);
- for( i = 0; i < Len; i++ )
- WorkBuf[i] = *String++;
- WorkBuf[i] = 0x00;
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
-*/
-char * xbExpn::DATE()
-{
- xbDate d;
- strcpy( WorkBuf, d.Sysdate());
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-char * xbExpn::TRIM( const char * String )
-{
- WorkBuf[0] = 0x00;
- if( !String )
- return WorkBuf;
- char *sp;
- xbShort len;
- len = strlen( String );
- if( len < WorkBufMaxLen ) {
- strcpy( WorkBuf, String );
- }
- else {
- strncpy( WorkBuf, String, WorkBufMaxLen );
- WorkBuf[ WorkBufMaxLen ] = 0x00;
- len = WorkBufMaxLen;
- }
- sp = WorkBuf + len - 1;
- while( *sp == 0x20 && sp >= WorkBuf ) {
- *sp = 0x00;
- sp--;
- }
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-char *xbExpn::UPPER( const char *String )
-{
- WorkBuf[0] = 0x00;
- if (!String)
- return WorkBuf;
- xbShort i;
- i = 0;
- while(*String && i < WorkBufMaxLen) {
- WorkBuf[i++] = toupper(*String);
- String++;
- }
- WorkBuf[i] = 0x00;
- return WorkBuf;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param String
-*/
-xbLong xbExpn::VAL( const char * String )
-{
- if( String )
- return (xbLong) *String;
- else
- return 0;
-}
-/*************************************************************************/
-//! Short description.
-/*!
- \param Date8
-*/
-xbLong xbExpn::YEAR( const char * Date8 ){
- xbDate d;
- return d.YearOf( Date8 );
-}
-/*************************************************************************/
-#endif // XB_EXPRESSIONS
diff --git a/xbase64/xbexpprc.cpp b/xbase64/xbexpprc.cpp
deleted file mode 100755
index 8334ea4..0000000
--- a/xbase64/xbexpprc.cpp
+++ /dev/null
@@ -1,549 +0,0 @@
-/* xbexpprc.cpp
-
- Xbase64 project source code
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-
-#ifdef XB_EXPRESSIONS
-
-#include <ctype.h>
-#include <math.h>
-
-/*! \file xbexpprc.cpp
-*/
-
-/*************************************************************************/
-//! Short description
-/*!
- \param e
-*/
-xbExpNode * xbExpn::GetFirstTreeNode( xbExpNode * e )
-{
- xbExpNode * WorkNode;
- if( !e ) return e;
- WorkNode = e;
- while( WorkNode->Sibling1 )
- WorkNode = WorkNode->Sibling1;
- return WorkNode;
-}
-/*************************************************************************/
-//! Short description
-/*!
- \param Operand
- \param Op1
- \pamam Op2
-*/
-xbShort xbExpn::ValidOperation( char * Operand, char Op1, char Op2 )
-{
- /* Valid operation table
-
- operator Op1 Op2 operator Op1 Op2
-
- ** N N = N N
- * N N = C C
- / N N = D D
- + N N <>,# N N
- + C C <>,# C C
- + D N <>,# D D
- - N N <= N N
- - C C <= D D
- - D D <= C C
- - D N >= N N
- < N N >= D D
- < C C >= C C
- < D D $ C C
- > N N
- > C C
- > D D
-
- C = Character
- D = Date
- N = Numeric
-
- Maybe reversed to what you are thinking ==> think OP2 - OP1
-
- */
-
- // check for **
- if( Operand[0] == '*' && Operand[1] == '*' && Op1 == 'N' && Op2 == 'N' )
- return 1;
-
- // check for !=
- if(( Operand[0] == '!' && Operand[1] == '=' ) &&
- (( Op1 == 'N' && Op2 == 'N' ) ||
- ( Op1 == 'C' && Op2 == 'C' ) ||
- ( Op1 == 'D' && Op2 == 'D' )))
- return 1;
-
- switch( Operand[0] ) {
- case '*':
- case '/':
- if( Op1 == 'N' && Op2 == 'N' )
- return 1;
- else
- return 0;
-
- case '+':
- if(( Op1 == 'N' && Op2 == 'N' ) ||
- ( Op1 == 'C' && Op2 == 'C' ) ||
- ( Op1 == 'N' && Op2 == 'D' ))
- return 1;
- else
- return 0;
-
- case '-':
- if(( Op1 == 'N' && Op2 == 'N' ) ||
- ( Op1 == 'C' && Op2 == 'C' ) ||
- ( Op1 == 'D' && Op2 == 'D' ) ||
- ( Op1 == 'N' && Op2 == 'D' ))
- return 1;
- else
- return 0;
-
- case '<':
- case '>':
- case '=':
- case '#':
- if(( Op1 == 'N' && Op2 == 'N' ) ||
- ( Op1 == 'C' && Op2 == 'C' ) ||
- ( Op1 == 'D' && Op2 == 'D' ))
- return 1;
- else
- return 0;
-
- case '$':
- if( Op1 == 'C' && Op2 == 'C' )
- return 1;
- else
- return 0;
-
- case '.' :
- if( (strncmp( Operand, ".AND.", 5 ) == 0 ) ||
- (strncmp( Operand, ".OR.", 4 ) == 0 ) ||
- (strncmp( Operand, ".NOT.", 5 ) == 0 ))
- return 1;
- else
- return 0;
-
- default:
- return 0;
- }
-}
-/*************************************************************************/
-//! Short description
-/*!
- \param e
-*/
-xbExpNode * xbExpn::GetNextTreeNode( xbExpNode * e )
-{
- if( !e->Node ) return NULL;
-
- /* sibling 1 && sibling 2 exists */
- if( e == e->Node->Sibling1 && e->Node->Sibling2 )
- return GetFirstTreeNode( e->Node->Sibling2 );
-
- /* sibling2 && sibling3 exists */
- else if( e == e->Node->Sibling2 && e->Node->Sibling3 )
- return GetFirstTreeNode( e->Node->Sibling3 );
-
- else
- return e->Node;
-}
-/*************************************************************************/
-//! Short description
-/*!
- \param e
-*/
-xbShort xbExpn::ProcessExpression( xbExpNode * e )
-{
- return ProcessExpression( e, 0 );
-}
-/*************************************************************************/
-//! Short description
-/*!
- \param Wtree
- \param RecBufSw
-*/
-xbShort xbExpn::ProcessExpression( xbExpNode * Wtree, xbShort RecBufSw )
-{
- xbExpNode * WorkNode;
- xbShort rc;
- if( Wtree == 0 )
- Wtree = Tree;
- memset(WorkBuf, 0x00, WorkBufMaxLen+1 );
- /* initialize the stack - free any expnodes */
- while( GetStackDepth() > 0 ) {
- WorkNode = (xbExpNode *) Pop();
- if( !WorkNode->InTree )
- delete WorkNode;
- }
- if(( WorkNode = GetFirstTreeNode( Wtree )) == NULL )
- return XB_NO_DATA;
-
- while( WorkNode ) {
- Push(WorkNode);
- if( WorkNode->Type == 'D' && WorkNode->dbf ) {
- WorkNode->dbf->GetField( WorkNode->FieldNo, WorkNode->StringResult, RecBufSw );
- if( WorkNode->dbf->GetFieldType( WorkNode->FieldNo ) == 'N' ||
- WorkNode->dbf->GetFieldType( WorkNode->FieldNo ) == 'F' )
- WorkNode->DoubResult = WorkNode->dbf->GetDoubleField( WorkNode->FieldNo, RecBufSw );
- } else if( WorkNode->Type == 'O' ) {
- if(( rc = ProcessOperator( RecBufSw )) != XB_NO_ERROR )
- return rc;
- } else if( WorkNode->Type == 'F' )
- if(( rc = ProcessFunction( WorkNode->NodeText )) != XB_NO_ERROR )
- return rc;
- WorkNode = GetNextTreeNode( WorkNode );
- }
- if( GetStackDepth() != 1 ) /* should only have result left in stack */
- return XB_PARSE_ERROR;
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-//! Short description
-/*!
- \param e
-*/
-char xbExpn::GetOperandType( xbExpNode * e )
-{
- /* this routine returns
- L - logical
- N - Numeric
- C - Character
- 0 - error
- */
- char WorkType;
- if( e->Type == 'd' || e->Type == 'N' || e->Type == 'i' ) return 'N';
- if( e->Type == 'l' ) return 'L';
- if( e->Type == 's' ) return 'C';
- if( e->Type == 'C' ) {
- if(e->NodeText[0]=='-' || e->NodeText[0]=='+' ||
- (isdigit(e->NodeText[0]) &&
- !(e->NodeText[e->DataLen] == '\'' || e->NodeText[e->DataLen] == '"')))
- return 'N';
- else
- return 'C';
- } else if( e->Type == 'D' && e->dbf ){
- WorkType = e->dbf->GetFieldType( e->FieldNo );
- if( WorkType == 'C' ) return 'C';
- else if( WorkType == 'F' || WorkType == 'N' ) return 'N';
- else if( WorkType == 'L' ) return 'L';
- else if( WorkType == 'D' ) return 'D';
- else return 0;
- } else
- return 0;
-}
-/*************************************************************************/
-//! Short description
-/*!
- \param RecBufSw
-*/
-xbShort xbExpn::ProcessOperator( xbShort RecBufSw )
-{
- xbExpNode * WorkNode;
- char Operator[6];
- char t;
- if( GetStackDepth() < 3 )
- return XB_PARSE_ERROR;
- WorkNode = (xbExpNode *) Pop();
- if( WorkNode->Len > 5 )
- return XB_PARSE_ERROR;
-
- memset( Operator, 0x00, 6 );
- strncpy( Operator, WorkNode->NodeText, WorkNode->Len );
- if( !WorkNode->InTree )
- delete WorkNode;
-
- /* load up operand 1 */
- WorkNode = (xbExpNode *) Pop();
- if(( OpType1 = GetOperandType( WorkNode )) == 0 )
- return XB_PARSE_ERROR;
-
- if( OpLen1 < WorkNode->DataLen+1 && WorkNode->Type != 'd' ) {
- if( OpLen1 > 0 ) free( Op1 );
- if(( Op1 = (char *) malloc( WorkNode->DataLen+1 )) == NULL ) {
- return XB_NO_MEMORY;
- }
- OpLen1 = WorkNode->DataLen+1;
- }
- OpDataLen1 = WorkNode->DataLen;
- memset( Op1, 0x00, WorkNode->DataLen+1 );
- if( WorkNode->Type == 'D' && WorkNode->dbf ) { /* database field */
- WorkNode->dbf->GetField( WorkNode->FieldNo, Op1, RecBufSw );
- t = WorkNode->dbf->GetFieldType( WorkNode->FieldNo );
- if( t == 'N' || t == 'F' )
- Opd1 = strtod( WorkNode->StringResult, 0 );
- else if( t == 'D' ){ // date field
- xbDate d;
- Opd1 = d.JulianDays( WorkNode->StringResult );
- }
- }
- else if( WorkNode->Type == 'C' ) /* constant */
- memcpy( Op1, WorkNode->NodeText, WorkNode->DataLen );
- else if( WorkNode->Type == 's' ) /* previous result */
- memcpy( Op1, WorkNode->StringResult, WorkNode->DataLen+1 );
- else if( WorkNode->Type == 'd' ) /* previous numeric result */
- Opd1 = WorkNode->DoubResult;
- else if( WorkNode->Type == 'N' ) /* previous numeric result */
- Opd1 = strtod( WorkNode->StringResult, 0 );
- else if(WorkNode->Type == 'l') /* previous logical result 3/26/00 dtb */
- Opd1 = WorkNode->IntResult;
- if( !WorkNode->InTree )
- delete WorkNode;
-
- /* load up operand 2 */
- WorkNode = (xbExpNode *) Pop();
- if(( OpType2 = GetOperandType( WorkNode )) == 0 )
- return XB_PARSE_ERROR;
-
- if( OpLen2 < WorkNode->DataLen+1 && WorkNode->Type != 'd' ) {
- if( OpLen2 > 0 ) free( Op2 );
- if(( Op2 = (char *) malloc( WorkNode->DataLen+1 )) == NULL ) {
- return XB_NO_MEMORY;
- }
- OpLen2 = WorkNode->DataLen+1;
- }
- OpDataLen2 = WorkNode->DataLen;
- memset( Op2, 0x00, WorkNode->DataLen+1 );
- if( WorkNode->Type == 'D' && WorkNode->dbf ) { /* database field */
- WorkNode->dbf->GetField( WorkNode->FieldNo, Op2, RecBufSw );
- t = WorkNode->dbf->GetFieldType( WorkNode->FieldNo );
- if( t == 'N' || t == 'F' )
- Opd2 = strtod( WorkNode->StringResult, 0 );
- else if( t == 'D' ){ // date field
- xbDate d;
- Opd2 = d.JulianDays( WorkNode->StringResult );
- }
- }
- else if( WorkNode->Type == 'C' ) /* constant */
- memcpy( Op2, WorkNode->NodeText, WorkNode->DataLen );
- else if( WorkNode->Type == 's' ) /* previous result */
- memcpy( Op2, WorkNode->StringResult, WorkNode->DataLen+1 );
- else if( WorkNode->Type == 'd' ) /* previous numeric result */
- Opd2 = WorkNode->DoubResult;
- else if( WorkNode->Type == 'N' ) /* previous numeric result */
- Opd2 = strtod( WorkNode->StringResult, 0 );
- else if(WorkNode->Type == 'l') /* previous logical result 3/26/00 dtb*/
- Opd2 = WorkNode->IntResult;
- if( !WorkNode->InTree )
- delete WorkNode;
- if( !ValidOperation( Operator, OpType1, OpType2 ))
- return XB_PARSE_ERROR;
-
- if( OpType1 == 'N' || OpType1 == 'L' || OpType1 == 'D' ) /* numeric procesing */
- return NumericOperation( Operator );
- else /* must be character */
- return AlphaOperation( Operator );
-}
-/*************************************************************************/
-//! Short description
-/*!
- \param Operator
-*/
-xbShort xbExpn::NumericOperation( char * Operator )
-{
- xbDouble Operand1, Operand2;
- xbExpNode * WorkNode;
- xbShort ResultLen;
- char SaveType;
- ResultLen = 0;
-
-/* This function assumes a valid operation coming in */
-
- if( Operator[0] == '=' || Operator[0] == '<' ||
- Operator[0] == '>' || Operator[0] == '#' ||
- Operator[0] == '.' || (strncmp( Operator, "!=", 2 ) == 0 ))
- SaveType = 'l';
- else
- SaveType = 'd';
-
- WorkNode = new xbExpNode;
-
- if( !WorkNode )
- return XB_PARSE_ERROR;
- WorkNode->ResultLen = ResultLen;
- WorkNode->Type = SaveType;
- WorkNode->DataLen = ResultLen;
-
- if( OpType1 == 'd' || OpType1 == 'N' || OpType2 == 'D' )
- Operand1 = Opd1;
- else
- Operand1 = strtod( Op1, NULL );
-
- if( OpType2 == 'd' || OpType2 == 'N' || OpType2 == 'D' )
- Operand2 = Opd2;
- else
- Operand2 = strtod( Op2, NULL );
-
- if( Operator[0] == '*' && Operator[1] == '*' )
- WorkNode->DoubResult = pow( Operand2, Operand1 );
- else if( Operator[0] == '*' )
- WorkNode->DoubResult = Operand2 * Operand1;
- else if( Operator[0] == '/')
- WorkNode->DoubResult = Operand2 / Operand1;
- else if( Operator[0] == '+' ){
- WorkNode->DoubResult = Operand2 + Operand1;
- xbDate d;
- WorkNode->StringResult = d.JulToDate8((xbLong) WorkNode->DoubResult );
- } else if( Operator[0] == '-' ){
- WorkNode->DoubResult = Operand2 - Operand1;
- xbDate d;
- WorkNode->StringResult = d.JulToDate8((xbLong) WorkNode->DoubResult );
- }
-
- /* = */
- else if( Operator[0]== '=' && Operand1 == Operand2 )
- WorkNode->IntResult = 1;
- else if( Operator[0] == '=' )
- WorkNode->IntResult = 0;
- /* not = */
- else if(( Operator[0] == '<' && Operator[1] == '>' )||
- ( Operator[0] == '!' && Operator[1] == '=' )||
- Operator[0] == '#' || (strncmp( Operator, "!=", 2 ) == 0 ))
- WorkNode->IntResult = ( Operand1 != Operand2 ) ? 1 : 0;
- /* less than */
- else if( Operator[0] == '<' )
- WorkNode->IntResult = ( Operand2 < Operand1 ) ? 1 : 0;
- /* greater than */
- else if( Operator[0] == '>' )
- WorkNode->IntResult = ( Operand2 > Operand1 ) ? 1 : 0;
- else if(Operator[0] == '.'){ // logical operators, added 3/26/00 dtb
- switch(Operator[1]){
- case 'A' : // and
- WorkNode->IntResult = (Opd1 && Opd2) ? 1 : 0;
- break;
-
- case 'N' : // not
- WorkNode->IntResult = (!(Opd1 && Opd2)) ? 1 : 0;
- break;
-
- case 'O' : // or
- WorkNode->IntResult = (Opd1 || Opd2) ? 1 : 0;
- break;
-
- default :
- return XB_PARSE_ERROR;
- }
- } else
- return XB_PARSE_ERROR;
-
- Push(WorkNode);
- return 0;
-}
-/*************************************************************************/
-//! Short description
-/*!
- \param Operator
-*/
-xbShort xbExpn::AlphaOperation( char * Operator )
-{
- xbShort ResultLen, i;
- char SaveType;
- xbExpNode * WorkNode;
-
- if( Operator[0] == '=' || Operator[0] == '<' ||
- Operator[0] == '>' || Operator[0] == '#' ||
- (strncmp( Operator, "!=", 2 ) == 0 ) ||
- Operator[0] == '$'){
- ResultLen = 0;
- SaveType = 'l';
- } else {
- ResultLen = OpDataLen1 + OpDataLen2 + 1;
- SaveType = 's';
- }
-
- WorkNode = new xbExpNode;
- if( !WorkNode )
- return XB_PARSE_ERROR;
- WorkNode->ResultLen = ResultLen;
- WorkNode->Type = SaveType;
- if( WorkNode->Type == 'l' )
- WorkNode->DataLen = 0;
- else
- WorkNode->DataLen = ResultLen - 1;
-
- if( Operator[0] == '+' ){
- WorkNode->StringResult = Op2;
- WorkNode->StringResult += Op1;
- } else if( Operator[0] == '-' ) {
- WorkNode->StringResult = RTRIM( Op2 );
- WorkNode->StringResult += Op1;
- i = WorkNode->StringResult.len();
- for( ; i < ResultLen-1; i++)
- WorkNode->StringResult += " ";
- }
- /* == */
- else if(( strncmp( Operator, "==", 2 ) == 0 ) && strcmp(Op1,Op2) == 0)
- WorkNode->IntResult = 1;
-
- else if(( strncmp( Operator, "==", 2 ) == 0 ))
- WorkNode->IntResult = 0;
-
- /* = */
- else if( Operator[0] == '=' && strcmp(Op1,Op2) == 0 )
- WorkNode->IntResult = 1;
-
- else if( Operator[0] == '=' )
- WorkNode->IntResult = 0;
-
- /* not = */
- else if(( strncmp( Operator, "<>", 2 ) == 0 ) ||
- Operator[0] == '#' ||
- strncmp( Operator, "!=", 2 ) == 0 )
- WorkNode->IntResult = ( strcmp( Op1, Op2 ) != 0 ) ? 1 : 0;
- /* less than */
- else if( Operator[0] == '<' )
- WorkNode->IntResult = ( strcmp( Op2, Op1 ) < 0 ) ? 1 : 0;
- /* greater than */
- else if( Operator[0] == '>' )
- WorkNode->IntResult = ( strcmp( Op2, Op1 ) > 0 ) ? 1 : 0;
- else if(Operator[0] == '$')
- WorkNode->IntResult = (strstr(Op1,Op2)) ? 1 : 0;
- else
- return XB_PARSE_ERROR;
-
- Push(WorkNode);
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-#endif // XB_EXPRESSIONS
diff --git a/xbase64/xbfields.cpp b/xbase64/xbfields.cpp
deleted file mode 100755
index d3e2388..0000000
--- a/xbase64/xbfields.cpp
+++ /dev/null
@@ -1,672 +0,0 @@
-/* xbfields.cpp
-
- Xbase64 project source code
-
- This file contains the basic X-Base routines for reading and writing
- Xbase fields.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-
-/*! \file xbfields.cpp
-*/
-/************************************************************************/
-/* This function returns true if the data is valid logical data */
-//! Determines if data is valid logical data.
-/*! Determines if the data in buf is valid for a logical field value.
-
- \param buf data to be tested
- \returns TRUE (non-zero) if valid, FALSE (zero) if not.
-*/
-xbShort xbDbf::ValidLogicalData(const char * buf) {
- if( buf[0] )
- if( buf[0] == 'T' || buf[0] == 't' || buf[0] == 'F' || buf[0] == 'f' ||
- buf[0] == 'Y' || buf[0] == 'y' || buf[0] == 'N' || buf[0] == 'n' ||
- buf[0] == '?' )
- return 1;
- return 0;
-}
-/************************************************************************/
-/* This function returns true if the data is valid numeric data */
-//! Determines if data is valid numeric data.
-/*! Determines if the data in buf is valid for a numeric field value.
-
- \param buf
- \returns TRUE (non-zero) if valid, FALSE (zero) if not.
-*/
-xbShort xbDbf::ValidNumericData(const char * buf) {
- const char *p;
-
- p = buf;
- while( *p ){
- if( *p != '+' && *p != '-' && *p != '.' && *p != '0' && *p != '1' &&
- *p != '2' && *p != '3' && *p != '4' && *p != '5' && *p != '6' &&
- *p != '7' && *p != '8' && *p != '9' )
- return 0;
- else
- p++;
- }
- return 1;
-}
-/************************************************************************/
-/* This function returns a fields length */
-//! Returns the length of the specified field.
-/*! Returns the length of the field specified by FieldNo.
-
- \param FieldNo Number of field.
- \returns Length of the specified field in bytes.
-*/
-xbShort xbDbf::GetFieldLen( xbShort FieldNo )
-{
- if( FieldNo >= 0 && FieldNo < NoOfFields ){
- if( SchemaPtr[FieldNo].Type == 'C' && SchemaPtr[FieldNo].NoOfDecs > 0 )
- return SchemaPtr[FieldNo].LongFieldLen;
- else
- return SchemaPtr[FieldNo].FieldLen;
- }
- else
- return 0;
-}
-/************************************************************************/
-/* This function returns a fields decimal length */
-//! Returns the number of decimals in the specified field.
-/*! Returns the number of decimals in the field specified by FieldNo.
-
- \param FieldNo Number of field.
- \returns Length of the specified field in bytes.
-*/
-
-xbShort xbDbf::GetFieldDecimal( xbShort FieldNo )
-{
- if( FieldNo >= 0 && FieldNo < NoOfFields )
- return SchemaPtr[FieldNo].NoOfDecs;
- else
- return 0;
-}
-/************************************************************************/
-/* This function returns a fields type */
-//! Returns the type of the specified field.
-/*! Returns the type of the field specified by FieldNo.
-
- \param FieldNo Number of field.
- \returns Type of specified field.
-*/
-char xbDbf::GetFieldType( xbShort FieldNo ) const
-{
- if( FieldNo >= 0 && FieldNo < NoOfFields )
- return SchemaPtr[FieldNo].Type;
- else
- return 0;
-}
-/************************************************************************/
-/* This function returns a fields name */
-//! Returns the name of the specified field.
-/*! Returns a pointer to the name for the field specified by FieldNo.
-
- \param FieldNo Number of field.
- \returns A pointer to the name of the field.
-*/
-char * xbDbf::GetFieldName( xbShort FieldNo )
-{
- if( FieldNo >= 0 && FieldNo < NoOfFields )
- return SchemaPtr[FieldNo].FieldName;
- else
- return 0;
-}
-/************************************************************************/
-/* This function returns the field ID number for a given field
- or -1 if the field is not one of the fields of the database */
-//! Returns the field number of the specified field.
-/*! Returns the field number for the named field.
-
- \param name Name of field.
- \returns Number of field named name.
-*/
-xbShort xbDbf::GetFieldNo( const char * name ) const
-{
- int i, len1, len2;
-
- if(( len1 = strlen( name )) > 10 )
- return -1;
-
- for( i = 0; i < NoOfFields; i++ ){
- len2 = strlen( SchemaPtr[i].FieldName );
- if( len1 == len2 )
-
-//#ifndef __WIN32__
-#ifdef HAVE_STRCASECMP
- if(!strcasecmp( SchemaPtr[i].FieldName, name ))
-#else
- if(!stricmp( SchemaPtr[i].FieldName, name ))
-#endif
-
- return i;
- }
- return -1;
-}
-/************************************************************************/
-/*
- Helpers
-*/
-
-//! Get the value of the specified field.
-/*! Get the value of the field referenced by Name and place its value
- in buf.
-
- \param Name Name of field.
- \param buf Buffer to hold field value. Must be large enough to hold
- the entire field value. Use GetFieldLen() to determine
- the length of the field, if necessary.
- \param RecBufSw
- \returns One of the following:
-*/
-xbShort xbDbf::GetField(const char *Name, char *buf,
- const xbShort RecBufSw ) const
-{
- return GetField(GetFieldNo(Name), buf, RecBufSw);
-}
-
-/************************************************************************/
-//! Get the value of the specified field.
-/*! Get the value of the field specified by Name and place its value
- in buf.
-
- \param Name Name of field.
- \param buf Buffer to hold field value. Must be large enough to hold
- the entire field value. Use GetFieldLen() to determine
- the length of the field, if necessary.
- \returns One of the following:
-*/
-xbShort xbDbf::GetField(const char *Name, char *buf) const
-{
- return GetField(GetFieldNo(Name), buf);
-}
-/************************************************************************/
-//! Get the raw value of the specified field.
-/*! Get the value of the field specified by Name and place its value
- in buf.
-
- \param Name Name of field.
- \param buf Buffer to hold field value. Must be large enough to hold
- the entire field value. Use GetFieldLen() to determine
- the length of the field, if necessary.
- \returns One of the following:
-*/
-xbShort xbDbf::GetRawField(const char *Name, char *buf) const
-{
- return GetRawField(GetFieldNo(Name), buf);
-}
-
-/************************************************************************/
-
-// FIXME this function doesn't follow look and feel of the rest of the lib
-// GAK
-
-static char __buf[1024];
-
-static void trim(char *s) {
- int len = strlen(s)-1;
- if (len > 0) {
- while ((len != 0) && (s[len] == ' '))
- len--;
- s[len+1] = 0;
- }
-}
-
-//! Get the value of the specified field.
-/*! Returns the value of the field specified by Name.
-
- \param Name Name of field.
- \returns Value of the specified field.
-*/
-const char *xbDbf::GetField(const char *Name) const {
- GetField(GetFieldNo(Name), __buf);
- trim(__buf);
- return __buf;
-}
-
-//! Get the value of the specified field.
-/*! Returns the value of the field specified by FieldNo.
-
- \param FieldNo Number of field.
- \returns Value of the specified field.
-*/
-const char *xbDbf::GetField(xbShort FieldNo) const {
- GetField(FieldNo, __buf);
- trim(__buf);
- return __buf;
-}
-/************************************************************************/
-/* This function fills a buffer with data from the record buffer
- for a particular field number.
-
- Use GetFieldNo to get a number based on a field's name
-
- If successful, this function returns the field size.
-*/
-
-//! Get the value of the specified field.
-/*! Get the value of the field specified by FieldNo and place its value
- in buf.
-
- \param FieldNo Number of field.
- \param buf Buffer to hold field value. Must be large enough to hold
- the entire field value. Use GetFieldLen() to determine
- the length of the field, if necessary.
- \param RecBufSw
- \returns The length of the field.
-*/
-xbShort xbDbf::GetField( xbShort FieldNo, char * buf, xbShort RecBufSw) const
-{
- xbShort length;
- if( FieldNo < 0 || FieldNo >= NoOfFields ) {
- buf[0] = 0x00;
- return 0x00;
- }
-
-// Check for existence of a long field length
- if( SchemaPtr[FieldNo].Type == 'C' && SchemaPtr[FieldNo].NoOfDecs > 0 )
- length = SchemaPtr[FieldNo].LongFieldLen;
- else
- length = SchemaPtr[FieldNo].FieldLen;
-
- if( RecBufSw )
- memcpy( buf, SchemaPtr[FieldNo].Address2, length );
- else
- memcpy( buf, SchemaPtr[FieldNo].Address, length );
- buf[length] = 0x00;
- return( length );
-}
-/************************************************************************/
-xbShort xbDbf::GetField( xbShort FieldNo, xbString & sf, xbShort RecBufSw) const
-{
- xbShort length;
- if( FieldNo < 0 || FieldNo >= NoOfFields ) {
- sf = "";
- return 0;
- }
-
- // Check for existence of a long field length
- if( SchemaPtr[FieldNo].Type == 'C' && SchemaPtr[FieldNo].NoOfDecs > 0 )
- length = SchemaPtr[FieldNo].LongFieldLen;
- else
- length = SchemaPtr[FieldNo].FieldLen;
-
- if( RecBufSw )
- sf.assign( xbString(SchemaPtr[FieldNo].Address2, length), 0, length );
- else
- sf.assign( xbString(SchemaPtr[FieldNo].Address, length), 0, length );
-
- return( length );
-}
-/************************************************************************/
-/* This function fills a field in the record buffer with data from
- a buffer for a particular field.
-
- Use GetFieldNo to get a number based on a field's name
-
- Field type N or F is loaded as right justified, left blank filled.
- Other fields are loaded as left justified, right blank filled.
-
- This method does check the data's validity.
-
- If successful, this function returns 0, if invalid data, it returns -1
- or XB_INVALID_FIELDNO
-*/
-
-//! Put a value into the specified field.
-/*!
-*/
-xbShort xbDbf::PutField(const char *Name, const char *buf) {
- return PutField(GetFieldNo(Name), buf);
-}
-/************************************************************************/
-//! Put a raw value into the specified field.
-/*!
-*/
-xbShort xbDbf::PutRawField(const char *Name, const char *buf) {
- return PutRawField(GetFieldNo(Name), buf);
-}
-/************************************************************************/
-//! Put a value into the specified field.
-/*!
-*/
-xbShort xbDbf::PutField(const xbShort FieldNo, const char *buf) {
- xbShort len, i;
- char * startpos;
- char * tp; /* target pointer */
- const char * sp; /* source pointer */
-
- if( FieldNo < 0 || FieldNo >= NoOfFields )
- return XB_INVALID_FIELDNO;
-
- if( DbfStatus != XB_UPDATED ){
- DbfStatus = XB_UPDATED;
- memcpy( RecBuf2, RecBuf, RecordLen );
- }
-
- if( SchemaPtr[FieldNo].Type == 'L' && !ValidLogicalData( buf ))
- return XB_INVALID_DATA;
-
- else if(( SchemaPtr[FieldNo].Type == 'F' || SchemaPtr[FieldNo].Type == 'N' )
- && !ValidNumericData( buf ))
- return XB_INVALID_DATA;
-
- else if( SchemaPtr[FieldNo].Type == 'D' ){
- xbDate d;
- if( !d.DateIsValid( buf ))
- return XB_INVALID_DATA;
- }
-
- if( SchemaPtr[FieldNo].Type == 'C' && SchemaPtr[FieldNo].NoOfDecs > 0 )
- memset( SchemaPtr[FieldNo].Address, 0x20, SchemaPtr[FieldNo].LongFieldLen );
- else
- memset( SchemaPtr[FieldNo].Address, 0x20, SchemaPtr[FieldNo].FieldLen );
-
- len = strlen( buf );
-
- if(( SchemaPtr[FieldNo].Type == 'N' || SchemaPtr[FieldNo].Type == 'F')
- && len > SchemaPtr[FieldNo].FieldLen )
- return XB_INVALID_DATA;
- else if( len > SchemaPtr[FieldNo].FieldLen )
- len = SchemaPtr[FieldNo].FieldLen;
-
- if( SchemaPtr[FieldNo].Type == 'F' || SchemaPtr[FieldNo].Type == 'N'
- || SchemaPtr[FieldNo].Type == 'M') {
-
- const char *sdp = strchr( buf, '.' ); /* source decimal point */
- len = 0;
- sp =buf;
- while( *sp && *sp != '.' ) { len++; sp++; }
- if( SchemaPtr[FieldNo].NoOfDecs > 0 ){
- /* do the right of decimal area */
- tp = SchemaPtr[FieldNo].Address;
- tp += SchemaPtr[FieldNo].FieldLen - SchemaPtr[FieldNo].NoOfDecs - 1;
- *tp++ = '.';
- sp = sdp;
- if( sp ) sp++;
- for( i = 0; i < SchemaPtr[FieldNo].NoOfDecs; i++ )
- if( sp && *sp ) *tp++ = *sp++; else *tp++ = '0';
-
- startpos= SchemaPtr[FieldNo].Address +
- SchemaPtr[FieldNo].FieldLen -
- SchemaPtr[FieldNo].NoOfDecs - len - 1;
- }
- else
- {
- startpos=SchemaPtr[FieldNo].Address+SchemaPtr[FieldNo].FieldLen-len;
- }
- }
- else
- startpos = SchemaPtr[FieldNo].Address;
-
- memcpy( startpos, buf, len );
- return 0;
-}
-
-/************************************************************************/
-//! Put a raw value into the specified field.
-/*!
-*/
-xbShort xbDbf::PutRawField(const xbShort FieldNo, const char *buf) {
- xbShort len;
- char * startpos;
-
- if( FieldNo < 0 || FieldNo >= NoOfFields )
- return XB_INVALID_FIELDNO;
-
- if( DbfStatus != XB_UPDATED ){
- DbfStatus = XB_UPDATED;
- memcpy( RecBuf2, RecBuf, RecordLen );
- }
-
- startpos = SchemaPtr[FieldNo].Address;
- len = SchemaPtr[FieldNo].FieldLen;
- memcpy( startpos, buf, len );
-
- return 0;
-}
-
-/************************************************************************/
-//! Get the value of the specified field.
-/*!
-*/
-xbShort xbDbf::GetField( xbShort FieldNo, char *buf) const {
- return GetField(FieldNo, buf, 0);
-}
-/************************************************************************/
-//! Get the raw value of the specified field.
-/*!
-*/
-xbShort xbDbf::GetRawField( xbShort FieldNo, char *buf ) const {
- return GetField(FieldNo, buf, 0);
-}
-/************************************************************************/
-//! Get the long value of the specified field.
-/*!
-*/
-xbLong xbDbf::GetLongField( xbShort FieldNo ) const
-{
- char buf[18];
- memset( buf, 0x00, 18 );
- GetField( FieldNo, buf );
- return atol( buf );
-}
-/************************************************************************/
-//! Get the long value of the specified field.
-/*!
-*/
-xbLong xbDbf::GetLongField( const char * FieldName ) const
-{
- return( GetLongField( GetFieldNo( FieldName )));
-}
-/************************************************************************/
-//! Put a long value into the specified field.
-/*!
-*/
-xbShort xbDbf::PutLongField( xbShort FieldNo, xbLong Val )
-{
- char buf[18];
- memset( buf, 0x00, 18 );
- sprintf( buf, "%ld", Val );
- return( PutField( FieldNo, buf ));
-}
-/************************************************************************/
-//! Put a long value into the specified field.
-/*!
-*/
-xbShort xbDbf::PutLongField(const char *FieldName, xbLong Val) {
- return ( PutLongField( GetFieldNo( FieldName ), Val ));
-}
-/************************************************************************/
-//! Get the float value of the specified field.
-/*!
-*/
-xbFloat xbDbf::GetFloatField( xbShort FieldNo )
-{
- char buf[21];
- memset( buf, 0x00, 21 );
- if( GetField( FieldNo, buf ) != 0 )
- return atof( buf );
- else
- return 0;
-}
-/************************************************************************/
-//! Get the float value of the specified field.
-/*!
-*/
-xbFloat xbDbf::GetFloatField(const char * FieldName) {
- xbShort fnum;
- if((fnum = GetFieldNo(FieldName)) != -1)
- return GetFloatField(fnum);
- else
- return 0;
-}
-/************************************************************************/
-//! Put a float value into the specified field.
-/*!
-*/
-xbShort xbDbf::PutFloatField( xbShort FldNo, xbFloat f )
-{
- char buf[25];
- char buf2[12];
- memset( buf, 0x00, 25 );
- memset( buf2, 0x00, 12 );
- sprintf( buf, "%d.%df", GetFieldLen( FldNo ), GetFieldDecimal( FldNo ));
- strcpy( buf2, "%-" );
- strcat( buf2, buf );
- sprintf( buf, buf2, f );
-
- /* remove trailing space */
- xbShort i = 0;
- while( i < 25 )
- if( buf[i] == 0x20 ){
- buf[i] = 0x00;
- break;
- } else
- i++;
- return PutField( FldNo, buf );
-}
-/************************************************************************/
-//! Put a float value into the specified field.
-/*!
-*/
-xbShort xbDbf::PutFloatField(const char *FieldName, xbFloat f) {
- xbShort fnum;
- if ((fnum = GetFieldNo(FieldName)) != -1)
- return PutFloatField(fnum, f);
- else
- return 0;
-}
-/************************************************************************/
-//! Get the double value of the specified field.
-/*!
-*/
-xbDouble xbDbf::GetDoubleField( xbShort FieldNo, xbShort RecBufSw )
-{
- char buf[21];
- memset( buf, 0x00, 21 );
- if( GetField( FieldNo, buf, RecBufSw ) != 0 )
- return strtod( buf, NULL );
- else
- return 0;
-}
-/************************************************************************/
-//! Get the double value of the specified field.
-/*!
-*/
-xbDouble xbDbf::GetDoubleField(const char *FieldName) {
- xbShort fnum;
- if ((fnum = GetFieldNo(FieldName)) != -1)
- return GetDoubleField(fnum);
- else
- return 0;
-}
-/************************************************************************/
-//! Put a double value into the specified field.
-/*!
-*/
-xbShort xbDbf::PutDoubleField( xbShort FieldNo, xbDouble d) {
- return PutFloatField(FieldNo, (xbFloat)d);
-}
-/************************************************************************/
-//! Put a double value into the specified field.
-/*!
-*/
-xbShort xbDbf::PutDoubleField(const char *FieldName, xbDouble d) {
- xbShort fnum;
- if ((fnum = GetFieldNo(FieldName)) != -1)
- return PutFloatField(fnum, (xbFloat)d);
- else
- return 0;
-}
-/************************************************************************/
-//! Get the logical value of the specified field.
-/*!
-*/
-xbShort xbDbf::GetLogicalField( xbShort FieldNo )
-{
- char buf[3];
- if( GetFieldType( FieldNo ) != 'L' ) return -1;
- memset( buf, 0x00, 3 );
- GetField( FieldNo, buf );
- if( buf[0] == 'Y' || buf[0] == 'y' || buf[0] == 'T' || buf[0] == 't' )
- return 1;
- else
- return 0;
-}
-/************************************************************************/
-//! Get the logical value of the specified field.
-/*!
-*/
-xbShort xbDbf::GetLogicalField( const char * FieldName )
-{
- xbShort fnum;
- if(( fnum = GetFieldNo( FieldName )) != -1 )
- return GetLogicalField( fnum );
- else
- return -1;
-}
-/************************************************************************/
-//! Get the string value of the specified field.
-/*!
-*/
-char * xbDbf::GetStringField( const char * FieldName )
-{
- return GetStringField(GetFieldNo(FieldName));
-}
-/************************************************************************/
-//! Get the string value of the specified field.
-/*!
-*/
-char * xbDbf::GetStringField( xbShort FieldNo )
-{
- /* allocate memory if needed */
- if( !SchemaPtr[FieldNo].fp )
- SchemaPtr[FieldNo].fp = new char[GetFieldLen(FieldNo)+1];
-
- if( !SchemaPtr[FieldNo].fp )
- return 0;
-
- GetField( FieldNo, SchemaPtr[FieldNo].fp );
- return SchemaPtr[FieldNo].fp;
-}
-/************************************************************************/
diff --git a/xbase64/xbfile.cpp b/xbase64/xbfile.cpp
deleted file mode 100755
index 0064a88..0000000
--- a/xbase64/xbfile.cpp
+++ /dev/null
@@ -1,69 +0,0 @@
-/* xbfile.cpp
-
- Xbase64 project source code
-
- This file contains logic for the basic Xbase class.
-
- Copyright (C) 1997,2003,2004 Gary A Kunkel
- Sergiy Yakovin
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xbfile.h"
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-
-xbString xbFile::MakeFileName(const char *name)
-{
- xbString file=name;
- if (file.isEmpty()) return file;
- int len=strlen(name);
- const char *extLower=GetExtWithDot(true);
- const char *extUpper=GetExtWithDot(false);
- int lenLower=strlen(extLower);
- int lenUpper=strlen(extUpper);
- if (len>lenLower && strcmp(&name[len-lenLower], extLower)==0 ||
- len>lenUpper && strcmp(&name[len-lenUpper], extUpper)==0) return file;
- char lastSymbol=name[len-1];
- file+=GetExtWithDot(lastSymbol<'A' || lastSymbol>'Z');
- return file;
-}
-
diff --git a/xbase64/xbfile.h b/xbase64/xbfile.h
deleted file mode 100755
index 50c69e9..0000000
--- a/xbase64/xbfile.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/* xbfile.h
-
- Xbase project source code
-
- This file conatains a header file for the xbLock virtual objects which
- is used for controlling file and record locking. Record and file
- locking has been rewritten in version 3.
-
- Copyright (C) 1997,2003,2004 Gary A Kunkel
- Sergio Yakovin
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-/*! \file xblock.h
-*/
-
-#ifndef __XB_FILE_H__
-#define __XB_FILE_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-class XBDLLEXPORT xbFile
-{
- public:
- xbFile(){}
- virtual const char* GetExtWithDot(bool lower)=0;
- const xbString& GetFileName() {return fileName_;}
- xbString MakeFileName(const char* filename);
-
- protected:
- void SetFileName(const char *filename)
- {
- fileName_=MakeFileName(filename);
- }
-
- private:
- xbString fileName_;
-};
-
-#endif // XBFILE_H
diff --git a/xbase64/xbfilter.cpp b/xbase64/xbfilter.cpp
deleted file mode 100755
index 104e113..0000000
--- a/xbase64/xbfilter.cpp
+++ /dev/null
@@ -1,231 +0,0 @@
-/* xbfilter.cpp
-
- Xbase project source code
-
- This file conatains logic for the xbfilter class.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xbfilter.h"
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-//#include <xbase64/xbexcept.h>
-
-/*! \file xbfilter.cpp
-*/
-
-#ifdef XB_FILTERS
-/************************************************************************/
-//! Constructor.
-/*!
- \param dbf
- \param index
- \param exp
-*/
-xbFilter::xbFilter( xbDbf * dbf, xbIndex * index, char * exp )
-{
- xbShort rc;
- Status = 0;
- CurFilterRecNo = 0L;
- d = dbf;
- i = index;
-// e = 0;
-
-
- flExpn = new xbExpn( d->xbase );
- if(( rc = flExpn->ParseExpression( exp, d )) != XB_NO_ERROR )
- Status = rc;
- else{
- if( flExpn->GetExpressionResultType() != 'L' )
- Status = XB_PARSE_ERROR;
- }
-}
-
-/***********************************************************************/
-//! Destructor.
-/*!
-*/
-xbFilter::~xbFilter()
-{
- if( flExpn )
- delete flExpn;
-}
-
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-xbShort xbFilter::GetFirstFilterRec()
-{
- xbShort rc;
-
- if( Status )
- return Status;
-
- if( i )
- rc = i->GetFirstKey();
- else
- rc = d->GetFirstRecord();
-
- while( rc == XB_NO_ERROR ){
- if(( rc = flExpn->ProcessExpression()) != XB_NO_ERROR )
- return rc;
-
- if( flExpn->GetIntResult() )
- {
- CurFilterRecNo = d->GetCurRecNo();
- return XB_NO_ERROR;
- }
- if( i )
- rc = i->GetNextKey();
- else
- rc = d->GetNextRecord();
- }
- return rc;
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-xbShort xbFilter::GetLastFilterRec()
-{
- xbShort rc;
-
- if( Status )
- return Status;
-
- if( i )
- rc = i->GetLastKey();
- else
- rc = d->GetLastRecord();
-
- while( rc == XB_NO_ERROR ){
- if(( rc = flExpn->ProcessExpression()) != XB_NO_ERROR )
- return rc;
-
- if( flExpn->GetIntResult() )
- {
- CurFilterRecNo = d->GetCurRecNo();
- return XB_NO_ERROR;
- }
- if( i )
- rc = i->GetPrevKey();
- else
- rc = d->GetPrevRecord();
- }
- return rc;
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-xbShort xbFilter::GetNextFilterRec()
-{
- xbShort rc;
-
- if( Status )
- return Status;
-
- if( !CurFilterRecNo )
- return GetFirstFilterRec();
-
- if( i ){
- rc = i->GetNextKey();
- }
- else
- rc = d->GetNextRecord();
-
- while( rc == XB_NO_ERROR ){
- if(( rc = flExpn->ProcessExpression()) != XB_NO_ERROR )
- return rc;
-
- if( flExpn->GetIntResult())
- {
- CurFilterRecNo = d->GetCurRecNo();
- return XB_NO_ERROR;
- }
- if( i )
- rc = i->GetNextKey();
- else
- rc = d->GetNextRecord();
- }
- return rc;
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-xbShort xbFilter::GetPrevFilterRec()
-{
- xbShort rc;
-
- if( Status )
- return Status;
-
- if( !CurFilterRecNo )
- return GetLastFilterRec();
-
- if( i ){
- rc = i->GetPrevKey();
- }
- else
- rc = d->GetPrevRecord();
-
- while( rc == XB_NO_ERROR ){
- if(( rc = flExpn->ProcessExpression()) != XB_NO_ERROR )
- return rc;
-
- if( flExpn->GetIntResult())
- {
- CurFilterRecNo = d->GetCurRecNo();
- return XB_NO_ERROR;
- }
- if( i )
- rc = i->GetPrevKey();
- else
- rc = d->GetPrevRecord();
- }
- return rc;
-}
-/***********************************************************************/
-#endif // XB_FILTERS_ON
diff --git a/xbase64/xbfilter.h b/xbase64/xbfilter.h
deleted file mode 100755
index 578a1da..0000000
--- a/xbase64/xbfilter.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* xbfilter.h
-
- Xbase project source code
-
- This file conatains a header file for the xbFilter object which
- is used for filtering data.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-/*! \file xbfilter.h
-*/
-
-#ifndef __XB_FILTER_H__
-#define __XB_FILTER_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-//! xbFilter class
-/*!
-*/
-
-class XBDLLEXPORT xbFilter
-{
-public:
- xbFilter( xbDbf * dbf, xbIndex * index, char * expression );
- virtual ~xbFilter();
-
- xbShort GetFirstFilterRec();
- xbShort GetLastFilterRec();
- xbShort GetNextFilterRec();
- xbShort GetPrevFilterRec();
- xbShort GetStatus() { return Status; }
-
-protected:
- xbULong CurFilterRecNo;
- xbShort Status;
- xbExpn * flExpn;
- xbDbf *d;
- xbIndex *i;
-};
-
-#endif
diff --git a/xbase64/xbindex.cpp b/xbase64/xbindex.cpp
deleted file mode 100755
index f3a9c17..0000000
--- a/xbase64/xbindex.cpp
+++ /dev/null
@@ -1,220 +0,0 @@
-/* xbindex.cpp
-
- Xbase64 project source code
-
- This file contains the implementation of the xbIndex class.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xbindex.h"
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-
-/*! \file xbindex.cpp
-*/
-
-#ifdef XB_INDEX_ANY
-//! Constructor
-/*!
- \param pdbf
-*/
-xbIndex::xbIndex(xbDbf * pdbf)
-{
- index = this;
- dbf = pdbf;
-// ExpressionTree = NULL;
- IxExp = NULL;
- indexfp = NULL;
-// IndexStatus = 0;
- CurDbfRec = 0L;
- KeyBuf = NULL;
- KeyBuf2 = NULL;
-#ifdef XB_LOCKING_ON
- LockCnt = 0;
-
- CurLockCount = 0;
- CurLockType = -1;
-#endif // XB_LOCKING_ON
-}
-
-/*************************************************************************/
-
-//! Destructor
-/*!
- \param pdbf
-*/
-xbIndex::~xbIndex()
-{
- if( IxExp ){
- delete IxExp;
- IxExp = NULL;
- }
-}
-/*************************************************************************/
-
-void xbIndex::Flush()
-{
- if(indexfp) fflush(indexfp);
-}
-
-/*************************************************************************/
-xbShort xbIndex::OpenIndex(const char* FileName)
-{
- if (IsOpen()) return XB_ALREADY_OPEN;
-
- int rc;
-
- SetFileName(FileName);
-
- /* open the file */
- if(( indexfp = fopen( GetFileName(), "r+b" )) == NULL ){
- //
- // Try to open read only if can't open read/write
- //
- if(( indexfp = fopen( GetFileName(), "rb" )) == NULL )
- return XB_OPEN_ERROR;
- }
-
-#ifdef XB_LOCKING_ON
- /*
- ** Must turn off buffering when multiple programs may be accessing
- ** index files.
- */
- setbuf( indexfp, NULL );
-#endif
-
-// IndexStatus = 1;
- if(( rc = GetHeadNode()) != 0){
- fclose( indexfp );
- return rc;
- }
-
- /* parse the expression */
-/* pre 3.0
- if(( rc = dbf->xbase->BuildExpressionTree( HeadNode.KeyExpression,
- strlen( HeadNode.KeyExpression ), dbf )) != XB_NO_ERROR ){
- return rc;
- }
- ExpressionTree = dbf->xbase->GetTree();
- dbf->xbase->SetTreeToNull();
-*/
- IxExp = new xbExpn( dbf->xbase );
- if(( rc = IxExp->BuildExpressionTree( GetKeyExpression(),
- strlen( GetKeyExpression() ), dbf )) != XB_NO_ERROR ){
- fclose( indexfp );
- return rc;
- }
-
- rc=AllocKeyBufs();
- if(rc){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- fclose(indexfp);
- return rc;
- }
-
-#ifdef XBASE_DEBUG
-// CheckIndexIntegrity( 0 );
-#endif
-
-#ifdef XB_LOCKING_ON
- //if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
-
- rc = dbf->AddIndexToIxList( index, GetFileName() );
- return rc;
-}
-/*************************************************************************/
-//! Short description.
-/*!
-*/
-xbShort xbIndex::AllocKeyBufs()
-{
- KeyBuf = (char *) malloc( GetKeyLen() + 1 );
- if(KeyBuf==NULL) {
- return XB_NO_MEMORY;
- };
- KeyBuf2 = (char *) malloc( GetKeyLen() + 1);
- if(KeyBuf2==NULL) {
- free(KeyBuf);
- return XB_NO_MEMORY;
- };
- memset( KeyBuf, 0x00, GetKeyLen() + 1 );
- memset( KeyBuf2, 0x00, GetKeyLen() + 1 );
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-
-xbShort xbIndex::CloseIndex( void )
-{
- if(KeyBuf){
- free(KeyBuf);
- KeyBuf = NULL;
- }
- if(KeyBuf2){
- free(KeyBuf2);
- KeyBuf2 = NULL;
- }
-
- dbf->RemoveIndexFromIxList( index ); // why not 'this'?
- FreeNodesMemory();
- if( IxExp ){
- delete IxExp;
- IxExp = 0;
- }
-
- if(indexfp){
- fclose( indexfp );
- indexfp = NULL;
- }
-// IndexStatus = 0;
- return 0;
-}
-/***********************************************************************/
-
-#endif // XB_INDEX_ANY
diff --git a/xbase64/xbindex.h b/xbase64/xbindex.h
deleted file mode 100755
index 69f55dc..0000000
--- a/xbase64/xbindex.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/* xbindex.h
-
- Xbase64 project source code
-
- This file contains a header file for the NTX object, which is used
- for handling NTX type indices. NTX are the Clipper equivalant of xbNdx
- files.
-
- Copyright (C) 1998 SynXis Corp., Bob Cotton
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifndef __XB_INDEX_H__
-#define __XB_INDEX_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-#include <xbase64/xbase64.h>
-#include <string.h>
-/*! \file xbindex.h
-*/
-
-#define XB_UNIQUE 1
-#define XB_NOT_UNIQUE 0
-
-//! xbIndex class
-/*!
-*/
-
-class XBDLLEXPORT xbIndex: protected xbFile
-{
- public:
- xbIndex() {}
- xbIndex(xbDbf *);
-
- virtual ~xbIndex();
-
- xbShort OpenIndex ( const char * );
- xbShort CloseIndex();
- virtual xbShort CreateIndex( const char *, const char *, xbShort, xbShort ) = 0;
- virtual xbLong GetTotalNodes() = 0;
- virtual xbULong GetCurDbfRec() = 0;
- virtual xbShort CreateKey( xbShort, xbShort ) = 0;
- virtual xbShort GetCurrentKey(char *key) = 0;
- virtual xbShort AddKey( xbLong ) = 0;
- virtual xbShort UniqueIndex() = 0;
- virtual xbShort DeleteKey( xbLong ) = 0;
- virtual xbShort KeyWasChanged() = 0;
- virtual xbShort FindKey( const char * ) = 0;
- virtual xbShort FindKey() = 0;
- virtual xbShort FindKey( xbDouble ) = 0;
- virtual xbShort GetNextKey() = 0;
- virtual xbShort GetLastKey() = 0;
- virtual xbShort GetFirstKey() = 0;
- virtual xbShort GetPrevKey() = 0;
- virtual xbShort ReIndex(void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0) = 0;
-// virtual xbShort KeyExists( char * Key ) { return FindKey( Key, strlen( Key ), 0 ); }
- virtual xbShort KeyExists( xbDouble ) = 0;
- virtual xbShort TouchIndex() { return XB_NO_ERROR; }
- virtual void SetNodeSize(xbShort size) {}
- virtual xbShort GetNodeSize() { return NodeSize; }
- virtual void GetExpression(char *buf, int len) = 0;
- virtual void Flush();
- virtual const char * GetIxName() {return GetFileName().getData();}
- xbShort AllocKeyBufs();
- xbBool IsOpen() {return indexfp!=NULL;}
-
-#ifdef XBASE_DEBUG
- virtual void DumpHdrNode( xbShort Option ) = 0;
- virtual void DumpNodeRec( xbLong ) = 0;
- virtual void DumpNodeChain() = 0;
- virtual xbShort CheckIndexIntegrity( xbShort ) = 0;
-#endif
-
-#ifdef XB_LOCKING_ON
-// xbShort LockIndex( xbShort LockType );
-// virtual xbShort LockIndex( const xbShort, const xbShort );
-#else
-// virtual xbShort LockIndex( const xbShort, const xbShort ) const { return XB_NO_ERROR; }
-#endif
-
- protected:
- virtual xbShort GetHeadNode()=0;
- virtual xbUShort GetKeyLen()=0;
- virtual const char* GetKeyExpression()=0;
- virtual void FreeNodesMemory()=0;
-
- xbIndex *index;
- xbDbf *dbf;
- xbExpn *IxExp; /* index expression defines keys */
- FILE *indexfp; /* NULL = closed, other = open */
-// int IndexStatus; /* old - 0 = closed, 1 = open */
- xbULong CurDbfRec; /* current Dbf record number */
- char *KeyBuf; /* work area key buffer */
- char *KeyBuf2; /* work area key buffer */
- xbShort NodeSize;
-
-#ifdef XB_LOCKING_ON
- int LockCnt; /* current index lock count */
- int CurLockCount; /* old locking field */
- int CurLockType; /* old locking field */
-#endif
-};
-
-#endif /* __XB_INDEX_H__ */
diff --git a/xbase64/xblock.cpp b/xbase64/xblock.cpp
deleted file mode 100755
index c44cbb9..0000000
--- a/xbase64/xblock.cpp
+++ /dev/null
@@ -1,580 +0,0 @@
-/* xblock.cpp
-
- Xbase64 project source code
- written at 35000 feet on SWA
-
- This file contains the implementation of the xbLock.
-
- This file conatains a header file for the xbLock virtual objects which
- is used for controlling file and record locking. Record and file
- locking has been rewritten in version 3.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xblock.h"
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-
-#ifdef HAVE_IO_H // windows locking
-#include <io.h>
-#endif
-
-#ifdef HAVE_DOS_H // _sleep
-#include <dos.h>
-#endif
-
-//#include <stdio.h>
-//#include <stdlib.h>
-
-/*! \file xblock.cpp
-*/
-#ifdef XB_LOCKING_ON
-
-//! Constructor
-/*!
- \param pdbf
-*/
-
-/*************************************************************************/
-xbLock::xbLock(xbDbf * pdbf)
-{
- dbf = pdbf;
- HdrLockCnt = 0;
- TableLockCnt = 0;
- MemoLockCnt = 0;
- IndexLockCnt = 0;
- std::cout << "xbLock constructor" << std::cout;
-}
-/*************************************************************************/
-xbLock::~xbLock()
-{
- std::cout << "xbLock destructor" << std::endl;
-}
-/*************************************************************************/
-
-//! File lock routine
-/*!
- Lowest level lock routine
- Locks/unlocks a database,memo or index file.
- This function assumes the file position has been correctly set
-
- \param fn file to lock/unlock
- \param LockType lock type, one of: XB_LOCK or XB_UNLOCK
- \param lockLen byte count to lock
-*/
-
-#ifdef __WIN32__
-xbShort xbLock::LockFile( int fn, xbShort LockType, xbOffT lockLen)
-{
- int mode;
- int rc;
- int tries = 0;
-
- /* convert the xbase locking command into a windows locking command */
- if( LockType == XB_UNLOCK )
- mode = LK_UNLCK;
- else if( LockType == XB_LOCK || LockType == XB_LOCK_HOLD )
- mode = LK_NBLCK;
- else
- return XB_INVALID_LOCK_OPTION;
-
- do{
- rc = locking( fn, mode, lockLen );
- if( rc )
- _sleep( 1 );
- } while( rc == -1 && tries < dbf->xbase->GetLockRetryCount());
-
- if( rc )
- return XB_LOCK_FAILED;
-
- return 0;
-}
-
-#elif HAVE_FCNTL_H
-
-xbShort xbLock::LockFile( int fn, xbShort LockType, xbOffT lockLen )
-{
- xbShort cmd, rc;
- xbShort tries = 0;
-
-/* convert cross platform xbase lock type to unix lock type */
- if( LockType == XB_UNLOCK )
- cmd = F_ULOCK;
-else if( LockType == XB_LOCK || LockType == XB_LOCK_HOLD )
- cmd = F_TLOCK;
- else
- return XB_INVALID_LOCK_OPTION;
-
-/* do the actual lock */
- do{
- #ifdef _LARGEFILE64_SOURCE
- rc = lockf64( fn, cmd, lockLen );
- #else
- rc = lockf( fn, cmd, lockLen );
- #endif
- if( rc == -1 && errno != EINTR ){
- tries++;
- sleep(1);
- }
- } while( rc == -1 && tries < dbf->xbase->GetLockRetryCount());
-
- if( rc )
- return XB_LOCK_FAILED;
-
- return XB_NO_ERROR;
-}
-#endif // HAVE_FCNTL
-/*************************************************************************/
-/*************************************************************************/
-xbaseLock::xbaseLock( xbDbf * pdbf ) : xbLock( pdbf )
-{
- std::cout << "xbaseLock constructor" << std::cout;
-}
-/*************************************************************************/
-xbShort xbaseLock::LockTableHeader( xbShort LockType )
-{
- if( LockType == XB_UNLOCK )
- return XB_NO_ERROR;
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-xbShort xbaseLock::LockTable( xbShort LockType )
-{
- if(( LockType == XB_LOCK || LockType == XB_LOCK_HOLD ) && TableLockCnt ){
- TableLockCnt++;
- return XB_NO_ERROR;
- }
- if( LockType == XB_UNLOCK && TableLockCnt > 1 ){
- TableLockCnt--;
- return XB_NO_ERROR;
- }
-
-#ifdef _LARGEFILE64_SOURCE
- if( lseek64( fileno( lfh ), 1, SEEK_SET ) != 1 )
- return XB_LOCK_FAILED;
-
- if( LockFile( fileno( lfh ), LockType, 4294967295LL ) != XB_NO_ERROR )
- return XB_LOCK_FAILED;
-#else
- if( lseek( fileno( lfh ), 1, SEEK_SET ) != 1 )
- return XB_LOCK_FAILED;
-
- if( LockFile( fileno( lfh ), LockType, 4294967295L ) != XB_NO_ERROR )
- return XB_LOCK_FAILED;
-#endif
-
- if( LockType == XB_UNLOCK )
- TableLockCnt--;
- else
- TableLockCnt++;
-
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-xbShort xbaseLock::LockRecord(xbShort LockType,xbULong RecNo,xbOffT RecCnt)
-{
-
-#ifdef _LARGEFILE64_SOURCE
- if( lseek64( fileno( lfh ), 100L + RecNo, SEEK_SET ) == -1 ){
- return XB_LOCK_FAILED;
- }
-#else
- if( lseek( fileno( lfh ), 100L + RecNo, SEEK_SET ) == -1 ){
- return XB_LOCK_FAILED;
- }
-#endif
-
- return LockFile( fileno( lfh ), LockType, (xbOffT) RecCnt );
-}
-/*************************************************************************/
-xbShort xbaseLock::LockMemo( xbShort LockType )
-{
- xbShort rc;
-
- if(( LockType == XB_LOCK || LockType == XB_LOCK_HOLD ) && MemoLockCnt ){
- MemoLockCnt++;
- return XB_NO_ERROR;
- }
- else if ( LockType == XB_UNLOCK && MemoLockCnt > 1 ){
- MemoLockCnt--;
- return XB_NO_ERROR;
- }
-
-#ifdef _LARGEFILE64_SOURCE
- if( lseek64( fileno( lfh ), 2, SEEK_SET ) != 2 )
- return XB_LOCK_FAILED;
-#else
- if( lseek( fileno( lfh ), 2, SEEK_SET ) != 2 )
- return XB_LOCK_FAILED;
-#endif
- rc = LockFile( fileno( lfh ), LockType, 1 );
-
- if( rc == XB_NO_ERROR ){
- if( LockType == XB_UNLOCK )
- MemoLockCnt--;
- else
- MemoLockCnt++;
- }
- return rc;
-}
-/*************************************************************************/
-//! Lock Index
-/*!
- Locks all indices for a table when using lock mode XB_XBASE_LOCK_MODE
-
- \param LockType is one of XB_LOCK, XB_LOCK_HOLD or XB_UNLOCK
-*/
-
-xbShort xbaseLock::LockIndex( xbShort LockType )
-{
- xbShort rc;
-
-// if( !NdxList )
-// printf( "no index\n" );
-
- if(( LockType == XB_LOCK || LockType == XB_LOCK_HOLD ) && IndexLockCnt ){
- IndexLockCnt++;
- return XB_NO_ERROR;
- }
- if( LockType == XB_UNLOCK && IndexLockCnt > 1 ){
- IndexLockCnt--;
- return XB_NO_ERROR;
- }
-
-#ifdef _LARGEFILE64_SOURCE
- if( lseek64( fileno( lfh ), 3, SEEK_SET ) == -1 ){
- printf( "here cp1\n");
- return XB_LOCK_FAILED;
- }
-#else
- if( lseek( fileno( lfh ), 3, SEEK_SET ) == -1 ){
- printf( "here cp2\n" );
- return XB_LOCK_FAILED;
- }
-#endif
-
- rc = LockFile( fileno( lfh ), LockType, 1 );
-
- if( rc == XB_NO_ERROR )
- if( LockType == XB_UNLOCK )
- IndexLockCnt--;
- else
- IndexLockCnt++;
-
- return rc;
-}
-/*************************************************************************/
-xbShort xbaseLock::UnlockAll()
-{
- return XB_INVALID_LOCK_OPTION;
-}
-/************************************************************************/
-xbShort xbaseLock::LockInit()
-{
- xbShort len;
- xbString lfn;
-
- lfn = dbf->GetDbfName();
- lfn.resize( lfn.len() - 3 );
-
- lfn += ".lck";
-
-#ifdef _LARGEFILE_SOURCE
- if(( lfh = fopen64( lfn.getData(), "w+b" )) == NULL )
- return XB_OPEN_ERROR;
-#else
- if(( lfh = fopen( lfn.getData(), "w+b" )) == NULL )
- return XB_OPEN_ERROR;
-#endif
-
- else
- return XB_NO_ERROR;
-}
-
-/*************************************************************************/
-/*************************************************************************/
-dbaseLock::dbaseLock( xbDbf * pdbf ) : xbLock( pdbf )
-{
- std::cout << "dbaseLock constructor" << std::cout;
-}
-/*************************************************************************/
-xbShort dbaseLock::LockTableHeader( xbShort LockType )
-{
- if( LockType == XB_UNLOCK )
- return XB_NO_ERROR;
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-xbShort dbaseLock::LockTable( xbShort LockType )
-{
-
- if(( LockType == XB_LOCK || LockType == XB_LOCK_HOLD ) && TableLockCnt ){
- TableLockCnt++;
- return XB_NO_ERROR;
- }
- if( LockType == XB_UNLOCK && TableLockCnt > 1 ){
- TableLockCnt--;
- return XB_NO_ERROR;
- }
-
-#ifdef _LARGEFILE64_SOURCE
- if( lseek64( dbf->GetDbfFileNo(), 4026531838LL, SEEK_SET ))
- return XB_LOCK_FAILED;
-
- if( LockFile( dbf->GetDbfFileNo(), LockType, 1 ) != XB_NO_ERROR )
- return XB_LOCK_FAILED;
-
- if( LockType == XB_LOCK || LockType == XB_LOCK_HOLD ){
- if( LockRecord( XB_LOCK, 1, 4294967295LL ) != XB_NO_ERROR )
- return LockTable( XB_UNLOCK );
- LockRecord( XB_UNLOCK, 1, 4294967295LL );
- }
-
- if( LockType == XB_UNLOCK )
- TableLockCnt--;
- else
- TableLockCnt++;
-
- return XB_NO_ERROR;
-#else
- /* I couldn't figure out how Dbase locks a file at offset 4026531838
- for a 32 bit platform - if you know how, please let me know
-
- Gary - gkunkel@zhsac.com
-
- */
-
- return XB_INVALID_LOCK_OPTION;
-#endif
-
-}
-
-/*************************************************************************/
-xbShort dbaseLock::LockRecord( xbShort LockType, xbULong RecNo, xbOffT RecCnt )
-{
-#ifdef _LARGEFILE64_SOURCE
-
- if( lseek64( dbf->GetDbfFileNo(), 4026531838LL - (RecNo+RecCnt-1), SEEK_SET ) == -1 )
- return XB_LOCK_FAILED;
-
- return LockFile( dbf->GetDbfFileNo(), LockType, RecCnt );
-
-#else
-
- /* I couldn't figure out how dbase locks a file at offset 4026531838
- for a 32 bit platform - if you know how, please let me know
-
- Gary - gkunkel@zhsac.com
-
- */
-
- return XB_INVALID_LOCK_OPTION;
-#endif
-}
-
-/*************************************************************************/
-xbShort dbaseLock::LockMemo( xbShort LockType )
-{
-
- xbShort rc;
-
- if(( LockType == XB_LOCK || LockType == XB_LOCK_HOLD ) && MemoLockCnt ){
- MemoLockCnt++;
- return XB_NO_ERROR;
- }
- else if ( LockType == XB_UNLOCK && MemoLockCnt > 1 ){
- MemoLockCnt--;
- return XB_NO_ERROR;
- }
-
-#ifdef _LARGEFILE_SOURCE
- if( lseek64( dbf->GetMemoFileNo(), 4026531838LL, SEEK_SET ) == -1 )
- return XB_LOCK_FAILED;
- rc = LockFile( dbf->GetMemoFileNo(), LockType, 1 );
-#else
- rc = XB_INVALID_OPTION;
-#endif
-
- if( rc == XB_NO_ERROR ){
- if( LockType == XB_UNLOCK )
- MemoLockCnt--;
- else
- MemoLockCnt++;
- }
- return rc;
-}
-/*************************************************************************/
-xbShort dbaseLock::LockIndex( xbShort LockType )
-{
- if( LockType == XB_NO_ERROR )
- return XB_NO_ERROR;
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-xbShort dbaseLock::UnlockAll()
-{
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-/*************************************************************************/
-clipperLock::clipperLock( xbDbf * pdbf ) : xbLock( pdbf )
-{
- std::cout << "clipperLock constructor" << std::cout;
-}
-/*************************************************************************/
-xbShort clipperLock::LockTableHeader( xbShort LockType )
-{
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-xbShort clipperLock::LockTable( xbShort LockType )
-{
- if(( LockType == XB_LOCK || LockType == XB_LOCK_HOLD ) && TableLockCnt ){
- TableLockCnt++;
- return XB_NO_ERROR;
- }
- if( LockType == XB_UNLOCK && TableLockCnt > 1 ){
- TableLockCnt--;
- return XB_NO_ERROR;
- }
-
- if( LockRecord( LockType, 1L, 1000000000L ) != XB_NO_ERROR )
- return XB_LOCK_FAILED;
-
- if( LockType == XB_UNLOCK )
- TableLockCnt--;
- else
- TableLockCnt++;
-
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-xbShort clipperLock::LockRecord(
- xbShort LockType, xbULong RecNo, xbOffT RecCnt )
-{
-
-#ifdef _LARGEFILE64_SOURCE
- if( lseek64( dbf->GetDbfFileNo(), 1000000000L + RecNo, SEEK_SET ))
- return XB_LOCK_FAILED;
-#else
- if( lseek( dbf->GetDbfFileNo(), 1000000000L + RecNo, SEEK_SET ))
- return XB_LOCK_FAILED;
-#endif
-
- return LockFile( dbf->GetDbfFileNo(), LockType, RecCnt );
-}
-/*************************************************************************/
-xbShort clipperLock::LockMemo( xbShort LockType )
-{
- return XB_NO_ERROR;
-}
-/*************************************************************************/
-xbShort clipperLock::LockIndex( xbShort LockType )
-{
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-xbShort clipperLock::UnlockAll()
-{
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-/*************************************************************************/
-foxproLock::foxproLock( xbDbf * pdbf ) : xbLock( pdbf )
-{
- std::cout << "foxproLock constructor" << std::cout;
-}
-/*************************************************************************/
-xbShort foxproLock::LockTableHeader( xbShort LockType )
-{
-
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-xbShort foxproLock::LockTable( xbShort LockType )
-{
-
- if(( LockType == XB_LOCK || LockType == XB_LOCK_HOLD ) && TableLockCnt ){
- TableLockCnt++;
- return XB_NO_ERROR;
- }
- if( LockType == XB_UNLOCK && TableLockCnt > 1 ){
- TableLockCnt--;
- return XB_NO_ERROR;
- }
-
-
-// something goes in here
-
-
- if( LockType == XB_UNLOCK )
- TableLockCnt--;
- else
- TableLockCnt++;
-
- return XB_NO_ERROR;
-
-}
-/*************************************************************************/
-xbShort foxproLock::LockRecord( xbShort LockType, xbULong RecNo, xbOffT len )
-{
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-xbShort foxproLock::LockMemo( xbShort LockType )
-{
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-xbShort foxproLock::LockIndex( xbShort LockType )
-{
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-xbShort foxproLock::UnlockAll()
-{
- return XB_INVALID_LOCK_OPTION;
-}
-/*************************************************************************/
-
-#endif // XB_LOCKING_ON
-
diff --git a/xbase64/xblock.h b/xbase64/xblock.h
deleted file mode 100755
index 50dfcf2..0000000
--- a/xbase64/xblock.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/* xblock.h
-
- Xbase project source code
-
- This file conatains a header file for the xbLock virtual objects which
- is used for controlling file and record locking. Record and file
- locking has been rewritten in version 3.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-/*! \file xblock.h
-*/
-
-#ifndef __XB_XBLOCK_H__
-#define __XB_XBLOCK_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-#ifdef XB_LOCKING_ON
-
-//! xbLock class
-/*!
-*/
-
-class XBDLLEXPORT xbLock
-{
-public:
- xbLock( xbDbf * dbf );
- virtual ~xbLock();
- virtual xbShort LockTableHeader( xbShort LockType ) = 0;
- virtual xbShort LockTable( xbShort LockType ) = 0;
- virtual xbShort LockRecord( xbShort LockType, xbULong RecNo, xbOffT len ) = 0;
- virtual xbShort LockMemo( xbShort LockType ) = 0;
- virtual xbShort LockIndex( xbShort LockType ) = 0;
- virtual xbShort UnlockAll() = 0;
- virtual xbShort LockInit() { return XB_NO_ERROR; }
-
-protected:
- xbDbf *dbf;
- xbShort HdrLockCnt;
- xbShort TableLockCnt;
- xbShort MemoLockCnt;
- xbShort IndexLockCnt;
- xbShort LockFile( int fn, xbShort LockType, xbOffT lockLen );
-};
-
-class XBDLLEXPORT xbaseLock : xbLock
-{
-public:
- xbaseLock( xbDbf * pdbf );
- virtual ~xbaseLock() {}
- virtual xbShort LockTableHeader( xbShort LockType );
- virtual xbShort LockTable( xbShort LockType );
- virtual xbShort LockRecord( xbShort LockType, xbULong RecNo, xbOffT len );
- virtual xbShort LockMemo( xbShort LockType );
- virtual xbShort LockIndex( xbShort LockType );
- virtual xbShort UnlockAll();
- virtual xbShort LockInit();
-private:
- FILE *lfh; /* lock file handle */
-
-};
-
-class XBDLLEXPORT dbaseLock : xbLock
-{
-public:
- dbaseLock( xbDbf * pdbf );
- virtual ~dbaseLock() {}
- virtual xbShort LockTableHeader( xbShort LockType );
- virtual xbShort LockTable( xbShort LockType );
- virtual xbShort LockRecord( xbShort LockType, xbULong RecNo, xbOffT len );
- virtual xbShort LockMemo( xbShort LockType );
- virtual xbShort LockIndex( xbShort LockType );
- virtual xbShort UnlockAll();
-};
-
-
-class XBDLLEXPORT clipperLock : xbLock
-{
-public:
- clipperLock( xbDbf * pdbf );
- virtual ~clipperLock() {}
- virtual xbShort LockTableHeader( xbShort LockType );
- virtual xbShort LockTable( xbShort LockType );
- virtual xbShort LockRecord( xbShort LockType, xbULong RecNo, xbOffT len );
- virtual xbShort LockMemo( xbShort LockType );
- virtual xbShort LockIndex( xbShort LockType );
- virtual xbShort UnlockAll();
-};
-
-class XBDLLEXPORT foxproLock : xbLock
-{
-public:
- foxproLock( xbDbf * pdbf );
- virtual ~foxproLock() {}
- virtual xbShort LockTableHeader( xbShort LockType );
- virtual xbShort LockTable( xbShort LockType );
- virtual xbShort LockRecord( xbShort LockType, xbULong RecNo, xbOffT len );
- virtual xbShort LockMemo( xbShort LockType );
- virtual xbShort LockIndex( xbShort LockType );
- virtual xbShort UnlockAll();
-};
-
-class XBDLLEXPORT noLock : xbLock
-{
-public:
- noLock( xbDbf * pdbf ) : xbLock( pdbf ) {};
- virtual ~noLock() {}
- virtual xbShort LockTableHeader( xbShort LockType )
- { return XB_NO_ERROR; }
- virtual xbShort LockTable( xbShort LockType )
- { return XB_NO_ERROR; }
- virtual xbShort LockRecord( xbShort LockType, xbULong RecNo )
- { return XB_NO_ERROR; }
- virtual xbShort LockMemo( xbShort LockType )
- { return XB_NO_ERROR; }
- virtual xbShort LockIndex( xbShort LockType )
- { return XB_NO_ERROR; }
- virtual xbShort UnlockAll()
- { return XB_NO_ERROR; }
-};
-
-
-
-
-#endif // XB_LOCKING_ON
-#endif // __XB_XBLOCK_H__
diff --git a/xbase64/xbmemo.cpp b/xbase64/xbmemo.cpp
deleted file mode 100755
index 75956dd..0000000
--- a/xbase64/xbmemo.cpp
+++ /dev/null
@@ -1,1173 +0,0 @@
-/* xbmemo.cpp
-
- Xbase64 project source code
-
- This file contains the basic Xbase64 routines for handling
- dBASE III+ and dBASE IV style memo .dbt files
-
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-#ifdef XB_MEMO_FIELDS
-
-#include <stdio.h>
-//#include <xbase64/xbexcept.h>
-
-#ifdef HAVE_IO_H
-#include <io.h>
-#endif
-
-
-/*! \file xbmemo.cpp
-*/
-
-/************************************************************************/
-//! Short description
-/*!
-*/
-xbLong xbDbf::CalcLastDataBlock()
-{
- if( _fseek( mfp, 0, SEEK_END ) != 0 )
- return XB_SEEK_ERROR;
- return ( _ftell( mfp ) / MemoHeader.BlockSize );
-}
-/************************************************************************/
-//! Short description
-/*!
- \param BlocksNeeded
- \param Location
- \param PrevNode
-*/
-xbShort xbDbf::GetBlockSetFromChain( xbLong BlocksNeeded,
- xbLong Location, xbLong PrevNode )
-
-/* this routine grabs a set of blocks out of the free block chain */
-{
- xbShort rc;
- xbLong NextFreeBlock2, NewFreeBlocks, SaveNextFreeBlock;
-
- if(( rc = ReadMemoBlock( Location, 2 )) != XB_NO_ERROR )
- return rc;
-
- if( BlocksNeeded == FreeBlockCnt ){ /* grab this whole set of blocks */
- if( PrevNode == 0 ){ /* first in the chain */
- MemoHeader.NextBlock = NextFreeBlock;
- if(( rc = UpdateHeadNextNode()) != XB_NO_ERROR )
- return rc;
- }
- else /* remove out of the middle or end */
- {
- NextFreeBlock2 = NextFreeBlock;
- if(( rc = ReadMemoBlock( PrevNode, 2 )) != XB_NO_ERROR )
- return rc;
- NextFreeBlock = NextFreeBlock2;
- if(( rc = WriteMemoBlock( PrevNode, 2 )) != XB_NO_ERROR )
- return rc;
- }
- }
-
- else /* only take a portion of this set */
- {
- if( PrevNode == 0 ){ /* first in the set */
- MemoHeader.NextBlock = Location + BlocksNeeded;
- if(( rc = UpdateHeadNextNode()) != XB_NO_ERROR )
- return rc;
- FreeBlockCnt -= BlocksNeeded;
- if(( rc = WriteMemoBlock( MemoHeader.NextBlock, 2 )) != XB_NO_ERROR )
- return rc;
- }
- else /* remove out of the middle or end */
- {
- NewFreeBlocks = FreeBlockCnt - BlocksNeeded;
- SaveNextFreeBlock = NextFreeBlock;
- NextFreeBlock2= Location + BlocksNeeded;
- if(( rc = ReadMemoBlock( PrevNode, 2 )) != XB_NO_ERROR )
- return rc;
- NextFreeBlock = NextFreeBlock2;
- if(( rc = WriteMemoBlock( PrevNode, 2 )) != XB_NO_ERROR )
- return rc;
- FreeBlockCnt = NewFreeBlocks;
- NextFreeBlock = SaveNextFreeBlock;
- if(( rc = WriteMemoBlock( NextFreeBlock2, 2 )) != XB_NO_ERROR )
- return rc;
- }
- }
- return 0;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param BlocksNeeded
- \param LastDataBlock
- \param Location
- \param PreviousNode
-*/
-xbShort xbDbf::FindBlockSetInChain( xbLong BlocksNeeded,
- xbLong LastDataBlock, xbLong &Location, xbLong &PreviousNode )
-
-/* this routine searches thru the free node chain in a dbase IV type
- memo file searching for a place to grab some free blocks for reuse
-
- LastDataBlock- is the last data block in the file, enter 0
- for the routine to calculate it.
- BlocksNeeded - is the size to look in the chain for
- Location - is the location it finds
- PreviousNode - is the block number of the node imediately previous
- to this node in the chain - 0 if header node
- returns - 0 if no spot in chain found
- 1 if spot in chain is found
-*/
-{
- xbShort rc;
- xbLong LDB, PrevNode, CurNode;
-
- if( LastDataBlock == 0 )
- LDB = CalcLastDataBlock();
- else
- LDB = LastDataBlock;
-
- if( MemoHeader.NextBlock < LDB ){
- PrevNode = 0L;
- CurNode = MemoHeader.NextBlock;
- if(( rc = ReadMemoBlock( MemoHeader.NextBlock, 2 )) != XB_NO_ERROR )
- return rc;
- while( BlocksNeeded > FreeBlockCnt && NextFreeBlock < LDB ){
- PrevNode = CurNode;
- CurNode = NextFreeBlock;
- if(( rc = ReadMemoBlock( NextFreeBlock, 2 )) != XB_NO_ERROR )
- return rc;
- }
- if( BlocksNeeded <= FreeBlockCnt ){
- Location = CurNode;
- PreviousNode = PrevNode;
- return 1;
- }
- else{ /* no data found and at end of chain */
- PreviousNode = CurNode;
- return 0;
- }
- }
- else{
- PreviousNode = 0;
- return 0;
- }
-}
-/************************************************************************/
-//! Short description
-/*!
- \param BlockSize
-*/
-xbShort xbDbf::SetMemoBlockSize( xbShort BlockSize )
-{
- if(IsType3Dbt())
- return XB_NO_ERROR; // not applicable for type 3
- if( BlockSize % 512 != 0 )
- return XB_INVALID_BLOCK_SIZE;
-
- MemoHeader.BlockSize = BlockSize;
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param Option
-*/
-xbShort xbDbf::GetDbtHeader( xbShort Option )
-{
- char *p;
- xbShort i;
- char MemoBlock[24];
-
- /* Option = 0 --> read only first four bytes
- 1 --> read the entire thing */
-
- if( !mfp )
- return XB_NOT_OPEN;
-
- if( _fseek( mfp, 0, SEEK_SET ))
- return XB_SEEK_ERROR;
-
- if(( fread( MemoBlock, 24, 1, mfp )) != 1 )
- return XB_READ_ERROR;
-
- p = MemoBlock;
- MemoHeader.NextBlock = xbase->GetLong( p );
- if(IsType3Dbt() || Option == 0)
- return XB_NO_ERROR;
-
- /* version IV stuff follows */
- p+=8;
- for( i = 0; i < 8; i++, p++ )
- MemoHeader.FileName[i] = *p;
- MemoHeader.Version = *p;
- p+=4;
- MemoHeader.BlockSize = xbase->GetShort( p );
- return XB_NO_ERROR;
-}
-
-/***********************************************************************/
-xbShort xbDbf::OpenFPTFile()
-{
- if (GetFileName().len() < 3)
- return XB_INVALID_NAME;
-
- xbShort len = GetFileName().len() - 1;
- xbString ext = GetFileName().mid(len-2, 3);
- MemofileName = GetFileName().mid(0, len-2);
- if (ext == "DBF")
- MemofileName += "FPT";
- else
- if (ext = "dbf")
- MemofileName += "fpt";
- else
- return XB_INVALID_NAME;
- if ((mfp = fopen(MemofileName, "r+b" )) == NULL){
- //
- // Try to open read only if can't open read/write
- //
- if ((mfp = fopen(MemofileName, "rb" )) == NULL)
- return XB_OPEN_ERROR;
- }
- char header[8];
- if ((fread(header, 8, 1, mfp)) != 1)
- return XB_READ_ERROR;
-
- char *p = header;
- MemoHeader.NextBlock = xbase->GetHBFULong(p);
- p += 6;
- MemoHeader.BlockSize = xbase->GetHBFShort(p);
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbShort xbDbf::OpenMemoFile()
-{
- if (Version == (char)0xf5 || Version == (char)0x30)
- return OpenFPTFile();
-
- xbShort len, rc;
- xbOffT Size, NewSize, l;
- MemofileName = GetFileName();
- len = GetFileName().len() - 1;
- if( MemofileName[len] == 'F' )
- MemofileName.putAt(len, 'T');
- else if( MemofileName[len] == 'f' )
- MemofileName.putAt(len, 't');
- else
- return XB_INVALID_NAME;
-
- if(( mfp = fopen( MemofileName, "r+b" )) == NULL ){
- //
- // Try to open read only if can't open read/write
- //
- if(( mfp = fopen( MemofileName, "rb" )) == NULL )
- return XB_OPEN_ERROR;
- }
-#ifdef XB_LOCKING_ON
- setbuf( mfp, NULL );
-#endif
- if(( rc = GetDbtHeader(1)) != 0 ){
- fclose( mfp );
- return rc;
- }
-
- len = GetMemoBlockSize();
- if( len == 0 || ((len % 512) != 0 )){
- fclose( mfp );
- return XB_INVALID_BLOCK_SIZE;
- }
-
- /* logic to verify file size is a multiple of block size */
- if(( rc = _fseek( mfp, 0, SEEK_END )) != 0 ){
- fclose( mfp );
- return XB_SEEK_ERROR;
- }
-
- /* if the file is not a multiple of block size, fix it, append nulls */
- Size = _ftell( mfp );
- if(( Size % MemoHeader.BlockSize ) != 0 ){
- NewSize = ( Size / MemoHeader.BlockSize + 1) * MemoHeader.BlockSize;
- for( l = Size; l < NewSize; l++ )
- fputc( 0x00, mfp );
- }
-
- if(( mbb = (void *) malloc(len)) == NULL ){
- fclose( mfp );
- return XB_NO_MEMORY;
- }
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbShort xbDbf::CreateMemoFile( void )
-{
- xbShort len,i;
- char *sp;
- char buf[4];
-
- len = GetMemoBlockSize();
- if( len == 0 || len % 512 != 0 )
- return XB_INVALID_BLOCK_SIZE;
-
- if(( sp = (char*)strrchr(GetFileName(), PATH_SEPARATOR)) != NULL )
- sp++;
- else
- sp = MemoHeader.FileName;
-
- memset( MemoHeader.FileName, 0x00, 8 );
-
- for( i = 0; i < 8 && *sp != '.'; i++ )
- MemoHeader.FileName[i] = *sp++;
-
- MemofileName = GetFileName();
-
- len = GetFileName().len() - 1;
- if( MemofileName[len] == 'F' )
- MemofileName.putAt(len, 'T');
- else if( MemofileName[len] == 'f' )
- MemofileName.putAt(len, 't');
- else
- return XB_INVALID_NAME;
-
- /* Initialize the variables */
- MemoHeader.NextBlock = 1L;
-
- if(( mfp = fopen( MemofileName, "w+b" )) == NULL )
- return XB_OPEN_ERROR;
-#ifdef XB_LOCKING_ON
- setbuf( mfp, NULL );
-#endif
-
- if(( _fseek( mfp, 0, SEEK_SET )) != 0 ){
- fclose( mfp );
- return XB_SEEK_ERROR;
- }
-
- memset( buf, 0x00, 4 );
- xbase->PutLong( buf, MemoHeader.NextBlock );
- if(( fwrite( &buf, 4, 1, mfp )) != 1 ){
- fclose( mfp );
- return XB_WRITE_ERROR;
- }
-
- if( IsType3Dbt() ){ /* dBASE III+ */
- for( i = 0; i < 12; i++ ) fputc( 0x00, mfp );
- fputc( 0x03, mfp );
- for( i = 0; i < 495; i++ ) fputc( 0x00, mfp );
- }
- else
- {
- for( i = 0; i < 4; i++ ) fputc( 0x00, mfp );
- fwrite( &MemoHeader.FileName, 8, 1, mfp );
- for( i = 0; i < 4; i++ ) fputc( 0x00, mfp );
- memset( buf, 0x00, 2 );
- xbase->PutShort( buf, MemoHeader.BlockSize );
- if(( fwrite( &buf, 2, 1, mfp )) != 1 ){
- fclose( mfp );
- return XB_WRITE_ERROR;
- }
- for( i = 22; i < MemoHeader.BlockSize; i++ ) fputc( 0x00, mfp );
- }
-
- if(( mbb = (void *) malloc( MemoHeader.BlockSize )) == NULL ){
- fclose( mfp );
- return XB_NO_MEMORY;
- }
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param BlockNo
- \param Option
-*/
-
-/* Option = 0 - 1st Block of a set of valid data blocks, load buckets */
-/* Option = 1 - subsequant block of data in a multi block set or db III*/
-/* Option = 2 - 1st block of a set of free blocks, load buckets */
-/* Option = 3 - read 8 bytes of a block, don't load any buckets */
-/* Option = 4 - read 8 bytes of a block, load data buckets */
-
-xbShort xbDbf::ReadMemoBlock( xbLong BlockNo, xbShort Option )
-{
- size_t ReadSize;
- CurMemoBlockNo = -1;
-
- if( BlockNo < 1L )
- return XB_INVALID_BLOCK_NO;
-
- if( _fseek( mfp,((xbOffT)BlockNo*MemoHeader.BlockSize), SEEK_SET ))
- return XB_SEEK_ERROR;
-
-
- if( Option == 0 || Option == 1 )
- ReadSize = MemoHeader.BlockSize;
- else
- ReadSize = 8L;
-
- if(fread( mbb, ReadSize, 1, mfp ) != 1 )
- return XB_READ_ERROR;
-
- if( Option == 0 || Option == 4){ // 1st block of a set of valid data blocks
- mfield1 = xbase->GetShort( (char *) mbb );
- MStartPos = xbase->GetShort( (char *) mbb+2 );
- MFieldLen = xbase->GetLong ( (char *) mbb+4 );
- }
- else if( Option == 2 ){ // 1st block of a set of free blocks
- NextFreeBlock = xbase->GetLong( (char *) mbb );
- FreeBlockCnt = xbase->GetLong( (char *) mbb+4 );
- }
-
- if( Option == 0 || Option == 1 )
- CurMemoBlockNo = BlockNo;
-
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param BlockNo
- \param Option
-*/
-xbShort xbDbf::WriteMemoBlock( xbLong BlockNo, xbShort Option )
-{
-/* Option = 0 - 1st Block of a set of valid data blocks, set buckets */
-/* Option = 1 - subsequant block of data in a multi block set or db III */
-/* Option = 2 - 1st block of a set offree blocks, set buckets */
-
- xbLong WriteSize;
-
- if( BlockNo < 1L )
- return XB_INVALID_BLOCK_NO;
-
- CurMemoBlockNo = -1;
-
- if( Option == 0 ){
- xbase->PutShort( (char *) mbb, mfield1 );
- xbase->PutShort( (char *) mbb+2, MStartPos );
- xbase->PutLong ( (char *) mbb+4, MFieldLen );
- WriteSize = MemoHeader.BlockSize;
- }
- else if( Option == 2 ){
- xbase->PutLong((char *) mbb, NextFreeBlock );
- xbase->PutLong((char *) mbb+4, FreeBlockCnt );
- WriteSize = 8L;
- }
- else
- WriteSize = MemoHeader.BlockSize;
-
- if( _fseek( mfp,((xbOffT)BlockNo*MemoHeader.BlockSize), SEEK_SET ))
- return XB_SEEK_ERROR;
-
- if(( fwrite( mbb, WriteSize, 1, mfp )) != 1 )
- return XB_WRITE_ERROR;
-
- if( Option == 0 || Option == 1 )
- CurMemoBlockNo = BlockNo;
-
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param FieldNo
- \param len
- \param Buf
- \param LockOpt
-*/
-xbShort xbDbf::GetFPTField(xbShort FieldNo, xbLong len,
- char * Buf, xbShort LockOpt) {
-
- if (FieldNo < 0 || FieldNo > (NoOfFields - 1))
- return XB_INVALID_FIELDNO;
-
- if (GetFieldType(FieldNo) != 'M')
- return XB_NOT_MEMO_FIELD;
-
-#ifdef XB_LOCKING_ON
-// if( LockOpt != -1 )
-// if( LockMemoFile( XB_LOCK ) != XB_NO_ERROR )
-// return XB_LOCK_FAILED;
-#endif
-
- xbLong BlockNo;
- char buf[18];
-
- if( Version == (char)0x30 ) {
- memset( buf, 0x00, 18 ) ;
- GetField( FieldNo, buf );
- BlockNo = xbase->GetLong((char*) buf);
- } else {
- BlockNo = GetLongField(FieldNo);
- }
-
- if ( BlockNo == 0L )
- return 0L;
-
- // Seek to start_of_block + 4
-
-
-// FIXME LOCK
-
-#ifdef XB_LOCKING_ON
-// try {
-#endif
- if (_fseek(mfp, ((xbOffT)BlockNo * MemoHeader.BlockSize + 4), SEEK_SET) != 0)
- return XB_SEEK_ERROR;
- char h[4];
- if ((fread(h, 4, 1, mfp)) != 1)
- return XB_READ_ERROR;
-
- xbULong fLen = xbase->GetHBFULong(h);
-
- xbULong l = (fLen < (xbULong)len) ? fLen : len;
- if ((fread(Buf, l, 1, mfp)) != 1)
- return XB_READ_ERROR;
- Buf[l]=0;
-#ifdef XB_LOCKING_ON
-// }
-// catch (...) {
-// if (LockOpt != -1)
-// LockMemoFile( XB_UNLOCK );
-// throw;
-// }
-#endif
-
-#ifdef XB_LOCKING_ON
-// if (LockOpt != -1)
-// LockMemoFile( XB_UNLOCK );
-#endif
-
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param FieldNo
- \param len
- \param Buf
- \param LockOpt
-*/
-xbShort xbDbf::GetMemoField( xbShort FieldNo, xbLong len,
- char * Buf, xbShort LockOpt )
-{
- if( Version == (char)0xf5 || Version == (char)0x30 )
- return GetFPTField(FieldNo, len, Buf, LockOpt);
-
- xbLong BlockNo, Tcnt, Scnt;
- char *tp, *sp; /* target and source pointers */
- xbShort rc;
- xbShort Vswitch;
- xbLong MemoLen;
-
- if( FieldNo < 0 || FieldNo > ( NoOfFields - 1 ))
- return XB_INVALID_FIELDNO;
-
- if( GetFieldType( FieldNo ) != 'M' )
- return XB_NOT_MEMO_FIELD;
-
-#ifdef XB_LOCKING_ON
-// if( LockOpt != -1 )
-// if(( rc = LockMemoFile( LockOpt, XB_LOCK )) != XB_NO_ERROR )
-// return XB_LOCK_FAILED;
-#endif
-
- if(( BlockNo = GetLongField( FieldNo )) == 0 ){
-#ifdef XB_LOCKING_ON
-// if( LockOpt != -1 )
-// LockMemoFile( XB_UNLOCK );
-#endif
- return XB_NO_MEMO_DATA;
- }
-
- if( IsType3Dbt() )
- Vswitch = 1;
- else
- Vswitch = 0;
-
- if(( rc = ReadMemoBlock( BlockNo, Vswitch )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( LockOpt != -1 )
-// LockMemoFile( XB_UNLOCK );
-#endif
- return rc;
- }
-
- tp = Buf;
- sp = (char *) mbb;
-
- if( IsType4Dbt() ){
- sp+=8;
- Scnt = 8L;
- }
- else
- Scnt = 0L;
-
- Tcnt = 0L;
- MemoLen = GetMemoFieldLen( FieldNo );
- while( Tcnt < len && Tcnt < MemoLen ){
- *tp++ = *sp++;
- Scnt++;
- Tcnt++;
- if( Scnt >= MemoHeader.BlockSize ){
- BlockNo++;
- if(( rc = ReadMemoBlock( BlockNo, 1 )) != 0 )
- return rc;
- Scnt = 0;
- sp = (char *) mbb;
- }
- }
-#ifdef XB_LOCKING_ON
- //if( LockOpt != -1 )
-// LockMemoFile( XB_LOCK );
-#endif
-
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param FieldNo
-*/
-xbLong xbDbf::GetFPTFieldLen( xbShort FieldNo )
-{
- xbLong BlockNo;
- if(( BlockNo = GetLongField(FieldNo)) == 0L )
- return 0L;
- // Seek to start_of_block + 4
- if(_fseek(mfp, ((xbOffT)BlockNo * MemoHeader.BlockSize + 4), SEEK_SET) != 0)
- return XB_SEEK_ERROR;
- char h[4];
- if((fread(h, 4, 1, mfp)) != 1)
- return XB_READ_ERROR;
-
- return xbase->GetHBFULong(h);
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param FieldNo
-*/
-xbLong xbDbf::GetMemoFieldLen( xbShort FieldNo ) {
- if (Version == (char)0xf5 || Version == (char)0x30 )
- return GetFPTFieldLen(FieldNo);
-
- xbLong BlockNo, ByteCnt;
- xbShort scnt, NotDone;
- char *sp, *spp;
-
- if(( BlockNo = GetLongField( FieldNo )) == 0L )
- return 0L;
-
- if( IsType4Dbt()){ /* dBASE IV */
- if( BlockNo == CurMemoBlockNo && CurMemoBlockNo != -1 )
- return MFieldLen - MStartPos;
- if( ReadMemoBlock( BlockNo, 0 ) != XB_NO_ERROR )
- return 0L;
- return MFieldLen - MStartPos;
- } else { /* version 0x03 dBASE III+ */
- ByteCnt = 0L;
- spp = NULL;
- NotDone = 1;
- while( NotDone ){
- if( ReadMemoBlock( BlockNo++, 1 ) != XB_NO_ERROR )
- return 0L;
- scnt = 0;
- sp = (char *) mbb;
- while( scnt < 512 && NotDone ){
- if( *sp == 0x1a && *spp == 0x1a )
- NotDone = 0;
- else{
- ByteCnt++; scnt++; spp = sp; sp++;
- }
- }
- }
- if( ByteCnt > 0 ) ByteCnt--;
- return ByteCnt;
- }
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbShort xbDbf::MemoFieldsPresent() const
-{
- xbShort i;
- for( i = 0; i < NoOfFields; i++ )
- if( GetFieldType( i ) == 'M' )
- return 1;
-
- return 0;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param FieldNo
-*/
-xbShort xbDbf::DeleteMemoField( xbShort FieldNo )
-{
- xbLong SBlockNo, SNoOfBlocks, SNextBlock;
- xbLong LastFreeBlock, LastFreeBlockCnt, LastDataBlock;
- xbShort rc;
-
- NextFreeBlock = 0L;
- LastFreeBlockCnt = 0L;
- LastFreeBlock = 0L;
-
- if( IsType3Dbt() ){ /* type III */
- PutField( FieldNo, " " );
- return XB_NO_ERROR;
- }
-
- /* Get Block Number */
- if(( SBlockNo = GetLongField( FieldNo )) == 0 )
- return XB_INVALID_BLOCK_NO;
-
- /* Load the first block */
-
- if(( rc = ReadMemoBlock( SBlockNo, 4 )) != XB_NO_ERROR )
- return rc;
-
- if( (MFieldLen+2) % MemoHeader.BlockSize )
- SNoOfBlocks = (MFieldLen+2)/MemoHeader.BlockSize+1L;
- else
- SNoOfBlocks = (MFieldLen+2)/MemoHeader.BlockSize;
-
- /* Determine last good data block */
- LastDataBlock = CalcLastDataBlock();
-
- /* position to correct location in chain */
- NextFreeBlock = MemoHeader.NextBlock;
- while( SBlockNo > NextFreeBlock && SBlockNo < LastDataBlock ){
- LastFreeBlock = NextFreeBlock;
- if(( rc = ReadMemoBlock( NextFreeBlock, 2 )) != XB_NO_ERROR )
- return rc;
- LastFreeBlockCnt = FreeBlockCnt;
- }
-
-
- /* if next block should be concatonated onto the end of this set */
-
- if((SBlockNo+SNoOfBlocks) == NextFreeBlock && NextFreeBlock < LastDataBlock )
- {
- if(( rc = ReadMemoBlock( NextFreeBlock, 2 )) != XB_NO_ERROR )
- return XB_NO_ERROR;
- SNoOfBlocks += FreeBlockCnt;
- SNextBlock = NextFreeBlock;
- } else if( LastFreeBlock == 0L )
- SNextBlock = MemoHeader.NextBlock;
- else
- SNextBlock = NextFreeBlock;
-
- /* if this is the first set of free blocks */
- if( LastFreeBlock == 0L ){
- /* 1 - write out the current block */
- /* 2 - update header block */
- /* 3 - write header block */
- /* 4 - update data field */
-
- NextFreeBlock = SNextBlock;
- FreeBlockCnt = SNoOfBlocks;
- if(( rc = WriteMemoBlock( SBlockNo, 2 )) != XB_NO_ERROR )
- return rc;
-
- MemoHeader.NextBlock = SBlockNo;
- if(( rc = UpdateHeadNextNode()) != XB_NO_ERROR )
- return rc;
- PutField( FieldNo, " " );
- return XB_NO_ERROR;
- }
-
-/* determine if this block set should be added to the previous set */
-
- if(( LastFreeBlockCnt + LastFreeBlock ) == SBlockNo ){
- if(( rc = ReadMemoBlock( LastFreeBlock, 2 )) != XB_NO_ERROR )
- return rc;
- NextFreeBlock = SNextBlock;
- FreeBlockCnt += SNoOfBlocks;
- if(( rc = WriteMemoBlock( LastFreeBlock, 2 )) != XB_NO_ERROR )
- return rc;
- PutField( FieldNo, " " );
- return XB_NO_ERROR;
- }
-
- /* insert into the chain */
- /* 1 - set the next bucket on the current node */
- /* 2 - write this node */
- /* 3 - go to the previous node */
- /* 4 - insert this nodes id into the previous node set */
- /* 5 - write previous node */
-
- FreeBlockCnt = SNoOfBlocks;
- if(( rc = WriteMemoBlock( SBlockNo, 2 )) != XB_NO_ERROR )
- return rc;
- if(( rc = ReadMemoBlock( LastFreeBlock, 2 )) != XB_NO_ERROR )
- return rc;
- NextFreeBlock = SBlockNo;
- if(( rc = WriteMemoBlock( LastFreeBlock, 2 )) != XB_NO_ERROR )
- return rc;
- PutField( FieldNo, " " );
-
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param FieldNo
- \param DataLen
- \param Buf
-*/
-
-xbShort xbDbf::AddMemoData( xbShort FieldNo, xbLong DataLen,
- const char * Buf )
-{
- xbShort rc;
- xbLong BlocksNeeded, LastDataBlock;
- xbLong PrevNode, HeadBlock;
- xbLong TotalLen; /* total length of needed area for memo field */
-
- TotalLen = DataLen+2;
- LastDataBlock = CalcLastDataBlock();
-
- if( IsType3Dbt() || /* always append to end */
- ( LastDataBlock == MemoHeader.NextBlock )){ /* no free space */
- if( TotalLen % MemoHeader.BlockSize )
- BlocksNeeded = TotalLen / MemoHeader.BlockSize + 1;
- else
- BlocksNeeded = TotalLen / MemoHeader.BlockSize;
-
- MemoHeader.NextBlock = LastDataBlock + BlocksNeeded; /* reset to eof */
- if(( rc = PutMemoData( LastDataBlock, BlocksNeeded, DataLen, Buf ))
- != XB_NO_ERROR )
- return rc;
- HeadBlock = LastDataBlock;
- if(( rc = UpdateHeadNextNode()) != XB_NO_ERROR )
- return rc;
- }else{
- TotalLen += 8;
- if( TotalLen % MemoHeader.BlockSize )
- BlocksNeeded = TotalLen / MemoHeader.BlockSize + 1;
- else
- BlocksNeeded = TotalLen / MemoHeader.BlockSize;
-
- if(( rc = FindBlockSetInChain( BlocksNeeded, LastDataBlock,
- HeadBlock, PrevNode )) == 1 ){
- if(( rc = GetBlockSetFromChain( BlocksNeeded, HeadBlock, PrevNode ))
- != XB_NO_ERROR )
- return rc;
- if(( rc = PutMemoData( HeadBlock, BlocksNeeded, DataLen, Buf ))
- != XB_NO_ERROR )
- return rc;
- } else { /* append to the end */
- /* if header block needed updated, already done by here */
- if(( rc = PutMemoData( LastDataBlock, BlocksNeeded, DataLen, Buf ))
- != XB_NO_ERROR )
- return rc;
- HeadBlock = LastDataBlock;
- if(( rc = ReadMemoBlock( PrevNode, 2 )) != XB_NO_ERROR )
- return rc;
- NextFreeBlock += BlocksNeeded;
- if(( rc = WriteMemoBlock( PrevNode, 2 )) != XB_NO_ERROR )
- return rc;
- }
- }
- PutLongField( FieldNo, HeadBlock );
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbShort xbDbf::UpdateHeadNextNode() const
-{
- char buf[4];
- memset( buf, 0x00, 4 );
- xbase->PutLong( buf, MemoHeader.NextBlock );
- if(( _fseek( mfp, 0, SEEK_SET )) != 0 )
- return XB_SEEK_ERROR;
-
- if(( fwrite( &buf, 4, 1, mfp )) != 1 )
- return XB_WRITE_ERROR;
-
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param StartBlock First block to write
- \param BlocksNeeded Total number of blocks needed
- \param DataLen Length of data to write
- \param Buf Actual data
-*/
-xbShort xbDbf::PutMemoData( xbLong StartBlock, xbLong BlocksNeeded,
- xbLong DataLen, const char *Buf )
-{
- xbShort i, rc, Tctr;
- xbShort BytesProcessed; // bytes processed so far
- xbShort TotalLen; // total length of data
- xbLong CurBlock;
- char *tp;
- const char *sp;
-
- TotalLen = DataLen + 2;
- CurBlock = StartBlock;
- memset( (char *) mbb, 0x00, MemoHeader.BlockSize );
- tp = (char *) mbb;
- sp = Buf;
- BytesProcessed = 0; /* total length processed */
-
-
- if( IsType3Dbt() )
- Tctr = 0;
- else{ /* dBASE IV */
- tp += 8;
- Tctr = 8;
- }
-
- for( i = 0; i < BlocksNeeded; i++ ){
- while( Tctr < MemoHeader.BlockSize && BytesProcessed < TotalLen ){
- if( BytesProcessed >= DataLen )
- *tp++ = 0x1a; /* end of data marker */
- else
- *tp++ = *sp++; /* copy data to memo block buffer */
- Tctr++;
- BytesProcessed++;
- }
-
- /* if incomplete block, finish it out with 0x00 */
- while( Tctr++ < MemoHeader.BlockSize )
- *tp++ = 0x00;
-
- if( i == 0 && IsType4Dbt() ){
- mfield1 = -1;
- MStartPos = 8;
- MFieldLen = DataLen + MStartPos;
- if(( rc = WriteMemoBlock( CurBlock++, 0 )) != XB_NO_ERROR )
- return rc;
- } else {
- if(( rc = WriteMemoBlock( CurBlock++, 1 )) != XB_NO_ERROR )
- return rc;
- }
- Tctr = 0;
- tp = (char *) mbb;
- }
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param FieldNo
- \param DataLen
- \param Buf
- \param LockOpt
-*/
-xbShort xbDbf::UpdateMemoData( xbShort FieldNo, xbLong DataLen,
- const char * Buf, xbShort LockOpt )
-{
- xbShort rc;
- xbLong TotalLen;
- xbLong BlocksNeeded, BlocksAvailable;
-
- #ifdef XB_LOCKING_ON
- if( LockOpt != -1 )
-// if(( rc = LockMemoFile( XB_LOCK )) != XB_NO_ERROR )
-// return XB_LOCK_FAILED;
- #endif
-
- if( DataLen ){
- TotalLen = DataLen + 2; // add 2 eod 0x1a chars
- if( IsType4Dbt()) TotalLen += 8; // leading fields for dbase iv
- }
- else
- TotalLen = 0;
-
- if( DataLen == 0L ){ /* handle delete */
- if( MemoFieldExists( FieldNo )){
- if(( rc = DeleteMemoField( FieldNo )) != XB_NO_ERROR ){
- #ifdef XB_LOCKING_ON
-// LockMemoFile( XB_UNLOCK );
- #endif
- return rc;
- }
- }
- } else if((IsType3Dbt() || GetMemoFieldLen(FieldNo)==0L)){
- if(( rc = AddMemoData( FieldNo, DataLen, Buf )) != XB_NO_ERROR ){
- #ifdef XB_LOCKING_ON
-// LockMemoFile( XB_UNLOCK );
- #endif
- return rc;
- }
- } else { /* version IV type files, reuse unused space */
- if( TotalLen % MemoHeader.BlockSize )
- BlocksNeeded = TotalLen / MemoHeader.BlockSize + 1;
- else
- BlocksNeeded = TotalLen / MemoHeader.BlockSize;
-
- if(( rc = ReadMemoBlock( GetLongField( FieldNo ), 4 )) != XB_NO_ERROR ){
- #ifdef XB_LOCKING_ON
-// LockMemoFile( XB_UNLOCK );
- #endif
- return rc;
- }
-
- if( (MFieldLen+2) % MemoHeader.BlockSize )
- BlocksAvailable = (MFieldLen+2) / MemoHeader.BlockSize + 1;
- else
- BlocksAvailable = (MFieldLen+2) / MemoHeader.BlockSize;
-
- if( BlocksNeeded == BlocksAvailable ){
- if(( rc = PutMemoData( GetLongField( FieldNo ), BlocksNeeded,
- DataLen, Buf )) != XB_NO_ERROR ){
- #ifdef XB_LOCKING_ON
-// LockMemoFile( XB_UNLOCK );
- #endif
- return rc;
- }
- } else {
- if(( rc = DeleteMemoField( FieldNo )) != XB_NO_ERROR ){
- #ifdef XB_LOCKING_ON
-// LockMemoFile( XB_UNLOCK );
- #endif
- return rc;
- }
- if(( rc = AddMemoData( FieldNo, DataLen, Buf )) != XB_NO_ERROR ){
- #ifdef XB_LOCKING_ON
-// LockMemoFile( XB_UNLOCK );
- #endif
- return rc;
- }
- }
- }
-
-
- #ifdef XB_LOCKING_ON
-// if( LockOpt != -1 )
-// if(( rc = LockMemoFile( XB_UNLOCK )) != XB_NO_ERROR )
-// return XB_LOCK_FAILED;
- #endif
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param FieldNo
-*/
-xbShort xbDbf::MemoFieldExists( xbShort FieldNo ) const
-{
- if( GetLongField( FieldNo ) == 0L )
- return 0;
- else
- return 1;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-#ifdef XBASE_DEBUG
-void xbDbf::DumpMemoHeader() const
-{
- xbShort i;
- std::cout << "\n*********************************";
- std::cout << "\nMemo header data...";
- std::cout << "\nNext Block " << MemoHeader.NextBlock;
- if( IsType4Dbt() ){
- std::cout << "\nFilename ";
- for( i = 0; i < 8; i++ )
- std::cout << MemoHeader.FileName[i];
- }
- std::cout << "\nBlocksize " << MemoHeader.BlockSize;
- return;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbShort xbDbf::DumpMemoFreeChain()
-{
- xbShort rc;
- xbLong CurBlock, LastDataBlock;
-
- if(( rc = GetDbtHeader(1)) != XB_NO_ERROR )
- return rc;
- LastDataBlock = CalcLastDataBlock();
- CurBlock = MemoHeader.NextBlock;
- std::cout << "Total blocks in file = " << LastDataBlock << std::endl;
- std::cout << "Head Next Block = " << CurBlock << std::endl;;
- while( CurBlock < LastDataBlock ){
- if(( rc = ReadMemoBlock( CurBlock, 2 )) != XB_NO_ERROR )
- return rc;
- std::cout << "**********************************" << std::endl;
- std::cout << "This Block = " << CurBlock << std::endl;
- std::cout << "Next Block = " << NextFreeBlock << std::endl;
- std::cout << "No Of Blocks = " << FreeBlockCnt << std::endl;
- CurBlock = NextFreeBlock;
- }
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-void xbDbf::DumpMemoBlock() const
-{
- xbShort i;
- char *p;
- p = (char *) mbb;
- if( IsType3Dbt() ){
- for( i = 0; i < 512; i++ )
- std::cout << *p++;
- } else {
- std::cout << "\nField1 => " << mfield1;
- std::cout << "\nStart Pos => " << MStartPos;
- std::cout << "\nField Len => " << MFieldLen;
- std::cout << "\nBlock data => ";
- p += 8;
- for( i = 8; i < MemoHeader.BlockSize; i++ )
- std::cout << *p++;
- }
- return;
-}
-#endif /* XBASE_DEBUG */
-#endif /* MEMO_FIELD */
diff --git a/xbase64/xbmindex.h b/xbase64/xbmindex.h
deleted file mode 100755
index 2cda630..0000000
--- a/xbase64/xbmindex.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef xbMultiIndex_h
-#define xbMultiIndex_h
-
-#include <xbase64/xbase64.h>
-
-class xbMultiIndex: public xbIndex
-{
- public:
- xbMultiIndex(xbDbf* dbf): xbIndex(dbf) {}
- virtual ~xbMultiIndex() {}
- virtual xbShort CreateIndex(const char * filename, const char* tag,
- const char* expr, xbShort unique, xbShort overwrite)=0;
-};
-#endif
diff --git a/xbase64/xbndx.cpp b/xbase64/xbndx.cpp
deleted file mode 100755
index e89bc7a..0000000
--- a/xbase64/xbndx.cpp
+++ /dev/null
@@ -1,2402 +0,0 @@
-/* xbndx.cpp
-
- Xbase64 project source code
-
- NDX indexing routines for X-Base
-
- Copyright (C) 1997,2003,2004 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xbndx.h"
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-#include <iostream>
-
-#ifdef XB_INDEX_NDX
-
-#ifdef HAVE_IO_H
-#include <io.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-//#include <xbase64/xbexcept.h>
-
-/*! \file xbndx.cpp
-*/
-
-/***********************************************************************/
-//! Short description
-/*!
-*/
-/* This routine dumps the node chain to stdout */
-#ifdef XBASE_DEBUG
-void xbNdx::DumpNodeChain()
-{
- xbNdxNodeLink *n;
- std::cout << std::endl << "*************************" << std::endl;
- std::cout << "xbNodeLinkCtr = " << xbNodeLinkCtr << std::endl;
- std::cout << "Reused = " << ReusedxbNodeLinks << std::endl;
-
- n = NodeChain;
- while(n){
- std::cout << "xbNodeLink Chain ->" << n->NodeNo << std::endl;
- std::cout << " CurKeyNo ->" << n->CurKeyNo << std::endl;
- n = n->NextNode;
- }
- n = FreeNodeChain;
- while(n){
- std::cout << "FreexbNodeLink Chain " << n->NodeNo << std::endl;
- n = n->NextNode;
- }
- n = DeleteChain;
- while(n){
- std::cout << "DeleteLink Chain " << n->NodeNo << std::endl;
- n = n->NextNode;
- }
-}
-#endif
-/***********************************************************************/
-//! Short description
-/*!
- \param n
-*/
-/* This routine returns a chain of one or more index nodes back to the */
-/* free node chain */
-
-void xbNdx::ReleaseNodeMemory(xbNdxNodeLink *n, xbBool doFree)
-{
- xbNdxNodeLink *temp;
-
- if(doFree){
- while(n){
- temp = n->NextNode;
- free(n);
- n = temp;
- }
- } else {
- if( !FreeNodeChain )
- FreeNodeChain = n;
- else { /* put this list at the end */
- temp = FreeNodeChain;
- while( temp->NextNode )
- temp = temp->NextNode;
- temp->NextNode = n;
- }
- }
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-/* This routine returns a node from the free chain if available, */
-/* otherwise it allocates new memory for the requested node */
-
-xbNdxNodeLink * xbNdx::GetNodeMemory()
-{
- xbNdxNodeLink * temp;
- if( FreeNodeChain ){
- temp = FreeNodeChain;
- FreeNodeChain = temp->NextNode;
- ReusedxbNodeLinks++;
- } else {
- temp = (xbNdxNodeLink *) malloc( sizeof( xbNdxNodeLink ));
- xbNodeLinkCtr++;
- }
- memset( temp, 0x00, sizeof( xbNdxNodeLink ));
- return temp;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-#ifdef XBASE_DEBUG
-void xbNdx::DumpHdrNode( xbShort opt )
-{
- if( opt ){
- FILE * log;
- if(( log = fopen( "xbase64.log", "a+t" )) == NULL ) return;
- fprintf( log, "Index Header Node for %s\n", GetFileName().getData());
- fprintf( log, "--------------------------------\n" );
- fprintf( log, "Start node = %ld\n", HeadNode.StartNode );
- fprintf( log, "Total nodes = %ld\n", HeadNode.TotalNodes );
- fprintf( log, "No of keys = %ld\n", HeadNode.NoOfKeys );
- fprintf( log, "Key Length = %d\n", HeadNode.KeyLen );
- fprintf( log, "Keys Per Node = %d\n", HeadNode.KeysPerNode );
- fprintf( log, "Key type = %d\n", HeadNode.KeyType );
- fprintf( log, "Key size = %ld\n", HeadNode.KeySize );
- fprintf( log, "Unknown 2 = %d\n", HeadNode.Unknown2 );
- fprintf( log, "Unique = %d\n", HeadNode.Unique );
- fprintf( log, "KeyExpression = %s\n", HeadNode.KeyExpression );
- fclose( log );
- }
- else
- {
- std::cout << "Start node = " << HeadNode.StartNode << std::endl;
- std::cout << "Total nodes = " << HeadNode.TotalNodes << std::endl;
- std::cout << "No of keys = " << HeadNode.NoOfKeys << std::endl;
- std::cout << "Key Length = " << HeadNode.KeyLen << std::endl;
- std::cout << "Keys Per Node = " << HeadNode.KeysPerNode << std::endl;
- std::cout << "Key type = " << HeadNode.KeyType << std::endl;
- std::cout << "Key size = " << HeadNode.KeySize << std::endl;
- std::cout << "Unknown 2 = " << HeadNode.Unknown2 << std::endl;
- std::cout << "Unique = " << HeadNode.Unique << std::endl;
- std::cout << "KeyExpression = " << HeadNode.KeyExpression << std::endl;
-#ifdef XB_VAR_NODESIZE
- std::cout << "NodeSize = " << NodeSize << std::endl;
-#endif // XB_VAR_NODESIZE
- std::cout << std::endl;
- }
-}
-#endif
-
-/***********************************************************************/
-//! Constructor
-/*!
- \param pdbf
-*/
-xbNdx::xbNdx() : xbIndex()
-{
-}
-
-/***********************************************************************/
-//! Constructor
-/*!
- \param pdbf
-*/
-xbNdx::xbNdx(xbDbf *pdbf) : xbIndex(pdbf) {
-#ifndef XB_VAR_NODESIZE
- memset( Node, 0x00, XB_NDX_NODE_SIZE );
-#else
- memset( Node, 0x00, XB_MAX_NDX_NODE_SIZE );
-#endif
- memset( &HeadNode, 0x00, sizeof( xbNdxHeadNode ));
- NodeChain = NULL;
- FreeNodeChain = NULL;
- DeleteChain = NULL;
- CurNode = NULL;
- xbNodeLinkCtr = 0L;
- ReusedxbNodeLinks = 0L;
-#ifndef XB_VAR_NODESIZE
- NodeSize = XB_NDX_NODE_SIZE;
-#else
- NodeSize = XB_DEFAULT_NDX_NODE_SIZE;
-#endif // XB_VAR_NODESIZE
-}
-
-/***********************************************************************/
-//! Destructor
-/*!
-*/
-xbNdx::~xbNdx()
-{
- CloseIndex();
-}
-
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbShort xbNdx::GetHeadNode( void )
-{
- char *p, *q;
- xbShort i;
-
- if( !IsOpen() )
- return XB_NOT_OPEN;
-
- if( _fseek( indexfp, 0, SEEK_SET ))
- return XB_SEEK_ERROR;
-
- if(( fread( Node, XB_NDX_NODE_SIZE, 1, indexfp )) != 1 )
- return XB_READ_ERROR;
-
- /* load the head node structure */
- p = Node;
- HeadNode.StartNode = dbf->xbase->GetLong ( p ); p+=4;
- HeadNode.TotalNodes = dbf->xbase->GetLong ( p ); p+=4;
- HeadNode.NoOfKeys = dbf->xbase->GetLong ( p ); p+=4;
- HeadNode.KeyLen = dbf->xbase->GetShort( p ); p+=2;
- HeadNode.KeysPerNode = dbf->xbase->GetShort( p ); p+=2;
- HeadNode.KeyType = dbf->xbase->GetShort( p ); p+=2;
- HeadNode.KeySize = dbf->xbase->GetLong ( p ); p+=4;
- HeadNode.Unknown2 = *p++;
- HeadNode.Unique = *p++;
-
-#ifdef XB_VAR_NODESIZE
- //
- // Automagically determine the node size. Note the (2 * sizeof(xbLong))
- // is taken directly from CreateIndex(). I don't understand it exactly,
- // but this is the value used to calculate the number of keys per node.
- // DTB.
- //
- NodeSize = (2 * sizeof(xbLong)) + HeadNode.KeySize * HeadNode.KeysPerNode;
- if(NodeSize % XB_NDX_NODE_MULTIPLE)
- NodeSize = ((NodeSize + XB_NDX_NODE_MULTIPLE) / XB_NDX_NODE_MULTIPLE) *
- XB_NDX_NODE_MULTIPLE;
-#endif
-
- q = HeadNode.KeyExpression;
- for( i = XB_NDX_NODE_BASESIZE; i < XB_NDX_NODE_SIZE && *p; i++ )
- *q++ = *p++;
-
- return 0;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param NodeNo
- \param SetNodeChain
-*/
-/* This routine reads a leaf node from disk */
-/* */
-/* If SetNodeChain 2, then the node is not appended to the node chain */
-/* but the CurNode pointer points to the node read */
-/* If SetNodeChain 1, then the node is appended to the node chain */
-/* If SetNodeChain 0, then record is only read to Node memory */
-
-xbShort xbNdx::GetLeafNode( xbLong NodeNo, xbShort SetNodeChain )
-{
- xbNdxNodeLink *n;
-
- if( !IsOpen() )
- return XB_NOT_OPEN;
-
- if( _fseek( indexfp, (xbOffT)NodeNo * XB_NDX_NODE_SIZE, SEEK_SET ))
- return XB_SEEK_ERROR;
-
- if(( fread( Node, XB_NDX_NODE_SIZE, 1, indexfp )) != 1 )
- return XB_READ_ERROR;
-
- if( !SetNodeChain ) return 0;
-
- if(( n = GetNodeMemory()) == NULL )
- return XB_NO_MEMORY;
-
- n->NodeNo = NodeNo;
- n->CurKeyNo = 0L;
- n->NextNode = NULL;
- n->Leaf.NoOfKeysThisNode = dbf->xbase->GetLong( Node );
- memcpy( n->Leaf.KeyRecs, Node+4, XB_NDX_NODE_SIZE - 4 );
-
- /* put the node in the chain */
- if( SetNodeChain == 1 ){
- if( NodeChain == NULL ){ /* first one ? */
- NodeChain = n;
- CurNode = n;
- CurNode->PrevNode = NULL;
- } else {
- n->PrevNode = CurNode;
- CurNode->NextNode = n;
- CurNode = n;
- }
- }
- else
- CurNode = n;
- return 0;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param n
-*/
-#ifdef XBASE_DEBUG
-void xbNdx::DumpNodeRec( xbLong n )
-{
- char *p;
- xbLong NoOfKeys, LeftBranch, RecNo, NodeType;
- xbShort i,j;
- FILE * log;
-
- if(( log = fopen( "xbase64.log", "a+t" )) == NULL ) return;
- GetLeafNode( n, 0 );
- NoOfKeys = dbf->xbase->GetLong( Node );
- p = Node + 4; /* go past no of keys */
-
- fprintf( log, "----------------------------------------------------\n" );
- fprintf( log, "Node # %ld\n", n );
- fprintf( log, "Number of keys = %ld\n", NoOfKeys );
- fprintf( log, " Key Left Dbf Rec Key\n" );
- fprintf( log, "Number Branch Number Data\n" );
-
- NodeType = 0;
- for( i = 0; i < (NoOfKeys+NodeType); i++ ){
- LeftBranch = dbf->xbase->GetLong( p );
- if( i == 0 && LeftBranch ){
- NodeType = 1; /* print one extra entry for interior nodes */
- fprintf( log, "Interior node\n" );
- }
-
- p+=4;
- RecNo = dbf->xbase->GetLong( p );
- p+=4;
-
- fprintf( log, " %3d %9ld %9ld ", i, LeftBranch, RecNo );
-
- if( NodeType == 1 && i == NoOfKeys )
- fprintf( log, "...\n" );
-
- else if( !HeadNode.KeyType ){
- for( j = 0; j < HeadNode.KeyLen; j++ )
- fputc( *p++, log );
- fputc( '\n', log );
- }
-
- else {
- fprintf( log, "??????\n" /*, dbf->xbase->GetDouble( p )*/ );
- p += 8;
- }
- }
- fclose( log );
-}
-#endif
-/***********************************************************************/
-#ifndef XB_INLINE_GETDBFNO
-xbLong xbNdx::GetDbfNo( xbShort RecNo, xbNdxNodeLink * n )
-{
- xbNdxLeafNode *temp;
- char *p;
- if( !n ) return 0L;
- temp = &n->Leaf;
- if( RecNo < 0 || RecNo > ( temp->NoOfKeysThisNode - 1 )) return 0L;
- p = temp->KeyRecs + 4;
- p += RecNo * ( 8 + HeadNode.KeyLen );
- return( dbf->xbase->GetLong( p ));
-}
-#endif
-/***********************************************************************/
-//! Short description
-/*!
- \param RecNo
- \param n
-*/
-xbLong xbNdx::GetLeftNodeNo( xbShort RecNo, xbNdxNodeLink * n )
-{
- xbNdxLeafNode *temp;
- char *p;
- if( !n ) return 0L;
- temp = &n->Leaf;
- if( RecNo < 0 || RecNo > temp->NoOfKeysThisNode ) return 0L;
- p = temp->KeyRecs;
- p += RecNo * ( 8 + HeadNode.KeyLen );
- return( dbf->xbase->GetLong( p ));
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param RecNo
- \param n
-*/
-char * xbNdx::GetKeyData( xbShort RecNo, xbNdxNodeLink * n )
-{
- xbNdxLeafNode *temp;
- char *p;
- if( !n ) return 0L;
- temp = &n->Leaf;
- if( RecNo < 0 || RecNo > ( temp->NoOfKeysThisNode - 1 )) return 0L;
- p = temp->KeyRecs + 8;
- p += RecNo * ( 8 + HeadNode.KeyLen );
- return( p );
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbLong xbNdx::GetTotalNodes( void )
-{
- if( &HeadNode )
- return HeadNode.TotalNodes;
- else
- return 0L;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbUShort xbNdx::GetKeysPerNode( void )
-{
- if( &HeadNode )
- return HeadNode.KeysPerNode;
- else
- return 0L;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param RetrieveSw
-*/
-xbShort xbNdx::GetFirstKey( xbShort RetrieveSw )
-{
-/* This routine returns 0 on success and sets CurDbfRec to the record */
-/* corresponding to the first index pointer */
-
- xbLong TempNodeNo;
- xbShort rc;
-
- /* initialize the node chain */
- if( NodeChain ){
- ReleaseNodeMemory( NodeChain );
- NodeChain = NULL;
- }
-
- if(( rc = GetHeadNode()) != 0 ){
- CurDbfRec = 0L;
- return rc;
- }
-
- /* get a node and add it to the link */
- if(( rc = GetLeafNode( HeadNode.StartNode, 1 )) != 0 ){
- return rc;
- }
-
-/* traverse down the left side of the tree */
- while( GetLeftNodeNo( 0, CurNode )){
- TempNodeNo = GetLeftNodeNo( 0, CurNode );
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
- CurDbfRec = 0L;
- return rc;
- }
- CurNode->CurKeyNo = 0;
- }
- CurDbfRec = GetDbfNo( 0, CurNode );
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param RetrieveSw
-*/
-xbShort xbNdx::GetNextKey( xbShort RetrieveSw )
-{
-/* This routine returns 0 on success and sets CurDbfRec to the record */
-/* corresponding to the next index pointer */
-
- xbNdxNodeLink * TempxbNodeLink;
- xbLong TempNodeNo;
- xbShort rc;
-
- if( !IsOpen() ){
- CurDbfRec = 0L;
- return XB_NOT_OPEN;
- }
-
- if( !CurNode ){
- rc = GetFirstKey( RetrieveSw );
- return rc;
- }
-
- /* more keys on this node ? */
- if(( CurNode->Leaf.NoOfKeysThisNode-1) > CurNode->CurKeyNo ){
- CurNode->CurKeyNo++;
- CurDbfRec = GetDbfNo( CurNode->CurKeyNo, CurNode );
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
- }
-
- /* if head node we are at eof */
- if( CurNode->NodeNo == HeadNode.StartNode ) {
- return XB_EOF;
- }
-
- /* this logic assumes that interior nodes have n+1 left node no's where */
- /* n is the number of keys in the node */
-
- /* pop up one node to the interior node level & free the leaf node */
-
- TempxbNodeLink = CurNode;
- CurNode = CurNode->PrevNode;
- CurNode->NextNode = NULL;
- ReleaseNodeMemory( TempxbNodeLink );
-
- /* while no more right keys && not head node, pop up one node */
- while(( CurNode->CurKeyNo >= CurNode->Leaf.NoOfKeysThisNode ) &&
- ( CurNode->NodeNo != HeadNode.StartNode )){
- TempxbNodeLink = CurNode;
- CurNode = CurNode->PrevNode;
- CurNode->NextNode = NULL;
- ReleaseNodeMemory( TempxbNodeLink );
- }
-
- /* if head node && right most key, return end-of-file */
- if(( HeadNode.StartNode == CurNode->NodeNo ) &&
- ( CurNode->CurKeyNo >= CurNode->Leaf.NoOfKeysThisNode )) {
- return XB_EOF;
- }
-
- /* move one to the right */
- CurNode->CurKeyNo++;
- TempNodeNo = GetLeftNodeNo( CurNode->CurKeyNo, CurNode );
-
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
- return rc;
- }
-
-/* traverse down the left side of the tree */
- while( GetLeftNodeNo( 0, CurNode )){
- TempNodeNo = GetLeftNodeNo( 0, CurNode );
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
- CurDbfRec = 0L;
- return rc;
- }
- CurNode->CurKeyNo = 0;
- }
- CurDbfRec = GetDbfNo( 0, CurNode );
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param NodeNo
- \param RetrieveSw
-*/
-xbShort xbNdx::GetLastKey( xbLong NodeNo, xbShort RetrieveSw )
-{
-/* This routine returns 0 on success and sets CurDbfRec to the record */
-/* corresponding to the last index pointer */
-
-/* If NodeNo = 0, start at head node, otherwise start at NodeNo */
-
- xbLong TempNodeNo;
- xbShort rc;
-
- if( NodeNo < 0 || NodeNo > HeadNode.TotalNodes )
- return XB_INVALID_NODE_NO;
-
- /* initialize the node chain */
- if( NodeChain ){
- ReleaseNodeMemory( NodeChain );
- NodeChain = NULL;
- }
- if( NodeNo == 0L )
- if(( rc = GetHeadNode()) != 0 ){
- CurDbfRec = 0L;
- return rc;
- }
-
- /* get a node and add it to the link */
- if( NodeNo == 0L ){
- if(( rc = GetLeafNode( HeadNode.StartNode, 1 )) != 0 ){
- CurDbfRec = 0L;
- return rc;
- }
- } else {
- if(( rc = GetLeafNode( NodeNo, 1 )) != 0 ) {
- CurDbfRec = 0L;
- return rc;
- }
- }
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode;
-
-/* traverse down the right side of the tree */
- while( GetLeftNodeNo( CurNode->Leaf.NoOfKeysThisNode, CurNode )){
- TempNodeNo = GetLeftNodeNo( CurNode->Leaf.NoOfKeysThisNode, CurNode );
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
- CurDbfRec = 0L;
- return rc;
- }
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode;
- }
- CurNode->CurKeyNo--; /* leaf node has one fewer ix recs */
- CurDbfRec = GetDbfNo( CurNode->Leaf.NoOfKeysThisNode-1, CurNode );
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param RetrieveSw
-*/
-xbShort xbNdx::GetPrevKey( xbShort RetrieveSw )
-{
-/* This routine returns 0 on success and sets CurDbfRec to the record */
-/* corresponding to the previous index pointer */
-
- xbNdxNodeLink * TempxbNodeLink;
- xbLong TempNodeNo;
- xbShort rc;
-
- if( !IsOpen() ){
- CurDbfRec = 0L;
- return XB_NOT_OPEN;
- }
-
- if( !CurNode ){
- CurDbfRec = 0L;
- return GetFirstKey( RetrieveSw );
- }
-
- /* more keys on this node ? */
- if( CurNode->CurKeyNo > 0 ){
- CurNode->CurKeyNo--;
- CurDbfRec = GetDbfNo( CurNode->CurKeyNo, CurNode );
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
- }
-
- /* this logic assumes that interior nodes have n+1 left node no's where */
- /* n is the number of keys in the node */
- /* pop up one node to the interior node level & free the leaf node */
-
- if( !CurNode->PrevNode ) { /* michael - make sure prev node exists */
- return XB_EOF;
- }
-
- TempxbNodeLink = CurNode;
- CurNode = CurNode->PrevNode;
- CurNode->NextNode = NULL;
- ReleaseNodeMemory( TempxbNodeLink );
-
- /* while no more left keys && not head node, pop up one node */
- while(( CurNode->CurKeyNo == 0 ) &&
- ( CurNode->NodeNo != HeadNode.StartNode )) {
- TempxbNodeLink = CurNode;
- CurNode = CurNode->PrevNode;
- CurNode->NextNode = NULL;
- ReleaseNodeMemory( TempxbNodeLink );
- }
-
- /* if head node && left most key, return beginning-of-file */
- if(( HeadNode.StartNode == CurNode->NodeNo ) &&
- ( CurNode->CurKeyNo == 0 )) {
- return XB_BOF;
- }
-
- /* move one to the left */
- CurNode->CurKeyNo--;
- TempNodeNo = GetLeftNodeNo( CurNode->CurKeyNo, CurNode );
-
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ) {
- return rc;
- }
-
- if( GetLeftNodeNo( 0, CurNode )) /* if interior node */
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode;
- else /* leaf node */
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode - 1;
-
-/* traverse down the right side of the tree */
- while( GetLeftNodeNo( 0, CurNode )){ /* while interior node */
- TempNodeNo = GetLeftNodeNo( CurNode->Leaf.NoOfKeysThisNode, CurNode );
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
- CurDbfRec = 0L;
- return rc;
- }
- if( GetLeftNodeNo( 0, CurNode )) /* if interior node */
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode;
- else /* leaf node */
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode - 1;
- }
- CurDbfRec = GetDbfNo( CurNode->Leaf.NoOfKeysThisNode - 1, CurNode );
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
-}
-/**************************************************************************/
-//! Short description
-/*!
- \param key
- \param klen
- \param node
- \param comp
-*/
-/*
-** This is a pretty basic binary search with two exceptions: 1) it will
-** find the first of duplicate key values and 2) will return the index
-** and the value of the last comparision even if it doesn't find a
-** match.
-*/
-xbShort
-xbNdx::BSearchNode(const char *key, xbShort klen, const xbNdxNodeLink *node,
- xbShort *comp)
-{
- xbShort c, p, start = 0, end = node->Leaf.NoOfKeysThisNode - 1;
-
- if(start > end){
- *comp = 2;
- return 0;
- }
-
- do {
- p = (start + end) / 2;
- c = CompareKey(key, GetKeyData(p, (xbNdxNodeLink *)node), klen);
- switch(c){
-
- case 1 : /* greater than */
- start = p + 1;
- break;
-
- case 2 : /* less than */
- end = p - 1;
- break;
- }
- } while(start <= end && c);
-
-
- if(c == 1)
- while(p < node->Leaf.NoOfKeysThisNode &&
- (c = CompareKey(key, GetKeyData(p, (xbNdxNodeLink *)node), klen)) == 1)
- p++;
-
- *comp = c;
-
- if(!c)
- while(p > 0 && !CompareKey(key, GetKeyData(p - 1, (xbNdxNodeLink *)node), klen))
- p--;
-
- return p;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param Tkey
- \param Klen
-*/
-xbLong xbNdx::GetLeafFromInteriorNode( const char * Tkey, xbShort Klen )
-{
- /* This function scans an interior node for a key and returns the */
- /* correct interior leaf node no */
-
- xbShort p, c;
-
- /* if Tkey > any keys in node, return right most key */
- p = CurNode->Leaf.NoOfKeysThisNode - 1;
- if( CompareKey( Tkey, GetKeyData( p, CurNode ), Klen ) == 1 ) {
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode;
- return GetLeftNodeNo( CurNode->Leaf.NoOfKeysThisNode, CurNode );
- }
-
- p = BSearchNode(Tkey, Klen, CurNode, &c);
- CurNode->CurKeyNo = p;
- return GetLeftNodeNo( p, CurNode );
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param d
-*/
-xbShort xbNdx::KeyExists( xbDouble d )
-{
- char buf[9];
- memset( buf, 0x00, 9 );
- dbf->xbase->PutDouble( buf, d );
- return FindKey( buf, 8, 0 );
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param d
-*/
-xbShort xbNdx::FindKey( xbDouble d )
-{
- char buf[9];
- memset( buf, 0x00, 9 );
- dbf->xbase->PutDouble( buf, d );
- return FindKey( buf, 8, 1 );
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param Key
-*/
-xbShort xbNdx::FindKey( const char * Key )
-{
- return FindKey( Key, strlen( Key ), 1 );
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param Tkey
- \param DbfRec
-*/
-xbShort xbNdx::FindKey( const char * Tkey, xbLong DbfRec )
-{
- /* find a key with a specifc DBF record number */
- xbShort rc;
-
- xbLong CurDbfRecNo;
- xbLong CurNdxDbfNo;
-
- /* if we are already on the correct key, return XB_FOUND */
- if( CurNode ) {
- CurDbfRecNo = dbf->GetCurRecNo();
- CurNdxDbfNo = GetDbfNo( CurNode->CurKeyNo, CurNode );
- if( CurDbfRecNo == CurNdxDbfNo &&
- (strncmp(Tkey, GetKeyData( CurNode->CurKeyNo, CurNode ),
- HeadNode.KeyLen ) == 0 )) {
- return XB_FOUND;
- }
- }
- rc = FindKey( Tkey, HeadNode.KeyLen, 0 );
-
- while( rc == 0 || rc == XB_FOUND ) {
- if( strncmp( Tkey, GetKeyData( CurNode->CurKeyNo, CurNode ),
- HeadNode.KeyLen ) == 0 ){
- if( DbfRec == GetDbfNo( CurNode->CurKeyNo, CurNode )) {
- return XB_FOUND;
- }
- else
- rc = GetNextKey( 0 );
- } else {
- return XB_NOT_FOUND;
- }
- }
- return XB_NOT_FOUND;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbShort xbNdx::FindKey( void )
-{
- /* if no paramaters given, use KeyBuf */
- return( FindKey( KeyBuf, HeadNode.KeyLen, 0 ));
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param Tkey
- \param Klen
- \param RetrieveSw
-*/
-xbShort xbNdx::FindKey( const char * Tkey, xbShort Klen, xbShort RetrieveSw )
-{
- /* This routine sets the current key to the found key */
- /* if RetrieveSw is true, the method positions the dbf record */
- xbShort rc,i;
- xbLong TempNodeNo;
-
- if( NodeChain ) {
- ReleaseNodeMemory( NodeChain );
- NodeChain = NULL;
- }
-
- if(( rc = GetHeadNode()) != 0 ){
- CurDbfRec = 0L;
- return rc;
- }
-
- /* load first node */
- if(( rc = GetLeafNode( HeadNode.StartNode, 1 )) != 0 ){
- CurDbfRec = 0L;
- return rc;
- }
-
- /* traverse down the tree until it hits a leaf */
- while( GetLeftNodeNo( 0, CurNode )){ /* while interior node */
- TempNodeNo = GetLeafFromInteriorNode( Tkey, Klen );
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
- CurDbfRec = 0L;
- return rc;
- }
- }
-
- i = BSearchNode(Tkey, Klen, CurNode, &rc);
- switch(rc) {
- case 0 : /* found! */
- CurNode->CurKeyNo = i;
- CurDbfRec = GetDbfNo( i, CurNode );
- if( RetrieveSw )
- dbf->GetRecord(CurDbfRec);
- return XB_FOUND;
-
- case 1 : /* less than */
-// if(i < CurNode->Leaf.NoOfKeysThisNode)
- break;
-// i++;
-
- case 2 : /* greater than */
- CurNode->CurKeyNo = i;
- CurDbfRec = GetDbfNo( i, CurNode );
- if( RetrieveSw )
- dbf->GetRecord(CurDbfRec);
- return XB_NOT_FOUND;
- }
-
- CurNode->CurKeyNo = i;
- if(i >= CurNode->Leaf.NoOfKeysThisNode){
- CurDbfRec = 0;
- return XB_EOF;
- }
-
- CurDbfRec = GetDbfNo( i, CurNode );
- if((RetrieveSw) && (CurDbfRec > 0))
- dbf->GetRecord( CurDbfRec );
-
- return XB_NOT_FOUND;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbShort xbNdx::CalcKeyLen()
-{
- xbShort rc;
- xbExpNode * TempNode;
- char FieldName[11];
- char Type;
-
- TempNode = IxExp->GetFirstTreeNode();
-
- if( !TempNode )
- return 0;
-
- if( TempNode->Type == 'd' ) return -8;
- if( TempNode->Type == 'D' ){
- memset( FieldName, 0x00, 11 );
- memcpy( FieldName, TempNode->NodeText, TempNode->Len );
- Type = dbf->GetFieldType( dbf->GetFieldNo( FieldName ));
- if( Type == 'N' || Type == 'F' )
- return -8;
- }
-
- if(( rc = IxExp->ProcessExpression()) != XB_NO_ERROR )
- return 0;
-
- TempNode = (xbExpNode *) IxExp->Pop();
- if( !TempNode )
- return 0;
- rc = TempNode->DataLen;
-
- if( !TempNode->InTree )
- delete TempNode;
-
- return rc;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param IxName
- \param Exp
- \param Unique
- \param Overlay
-*/
-xbShort xbNdx::CreateIndex(const char * IxName, const char * Exp,
- xbShort Unique, xbShort Overlay )
-{
- xbShort i, KeyLen, rc;
-
- if( IsOpen()) CloseIndex();
- if( strlen( Exp ) > 488 )
- return XB_INVALID_KEY_EXPRESSION;
-
- if( dbf->GetDbfStatus() == 0 )
- return XB_NOT_OPEN;
-
- /* Get the index file name and store it in the class */
- SetFileName(IxName);
-
- /* check if the file already exists */
- if (((indexfp = fopen( GetFileName(), "r" )) != NULL ) && !Overlay ) {
- fclose( indexfp );
- return XB_FILE_EXISTS;
- }
-
- if (indexfp)
- fclose(indexfp);
-
- if(( indexfp = fopen( GetFileName(), "w+b" )) == NULL )
- return XB_OPEN_ERROR;
-
-#ifdef XB_LOCKING_ON
- /*
- ** Must turn off buffering when multiple programs may be accessing
- ** index files.
- */
- setbuf( indexfp, NULL );
-#endif
-
- /* parse the expression */
- IxExp = new xbExpn( dbf->xbase );
- if(( rc = IxExp->BuildExpressionTree( Exp, strlen( Exp ), dbf )) != XB_NO_ERROR )
- return rc;
-
- /* build the header record */
- memset( &HeadNode, 0x00, sizeof( xbNdxHeadNode ));
- HeadNode.StartNode = 1L;
- HeadNode.TotalNodes = 2L;
- HeadNode.NoOfKeys = 1L;
- KeyLen = CalcKeyLen();
-
- if( KeyLen == 0 || KeyLen > 100 ) /* 100 byte key length limit */
- return XB_INVALID_KEY;
- else if( KeyLen == -8 ){
- HeadNode.KeyType = 1; /* numeric key */
- HeadNode.KeyLen = 8;
- } else {
- HeadNode.KeyType = 0; /* character key */
- HeadNode.KeyLen = KeyLen;
- }
-
-// HeadNode.KeysPerNode = (xbUShort) ( XB_NDX_NODE_SIZE - (2*sizeof( xbLong ))) /
-// (HeadNode.KeyLen + 8 );
-// HeadNode.KeySize = HeadNode.KeyLen + 8;
-// while(( HeadNode.KeySize % 4 ) != 0 ) HeadNode.KeySize++; /* multiple of 4*/
-
-/* above code replaced with following by Paul Koufalis pkoufalis@cogicom.com */
-// while(( HeadNode.KeyLen % 4 ) != 0 ) HeadNode.KeyLen++; /* multiple of 4*/
-// HeadNode.KeySize = HeadNode.KeyLen + 8;
-
-
-/* above two lines commented out by gary 4/14/99 and replaced w/ following
- For compatibility with other Xbase tools
- KeyLen is the length of the key data
- KeySize = KeyLen+8, rounded up until divisible by 4
-*/
-
- HeadNode.KeySize = HeadNode.KeyLen + 8;
- while(( HeadNode.KeySize % 4 ) != 0 ) HeadNode.KeySize++; /* multiple of 4*/
-
- HeadNode.KeysPerNode = (xbUShort)
- (XB_NDX_NODE_SIZE - (2*sizeof( xbLong ))) / HeadNode.KeySize;
-
- HeadNode.Unique = Unique;
- strncpy( HeadNode.KeyExpression, Exp, 488 );
- KeyBuf = (char *) malloc( HeadNode.KeyLen + 1 );
- KeyBuf2 = (char *) malloc( HeadNode.KeyLen + 1 );
- memset( KeyBuf, 0x00, HeadNode.KeyLen + 1 );
- memset( KeyBuf2, 0x00, HeadNode.KeyLen + 1 );
-
- if(( rc = PutHeadNode( &HeadNode, indexfp, 0 )) != 0 ){
- return rc;
- }
- /* write node #1 all 0x00 */
- for( i = 0; i < XB_NDX_NODE_SIZE; i++ ){
- if ((fwrite("\x00", 1, 1, indexfp)) != 1){
- fclose( indexfp );
- return XB_WRITE_ERROR;
- }
- }
-// IndexStatus = XB_OPEN;
- return dbf->AddIndexToIxList( index, GetFileName() );
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param RecNo
- \param n
- \param NodeNo
-*/
-xbShort xbNdx::PutLeftNodeNo( xbShort RecNo, xbNdxNodeLink *n, xbLong NodeNo )
-{
- /* This routine sets n node's leftnode number */
- xbNdxLeafNode *temp;
- char *p;
- if( !n )
- return XB_INVALID_NODELINK;
-
- temp = &n->Leaf;
- if( RecNo < 0 || RecNo > HeadNode.KeysPerNode)
- return XB_INVALID_KEY;
-
- p = temp->KeyRecs;
- p+= RecNo * ( 8 + HeadNode.KeyLen );
- dbf->xbase->PutLong( p, NodeNo );
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param RecNo
- \param n
- \param DbfNo
-*/
-xbShort xbNdx::PutDbfNo( xbShort RecNo, xbNdxNodeLink *n, xbLong DbfNo )
-{
- /* This routine sets n node's dbf number */
- xbNdxLeafNode *temp;
- char *p;
- if( !n )
- return XB_INVALID_NODELINK;
-
- temp = &n->Leaf;
- if( RecNo < 0 || RecNo > (HeadNode.KeysPerNode-1))
- return XB_INVALID_KEY;
-
- p = temp->KeyRecs + 4;
- p+= RecNo * ( 8 + HeadNode.KeyLen );
- dbf->xbase->PutLong( p, DbfNo );
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param l
- \param n
-*/
-xbShort xbNdx::PutLeafNode( xbLong l, xbNdxNodeLink *n )
-{
- if ((_fseek(indexfp, (xbOffT)l * XB_NDX_NODE_SIZE , SEEK_SET)) != 0) {
- fclose( indexfp );
- return XB_SEEK_ERROR;
- }
- dbf->xbase->PutLong( Node, n->Leaf.NoOfKeysThisNode );
-
- if(( fwrite( Node, 4, 1, indexfp )) != 1 ){
- fclose( indexfp );
- return XB_WRITE_ERROR;
- }
- if(( fwrite( &n->Leaf.KeyRecs, XB_NDX_NODE_SIZE-4, 1, indexfp )) != 1 ){
- fclose( indexfp );
- return XB_WRITE_ERROR;
- }
- return 0;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param Head
- \param f
- \param UpdateOnly
-*/
-xbShort xbNdx::PutHeadNode( xbNdxHeadNode * Head, FILE * f, xbShort UpdateOnly )
-{
- char buf[4];
-
- if(( _fseek( f, 0L, SEEK_SET )) != 0 ){
- fclose( f );
- return XB_SEEK_ERROR;
- }
- memset( buf, 0x00, 4 );
- dbf->xbase->PutLong( buf, Head->StartNode );
- if(( fwrite( &buf, 4, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
- memset( buf, 0x00, 4 );
- dbf->xbase->PutLong( buf, Head->TotalNodes );
- if(( fwrite( &buf, 4, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
- memset( buf, 0x00, 4 );
- dbf->xbase->PutLong( buf, Head->NoOfKeys );
- if(( fwrite( &buf, 4, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
- if( UpdateOnly )
- return XB_NO_ERROR;
- memset( buf, 0x00, 2 );
- dbf->xbase->PutLong( buf, Head->KeyLen );
- if(( fwrite( &buf, 2, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
- memset( buf, 0x00, 2 );
- dbf->xbase->PutLong( buf, Head->KeysPerNode );
- if(( fwrite( &buf, 2, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
- memset( buf, 0x00, 2 );
- dbf->xbase->PutLong( buf, Head->KeyType );
- if(( fwrite( &buf, 2, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
- memset( buf, 0x00, 4 );
- dbf->xbase->PutLong( buf, Head->KeySize );
- if(( fwrite( &buf, 4, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
- if(( fwrite( &Head->Unknown2, XB_NDX_NODE_SIZE - 22, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
- return 0;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param RecNo
- \param n
-*/
-xbShort xbNdx::PutKeyData( xbShort RecNo, xbNdxNodeLink *n )
-{
- /* This routine copies the KeyBuf data into xbNdxNodeLink n */
- xbNdxLeafNode *temp;
- char *p;
- xbShort i;
- if( !n )
- return XB_INVALID_NODELINK;
-
- temp = &n->Leaf;
- if( RecNo < 0 || RecNo > (HeadNode.KeysPerNode-1))
- return XB_INVALID_KEY;
-
- p = temp->KeyRecs + 8;
- p+= RecNo * ( 8 + HeadNode.KeyLen );
- for( i = 0; i < HeadNode.KeyLen; i++ ) {
- *p = KeyBuf[i];
- p++;
- }
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param n
- \param pos
- \param d
- \param l
- \param w
-*/
-xbShort xbNdx::PutKeyInNode( xbNdxNodeLink * n, xbShort pos, xbLong d,
- xbLong l, xbShort w )
-{
- xbShort i;
-
- /* check the node */
- if (!n)
- return XB_INVALID_NODELINK;
-
- if(pos < 0 || pos > HeadNode.KeysPerNode)
- return XB_INVALID_RECORD;
-
- if(n->Leaf.NoOfKeysThisNode >= HeadNode.KeysPerNode)
- return XB_NODE_FULL;
-
- /* if key movement, save the original key */
- if( pos < n->Leaf.NoOfKeysThisNode )
- memcpy( KeyBuf2, KeyBuf, HeadNode.KeyLen + 1);
-
- /* if interior node, handle the right most left node no */
- if( GetLeftNodeNo( 0, n ))
- PutLeftNodeNo( n->Leaf.NoOfKeysThisNode+1, n,
- GetLeftNodeNo( n->Leaf.NoOfKeysThisNode, n ));
-
- for( i = n->Leaf.NoOfKeysThisNode; i > pos; i-- ){
- memcpy( KeyBuf, GetKeyData(i-1,n), HeadNode.KeyLen );
- PutKeyData( i, n );
- PutDbfNo( i, n, GetDbfNo(i-1,n));
- PutLeftNodeNo(i, n, GetLeftNodeNo(i-1,n));
- }
-
- /* put new key in node */
- if( pos < n->Leaf.NoOfKeysThisNode )
- memcpy( KeyBuf, KeyBuf2, HeadNode.KeyLen + 1);
-
- PutKeyData( pos, n );
- PutDbfNo( pos, n, d );
- PutLeftNodeNo( pos, n, l );
- n->Leaf.NoOfKeysThisNode++;
- if( w )
- return PutLeafNode( n->NodeNo, n );
- else
- return 0;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param curNode Current Node
- \param newNode New Empty Node
- \param pos Position of new key in current node
- \param d dbf record number
-*/
-/* This function splits a full index leaf node into two parts
- as of 2/13/04, this split logic was modified to cause an
- even split in order to keep the index tree balanced
-
-*/
-
-xbShort xbNdx::SplitLeafNode( xbNdxNodeLink *curNode,
- xbNdxNodeLink *newNode, xbShort pos, xbLong d )
-{
- xbShort curNodeNewSize;
- xbShort newNodeSize;
- xbShort i,j,rc,startPos;
-
- curNodeNewSize = (curNode->Leaf.NoOfKeysThisNode + 1) / 2;
- newNodeSize = curNode->Leaf.NoOfKeysThisNode + 1 - curNodeNewSize;
-
- /* save off the current key buffer */
- memcpy( KeyBuf2, KeyBuf, HeadNode.KeyLen + 1 );
- if( pos < curNodeNewSize ){ /* new key goes in current node */
-
- /* copy second half of current node to beginning of new node */
- /* memcpy( dst, src, len ); */
- startPos = curNode->Leaf.NoOfKeysThisNode - newNodeSize;
-
- for( i = startPos, j = 0; i < CurNode->Leaf.NoOfKeysThisNode; i++, j++){
- memcpy( KeyBuf, GetKeyData( i, curNode ), HeadNode.KeyLen );
- PutKeyData( j, newNode );
- PutDbfNo( j, newNode, GetDbfNo( i, curNode ));
- }
-
- /* make a hole for the new key */
- for( i = curNodeNewSize - 1; i > pos; i-- ){
- memcpy( KeyBuf, GetKeyData( i-1, curNode ), HeadNode.KeyLen );
- PutKeyData( i, curNode );
- PutDbfNo( i, curNode, GetDbfNo( i-1, curNode ));
- }
-
- /* insert key appropriately */
- memcpy( KeyBuf, KeyBuf2, HeadNode.KeyLen + 1 );
- PutKeyData( pos, curNode );
- PutDbfNo( pos, curNode, d );
- }
- else
- {
- pos -= curNodeNewSize;
-
- /* do part one of the key migration */
- if( pos ){
-
-/* was originally
-
- startPos = curNode->Leaf.NoOfKeysThisNode - curNodeNewSize + 1;
-
-
- then was changed to
-*/
-
-/*
- if( ((pos + curNodeNewSize) == HeadNode.KeysPerNode) &&
- (pos == newNodeSize) ){ // off the right end
- startPos = curNode->Leaf.NoOfKeysThisNode - curNodeNewSize;
- }
- else
- {
- startPos = curNode->Leaf.NoOfKeysThisNode - curNodeNewSize + 1;
- }
-
-*/
-
-/*
- and this didn't work
-
-
- startPos = curNode->Leaf.NoOfKeysThisNode - curNodeNewSize;
-
-*/
-
- startPos = curNodeNewSize;
- for( i = startPos, j = 0;
- j < pos && i < curNode->Leaf.NoOfKeysThisNode; i++, j++){
- memcpy( KeyBuf, GetKeyData( i, curNode ), HeadNode.KeyLen );
- PutKeyData( j, newNode );
- PutDbfNo( j, newNode, GetDbfNo( i, curNode ));
- }
- }
-
- /* insert new key appropriately */
- memcpy( KeyBuf, KeyBuf2, HeadNode.KeyLen + 1 );
- PutKeyData( pos, newNode );
- PutDbfNo( pos, newNode, d );
-
- /* Load the remainder of the keys on the new node past the new key */
- if( pos < (newNodeSize-1) ){
-
-// startPos = curNode->Leaf.NoOfKeysThisNode - curNodeNewSize + pos + 1;
-
- startPos = curNodeNewSize + pos;
- for( i = startPos, j = pos+1; j < newNodeSize; i++, j++){
- memcpy( KeyBuf, GetKeyData( i, curNode ), HeadNode.KeyLen );
- PutKeyData( j, newNode );
- PutDbfNo( j, newNode, GetDbfNo( i, curNode ));
- }
- }
- }
-
- curNode->Leaf.NoOfKeysThisNode = curNodeNewSize;
- newNode->Leaf.NoOfKeysThisNode = newNodeSize;
-
- /* write the new nodes to disk */
- if(( rc = PutLeafNode( curNode->NodeNo, curNode )) != 0 )
- return rc;
- if(( rc = PutLeafNode( newNode->NodeNo, newNode )) != 0 )
- return rc;
-
- return 0;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param nodeToSplit Interior node to split
- \param newNode New empty node to use
- \param dscNodeNo Descendant node number
-*/
-/* This routine splits an interior node */
-
-xbShort xbNdx::SplitINode( xbNdxNodeLink *nodeToSplit,
- xbNdxNodeLink *newNode, xbLong dscNodeNo )
-{
- xbShort i,j,rc;
- xbNdxNodeLink * SaveNodeChain;
- xbNdxNodeLink * SaveCurNode;
- xbLong newNodeToSplitSize;
- xbLong newNodeSize;
- xbShort pos, startPos, offset;
-
- newNodeToSplitSize = (nodeToSplit->Leaf.NoOfKeysThisNode + 2 ) / 2;
- newNodeSize = nodeToSplit->Leaf.NoOfKeysThisNode + 2 - newNodeToSplitSize;
- pos = nodeToSplit->CurKeyNo;
-
- if( pos < (newNodeToSplitSize-1) ){
- /* copy second half of nodeToSplit to newNode */
- startPos = nodeToSplit->Leaf.NoOfKeysThisNode - newNodeSize +1;
- for(i=startPos, j=0; i <= nodeToSplit->Leaf.NoOfKeysThisNode; i++, j++ ){
- if( i < nodeToSplit->Leaf.NoOfKeysThisNode ){
- memcpy( KeyBuf, GetKeyData( i, nodeToSplit ), HeadNode.KeyLen );
- PutKeyData( j, newNode );
- }
- PutLeftNodeNo( j, newNode, GetLeftNodeNo( i, nodeToSplit ));
- }
-
- /* make a hole for the new key */
- for( i = newNodeToSplitSize; i > pos; i-- ){
- memcpy( KeyBuf, GetKeyData( i-1, nodeToSplit ), HeadNode.KeyLen );
- PutKeyData( i, nodeToSplit );
- PutLeftNodeNo( i, nodeToSplit, GetLeftNodeNo( i-1, nodeToSplit ));
- }
-
- /* load new high key value into current position on nodeToSplit */
- if( pos < (newNodeToSplitSize - 1 )){
- SaveNodeChain = NodeChain;
- NodeChain = NULL;
- SaveCurNode = CurNode;
- GetLastKey( GetLeftNodeNo( pos, nodeToSplit ), 0 );
- memcpy( KeyBuf, GetKeyData( CurNode->CurKeyNo, CurNode ), HeadNode.KeyLen );
- PutKeyData( pos, nodeToSplit );
- ReleaseNodeMemory( NodeChain );
- NodeChain = SaveNodeChain;
- CurNode = SaveCurNode;
- }
- PutLeftNodeNo( pos+1, nodeToSplit, dscNodeNo );
- }
-
-/*************/
-/* part b */
-/*************/
-
- else
- {
- pos -= newNodeToSplitSize-1;
- /* do part one of the key migration */
- if( pos ){
-// startPos = nodeToSplit->Leaf.NoOfKeysThisNode - newNodeToSplitSize + 2;
-
-// 5/29/04 gak changed the following line for index probs
-// startPos = nodeToSplit->Leaf.NoOfKeysThisNode - newNodeToSplitSize + 1;
-
- if( HeadNode.KeysPerNode % 2 )
- offset = 2;
- else
- offset = 1;
-
- startPos = nodeToSplit->Leaf.NoOfKeysThisNode - newNodeToSplitSize + offset;
-
- for( i = startPos, j = 0; j < pos; i++, j++ ){
- if( i < nodeToSplit->Leaf.NoOfKeysThisNode && j < (pos-1)){
- memcpy( KeyBuf, GetKeyData( i, nodeToSplit ), HeadNode.KeyLen );
- PutKeyData( j, newNode );
- }
- else
- {
- SaveNodeChain = NodeChain;
- NodeChain = NULL;
- SaveCurNode = CurNode;
- GetLastKey( GetLeftNodeNo( i, nodeToSplit ), 0 );
- memcpy(KeyBuf,GetKeyData(CurNode->CurKeyNo,CurNode),HeadNode.KeyLen);
- PutKeyData( j, newNode );
- ReleaseNodeMemory( NodeChain );
- NodeChain = SaveNodeChain;
- CurNode = SaveCurNode;
- }
- PutLeftNodeNo( j, newNode, GetLeftNodeNo( i, nodeToSplit ));
- }
- }
-
- /* insert new key appropriately */
- if( pos < (newNodeSize - 1)){
- SaveNodeChain = NodeChain;
- NodeChain = NULL;
- SaveCurNode = CurNode;
- GetLastKey( dscNodeNo, 0 );
- memcpy(KeyBuf,GetKeyData(CurNode->CurKeyNo,CurNode),HeadNode.KeyLen);
- PutKeyData( pos, newNode );
- ReleaseNodeMemory( NodeChain );
- NodeChain = SaveNodeChain;
- CurNode = SaveCurNode;
- }
- PutLeftNodeNo( pos, newNode, dscNodeNo );
-
- /* load remainder of the keys */
- if( pos < (newNodeSize - 1)){
-
-
-// startPos=nodeToSplit->Leaf.NoOfKeysThisNode-newNodeToSplitSize+pos+2;
-// 5/29/04 gak changed the following line for index probs
-
- startPos=nodeToSplit->Leaf.NoOfKeysThisNode-newNodeToSplitSize+pos+offset;
-
- for( i = startPos, j = pos+1; j < newNodeSize; i++, j++ ){
- if( i < nodeToSplit->Leaf.NoOfKeysThisNode ){
- memcpy( KeyBuf, GetKeyData( i, nodeToSplit ), HeadNode.KeyLen );
- PutKeyData( j, newNode );
- }
- PutLeftNodeNo( j, newNode, GetLeftNodeNo( i, nodeToSplit ));
- }
- }
- }
-
- nodeToSplit->Leaf.NoOfKeysThisNode = newNodeToSplitSize - 1;
- newNode->Leaf.NoOfKeysThisNode = newNodeSize - 1;
-
- if((rc = PutLeafNode( nodeToSplit->NodeNo, nodeToSplit )) != 0) return rc;
- if((rc = PutLeafNode( newNode->NodeNo, newNode )) != 0) return rc;
- return 0;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param RecBufSw
- \param KeyBufSw
-*/
-xbShort xbNdx::CreateKey( xbShort RecBufSw, xbShort KeyBufSw )
-{
- /* RecBufSw 0 Use RecBuf */
- /* 1 Use RecBuf2 */
- /* KeyBufSw 0 Use KeyBuf */
- /* 1 Use KeyBuf2 */
-
- xbShort rc;
- xbExpNode * TempNode;
-
- if(( rc = IxExp->ProcessExpression( RecBufSw )) != XB_NO_ERROR )
- return rc;
- TempNode = (xbExpNode *) IxExp->Pop();
- if( !TempNode )
- return XB_INVALID_KEY;
-
- if( KeyBufSw ){
- if( HeadNode.KeyType == 1 ) /* numeric key */
- dbf->xbase->PutDouble( KeyBuf2, TempNode->DoubResult );
- else{ /* character key */
- memset( KeyBuf2, 0x00, HeadNode.KeyLen + 1 );
- memcpy( KeyBuf2, TempNode->StringResult, XB_MIN(HeadNode.KeyLen + 1, TempNode->DataLen) );
- }
- } else {
- if( HeadNode.KeyType == 1 ) /* numeric key */
- dbf->xbase->PutDouble( KeyBuf, TempNode->DoubResult );
- else { /* character key */
- memset( KeyBuf, 0x00, HeadNode.KeyLen + 1 );
- memcpy( KeyBuf, TempNode->StringResult.c_str(), XB_MIN(HeadNode.KeyLen + 1, TempNode->DataLen) );
- }
- }
-// if( !TempNode->InTree ) dbf->xbase->FreeExpNode( TempNode );
- if( !TempNode->InTree ) delete TempNode;
- return 0;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param key
-*/
-xbShort
-xbNdx::GetCurrentKey(char *key)
-{
- CreateKey(0, 0);
- if(HeadNode.KeyType == 1)
- memcpy(key, KeyBuf, 8);
- else
- memcpy(key, KeyBuf, HeadNode.KeyLen + 1);
- return 0;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param DbfRec
-*/
-xbShort xbNdx::AddKey( xbLong DbfRec )
-{
- /* This routine assumes KeyBuf contains the contents of the index to key */
-
- char *p;
- xbShort i,rc;
- xbNdxNodeLink * TempNode;
- xbNdxNodeLink * Tparent;
- xbLong TempNodeNo; /* new, unattached leaf node no */
- xbNdxNodeLink * SaveNodeChain;
- xbNdxNodeLink * SaveCurNode;
-
- /* find node key belongs in */
- rc = FindKey( KeyBuf, HeadNode.KeyLen, 0 );
- if( rc == XB_FOUND && HeadNode.Unique )
- return XB_KEY_NOT_UNIQUE;
-
- if( CurNode->Leaf.NoOfKeysThisNode > 0 && rc == XB_FOUND ){
- rc = 0;
- while( rc == 0 ){
- if(( p = GetKeyData( CurNode->CurKeyNo, CurNode )) == NULL )
- rc = -1;
- else {
- rc = CompareKey( KeyBuf, p, HeadNode.KeyLen );
- if( rc == 0 && DbfRec >= GetDbfNo( CurNode->CurKeyNo, CurNode )){
- if((rc = GetNextKey(0)) == XB_EOF) {
- if((rc = GetLastKey(0, 0)) != XB_NO_ERROR)
- return rc;
- CurNode->CurKeyNo++;
- }
- }
- else
- rc = -1;
- }
- }
- }
-
- /* update header node */
- HeadNode.NoOfKeys++;
- /************************************************/
- /* section A - if room in node, add key to node */
- /************************************************/
-
- if( CurNode->Leaf.NoOfKeysThisNode < HeadNode.KeysPerNode ){
- if(( rc = PutKeyInNode( CurNode,CurNode->CurKeyNo,DbfRec,0L,1)) != 0)
- return rc;
- if(( rc = PutHeadNode( &HeadNode, indexfp, 1 )) != 0)
- return rc;
- return XB_NO_ERROR;
- }
-
- /***********************************************************************/
- /* section B - split leaf node if full and put key in correct position */
- /***********************************************************************/
-
- TempNode = GetNodeMemory();
- TempNode->NodeNo = HeadNode.TotalNodes++;
- rc = SplitLeafNode( CurNode, TempNode, CurNode->CurKeyNo, DbfRec );
- if( rc )
- return rc;
-
- TempNodeNo = TempNode->NodeNo;
- ReleaseNodeMemory( TempNode );
-
- /*****************************************************/
- /* section C go up tree splitting nodes as necessary */
- /*****************************************************/
- Tparent = CurNode->PrevNode;
-
- while( Tparent &&
- Tparent->Leaf.NoOfKeysThisNode >= HeadNode.KeysPerNode-1) {
-
- TempNode = GetNodeMemory();
-
- if( !TempNode )
- return XB_NO_MEMORY;
- TempNode->NodeNo = HeadNode.TotalNodes++;
-
- rc = SplitINode( Tparent, TempNode, TempNodeNo );
- if( rc ) return rc;
-
- TempNodeNo = TempNode->NodeNo;
- ReleaseNodeMemory( TempNode );
- ReleaseNodeMemory( CurNode );
- CurNode = Tparent;
- CurNode->NextNode = NULL;
- Tparent = CurNode->PrevNode;
- }
-
- /************************************************************/
- /* Section D if CurNode is split root, create new root */
- /************************************************************/
-
- /* at this point
- CurNode = The node that was just split
- TempNodeNo = The new node split off from CurNode */
-
- if(CurNode->NodeNo == HeadNode.StartNode ){
- TempNode = GetNodeMemory();
- if( !TempNode )
- return XB_NO_MEMORY;
-
- SaveNodeChain = NodeChain;
- NodeChain = NULL;
- SaveCurNode = CurNode;
- GetLastKey( CurNode->NodeNo, 0 );
- memcpy( KeyBuf, GetKeyData( CurNode->CurKeyNo,CurNode ),HeadNode.KeyLen );
- ReleaseNodeMemory( NodeChain );
- NodeChain = SaveNodeChain;
- CurNode = SaveCurNode;
- PutKeyData( 0, TempNode );
- PutLeftNodeNo( 0, TempNode, CurNode->NodeNo );
- PutLeftNodeNo( 1, TempNode, TempNodeNo );
- TempNode->NodeNo = HeadNode.TotalNodes++;
- TempNode->Leaf.NoOfKeysThisNode++;
- HeadNode.StartNode = TempNode->NodeNo;
- rc = PutLeafNode( TempNode->NodeNo, TempNode );
- if( rc ) return rc;
- rc = PutHeadNode( &HeadNode, indexfp, 1 );
- if( rc ) return rc;
- ReleaseNodeMemory( TempNode );
- return XB_NO_ERROR;
- }
- /**********************************/
- /* Section E make room in parent */
- /**********************************/
- for( i = Tparent->Leaf.NoOfKeysThisNode; i > Tparent->CurKeyNo; i-- ){
- memcpy( KeyBuf, GetKeyData( i-1, Tparent ), HeadNode.KeyLen );
- PutKeyData( i, Tparent );
- PutLeftNodeNo( i+1, Tparent, GetLeftNodeNo( i, Tparent ));
- }
-
- /* put key in parent */
- SaveNodeChain = NodeChain;
- NodeChain = NULL;
- SaveCurNode = CurNode;
- GetLastKey( CurNode->NodeNo, 0 );
- memcpy( KeyBuf,GetKeyData( CurNode->CurKeyNo, CurNode ), HeadNode.KeyLen );
- ReleaseNodeMemory( NodeChain );
- NodeChain = SaveNodeChain;
- CurNode = SaveCurNode;
- PutKeyData( i, Tparent );
- PutLeftNodeNo( i+1, Tparent, TempNodeNo );
- Tparent->Leaf.NoOfKeysThisNode++;
- rc = PutLeafNode( Tparent->NodeNo, Tparent );
- if( rc ) return rc;
- rc = PutHeadNode( &HeadNode, indexfp, 1 );
- if( rc ) return rc;
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param pos
- \param n
-*/
-xbShort xbNdx::RemoveKeyFromNode( xbShort pos, xbNdxNodeLink *n )
-{
- xbShort i;
- /* check the node */
- if( !n )
- return XB_INVALID_NODELINK;
-
- if( pos < 0 || pos > HeadNode.KeysPerNode )
- return XB_INVALID_KEY;
-
- for( i = pos; i < n->Leaf.NoOfKeysThisNode-1; i++ ){
- memcpy( KeyBuf, GetKeyData( i+1, n), HeadNode.KeyLen );
- PutKeyData( i, n );
- PutDbfNo( i, n, GetDbfNo( i+1, n ));
- PutLeftNodeNo( i, n, GetLeftNodeNo( i+1, n ));
- }
- PutLeftNodeNo( i, n, GetLeftNodeNo( i+1, n ));
- n->Leaf.NoOfKeysThisNode--;
- /* if last key was deleted, decrement CurKeyNo */
- if( n->CurKeyNo > n->Leaf.NoOfKeysThisNode )
- n->CurKeyNo--;
- return PutLeafNode( n->NodeNo, n );
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param n
-*/
-xbShort xbNdx::UpdateParentKey( xbNdxNodeLink * n )
-{
-/* this routine goes backwards thru the node chain looking for a parent
- node to update */
-
- xbNdxNodeLink * TempNode;
- if( !n )
- return XB_INVALID_NODELINK;
-
- if( !GetDbfNo( 0, n ))
- return XB_NOT_LEAFNODE;
-
- TempNode = n->PrevNode;
- while( TempNode ){
- if( TempNode->CurKeyNo < TempNode->Leaf.NoOfKeysThisNode ){
- memcpy(KeyBuf,GetKeyData(n->Leaf.NoOfKeysThisNode-1,n),HeadNode.KeyLen);
- PutKeyData( TempNode->CurKeyNo, TempNode );
- return PutLeafNode( TempNode->NodeNo, TempNode );
- }
- TempNode = TempNode->PrevNode;
- }
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param n
-*/
-/* This routine queues up a list of nodes which have been emptied */
-void xbNdx::UpdateDeleteList( xbNdxNodeLink *n )
-{
- n->NextNode = DeleteChain;
- DeleteChain = n;
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-/* Delete nodes from the node list - for now we leave the empty nodes */
-/* dangling in the file. Eventually we will remove nodes from the file */
-
-void xbNdx::ProcessDeleteList( void )
-{
- if( DeleteChain ){
- ReleaseNodeMemory( DeleteChain );
- DeleteChain = NULL;
- }
-}
-/***********************************************************************/
-//! Short description
-/*!
-*/
-xbShort xbNdx::KeyWasChanged( void )
-{
- CreateKey( 0, 0 ); /* use KeyBuf, RecBuf */
- CreateKey( 1, 1 ); /* use KeyBuf2, RecBuf2 */
- if( CompareKey( KeyBuf, KeyBuf2, HeadNode.KeyLen ) != 0 )
- return 1;
- else
- return 0;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param n
-*/
-xbNdxNodeLink * xbNdx::LeftSiblingHasSpace( xbNdxNodeLink * n )
-{
- xbNdxNodeLink * TempNode;
- xbNdxNodeLink * SaveCurNode;
-
- /* returns a Nodelink to xbNdxNodeLink n's left sibling if it has space */
- /* if left most node in parent return NULL */
- if( n->PrevNode->CurKeyNo == 0 )
- return NULL;
-
- SaveCurNode = CurNode;
- GetLeafNode( GetLeftNodeNo( n->PrevNode->CurKeyNo-1, n->PrevNode ), 2 );
- if( CurNode->Leaf.NoOfKeysThisNode < HeadNode.KeysPerNode ){
- TempNode = CurNode;
- CurNode = SaveCurNode;
- TempNode->PrevNode = n->PrevNode;
- return TempNode;
- } else { /* node is already full */
- ReleaseNodeMemory( CurNode );
- CurNode = SaveCurNode;
- return NULL;
- }
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param n
-*/
-xbNdxNodeLink * xbNdx::RightSiblingHasSpace( xbNdxNodeLink * n )
-{
- /* returns a Nodelink to xbNdxNodeLink n's right sibling if it has space */
-
- xbNdxNodeLink * TempNode;
- xbNdxNodeLink * SaveCurNode;
-
- /* if left most node in parent return NULL */
- if( n->PrevNode->CurKeyNo >= n->PrevNode->Leaf.NoOfKeysThisNode )
- return NULL;
- SaveCurNode = CurNode;
- /* point curnode to right sib*/
- GetLeafNode( GetLeftNodeNo( n->PrevNode->CurKeyNo+1, n->PrevNode ), 2 );
- if( CurNode->Leaf.NoOfKeysThisNode < HeadNode.KeysPerNode ){
- TempNode = CurNode;
- CurNode = SaveCurNode;
- TempNode->PrevNode = n->PrevNode;
- return TempNode;
- } else { /* node is already full */
- ReleaseNodeMemory( CurNode );
- CurNode = SaveCurNode;
- return NULL;
- }
-}
-/*************************************************************************/
-//! Short description
-/*!
- \param n
- \param Right
-*/
-xbShort xbNdx::MoveToRightNode( xbNdxNodeLink * n, xbNdxNodeLink * Right )
-{
- xbShort j;
- xbNdxNodeLink * TempNode;
- xbNdxNodeLink * SaveCurNode;
- xbNdxNodeLink * SaveNodeChain;
-
- if( n->CurKeyNo == 0 ){
- j = 1;
- SaveNodeChain = NodeChain;
- SaveCurNode = CurNode;
- NodeChain = NULL;
- GetLastKey( n->NodeNo, 0 );
- memcpy( KeyBuf, GetKeyData( CurNode->CurKeyNo, CurNode),HeadNode.KeyLen);
- ReleaseNodeMemory( NodeChain );
- NodeChain = SaveNodeChain;
- CurNode = SaveCurNode;
- } else {
- j = 0;
- memcpy( KeyBuf, GetKeyData( j, n ), HeadNode.KeyLen);
- }
- PutKeyInNode( Right, 0, 0L, GetLeftNodeNo( j, n ), 1 );
- ReleaseNodeMemory( Right );
- TempNode = n;
- CurNode = n->PrevNode;
- n = n->PrevNode;
- n->NextNode = NULL;
- UpdateDeleteList( TempNode );
- DeleteSibling( n );
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param n
- \param Left
-*/
-xbShort xbNdx::MoveToLeftNode( xbNdxNodeLink * n, xbNdxNodeLink * Left )
-{
- xbShort j, rc;
- xbNdxNodeLink * SaveNodeChain;
- xbNdxNodeLink * TempNode;
-
- if( n->CurKeyNo == 0 )
- j = 1;
- else
- j = 0;
-
- /* save the original node chain */
- SaveNodeChain = NodeChain;
- NodeChain = NULL;
-
- /* determine new right most key for left node */
- GetLastKey( Left->NodeNo, 0 );
- memcpy( KeyBuf, GetKeyData( CurNode->CurKeyNo, CurNode ), HeadNode.KeyLen);
- ReleaseNodeMemory( NodeChain );
- NodeChain = NULL; /* for next GetLastKey */
- PutKeyData( Left->Leaf.NoOfKeysThisNode, Left);
- PutLeftNodeNo( Left->Leaf.NoOfKeysThisNode+1, Left, GetLeftNodeNo( j,n ));
- Left->Leaf.NoOfKeysThisNode++;
- Left->CurKeyNo = Left->Leaf.NoOfKeysThisNode;
- if(( rc = PutLeafNode( Left->NodeNo, Left )) != 0 )
- return rc;
- n->PrevNode->NextNode = NULL;
- UpdateDeleteList( n );
-
- /* get the new right most key for left to update parents */
- GetLastKey( Left->NodeNo, 0 );
-
- /* assemble the chain */
- TempNode = Left->PrevNode;
- TempNode->CurKeyNo--;
- NodeChain->PrevNode = Left->PrevNode;
- UpdateParentKey( CurNode );
- ReleaseNodeMemory( NodeChain );
- ReleaseNodeMemory( Left );
- CurNode = TempNode;
- NodeChain = SaveNodeChain;
- TempNode->CurKeyNo++;
- DeleteSibling( TempNode );
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param n
-*/
-xbShort xbNdx::DeleteSibling( xbNdxNodeLink * n )
-{
- xbNdxNodeLink * Left;
- xbNdxNodeLink * Right;
- xbNdxNodeLink * SaveCurNode;
- xbNdxNodeLink * SaveNodeChain;
- xbNdxNodeLink * TempNode;
- xbShort rc;
-
- /* this routine deletes sibling CurRecNo out of xbNodeLink n */
- if( n->Leaf.NoOfKeysThisNode > 1 ){
- RemoveKeyFromNode( n->CurKeyNo, n );
- if( n->CurKeyNo == n->Leaf.NoOfKeysThisNode ){
- SaveNodeChain = NodeChain;
- SaveCurNode = CurNode;
- NodeChain = NULL;
- GetLastKey( n->NodeNo, 0 );
- /* assemble the node chain */
- TempNode = NodeChain->NextNode;
- NodeChain->NextNode = NULL;
- ReleaseNodeMemory( NodeChain );
- TempNode->PrevNode = n;
- UpdateParentKey( CurNode );
- /* take it back apart */
- ReleaseNodeMemory( TempNode );
- NodeChain = SaveNodeChain;
- CurNode = SaveCurNode;
- }
- } else if( n->NodeNo == HeadNode.StartNode ) {
- /* get here if root node and only one child remains */
- /* make remaining node the new root */
- if( n->CurKeyNo == 0 )
- HeadNode.StartNode = GetLeftNodeNo( 1, n );
- else
- HeadNode.StartNode = GetLeftNodeNo( 0, n );
- UpdateDeleteList( n );
- NodeChain = NULL;
- CurNode = NULL;
- }
- else if (( Left = LeftSiblingHasSpace( n )) != NULL )
- return MoveToLeftNode( n, Left );
- else if (( Right = RightSiblingHasSpace( n )) != NULL )
- return MoveToRightNode( n, Right );
- /* else if left sibling exists */
- else if( n->PrevNode->CurKeyNo > 0 ) {
- /* move right branch from left sibling to this node */
- SaveCurNode = CurNode;
- SaveNodeChain = NodeChain;
- NodeChain = NULL;
- GetLeafNode( GetLeftNodeNo( n->PrevNode->CurKeyNo-1, n->PrevNode ), 2 );
- Left = CurNode;
- Left->PrevNode = SaveCurNode->PrevNode;
- GetLastKey( Left->NodeNo, 0 );
- strncpy( KeyBuf, GetKeyData( CurNode->CurKeyNo,CurNode),HeadNode.KeyLen );
- if( n->CurKeyNo == 1 )
- PutLeftNodeNo( 1, n, GetLeftNodeNo( 0, n ));
- PutKeyData( 0, n );
- PutLeftNodeNo( 0, n, GetLeftNodeNo( Left->Leaf.NoOfKeysThisNode, Left ));
- if(( rc = PutLeafNode( n->NodeNo, n )) != XB_NO_ERROR ) return rc;
- SaveCurNode = n->PrevNode;
- SaveCurNode->NextNode = NULL;
- ReleaseNodeMemory( n );
- Left->Leaf.NoOfKeysThisNode--;
- if(( rc = PutLeafNode( Left->NodeNo, Left )) != XB_NO_ERROR ) return rc;
- /* rebuild left side of tree */
- GetLastKey( Left->NodeNo, 0 );
- NodeChain->PrevNode = SaveCurNode;
- SaveCurNode->CurKeyNo--;
- UpdateParentKey( CurNode );
- ReleaseNodeMemory( NodeChain );
- ReleaseNodeMemory( Left );
- CurNode = SaveCurNode;
- NodeChain = SaveNodeChain;
- }
- /* right sibling must exist */
- else if( n->PrevNode->CurKeyNo <= n->PrevNode->Leaf.NoOfKeysThisNode ){
- /* move left branch from left sibling to this node */
- SaveCurNode = CurNode;
- SaveNodeChain = NodeChain;
- NodeChain = NULL;
-
- /* move the left node number one to the left if necessary */
- if( n->CurKeyNo == 0 ){
- PutLeftNodeNo( 0, n, GetLeftNodeNo( 1, n ));
- GetLastKey( GetLeftNodeNo( 0, n ), 0 );
- memcpy(KeyBuf,GetKeyData(CurNode->CurKeyNo,CurNode),HeadNode.KeyLen);
- PutKeyData( 0, n );
- ReleaseNodeMemory( NodeChain );
- NodeChain = NULL;
- }
- GetLeafNode( GetLeftNodeNo( n->PrevNode->CurKeyNo+1, n->PrevNode ), 2 );
- /* put leftmost node number from right node in this node */
- PutLeftNodeNo( 1, n, GetLeftNodeNo( 0, CurNode ));
- if(( rc = PutLeafNode( n->NodeNo, n )) != XB_NO_ERROR ) return rc;
-
- /* remove the key from the right node */
- RemoveKeyFromNode( 0, CurNode );
- if(( rc = PutLeafNode( CurNode->NodeNo, CurNode )) != XB_NO_ERROR )
- return rc;
- ReleaseNodeMemory( CurNode );
-
- /* update new parent key value */
- GetLastKey( n->NodeNo, 0 );
- NodeChain->PrevNode = n->PrevNode;
- UpdateParentKey( CurNode );
- ReleaseNodeMemory( NodeChain );
- NodeChain = SaveNodeChain;
- CurNode = SaveCurNode;
- } else {
- /* this should never be true-but could be if 100 byte limit is ignored*/
- std::cout << "Fatal index error" << std::endl;
- exit(0);
- }
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description
-/*!
- \param DbfRec
-*/
-xbShort xbNdx::DeleteKey( xbLong DbfRec )
-{
-/* this routine assumes the key to be deleted is in KeyBuf */
-
- xbNdxNodeLink * TempNode;
- xbShort rc;
-
-#if 0
- // Not sure why this check is here, but it prevents numeric keys
- // from being deleted (and thus index updates will also fail).
- // I have removed it for now. Derry Bryson
- if( HeadNode.KeyType != 0x00 )
- xb_error(XB_INVALID_KEY_TYPE);
-#endif
-
- if(( rc = FindKey( KeyBuf, DbfRec )) != XB_FOUND )
- return rc;
-
- /* found the record to delete at this point */
- HeadNode.NoOfKeys--;
-
- /* delete the key from the node */
- if(( rc = RemoveKeyFromNode( CurNode->CurKeyNo, CurNode )) != 0 )
- return rc;
-
- /* if root node, we are done */
- if( !( CurNode->NodeNo == HeadNode.StartNode )){
- /* if leaf node now empty */
- if( CurNode->Leaf.NoOfKeysThisNode == 0 ){
- TempNode = CurNode->PrevNode;
- TempNode->NextNode = NULL;
- UpdateDeleteList( CurNode );
- CurNode = TempNode;
- DeleteSibling( CurNode );
- ProcessDeleteList();
- }
-
- /* if last key of leaf updated, update key in parent node */
- /* this logic updates the correct parent key */
-
- else if( CurNode->CurKeyNo == CurNode->Leaf.NoOfKeysThisNode )
- UpdateParentKey( CurNode );
- }
-
- if(CurNode)
- CurDbfRec = GetDbfNo( CurNode->CurKeyNo, CurNode );
- else
- CurDbfRec = 0;
-
- if(( rc = PutHeadNode( &HeadNode, indexfp, 1 )) != 0 )
- return rc;
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Short description
-/*!
- \param option
-*/
-#ifdef XBASE_DEBUG
-xbShort xbNdx::CheckIndexIntegrity( const xbShort option )
-{
- /* if option = 1, print out some stats */
- xbShort rc;
- xbLong ctr = 1L;
- while( ctr <= dbf->NoOfRecords()){
- if( option ) std::cout << "Checking Record " << ctr << std::endl;
- if(( rc = dbf->GetRecord(ctr++)) != XB_NO_ERROR )
- return rc;
- if(!dbf->RecordDeleted()){
- CreateKey( 0, 0 );
- rc = FindKey( KeyBuf, dbf->GetCurRecNo());
- if( rc != XB_FOUND ){
- if( option ){
- std::cout << "Record number " << dbf->GetCurRecNo()
- << " Not Found" << std::endl;
- std::cout << "Key = " << KeyBuf << std::endl;
- }
- return rc;
- }
- }
- }
- if( option )
- std::cout << std::endl << "Total records checked = "
- << ctr - 1 << std::endl;
- return XB_NO_ERROR;
-}
-#endif
-/***********************************************************************/
-//! Short description
-/*!
- \param statusFunc
-*/
-xbShort xbNdx::ReIndex(void (*statusFunc)(xbLong itemNum, xbLong numItems))
-{
- /* this method assumes the index has been locked in exclusive mode */
- xbLong l;
- xbShort rc, i, saveAutoLock;
- xbNdxHeadNode TempHead;
- FILE *t;
- xbString TempName;
- memcpy( &TempHead, &HeadNode, sizeof( struct xbNdxHeadNode ));
- TempHead.NoOfKeys = 1L;
- TempHead.TotalNodes = 2L;
- TempHead.StartNode = 1L;
- rc = dbf->xbase->DirectoryExistsInName( GetFileName() );
- if( rc ){
- TempName.assign(GetFileName(), 0, rc);
- TempName += "TEMPFILE.NDX";
- } else
- TempName = "TEMPFILE.NDX";
-
- if(( t = fopen( TempName, "w+b" )) == NULL )
- return XB_OPEN_ERROR;
-
- if(( rc = PutHeadNode( &TempHead, t, 0 )) != 0 ){
- fclose( t );
- remove(TempName);
- return rc;
- }
-
- for( i = 0; i < XB_NDX_NODE_SIZE; i++ ){
- if(( fwrite( "\x00", 1, 1, t )) != 1 ){
- fclose( t );
- remove(TempName);
- return XB_WRITE_ERROR;
- }
- }
- if( fclose( indexfp ) != 0 )
- return XB_CLOSE_ERROR;
- if( fclose( t ) != 0 )
- return XB_CLOSE_ERROR;
- if( remove( GetFileName() ) != 0 )
- return XB_CLOSE_ERROR;
- if( rename(TempName, GetFileName() ) != 0 )
- return XB_WRITE_ERROR;
- if(( indexfp = fopen( GetFileName(), "r+b" )) == NULL )
- return XB_OPEN_ERROR;
-
- saveAutoLock = dbf->GetAutoLock();
- dbf->AutoLockOff();
- for( l = 1; l <= dbf->PhysicalNoOfRecords(); l++ ){
- if(statusFunc && (l == 1 || !(l % 100) || l == dbf->PhysicalNoOfRecords()))
- statusFunc(l, dbf->PhysicalNoOfRecords());
- if(( rc = dbf->GetRecord(l)) != XB_NO_ERROR ){
- if(saveAutoLock)
- dbf->AutoLockOn();
- return rc;
- }
-
- if(!dbf->GetRealDelete() || !dbf->RecordDeleted()){
- /* Create the key */
- CreateKey( 0, 0 );
- /* add key to index */
- if(( rc = AddKey( l )) != XB_NO_ERROR ){
- if(saveAutoLock)
- dbf->AutoLockOn();
- return rc;
- }
- }
- }
- return rc;
-}
-
-/***********************************************************************/
-//! Short description
-/*!
- \param size
-*/
-void xbNdx::SetNodeSize(xbShort size)
-{
-#ifdef XB_VAR_NODESIZE
- if(size >= XB_DEFAULT_NDX_NODE_SIZE)
- {
- if(size % XB_NDX_NODE_MULTIPLE)
- NodeSize = ((size + XB_NDX_NODE_MULTIPLE) / XB_NDX_NODE_MULTIPLE) *
- XB_NDX_NODE_MULTIPLE;
- else
- NodeSize = size;
- }
- else
- NodeSize = XB_DEFAULT_NDX_NODE_SIZE;
-#endif
-}
-
-/***********************************************************************/
-//! Short description
-/*!
- \param buf
- \param len
-*/
-void xbNdx::GetExpression(char *buf, int len)
-{
- memcpy(buf, HeadNode.KeyExpression,
- len < XB_NDX_NODE_SIZE ? len : XB_NDX_NODE_SIZE - XB_NDX_NODE_BASESIZE);
-}
-
-const char* xbNdx::GetExtWithDot(bool lower)
-{
- return lower? ".ndx": ".NDX";
-}
-
-xbUShort xbNdx::GetKeyLen()
-{
- return HeadNode.KeyLen;
-}
-
-const char* xbNdx::GetKeyExpression()
-{
- return HeadNode.KeyExpression;
-}
-
-void xbNdx::FreeNodesMemory()
-{
- ReleaseNodeMemory(NodeChain, true);
- NodeChain = 0;
-// ReleaseNodeMemory(CloneChain, true);
-// CloneChain = 0;
- ReleaseNodeMemory(FreeNodeChain, true);
- FreeNodeChain = 0;
- ReleaseNodeMemory(DeleteChain, true);
- DeleteChain = 0;
-}
-
-#endif /* XB_INDEX_NDX */
diff --git a/xbase64/xbndx.h b/xbase64/xbndx.h
deleted file mode 100755
index 9f9d2d7..0000000
--- a/xbase64/xbndx.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/* xbndx.h
-
- Xbase64 project source code
-
- This file contains a header file for the xbNdx object, which is used
- for handling NDX type indices.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifndef __XB_NDX_H__
-#define __XB_NDX_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-#include <xbase64/xbase64.h>
-#include <string.h>
-
-/*! \file xbndx.h
-*/
-
-//
-// Define the following to use inline versions of the respective methods.
-//
-#define XB_INLINE_GETDBFNO
-
-#define XB_NDX_NODE_BASESIZE 24 // size of base header data
-
-#define XB_VAR_NODESIZE // define to enable variable node sizes
-
-#ifndef XB_VAR_NODESIZE
-#define XB_NDX_NODE_SIZE 2048
-//#define XB_NDX_NODE_SIZE 512 // standard dbase node size
-#else
-#define XB_DEFAULT_NDX_NODE_SIZE 512
-#define XB_MAX_NDX_NODE_SIZE 4096
-#define XB_NDX_NODE_SIZE NodeSize
-#define XB_NDX_NODE_MULTIPLE 512
-#endif // XB_VAR_NODESIZE
-
-//! xbNdxHeadnode struct
-/*!
-*/
-
-struct XBDLLEXPORT xbNdxHeadNode { /* ndx header on disk */
- xbLong StartNode; /* header node is node 0 */
- xbLong TotalNodes; /* includes header node */
- xbLong NoOfKeys; /* actual count + 1 */
- /* not updated by borland dbe? */
- xbUShort KeyLen; /* length of key data */
- xbUShort KeysPerNode;
- xbUShort KeyType; /* 00 = Char, 01 = Numeric */
- xbLong KeySize; /* key len + 8 bytes */
- char Unknown2;
- char Unique;
-// char KeyExpression[488];
-#ifndef XB_VAR_NODESIZE
- char KeyExpression[XB_NDX_NODE_SIZE - 24];
-#else
- char KeyExpression[XB_MAX_NDX_NODE_SIZE - 24];
-#endif // XB_VAR_NODESIZE
-};
-
-//! xbNdxLeafNode struct
-/*!
-*/
-
-struct XBDLLEXPORT xbNdxLeafNode { /* ndx node on disk */
- xbLong NoOfKeysThisNode;
-#ifndef XB_VAR_NODESIZE
- char KeyRecs[XB_NDX_NODE_SIZE-4];
-#else
- char KeyRecs[XB_MAX_NDX_NODE_SIZE - 4];
-#endif // XB_VAR_NODESIZE
-};
-
-//! xbNdxNodeLink struct
-/*!
-*/
-
-struct XBDLLEXPORT xbNdxNodeLink { /* ndx node memory */
- xbNdxNodeLink * PrevNode;
- xbNdxNodeLink * NextNode;
- xbLong CurKeyNo; /* 0 - KeysPerNode-1 */
- xbLong NodeNo;
- struct xbNdxLeafNode Leaf;
-};
-
-//! xbNdx class
-/*!
-*/
-
-class XBDLLEXPORT xbNdx : public xbIndex
-{
- public:
- xbNdx();
- xbNdx(xbDbf *);
- virtual ~xbNdx();
-
-/* don't uncomment next line - it causes seg faults for some undiagnosed reason*/
-// ~NDX() { if( NdxStatus ) CloseIndex(); }
-
- xbShort CreateIndex( const char *IxName, const char *Exp,
- xbShort Unique, xbShort OverLay );
- xbLong GetTotalNodes();
- xbULong GetCurDbfRec() { return CurDbfRec; }
- xbShort CreateKey( xbShort, xbShort );
- xbShort GetCurrentKey(char *key);
- xbShort AddKey( xbLong );
- xbShort UniqueIndex() { return HeadNode.Unique; }
- xbShort DeleteKey( xbLong );
- xbShort KeyWasChanged();
- xbShort FindKey( const char *Key );
- xbShort FindKey();
- xbShort FindKey( xbDouble );
-#ifdef XBASE_DEBUG
- void DumpHdrNode( xbShort Option );
- void DumpNodeRec( xbLong NodeNo );
- void DumpNodeChain();
- xbShort CheckIndexIntegrity( xbShort Option );
-#endif
- //! Short description.
- /*!
- */
- xbShort GetNextKey() { return GetNextKey( 1 ); }
- //! Short description.
- /*!
- */
- xbShort GetLastKey() { return GetLastKey( 0, 1 ); }
- //! Short description.
- /*!
- */
- xbShort GetFirstKey() { return GetFirstKey( 1 ); }
- //! Short description.
- /*!
- */
- xbShort GetPrevKey() { return GetPrevKey( 1 ); }
- xbShort ReIndex(void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0);
- xbShort KeyExists( const char * Key ) { return FindKey( Key, strlen( Key ), 0 ); }
- xbShort KeyExists( xbDouble );
-
- virtual void SetNodeSize(xbShort size);
-
- virtual void GetExpression(char *buf, int len);
- virtual const char* GetExtWithDot(bool lower);
-
- protected:
- virtual xbUShort GetKeyLen();
- virtual const char* GetKeyExpression();
- virtual void FreeNodesMemory();
-
- protected:
- xbNdxHeadNode HeadNode;
- xbNdxLeafNode LeafNode;
- xbLong xbNodeLinkCtr;
- xbLong ReusedxbNodeLinks;
-
-#ifndef XB_VAR_NODESIZE
- char Node[XB_NDX_NODE_SIZE];
-#else
- char Node[XB_MAX_NDX_NODE_SIZE];
-#endif // XB_VAR_NODESIZE
-
- xbNdxNodeLink * NodeChain; /* pointer to node chain of index nodes */
- xbNdxNodeLink * FreeNodeChain; /* pointer to chain of free index nodes */
- xbNdxNodeLink * CurNode; /* pointer to current node */
- xbNdxNodeLink * DeleteChain; /* pointer to chain to delete */
-// xbNdxNodeLink * CloneChain; /* pointer to node chain copy (add dup) */
-
-/* private functions */
- xbLong GetLeftNodeNo( xbShort, xbNdxNodeLink * );
-
-
- // in line functions for performance reasons
- //! Short description.
- /*!
- */
- inline xbShort CompareKey( const char *Key1, const char *Key2, xbShort Klen )
- {
- xbDouble d1, d2;
- int c;
-
- if(!( Key1 && Key2 )) return -1;
-
- if( Klen > HeadNode.KeyLen ) Klen = HeadNode.KeyLen;
-
- if( HeadNode.KeyType == 0 )
- {
- c = memcmp(Key1, Key2, Klen);
- if(c < 0)
- return 2;
- else if(c > 0)
- return 1;
- return 0;
- }
- else /* key is numeric */
- {
- d1 = dbf->xbase->GetDouble( Key1 );
- d2 = dbf->xbase->GetDouble( Key2 );
- if( d1 == d2 ) return 0;
- else if( d1 > d2 ) return 1;
- else return 2;
- }
- }
-
-#ifndef XB_INLINE_GETDBFNO
- xbLong GetDbfNo( xbShort, xbNdxNodeLink * );
-#else
- //! Short description.
- /*!
- */
- inline xbLong GetDbfNo( xbShort RecNo, xbNdxNodeLink *n )
- {
- xbNdxLeafNode *temp;
- char *p;
- if( !n ) return 0L;
- temp = &n->Leaf;
- if( RecNo < 0 || RecNo > ( temp->NoOfKeysThisNode - 1 )) return 0L;
- p = temp->KeyRecs + 4;
- p += RecNo * ( 8 + HeadNode.KeyLen );
- return( dbf->xbase->GetLong( p ));
- }
-#endif
- char * GetKeyData( xbShort, xbNdxNodeLink * );
- xbUShort GetKeysPerNode();
- virtual xbShort GetHeadNode();
- xbShort GetLeafNode( xbLong, xbShort );
- xbNdxNodeLink * GetNodeMemory();
- void ReleaseNodeMemory(xbNdxNodeLink *n, xbBool doFree = false);
- xbShort BSearchNode(const char *key, xbShort klen,
- const xbNdxNodeLink *node, xbShort *comp);
- xbLong GetLeafFromInteriorNode( const char *Tkey, xbShort Klen );
- xbShort CalcKeyLen();
- xbShort PutKeyData( xbShort, xbNdxNodeLink * );
- xbShort PutLeftNodeNo( xbShort, xbNdxNodeLink *, xbLong );
- xbShort PutLeafNode( xbLong, xbNdxNodeLink * );
- xbShort PutHeadNode( xbNdxHeadNode *, FILE *, xbShort );
- xbShort PutDbfNo( xbShort, xbNdxNodeLink *, xbLong );
- xbShort PutKeyInNode( xbNdxNodeLink *, xbShort, xbLong, xbLong, xbShort );
- xbShort SplitLeafNode( xbNdxNodeLink *, xbNdxNodeLink *, xbShort, xbLong );
- xbShort SplitINode( xbNdxNodeLink *, xbNdxNodeLink *, xbLong );
- xbShort AddToIxList();
- xbShort RemoveFromIxList();
- xbShort RemoveKeyFromNode( xbShort, xbNdxNodeLink * );
- xbShort FindKey( const char *Tkey, xbShort Klen, xbShort RetrieveSw );
- xbShort UpdateParentKey( xbNdxNodeLink * );
- xbShort GetFirstKey( xbShort );
- xbShort GetNextKey( xbShort );
- xbShort GetLastKey( xbLong, xbShort );
- xbShort GetPrevKey( xbShort );
- void UpdateDeleteList( xbNdxNodeLink * );
- void ProcessDeleteList();
- xbNdxNodeLink * LeftSiblingHasSpace( xbNdxNodeLink * );
- xbNdxNodeLink * RightSiblingHasSpace( xbNdxNodeLink * );
- xbShort DeleteSibling( xbNdxNodeLink * );
- xbShort MoveToLeftNode( xbNdxNodeLink *, xbNdxNodeLink * );
- xbShort MoveToRightNode( xbNdxNodeLink *, xbNdxNodeLink * );
- xbShort FindKey( const char *Tkey, xbLong DbfRec ); /* for a specific dbf no */
-};
-#endif /* __XB_NDX_H__ */
diff --git a/xbase64/xbnode.cpp b/xbase64/xbnode.cpp
deleted file mode 100755
index 5e688c1..0000000
--- a/xbase64/xbnode.cpp
+++ /dev/null
@@ -1,6 +0,0 @@
-#include "xbNode.h"
-
-void xbNodeLink::AddNode(xbNodeLink* node)
-{
- nextNode_=node;
-}
diff --git a/xbase64/xbnode.h b/xbase64/xbnode.h
deleted file mode 100755
index b1c3fdf..0000000
--- a/xbase64/xbnode.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef xbNode_h
-#define xbNode_h
-
-class xbNodeLink
-{
- public:
- xbNodeLink(): nextNode_(0) {}
- void AddNode(xbNodeLink* node);
- xbNodeLink* GetNext() {return nextNode_;}
-
- private:
- xbNodeLink(const xbNodeLink&);
- xbNodeLink& operator=(const xbNodeLink&);
-
- private:
- xbNodeLink* nextNode_;
-};
-
-#endif
diff --git a/xbase64/xbntx.cpp b/xbase64/xbntx.cpp
deleted file mode 100755
index 673aa68..0000000
--- a/xbase64/xbntx.cpp
+++ /dev/null
@@ -1,2604 +0,0 @@
-/* xbntx.xpp
-
- Xbase64 project source code
-
- NTX (Clipper) indexing routines for X-Base
-
- Copyright (C) 1999 SynXis Corp., Bob Cotton
- email - bob@synxis.com
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xbntx.h"
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-
-#ifdef XB_INDEX_NTX
-
-#ifdef HAVE_IO_H
-#include <io.h>
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <ctype.h>
-#include <sys/stat.h>
-
-//#include <xbase64/xbexcept.h>
-
-/*! \file xbntx.cpp
-*/
-
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-/* This routine dumps the node chain to stdout */
-#ifdef XBASE_DEBUG
-void xbNtx::DumpNodeChain( void )
-{
- xbNodeLink *n;
- std::cout << "*************************" << std::endl;
- std::cout << "NodeLinkCtr = " << NodeLinkCtr << std::endl;
- std::cout << "Reused = " << ReusedNodeLinks << std::endl;
-
- n = NodeChain;
- while(n){
- std::cout << "xbNodeLink Chain" << n->NodeNo << std::endl;
- n = n->NextNode;
- }
- n = FreeNodeChain;
- while(n){
- std::cout << "FreeNodeLink Chain" << n->NodeNo << std::endl;
- n = n->NextNode;
- }
- n = DeleteChain;
- while(n){
- std::cout << "DeleteLink Chain" << n->NodeNo << std::endl;
- n = n->NextNode;
- }
-}
-#endif
-/***********************************************************************/
-//! Short description.
-/*!
- \param n
-*/
-/* This routine returns a chain of one or more index nodes back to the */
-/* free node chain */
-
-void xbNtx::ReleaseNodeMemory( xbNodeLink * n, xbBool doFree )
-{
- xbNodeLink *temp;
-
- if(doFree){
- while(n){
- temp = n->NextNode;
- if(n->offsets)
- free(n->offsets);
- free(n);
- n = temp;
- }
- } else {
- if(!FreeNodeChain )
- FreeNodeChain = n;
- else { /* put this list at the end */
- temp = FreeNodeChain;
- while( temp->NextNode )
- temp = temp->NextNode;
- temp->NextNode = n;
- }
- }
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-/* This routine returns a node from the free chain if available, */
-/* otherwise it allocates new memory for the requested node */
-
-xbNodeLink * xbNtx::GetNodeMemory( void )
-{
- xbNodeLink * temp;
- if( FreeNodeChain ){
- temp = FreeNodeChain;
- temp->offsets = FreeNodeChain->offsets;
- FreeNodeChain = temp->NextNode;
- ReusedNodeLinks++;
- memset( temp->Leaf.KeyRecs, 0x00, XB_NTX_NODE_SIZE );
- temp->Leaf.NoOfKeysThisNode = 0;
- temp->PrevNode = 0x00;
- temp->NextNode = 0x00;
- temp->CurKeyNo = 0L;
- temp->NodeNo = 0L;
-
- for (int i = 0; i < HeadNode.KeysPerNode + 1; i++){
- temp->offsets[i] = 2 + ((HeadNode.KeysPerNode + 1) * 2) + (HeadNode.KeySize * i);
- }
- } else {
- temp = (xbNodeLink *) malloc( sizeof( xbNodeLink ));
- if(temp==NULL) return NULL;
- memset( temp, 0x00, sizeof( xbNodeLink ));
- temp->offsets = (xbUShort *)malloc( (HeadNode.KeysPerNode + 1) * sizeof(xbUShort));
- if (temp->offsets==NULL) {
- free(temp);
- return NULL;
- };
- NodeLinkCtr++;
- }
- return temp;
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-#ifdef XBASE_DEBUG
-void xbNtx::DumpHdrNode( xbShort Option )
-{
- if( Option == 0 ){
- std::cout << "Signature = " << HeadNode.Signature << std::endl;
- std::cout << "Version = " << HeadNode.Version << std::endl;
- std::cout << "StartPahe = " << HeadNode.StartNode << std::endl;
- std::cout << "UnusedOffset = " << HeadNode.UnusedOffset << std::endl;
- std::cout << "KeySize = " << HeadNode.KeySize << std::endl;
- std::cout << "KeyLen = " << HeadNode.KeyLen << std::endl;
- std::cout << "DecimalCount = " << HeadNode.DecimalCount << std::endl;
- std::cout << "KeysPerNode = " << HeadNode.KeysPerNode << std::endl;
- std::cout << "HalfKeysPerPage = " << HeadNode.HalfKeysPerNode << std::endl;
- std::cout << "KeyExpression = " << HeadNode.KeyExpression << std::endl;
- std::cout << "Unique = " << HeadNode.Unique << std::endl;
- } else
- std::cout << "Print Hdr Node option not implemented yet" << std::endl;
-}
-#endif
-/***********************************************************************/
-//! Constructor
-/*!
-*/
-xbNtx::xbNtx() : xbIndex()
-{
-}
-/***********************************************************************/
-//! Constructor
-/*!
- \param pdbf
-*/
-xbNtx::xbNtx( xbDbf * pdbf ) : xbIndex (pdbf)
-{
- memset( Node, 0x00, XB_NTX_NODE_SIZE );
- memset( &HeadNode, 0x00, sizeof( NtxHeadNode ));
- NodeChain = NULL;
-// CloneChain = NULL;
- FreeNodeChain = NULL;
- DeleteChain = NULL;
- CurNode = NULL;
- NodeLinkCtr = 0L;
- ReusedNodeLinks = 0L;
-}
-/***********************************************************************/
-//! Destructor
-/*!
-*/
-xbNtx::~xbNtx()
-{
- CloseIndex();
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-xbShort xbNtx::GetHeadNode( void )
-{
- char *p;
- if( !IsOpen() )
- return XB_NOT_OPEN;
- if( _fseek( indexfp, 0, SEEK_SET ))
- return XB_SEEK_ERROR;
- if(( fread( Node, XB_NTX_NODE_SIZE, 1, indexfp )) != 1 )
- return XB_READ_ERROR;
-
- /* load the head node structure */
- p = Node;
- HeadNode.Signature = dbf->xbase->GetShort( p ); p += sizeof(xbUShort);
- HeadNode.Version = dbf->xbase->GetShort( p ); p += sizeof(xbUShort);
- HeadNode.StartNode = dbf->xbase->GetULong( p ); p += sizeof(xbULong);
- HeadNode.UnusedOffset = dbf->xbase->GetULong( p ); p += sizeof(xbULong);
- HeadNode.KeySize = dbf->xbase->GetShort( p ); p += sizeof(xbUShort);
- HeadNode.KeyLen = dbf->xbase->GetShort( p ); p += sizeof(xbUShort);
- HeadNode.DecimalCount = dbf->xbase->GetShort( p ); p += sizeof(xbUShort);
- HeadNode.KeysPerNode = dbf->xbase->GetShort( p ); p += sizeof(xbUShort);
- HeadNode.HalfKeysPerNode = dbf->xbase->GetShort( p ); p += sizeof(xbUShort);
- strncpy(HeadNode.KeyExpression, p, 256); p+= 256;
-// HeadNode.Unique = *p++; ++ is unused code 8/19/03 - gkunkel
- HeadNode.Unique = *p;
-
- p = HeadNode.KeyExpression;
- while (*p){
- *p = toupper(*p);
- p++;
- }
- return 0;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param NodeNo
- \param SetNodeChain
-*/
-/* This routine reads a leaf node from disk */
-/* */
-/* If SetNodeChain 2, then the node is not appended to the node chain */
-/* but the CurNode pointer points to the node read */
-/* If SetNodeChain 1, then the node is appended to the node chain */
-/* If SetNodeChain 0, then record is only read to Node memory */
-
-xbShort xbNtx::GetLeafNode( xbLong NodeNo, xbShort SetNodeChain )
-{
- xbNodeLink *n;
- char *p;
-
- if( !IsOpen() )
- return XB_NOT_OPEN;
-
- if( _fseek( indexfp, (xbOffT)NodeNo, SEEK_SET ))
- return XB_SEEK_ERROR;
-
- if(( fread( Node, XB_NTX_NODE_SIZE, 1, indexfp )) != 1 )
- return XB_READ_ERROR;
-
- if( !SetNodeChain ) return 0;
-
- if(( n = GetNodeMemory()) == NULL )
- return XB_NO_MEMORY;
-
- n->NodeNo = NodeNo;
- n->CurKeyNo = 0L;
- n->NextNode = NULL;
-
- // The offsets at the head of each leaf are not necessarly in order.
- p = Node + 2;
- for( int i = 0; i < HeadNode.KeysPerNode + 1; i++){
- n->offsets[i] = dbf->xbase->GetShort( p );
- p += 2;
- }
-
- // Do the edian translation correctly
- n->Leaf.NoOfKeysThisNode = dbf->xbase->GetShort( Node );
- memcpy( n->Leaf.KeyRecs, Node, XB_NTX_NODE_SIZE );
-
- /* put the node in the chain */
- if( SetNodeChain == 1 ){
- if( NodeChain == NULL ){ /* first one ? */
- NodeChain = n;
- CurNode = n;
- CurNode->PrevNode = NULL;
- } else {
- n->PrevNode = CurNode;
- CurNode->NextNode = n;
- CurNode = n;
- }
- }
- else
- CurNode = n;
-
- return 0;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param n
-*/
-#ifdef XBASE_DEBUG
-void xbNtx::DumpNodeRec( xbLong n )
-{
- char *p;
- xbShort NoOfKeys;
- xbLong LeftBranch, RecNo;
- xbShort i,j;
-
- GetLeafNode( n, 0 );
- NoOfKeys = dbf->xbase->GetShort( Node );
- p = Node + 4; /* go past no of keys */
-std::cout << "-----------------------------------------------" << std::endl;
- std::cout << "Node # " << n;
- std::cout << "Number of keys = " << NoOfKeys << std::endl;
- std::cout << " Key Left Rec Key" << std::endl;
- std::cout << "Number Branch Number Data" << std::endl;
-
- for( i = 0; i < GetKeysPerNode()+1 /*NoOfKeys*/; i++ ){
- LeftBranch = dbf->xbase->GetLong( p );
- p+=4;
- RecNo = dbf->xbase->GetLong( p );
- p+=4;
- std::cout << i << " "
- << LeftBranch << " "
- << RecNo << " " << std::endl;
- for( j = 0; j < HeadNode.KeyLen; j++ ) std::cout << *p++;
- }
-}
-#endif
-/***********************************************************************/
-//! Short description.
-/*!
- \param RecNo
- \param n
-*/
-xbLong xbNtx::GetDbfNo( xbShort RecNo, xbNodeLink * n )
-{
- NtxLeafNode *temp;
- char *p;
- xbUShort itemOffset;
-
- if( !n ) return 0L;
- temp = &n->Leaf;
- p = temp->KeyRecs;
- if( RecNo < 0 || RecNo > ( temp->NoOfKeysThisNode )) return 0L;
- itemOffset = GetItemOffset(RecNo, n, 0);
- // ItemOffset is from the beginning of the record.
- p += itemOffset;
- p += 4;
- return( dbf->xbase->GetLong( p ));
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param RecNo
- \param n
-*/
-xbLong xbNtx::GetLeftNodeNo( xbShort RecNo, xbNodeLink * n )
-{
- NtxLeafNode *temp;
- char *p;
- xbUShort itemOffset;
-
- if( !n ) return 0L;
- temp = &n->Leaf;
- p = temp->KeyRecs;
- if( RecNo < 0 || RecNo > temp->NoOfKeysThisNode ) return 0L;
- itemOffset = GetItemOffset(RecNo, n, 0);
- // ItemOffset is from the beginning of the record.
- p += itemOffset;
- return( dbf->xbase->GetULong( p ));
-}
-
-/***********************************************************************/
-//! Short description.
-/*!
- \param RecNo
- \param n
-*/
-char * xbNtx::GetKeyData( xbShort RecNo, xbNodeLink * n )
-{
- NtxLeafNode *temp;
- char *p;
- xbUShort itemOffset;
- if( !n ) return 0L;
- temp = &n->Leaf;
- p = temp->KeyRecs;
- if( RecNo < 0 || RecNo > ( temp->NoOfKeysThisNode )) return 0L;
- itemOffset = GetItemOffset(RecNo, n, 0);
- // ItemOffset is from the beginning of the record.
- p += itemOffset + 8;
- return( p );
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param RecNo
- \param n
- \param
-*/
-xbUShort
-xbNtx::GetItemOffset(xbShort RecNo, xbNodeLink *n, xbShort) {
- if( RecNo > (this->HeadNode.KeysPerNode + 1) ){
- std::cout << "RecNo = " << RecNo << std::endl;
- std::cout << "this->HeadNode.KeysPerNode = "
- << this->HeadNode.KeysPerNode << std::endl;
- std::cout << "********************* BUG ***********************"
- << std::endl;
- // ;-)
- exit(1);
- }
-
- return n->offsets[RecNo];
-}
-
-//! Short description.
-/*!
- \param pos
- \param n
-*/
-xbUShort
-xbNtx::InsertKeyOffset(xbShort pos, xbNodeLink *n)
-{
- xbUShort temp;
-
- // save the new offset
- temp = n->offsets[n->Leaf.NoOfKeysThisNode + 1];
-
- for( int i = n->Leaf.NoOfKeysThisNode + 1; i > pos; i-- ){
- n->offsets[i] = n->offsets[i-1];
- }
- n->offsets[pos] = temp;
-
- return n->offsets[pos];
-}
-
-//! Short description.
-/*!
- \param pos
- \param n
-*/
-xbUShort
-xbNtx::DeleteKeyOffset(xbShort pos, xbNodeLink *n)
-{
- xbUShort temp;
- xbShort i;
- // save the old offset
- temp = n->offsets[pos];
-
- for( i = pos; i < n->Leaf.NoOfKeysThisNode; i++ ){
- n->offsets[i] = n->offsets[i+1];
- }
- n->offsets[i] = temp;
- return n->offsets[i];
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-xbLong xbNtx::GetTotalNodes( void )
-{
-// if( &HeadNode )
-// return HeadNode.TotalNodes;
-// else
- return 0L;
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-xbUShort xbNtx::GetKeysPerNode( void )
-{
- if( &HeadNode )
- return HeadNode.KeysPerNode;
- else
- return 0L;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param RetrieveSw
-*/
-xbShort xbNtx::GetFirstKey( xbShort RetrieveSw )
-{
-/* This routine returns 0 on success and sets CurDbfRec to the record */
-/* corresponding to the first index pointer */
-
- xbLong TempNodeNo;
- xbShort rc;
-
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// if((rc = LockIndex( XB_LOCK )) != 0)
-// return rc;
-#endif
-
- /* initialize the node chain */
- if( NodeChain ){
- ReleaseNodeMemory( NodeChain );
- NodeChain = NULL;
- }
-
- if(( rc = GetHeadNode()) != 0 ){
- CurDbfRec = 0L;
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return rc;
- }
-
- /* get a node and add it to the link */
-
- if(( rc = GetLeafNode( HeadNode.StartNode, 1 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return rc;
- }
-
-/* traverse down the left side of the tree */
- while( GetLeftNodeNo( 0, CurNode )){
- TempNodeNo = GetLeftNodeNo( 0, CurNode );
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return rc;
- }
- CurNode->CurKeyNo = 0;
- }
- CurDbfRec = GetDbfNo( 0, CurNode );
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param RetrieveSw
-*/
-xbShort xbNtx::GetNextKey( xbShort RetrieveSw )
-{
-/* This routine returns 0 on success and sets CurDbfRec to the record */
-/* corresponding to the next index pointer */
-
- xbNodeLink * TempNodeLink;
- xbLong TempNodeNo;
- xbShort rc;
-
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
- // if((rc = LockIndex( XB_LOCK )) != 0)
- // return rc;
-#endif
-
- if( !IsOpen() ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return XB_NOT_OPEN;
- }
-
- if( !CurNode ){
- rc = GetFirstKey( RetrieveSw );
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return rc;
- }
-
- /* more keys on this node ? */
- if(( CurNode->Leaf.NoOfKeysThisNode -1 ) > CurNode->CurKeyNo ){
- CurNode->CurKeyNo++;
- CurDbfRec = GetDbfNo( CurNode->CurKeyNo, CurNode );
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
- }
-
- /* if head node we are at eof */
- if( CurNode->NodeNo == HeadNode.StartNode ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return XB_EOF;
- }
-
- /* this logic assumes that interior nodes have n+1 left node no's where */
- /* n is the number of keys in the node */
- /* pop up one node to the interior node level & free the leaf node */
- TempNodeLink = CurNode;
- CurNode = CurNode->PrevNode;
- CurNode->NextNode = NULL;
- ReleaseNodeMemory( TempNodeLink );
-
- /* while no more right keys && not head node, pop up one node */
- while(( CurNode->CurKeyNo >= CurNode->Leaf.NoOfKeysThisNode ) &&
- ( CurNode->NodeNo != HeadNode.StartNode )){
- TempNodeLink = CurNode;
- CurNode = CurNode->PrevNode;
- CurNode->NextNode = NULL;
- ReleaseNodeMemory( TempNodeLink );
- }
-
- /* if head node && right most key, return end-of-file */
- if(( HeadNode.StartNode == CurNode->NodeNo ) &&
- ( CurNode->CurKeyNo >= CurNode->Leaf.NoOfKeysThisNode )){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return XB_EOF;
- }
-
- /* move one to the right */
- CurNode->CurKeyNo++;
- TempNodeNo = GetLeftNodeNo( CurNode->CurKeyNo, CurNode );
-
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return rc;
- }
-
-/* traverse down the left side of the tree */
- while( GetLeftNodeNo( 0, CurNode )){
- TempNodeNo = GetLeftNodeNo( 0, CurNode );
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return rc;
- }
- CurNode->CurKeyNo = 0;
- }
- CurDbfRec = GetDbfNo( 0, CurNode );
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param NodeNo
- \param RetrieveSw
-*/
-xbShort xbNtx::GetLastKey( xbLong NodeNo, xbShort RetrieveSw )
-{
-/* This routine returns 0 on success and sets CurDbfRec to the record */
-/* corresponding to the last index pointer */
-
-/* If NodeNo = 0, start at head node, otherwise start at NodeNo */
-
- xbLong TempNodeNo;
- xbShort rc;
-
-// TODO
-// NTX files keep no TotalNode count.
-// if( NodeNo < 0 || NodeNo > HeadNode.TotalNodes )
-// return XB_INVALID_NODE_NO;
-
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// if((rc = LockIndex( XB_LOCK )) != 0)
-// return rc;
-#endif
-
- /* initialize the node chain */
- if( NodeChain ){
- ReleaseNodeMemory( NodeChain );
- NodeChain = NULL;
- }
- if( NodeNo == 0L )
- if(( rc = GetHeadNode()) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return rc;
- }
-
- /* get a node and add it to the link */
- if( NodeNo == 0L ){
- if(( rc = GetLeafNode( HeadNode.StartNode, 1 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK);
-#endif
- CurDbfRec = 0L;
- return rc;
- }
- } else {
- if(( rc = GetLeafNode( NodeNo, 1 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return rc;
- }
- }
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode;
-
-/* traverse down the right side of the tree */
- while( GetLeftNodeNo( CurNode->Leaf.NoOfKeysThisNode, CurNode )){
- TempNodeNo = GetLeftNodeNo( CurNode->Leaf.NoOfKeysThisNode, CurNode );
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return rc;
- }
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode;
- }
- CurNode->CurKeyNo--; /* leaf node has one fewer ix recs */
- CurDbfRec = GetDbfNo( CurNode->Leaf.NoOfKeysThisNode-1, CurNode );
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param RetrieveSw
-*/
-xbShort xbNtx::GetPrevKey( xbShort RetrieveSw )
-{
-/* This routine returns 0 on success and sets CurDbfRec to the record */
-/* corresponding to the previous index pointer */
-
- xbNodeLink * TempNodeLink;
- xbLong TempNodeNo;
- xbShort rc;
-
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// if((rc = LockIndex( XB_LOCK )) != 0)
-// return rc;
-#endif
-
- if( !IsOpen() ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return XB_NOT_OPEN;
- }
-
- if( !CurNode ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return GetFirstKey( RetrieveSw );
- }
-
- /* more keys on this node ? */
- if( CurNode->CurKeyNo > 0 ){
- CurNode->CurKeyNo--;
- CurDbfRec = GetDbfNo( CurNode->CurKeyNo, CurNode );
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
- }
-
- /* this logic assumes that interior nodes have n+1 left node no's where */
- /* n is the number of keys in the node */
- /* pop up one node to the interior node level & free the leaf node */
-
- if( !CurNode->PrevNode ){ /* michael - make sure prev node exists */
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return XB_EOF;
- }
-
- TempNodeLink = CurNode;
- CurNode = CurNode->PrevNode;
- CurNode->NextNode = NULL;
- ReleaseNodeMemory( TempNodeLink );
-
- /* while no more left keys && not head node, pop up one node */
- while(( CurNode->CurKeyNo == 0 ) &&
- ( CurNode->NodeNo != HeadNode.StartNode )){
- TempNodeLink = CurNode;
- CurNode = CurNode->PrevNode;
- CurNode->NextNode = NULL;
- ReleaseNodeMemory( TempNodeLink );
- }
-
- /* if head node && left most key, return end-of-file */
- if(( HeadNode.StartNode == CurNode->NodeNo ) &&
- ( CurNode->CurKeyNo == 0 )){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return XB_EOF;
- }
-
- /* move one to the left */
- CurNode->CurKeyNo--;
- TempNodeNo = GetLeftNodeNo( CurNode->CurKeyNo, CurNode );
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return rc;
- }
-
- if( GetLeftNodeNo( 0, CurNode )) /* if interior node */
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode;
- else /* leaf node */
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode -1;
-
-/* traverse down the right side of the tree */
- while( GetLeftNodeNo( 0, CurNode )){ /* while interior node */
- TempNodeNo = GetLeftNodeNo( CurNode->Leaf.NoOfKeysThisNode, CurNode );
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return rc;
- }
- if( GetLeftNodeNo( 0, CurNode )) /* if interior node */
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode;
- else /* leaf node */
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode -1;
- }
- CurDbfRec = GetDbfNo( CurNode->Leaf.NoOfKeysThisNode -1, CurNode );
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- if( RetrieveSw )
- return dbf->GetRecord( CurDbfRec );
- else
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param Key1
- \param Key2
- \param Klen
-*/
-xbShort xbNtx::CompareKey( const char * Key1, const char * Key2, xbShort Klen )
-{
-/* if key1 = key2 --> return 0 */
-/* if key1 > key2 --> return 1 */
-/* if key1 < key2 --> return 2 */
-
- const char *k1, *k2;
- xbShort i;
-
- if( Klen > HeadNode.KeyLen ) Klen = HeadNode.KeyLen;
- k1 = Key1;
- k2 = Key2;
- for( i = 0; i < Klen; i++ ){
- if( *k1 > *k2 ) return 1;
- if( *k1 < *k2 ) return 2;
- k1++;
- k2++;
- }
- return 0;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param Key1
- \param Key2
-*/
-xbShort xbNtx::CompareKey( const char * Key1, const char * Key2)
-{
-/* if key1 = key2 --> return 0 */
-/* if key1 > key2 --> return 1 */
-/* if key1 < key2 --> return 2 */
-
- int rc;
- rc = strcmp(Key1, Key2);
- if( rc < 0 )
- return 2;
- else if( rc > 0 )
- return 1;
- else
- return 0;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param Tkey
- \param
-*/
-xbULong xbNtx::GetLeafFromInteriorNode( const char * Tkey, xbShort )
-{
- /* This function scans an interior node for a key and returns the */
- /* correct interior leaf node no */
-
- xbShort rc, p;
-
- /* if Tkey > any keys in node, return right most key */
- p = CurNode->Leaf.NoOfKeysThisNode -1 ;
- if( CompareKey( Tkey, GetKeyData( p, CurNode )) == 1 ){
- CurNode->CurKeyNo = CurNode->Leaf.NoOfKeysThisNode;
- return GetLeftNodeNo( CurNode->Leaf.NoOfKeysThisNode, CurNode );
- }
-
- /* otherwise, start at the beginning and scan up */
- p = 0;
- while( p < CurNode->Leaf.NoOfKeysThisNode){
- rc = CompareKey( Tkey, GetKeyData( p, CurNode ) );
- if (rc == 2) break;
- else if (rc == 0){
- CurNode->CurKeyNo = p;
- CurDbfRec = GetDbfNo( p, CurNode );
- return 0;
- }
- p++;
- }
-
- CurNode->CurKeyNo = p;
- return GetLeftNodeNo( p, CurNode );
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param d
-*/
-xbShort xbNtx::KeyExists( xbDouble d )
-{
- char buf[9];
- memset( buf, 0x00, 9 );
- dbf->xbase->PutDouble( buf, d );
- return FindKey( buf, 8, 0 );
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param d
-*/
-xbShort xbNtx::FindKey( xbDouble d )
-{
- char buf[9];
- memset( buf, 0x00, 9 );
- dbf->xbase->PutDouble( buf, d );
- return FindKey( buf, 8, 1 );
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param Key
-*/
-xbShort xbNtx::FindKey( const char * Key )
-{
- return FindKey( Key, strlen( Key ), 1 );
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param Tkey
- \param DbfRec
-*/
-xbShort xbNtx::FindKey( const char * Tkey, xbLong DbfRec )
-{
- /* find a key with a specifc xbDbf record number */
- xbShort rc;
- xbLong CurDbfRecNo;
- xbLong CurNtxDbfNo;
-
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// if((rc = LockIndex( XB_LOCK )) != 0)
-// return rc;
-#endif
-
- /* if we are already on the correct key, return XB_FOUND */
- if( CurNode ){
- CurDbfRecNo = dbf->GetCurRecNo();
- CurNtxDbfNo = GetDbfNo( CurNode->CurKeyNo, CurNode );
- if( CurDbfRecNo == CurNtxDbfNo ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return XB_FOUND;
- }
- }
-
- rc = FindKey( Tkey, HeadNode.KeyLen, 0 );
-
- while( rc == 0 || rc == XB_FOUND ){
- if( strncmp( Tkey, GetKeyData( CurNode->CurKeyNo, CurNode ),
- HeadNode.KeyLen ) == 0 ){
- if( DbfRec == GetDbfNo( CurNode->CurKeyNo, CurNode )){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
- // LockIndex( XB_UNLOCK );
-#endif
- return XB_FOUND;
- } else
- rc = GetNextKey( 0 );
- } else {
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return XB_NOT_FOUND;
- }
- }
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return XB_NOT_FOUND;
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-xbShort xbNtx::FindKey( void )
-{
- /* if no paramaters given, use KeyBuf */
- return( FindKey( KeyBuf, HeadNode.KeyLen, 0 ));
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param Tkey
- \param Klen
- \param RetrieveSw
-*/
-xbShort xbNtx::FindKey( const char * Tkey, xbShort Klen, xbShort RetrieveSw )
-{
- /* This routine sets the current key to the found key */
- /* if RetrieveSw is true, the method positions the dbf record */
-
- xbShort rc,i;
- xbLong TempNodeNo;
-
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// if((rc = LockIndex( XB_LOCK )) != 0)
-// return rc;
-#endif
- if( NodeChain ){
- ReleaseNodeMemory( NodeChain );
- NodeChain = NULL;
- }
-
- if(( rc = GetHeadNode()) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return rc;
- }
-
- // If the index is empty
- if( HeadNode.StartNode == 0){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return XB_NOT_FOUND;
- }
-
- /* load first node */
- if(( rc = GetLeafNode( HeadNode.StartNode, 1 )) != 0 ){
- CurDbfRec = 0L;
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return rc;
- }
-
- /* traverse down the tree until it hits a leaf */
- while( GetLeftNodeNo( 0, CurNode )){ /* while interior node */
- TempNodeNo = GetLeafFromInteriorNode( Tkey, Klen );
-
-#if 1
- // GetLeafFromInteriorNode will return 0 if the key is found on
- // an inode. But the leftNodeNo will not be 0.
- if (TempNodeNo == 0 && GetLeftNodeNo( 0, CurNode ) != 0){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- if( RetrieveSw ) dbf->GetRecord( CurDbfRec );
- return XB_FOUND;
- }
-#endif
-
- if(( rc = GetLeafNode( TempNodeNo, 1 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- CurDbfRec = 0L;
- return rc;
- }
- }
-
- /* leaf level */
- for( i = 0; i < CurNode->Leaf.NoOfKeysThisNode; i++ ){
- rc = CompareKey( Tkey, GetKeyData( i, CurNode ) );
- if( rc == 0 ){
- CurNode->CurKeyNo = i;
- CurDbfRec = GetDbfNo( i, CurNode );
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- if( RetrieveSw ) dbf->GetRecord( CurDbfRec );
- return XB_FOUND;
- } else if( rc == 2 ) {
- CurNode->CurKeyNo = i;
- CurDbfRec = GetDbfNo( i, CurNode );
- if( RetrieveSw ) dbf->GetRecord( CurDbfRec );
- // If key is lessthan, without length involved,
- // Check to see if the substring match
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- if(CompareKey( Tkey, GetKeyData( i, CurNode ), Klen ) == 0)
- return XB_FOUND;
- else
- return XB_NOT_FOUND;
- }
- }
- CurNode->CurKeyNo = i;
- CurDbfRec = GetDbfNo( i, CurNode );
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- if( RetrieveSw ) dbf->GetRecord( CurDbfRec );
- return XB_NOT_FOUND;
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-xbShort xbNtx::CalcKeyLen( void )
-{
- xbShort rc;
- xbExpNode * TempNode;
- char FieldName[11];
- char Type;
- TempNode = IxExp->GetFirstTreeNode();
-
- if( !TempNode ) return 0;
- if( TempNode->Type == 'd' ) return TempNode->ResultLen;
- if( TempNode->Type == 'D' ) {
- memset( FieldName, 0x00, 11 );
- memcpy( FieldName, TempNode->NodeText, TempNode->Len );
- Type = dbf->GetFieldType( dbf->GetFieldNo( FieldName ));
- if( Type == 'N' || Type == 'F' )
- return TempNode->ResultLen;
- }
-
- if(( rc = IxExp->ProcessExpression()) != XB_NO_ERROR )
- return 0;
-
- TempNode = (xbExpNode *) IxExp->Pop();
- if( !TempNode ) return 0;
- rc = TempNode->DataLen;
-
-// if( !TempNode->InTree ) dbf->xbase->FreeExpNode( TempNode );
- if( !TempNode->InTree ) delete TempNode;
- return rc;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param IxName
- \param Exp
- \param Unique
- \param Overlay
-*/
-xbShort xbNtx::CreateIndex(const char * IxName, const char * Exp, xbShort Unique, xbShort Overlay )
-{
- xbShort i, KeyLen, rc;
-
- if( IsOpen()) CloseIndex();
- if( strlen( Exp ) > 255 ) return XB_INVALID_KEY_EXPRESSION;
- if( dbf->GetDbfStatus() == 0 ) return XB_NOT_OPEN;
-
- /* Get the index file name and store it in the class */
- SetFileName(IxName);
-
- /* check if the file already exists */
- if(((indexfp = fopen( GetFileName(), "r" )) != NULL ) && !Overlay ){
- fclose( indexfp );
- return XB_FILE_EXISTS;
- }
- else if( indexfp ) fclose( indexfp );
-
- if(( indexfp = fopen( GetFileName(), "w+b" )) == NULL ){
- return XB_OPEN_ERROR;
- }
-
-#ifdef XB_LOCKING_ON
- /*
- ** Must turn off buffering when multiple programs may be accessing
- ** index files.
- */
- setbuf( indexfp, NULL );
-#endif
-
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// if((rc = LockIndex( XB_LOCK )) != 0)
-// return rc;
-#endif
-
- /* parse the expression */
- IxExp = new xbExpn( dbf->xbase );
- if(( rc = IxExp->BuildExpressionTree( Exp, strlen( Exp ), dbf )) != XB_NO_ERROR )
- return rc;
-
-// ExpressionTree = dbf->xbase->GetTree();
-// dbf->xbase->SetTreeToNull();
-
- /* build the header record */
- memset( &HeadNode, 0x00, sizeof( NtxHeadNode ));
- HeadNode.Signature = 0x6; // Clipper 5.x
- HeadNode.Version = 1;
- HeadNode.StartNode = 1024L;
- KeyLen = CalcKeyLen();
-
- // TODO
- // What is the Clipper key length limit?
- if( KeyLen == 0 || KeyLen > 100 ){ /* 100 byte key length limit */
-
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return XB_INVALID_KEY;
- } else {
- HeadNode.KeyLen = KeyLen;
- }
-
- // This is not the algorithm that Clipper uses. I cant figure out
- // what they use from looking at the examples.
- // This is correct tho.
- HeadNode.KeysPerNode = (xbUShort)
- (( XB_NTX_NODE_SIZE - (2 * sizeof( xbUShort ))) / (HeadNode.KeyLen + 10 )) - 1;
- if( HeadNode.KeysPerNode % 2 )
- HeadNode.KeysPerNode--;
-
- HeadNode.HalfKeysPerNode = (xbUShort) HeadNode.KeysPerNode / 2;
- HeadNode.KeySize = HeadNode.KeyLen + 8;
-// while(( HeadNode.KeySize % 4 ) != 0 ) HeadNode.KeySize++; /* multiple of 4*/
- HeadNode.Unique = Unique;
- strncpy( HeadNode.KeyExpression, Exp, 255 );
-
- rc=AllocKeyBufs();
- if(rc) {
- fclose(indexfp);
- return rc;
- };
-
- if(( rc = PutHeadNode( &HeadNode, indexfp, 0 )) != 0 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return rc;
- }
- /* write node #1 all 0x00 */
- for( i = 0; i < XB_NTX_NODE_SIZE; i++ ){
- if(( fwrite( "\x00", 1, 1, indexfp )) != 1 ){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- fclose( indexfp );
- return XB_WRITE_ERROR;
- }
- }
-
- if((rc = GetLeafNode(HeadNode.StartNode, 1)) != 0){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return rc;
- }
-
- for( i = 0; i < HeadNode.KeysPerNode + 1; i++ )
- CurNode->offsets[i] = (i * HeadNode.KeySize) +
- 2 + (2 * (HeadNode.KeysPerNode + 1));
-
- if((rc = PutLeafNode(HeadNode.StartNode, CurNode )) != 0){
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return rc;
- }
-
-#ifdef XB_LOCKING_ON
-// if( dbf->GetAutoLock() )
-// LockIndex( XB_UNLOCK );
-#endif
- return dbf->AddIndexToIxList( index, GetFileName());
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param RecNo
- \param n
- \param NodeNo
-*/
-xbShort xbNtx::PutLeftNodeNo( xbShort RecNo, xbNodeLink *n, xbLong NodeNo )
-{
- /* This routine sets n node's leftnode number */
- NtxLeafNode *temp;
- char *p;
- xbUShort itemOffset;
- if( !n ) return XB_INVALID_NODELINK;
- temp = &n->Leaf;
- if( RecNo < 0 || RecNo > HeadNode.KeysPerNode)
- return XB_INVALID_KEY;
- p = temp->KeyRecs;
- itemOffset = GetItemOffset(RecNo, n, 1);
- p += itemOffset;
- dbf->xbase->PutLong( p, NodeNo );
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param RecNo
- \param n
- \param DbfNo
-*/
-xbShort xbNtx::PutDbfNo( xbShort RecNo, xbNodeLink *n, xbLong DbfNo )
-{
- /* This routine sets n node's dbf number */
-
- NtxLeafNode *temp;
- char *p;
- xbUShort itemOffset;
- if( !n ) return XB_INVALID_NODELINK;
- temp = &n->Leaf;
- if( RecNo < 0 || RecNo > (HeadNode.KeysPerNode))
- return XB_INVALID_KEY;
- itemOffset = GetItemOffset(RecNo, n, 1);
- p = temp->KeyRecs;
- p += itemOffset;
- p += 4;
- dbf->xbase->PutLong( p, DbfNo );
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Short description.
-/*!
- \param l
- \param n
-*/
-xbShort xbNtx::PutLeafNode( xbLong l, xbNodeLink *n )
-{
- NtxLeafNode *temp;
- char *p;
-
- if(( _fseek( indexfp, (xbOffT)l , SEEK_SET )) != 0 ){
- fclose( indexfp );
- return XB_SEEK_ERROR;
- }
-
- temp = &n->Leaf;
- p = temp->KeyRecs;
- dbf->xbase->PutShort( p, temp->NoOfKeysThisNode );
-
- // The offsets at the head of each leaf are not necessarly in order.
- p += 2;
- for( int i = 0; i < HeadNode.KeysPerNode + 1; i++){
- dbf->xbase->PutShort( p, n->offsets[i] );
- p += 2;
- }
-
- if(( fwrite( &n->Leaf.KeyRecs, XB_NTX_NODE_SIZE, 1, indexfp )) != 1 ){
- fclose( indexfp );
- return XB_WRITE_ERROR;
- }
-
- PutHeadNode(&HeadNode, indexfp, 1);
- return 0;
-}
-/************************************************************************/
-//! Short description.
-/*!
- \param Head
- \param f
- \param UpdateOnly
-*/
-xbShort xbNtx::PutHeadNode( NtxHeadNode * Head, FILE * f, xbShort UpdateOnly )
-{
- char buf[4];
- char *p;
-
- if(( _fseek( f, 0L, SEEK_SET )) != 0 ){
- fclose( f );
- return XB_SEEK_ERROR;
- }
-
- memset( buf, 0x00, 2 );
- dbf->xbase->PutUShort( buf, Head->Signature );
- if(( fwrite( &buf, 2, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- memset( buf, 0x00, 2 );
- dbf->xbase->PutUShort( buf, Head->Version );
- if(( fwrite( &buf, 2, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- memset( buf, 0x00, 4 );
- dbf->xbase->PutULong( buf, Head->StartNode );
- if(( fwrite( &buf, 4, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- memset( buf, 0x00, 4 );
- dbf->xbase->PutULong( buf, Head->UnusedOffset );
- if(( fwrite( &buf, 4, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- if( UpdateOnly ){
- fflush(indexfp);
- return XB_NO_ERROR;
- }
-
- memset( buf, 0x00, 2 );
- dbf->xbase->PutUShort( buf, Head->KeySize );
- if(( fwrite( &buf, 2, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- memset( buf, 0x00, 2 );
- dbf->xbase->PutUShort( buf, Head->KeyLen );
- if(( fwrite( &buf, 2, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- memset( buf, 0x00, 2 );
- dbf->xbase->PutUShort( buf, Head->DecimalCount );
- if(( fwrite( &buf, 2, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- memset( buf, 0x00, 2 );
- dbf->xbase->PutUShort( buf, Head->KeysPerNode );
- if(( fwrite( &buf, 2, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- memset( buf, 0x00, 2 );
- dbf->xbase->PutUShort( buf, Head->HalfKeysPerNode );
- if(( fwrite( &buf, 2, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- p = HeadNode.KeyExpression;
- while(*p){
- *p = tolower(*p);
- p++;
- }
-
- if(( fwrite( &Head->KeyExpression, 256, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- memset( buf, 0x00, 1 );
- buf[0] = Head->Unique;
- if(( fwrite( &buf, 1, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
-
- if(( fwrite( &Head->NotUsed, 745, 1, f )) != 1 ){
- fclose( f );
- return XB_WRITE_ERROR;
- }
- return 0;
-}
-
-xbShort xbNtx::TouchIndex( void )
-{
- xbShort rc;
- if (( rc = GetHeadNode()) != XB_NO_ERROR) return rc;
- HeadNode.Version++;
- if (( rc = PutHeadNode(&HeadNode, indexfp, 1)) != XB_NO_ERROR) return rc;
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Short description.
-/*!
- \param RecNo
- \param n
-*/
-xbShort xbNtx::PutKeyData( xbShort RecNo, xbNodeLink *n )
-{
- /* This routine copies the KeyBuf data into xbNodeLink n */
- NtxLeafNode *temp;
- char *p;
- xbShort i;
- xbUShort itemOffset;
- if( !n ) return XB_INVALID_NODELINK;
- temp = &n->Leaf;
- if( RecNo < 0 || RecNo > (HeadNode.KeysPerNode))
- return XB_INVALID_KEY;
- itemOffset = GetItemOffset(RecNo, n, 1);
- p = temp->KeyRecs;
- p += itemOffset;
- p += 8;
- for( i = 0; i < HeadNode.KeyLen; i++ ){
- *p = KeyBuf[i];
- p++;
- }
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Short description.
-/*!
- \param n
- \param pos
- \param d
- \param l
- \param w
-*/
-xbShort xbNtx::PutKeyInNode( xbNodeLink * n, xbShort pos, xbLong d, xbLong l, xbShort w )
-{
- /* check the node */
- if( !n ) return XB_INVALID_NODELINK;
- if( pos < 0 || pos > HeadNode.KeysPerNode ) return XB_INVALID_RECORD;
- if( n->Leaf.NoOfKeysThisNode >= HeadNode.KeysPerNode ) return XB_NODE_FULL;
-
- InsertKeyOffset(pos, n);
- PutKeyData( pos, n );
- PutDbfNo( pos, n, d );
- PutLeftNodeNo( pos, n, l );
- n->Leaf.NoOfKeysThisNode++;
- if( w )
- return PutLeafNode( n->NodeNo, n );
- else
- return 0;
-}
-/************************************************************************/
-//! Short description.
-/*!
- \param n1
- \param n2
- \param pos
- \param d
-*/
-xbShort xbNtx::SplitLeafNode( xbNodeLink *n1, xbNodeLink *n2, xbShort pos, xbLong d )
-{
- xbShort i,j,rc;
- xbShort temp;
- xbShort start;
- xbShort end;
-// xbShort length;
-
- if( !n1 || !n2 ) return XB_INVALID_NODELINK;
- if( pos < 0 || pos > HeadNode.KeysPerNode ) return XB_INVALID_RECORD;
-
-// length = strlen(KeyBuf);
-
- // If the new key goes in the first node.
- if( pos < HeadNode.HalfKeysPerNode ){
- // Setup key to insert into parent
- memcpy(PushItem.Key,
- GetKeyData(HeadNode.HalfKeysPerNode -1, n1), HeadNode.KeyLen);
- PushItem.RecordNumber = GetDbfNo(HeadNode.HalfKeysPerNode -1, n1);
- PushItem.Node = 0L;
- start = pos;
- end = HeadNode.HalfKeysPerNode - 1;
- temp = n1->offsets[end];
- for( i = end; i > start; i--)
- n1->offsets[i] = n1->offsets[i-1];
-
- n1->offsets[start] = temp;
- // Insert new key
- PutKeyData( start , n1 );
- PutDbfNo ( start , n1, d );
- } else {
- // If the passed-in key IS median key, just copy it.
- if( pos == HeadNode.HalfKeysPerNode ){
- memcpy(PushItem.Key, KeyBuf, HeadNode.KeyLen);
- PushItem.RecordNumber = d;
- start = pos;
- end = pos;
- } else {
- // Otherwise, the median key will be middle key because the
- // new key will be inserted somewhere above the middle.
- memcpy( PushItem.Key,
- GetKeyData(HeadNode.HalfKeysPerNode, n1),
- HeadNode.KeyLen);
- PushItem.RecordNumber = GetDbfNo(HeadNode.HalfKeysPerNode, n1);
- start = HeadNode.HalfKeysPerNode ;
- end = pos -1;
- }
- temp = n1->offsets[start];
- for( i = start; i < end; i++)
- n1->offsets[i] = n1->offsets[i+1];
-
- n1->offsets[end] = temp;
-
- // Insert new key
- PutKeyData( pos -1 , n1 );
- PutDbfNo ( pos -1 , n1, d );
- }
-
- // Dup the node data
- memcpy(n2->Leaf.KeyRecs, n1->Leaf.KeyRecs, XB_NTX_NODE_SIZE);
-
- // Dup the offsets
- for( i = 0; i < HeadNode.KeysPerNode +1; i++)
- n2->offsets[i] = n1->offsets[i];
-
- // Setup the second node
- for(j=0, i=HeadNode.HalfKeysPerNode; i < HeadNode.KeysPerNode; i++, j++ ){
- temp = n2->offsets[j];
- n2->offsets[j] = n2->offsets[i];
- n2->offsets[i] = temp;
- }
-
- // Get the last offset for both nodes
- temp = n2->offsets[j];
- n2->offsets[j] = n2->offsets[HeadNode.KeysPerNode];
- n2->offsets[HeadNode.KeysPerNode] = temp;
-
- // Set the new count of both nodes
- n2->Leaf.NoOfKeysThisNode = HeadNode.HalfKeysPerNode;
- n1->Leaf.NoOfKeysThisNode = HeadNode.HalfKeysPerNode;
-
- if(( rc = PutLeafNode( n1->NodeNo, n1 )) != 0 )
- return rc;
- if(( rc = PutLeafNode( n2->NodeNo, n2 )) != 0 )
- return rc;
- return 0;
-}
-/************************************************************************/
-//! Short description.
-/*!
- \param n1
- \param n2
- \param
-*/
-xbShort xbNtx::SplitINode( xbNodeLink *n1, xbNodeLink *n2, xbLong )
- /* parent, tempnode, tempnodeno */
-{
- xbShort i,j,rc;
- xbShort temp;
- xbShort pos = n1->CurKeyNo;
- xbShort start;
- xbShort end;
- xbLong n1LastNodeNo = 0;
-
- NtxItem oldPushItem;
- oldPushItem.Node = PushItem.Node;
- oldPushItem.RecordNumber = PushItem.RecordNumber;
- memcpy(oldPushItem.Key, PushItem.Key, sizeof(PushItem.Key));
-
- // n2->NodeNo = HeadNode.TotalNodes++;
- n2->NodeNo = GetNextNodeNo();
-
- // If the new key goes in the first node.
- if( pos < HeadNode.HalfKeysPerNode ){
- // Setup key to insert into parent
- memcpy(PushItem.Key,
- GetKeyData(HeadNode.HalfKeysPerNode -1, n1), HeadNode.KeyLen);
- PushItem.RecordNumber = GetDbfNo(HeadNode.HalfKeysPerNode -1, n1);
- PushItem.Node = n2->NodeNo;
- n1LastNodeNo = GetLeftNodeNo(HeadNode.HalfKeysPerNode -1, n1);
- start = pos;
- end = HeadNode.HalfKeysPerNode - 1;
-
- // Insert the new key.
- temp = n1->offsets[end];
- for( i = end; i > start; i--)
- n1->offsets[i] = n1->offsets[i-1];
- n1->offsets[start] = temp;
- } else {
- // If the passed-in key IS median key, just copy it.
- if( pos == HeadNode.HalfKeysPerNode ){
- PutLeftNodeNo(0, n2, oldPushItem.Node);
- // PushItem should remain the same, except for its left pointer
- PushItem.Node = n2->NodeNo;
-// start = pos; unused code
-// end = pos; unused code
- } else {
- // Otherwise, the median key will be middle key becasue the
- // new key will be inserted somewhere above the middle.
- memcpy( PushItem.Key,
- GetKeyData(HeadNode.HalfKeysPerNode, n1),
- HeadNode.KeyLen);
- PushItem.RecordNumber = GetDbfNo(HeadNode.HalfKeysPerNode, n1);
- PushItem.Node = n2->NodeNo;
- n1LastNodeNo = GetLeftNodeNo(HeadNode.HalfKeysPerNode, n1);
-
-// start = HeadNode.HalfKeysPerNode + 1;
- start = HeadNode.HalfKeysPerNode;
- end = pos -1;
-
- // Insert the new key.
- temp = n1->offsets[start];
- for( i = start; i < end; i++)
- n1->offsets[i] = n1->offsets[i+1];
- n1->offsets[end] = temp;
- pos--;
- }
- }
-
- /* restore original key */
- memcpy( KeyBuf, oldPushItem.Key, HeadNode.KeyLen + 1);
-
- // Insert new key
- PutKeyData( pos, n1 );
- PutDbfNo ( pos, n1, oldPushItem.RecordNumber);
- PutLeftNodeNo( pos, n1, GetLeftNodeNo (pos + 1, n1));
- PutLeftNodeNo( pos + 1 /* +1 ?*/, n1, oldPushItem.Node /* t */ );
-
- // Dup the node data into the new page
- memcpy(n2->Leaf.KeyRecs, n1->Leaf.KeyRecs, XB_NTX_NODE_SIZE);
-
- // Dup the offsets
- for( i = 0; i < HeadNode.KeysPerNode +1; i++){
- n2->offsets[i] = n1->offsets[i];
- }
-
- // Setup the second node
- for( j = 0, i = HeadNode.HalfKeysPerNode; i<HeadNode.KeysPerNode; i++,j++ ){
- temp = n2->offsets[j];
- n2->offsets[j] = n2->offsets[i];
- n2->offsets[i] = temp;
- }
-
- // Get the last offset for both nodes
- temp = n2->offsets[j];
- n2->offsets[j] = n2->offsets[HeadNode.KeysPerNode];
- n2->offsets[HeadNode.KeysPerNode] = temp;
- PutLeftNodeNo(HeadNode.HalfKeysPerNode, n1, n1LastNodeNo);
-
- // Set the new count of both nodes
- n2->Leaf.NoOfKeysThisNode = HeadNode.HalfKeysPerNode;
- n1->Leaf.NoOfKeysThisNode = HeadNode.HalfKeysPerNode;
-
- if((rc = PutLeafNode( n1->NodeNo,n1 )) != 0) return rc;
- if((rc = PutLeafNode( n2->NodeNo,n2 )) != 0) return rc;
- return 0;
-}
-/************************************************************************/
-//! Short description.
-/*!
- \param RecBufSw
- \param KeyBufSw
-*/
-xbShort xbNtx::CreateKey( xbShort RecBufSw, xbShort KeyBufSw )
-{
- /* RecBufSw 0 Use RecBuf */
- /* 1 Use RecBuf2 */
- /* KeyBufSw 0 Use KeyBuf */
- /* 1 Use KeyBuf2 */
-
- xbShort rc;
- xbExpNode * TempNode;
-
- if(( rc = IxExp->ProcessExpression( RecBufSw )) != XB_NO_ERROR )
- return rc;
- TempNode = (xbExpNode *) IxExp->Pop();
- if( !TempNode ) return XB_INVALID_KEY;
-
- if( KeyBufSw ){
- memset( KeyBuf2, 0x00, HeadNode.KeyLen + 1 );
- memcpy( KeyBuf2, TempNode->StringResult, XB_MIN(HeadNode.KeyLen + 1, TempNode->DataLen) );
- } else {
- memset( KeyBuf, 0x00, HeadNode.KeyLen + 1 );
- memcpy( KeyBuf, TempNode->StringResult, XB_MIN(HeadNode.KeyLen + 1, TempNode->DataLen) );
- }
-// if( !TempNode->InTree ) dbf->xbase->FreeExpNode( TempNode );
- if( !TempNode->InTree ) delete TempNode;
- return 0;
-}
-/************************************************************************/
-//! Short description.
-/*!
- \param key
-*/
-xbShort
-xbNtx::GetCurrentKey(char *key)
-{
- CreateKey(0, 0);
- memcpy(key, KeyBuf, HeadNode.KeyLen + 1);
- return 0;
-}
-/************************************************************************/
-//! Short description.
-/*!
- \param DbfRec
-*/
-xbShort xbNtx::AddKey( xbLong DbfRec )
-{
- /* This routine assumes KeyBuf contains the contents of the index to key */
-
- xbShort i,rc;
- xbNodeLink * TempNode;
- xbNodeLink * Tparent;
- xbLong TempNodeNo; /* new, unattached leaf node no */
-
- /* find node key belongs in */
- rc = FindKey( KeyBuf, HeadNode.KeyLen, 0 );
- if( rc == XB_FOUND && HeadNode.Unique )
- return XB_KEY_NOT_UNIQUE;
-
- /************************************************/
- /* section A - if room in node, add key to node */
- /************************************************/
-
- if( CurNode->Leaf.NoOfKeysThisNode < HeadNode.KeysPerNode ){
- if(( rc = PutKeyInNode( CurNode,CurNode->CurKeyNo,DbfRec,0L,1)) != 0)
- return rc;
- if(( rc = PutHeadNode( &HeadNode, indexfp, 1 )) != 0)
- return rc;
- return XB_NO_ERROR;
- }
-
- /***********************************************************************/
- /* section B - split leaf node if full and put key in correct position */
- /***********************************************************************/
-
- TempNode = GetNodeMemory();
- // Create a new page
- TempNode->NodeNo = GetNextNodeNo();
-
- rc = SplitLeafNode( CurNode, TempNode, CurNode->CurKeyNo, DbfRec );
- if( rc ) return rc;
-
- /* TempNode is on disk, now we have to point someone above to
- that node. Keep the NodeNo of the on disk new node.
- */
- TempNodeNo = TempNode->NodeNo;
- ReleaseNodeMemory( TempNode );
-
- /*
- PushItem also contains the key to put into the parent
- PushItem should point at TempNode
- */
- PushItem.Node = TempNodeNo;
-
- /*****************************************************/
- /* section C go up tree splitting nodes as necessary */
- /*****************************************************/
-
- Tparent = CurNode->PrevNode;
-
- while( Tparent && Tparent->Leaf.NoOfKeysThisNode >= HeadNode.KeysPerNode ){
- TempNode = GetNodeMemory();
- if( !TempNode )
- return XB_NO_MEMORY;
-
- rc = SplitINode( Tparent, TempNode, TempNodeNo );
- if( rc ) return rc;
- TempNodeNo = TempNode->NodeNo;
- ReleaseNodeMemory( TempNode );
- ReleaseNodeMemory( CurNode );
- CurNode = Tparent;
- CurNode->NextNode = NULL;
- Tparent = CurNode->PrevNode;
- }
-
- /************************************************************/
- /* Section D if CurNode is split root, create new root */
- /************************************************************/
-
- /* at this point
- CurNode = The node that was just split
- TempNodeNo = The new node split off from CurNode */
-
- if(CurNode->NodeNo == HeadNode.StartNode ){
- TempNode = GetNodeMemory();
- if( !TempNode )
- return XB_NO_MEMORY;
-
- memcpy( KeyBuf, PushItem.Key, HeadNode.KeyLen );
- PutKeyData( 0, TempNode );
- PutDbfNo ( 0, TempNode, PushItem.RecordNumber );
- PutLeftNodeNo( 0, TempNode, CurNode->NodeNo );
- PutLeftNodeNo( 1, TempNode, PushItem.Node );
- TempNode->NodeNo = GetNextNodeNo();
- TempNode->Leaf.NoOfKeysThisNode++;
- HeadNode.StartNode = TempNode->NodeNo;
- rc = PutLeafNode( TempNode->NodeNo, TempNode );
- if( rc ) return rc;
- rc = PutHeadNode( &HeadNode, indexfp, 1 );
- if( rc ) return rc;
- ReleaseNodeMemory( TempNode );
- return XB_NO_ERROR;
- }
- /**********************************/
- /* Section E make room in parent */
- /**********************************/
- InsertKeyOffset(Tparent->CurKeyNo, Tparent);
-
- /* put key in parent */
-
- i = Tparent->CurKeyNo;
- memcpy( KeyBuf, PushItem.Key, HeadNode.KeyLen);
- PutKeyData( i, Tparent );
-
- PutDbfNo( i, Tparent, PushItem.RecordNumber);
- PutLeftNodeNo( i , Tparent, CurNode->NodeNo );
- PutLeftNodeNo( i + 1 , Tparent, TempNodeNo );
- Tparent->Leaf.NoOfKeysThisNode++;
-
- rc = PutLeafNode( Tparent->NodeNo, Tparent );
- if( rc ) return rc;
- rc = PutHeadNode( &HeadNode, indexfp, 1 );
- if( rc ) return rc;
-
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param n
-*/
-xbShort xbNtx::UpdateParentKey( xbNodeLink * n )
-{
-/* this routine goes backwards thru the node chain looking for a parent
- node to update */
-
- xbNodeLink * TempNode;
-
- if( !n ) return XB_INVALID_NODELINK;
- if( !GetDbfNo( 0, n )){
- std::cout << "Fatal index error - Not a leaf node" << n->NodeNo << std::endl;
-// exit(0);
- return XB_NOT_LEAFNODE;
- }
- TempNode = n->PrevNode;
-
- while( TempNode ){
- if( TempNode->CurKeyNo < TempNode->Leaf.NoOfKeysThisNode ){
- memcpy(KeyBuf,GetKeyData(n->Leaf.NoOfKeysThisNode-1,n),HeadNode.KeyLen);
- PutKeyData( TempNode->CurKeyNo, TempNode );
- return PutLeafNode( TempNode->NodeNo, TempNode );
- }
- TempNode = TempNode->PrevNode;
- }
- return XB_NO_ERROR;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param n
-*/
-/* This routine queues up a list of nodes which have been emptied */
-void xbNtx::UpdateDeleteList( xbNodeLink *n )
-{
- n->NextNode = DeleteChain;
- DeleteChain = n;
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-/* Delete nodes from the node list - for now we leave the empty nodes */
-/* dangling in the file. Eventually we will remove nodes from the file */
-
-void xbNtx::ProcessDeleteList( void )
-{
- if( DeleteChain ){
- ReleaseNodeMemory( DeleteChain );
- DeleteChain = NULL;
- }
-}
-/***********************************************************************/
-//! Short description.
-/*!
-*/
-xbShort xbNtx::KeyWasChanged( void )
-{
- CreateKey( 0, 0 ); /* use KeyBuf, RecBuf */
- CreateKey( 1, 1 ); /* use KeyBuf2, RecBuf2 */
- if( CompareKey( KeyBuf, KeyBuf2, HeadNode.KeyLen ) != 0 )
- return 1;
- else
- return 0;
-}
-/***********************************************************************/
-//! Short description.
-/*!
- \param DbfRec
-*/
-xbShort xbNtx::DeleteKey( xbLong DbfRec )
-{
-/* this routine assumes the key to be deleted is in KeyBuf */
-
- xbShort rc;
-
- // FindKey will set CurNodeNo on evey page down to the
- // key being deleted. This is important. Plus we
- // need to be able to find the key to delete it.
- CurNode = NULL;
- if(( rc = FindKey( KeyBuf, DbfRec )) != XB_FOUND )
- return rc;
-
- // Then delete it
- // next sentence modified 8/20/03 - gkunkel
- if(( rc = DeleteKeyFromNode( CurNode->CurKeyNo, CurNode )) != XB_NO_ERROR )
- return rc;
-
- CurDbfRec = GetDbfNo( CurNode->CurKeyNo, CurNode );
- if(( rc = PutHeadNode( &HeadNode, indexfp, 1 )) != 0 )
- return rc;
- return XB_NO_ERROR;
-}
-
-//! Short description.
-/*!
- \param pos
- \param n
-*/
-xbShort
-xbNtx::DeleteKeyFromNode(xbShort pos, xbNodeLink *n )
-{
- xbNodeLink *TempNode;
- xbShort rc;
-
- // Check to see if this is an inode
- if( GetLeftNodeNo( 0 , n ) != 0 ){
- // Copy the rightmost key from the left node.
- TempNode = n;
- GetLeafNode ( GetLeftNodeNo (n->CurKeyNo, n), 1);
- while(( rc = GetLeftNodeNo( 0, CurNode )) != 0 )
- GetLeafNode ( GetLeftNodeNo (CurNode->Leaf.NoOfKeysThisNode, CurNode), 1);
-
- // Get the key Data
- strcpy (KeyBuf , GetKeyData( CurNode->Leaf.NoOfKeysThisNode -1, CurNode));
- PutKeyData( pos, TempNode );
-
- // Get the xbDbf no
- PutDbfNo (pos, TempNode, GetDbfNo( CurNode->Leaf.NoOfKeysThisNode -1, CurNode) );
-
- // We don't change the LeftNodeNo. determined later
- // Write the changed node
- PutLeafNode( TempNode->NodeNo, TempNode );
-
- // Now delete the key from the child
- TempNode = CurNode;
-
- if((rc = PutLeafNode( n->NodeNo,n )) != 0) return rc;
-
- return DeleteKeyFromNode( TempNode->Leaf.NoOfKeysThisNode -1, TempNode);
- } else {
- return RemoveKeyFromNode(pos, n);
- }
-}
-
-//! Short description.
-/*!
- \param pos
- \param n
-*/
-xbShort xbNtx::RemoveKeyFromNode( xbShort pos, xbNodeLink *n )
-{
- xbNodeLink *TempNode;
- xbNodeLink *sibling;
- xbNodeLink *parent;
- xbShort rc;
- xbLong newHeadNode = 0;
- xbBool harvest = false;
-
- // Here we are a leaf node..
-
- if( n->NodeNo == HeadNode.StartNode && n->Leaf.NoOfKeysThisNode == 1)
- // we are about to delete the last node from the head node.
- newHeadNode = GetLeftNodeNo( 0 , n );
-
- // Remove the key from the current node.
- DeleteKeyOffset(pos, n);
- n->Leaf.NoOfKeysThisNode--;
-
- // Check to see if the number of keys left is less then
- // 1/2 KeysPerNode
- if( ! ( n->NodeNo == HeadNode.StartNode )
- && n->Leaf.NoOfKeysThisNode < HeadNode.HalfKeysPerNode){
- // This observed clipper behavior.
- // If less then 1/2 keys per node, then merge with right sibling.
- // If no right sibling, merge with left sibling.
- parent = n->PrevNode;
-
- // If the parents cur key is the last key, then take the left node
- if( parent->CurKeyNo == parent->Leaf.NoOfKeysThisNode ){
- TempNode = CurNode;
- GetLeafNode( GetLeftNodeNo(parent->CurKeyNo -1, parent), 2 );
- sibling = CurNode;
- CurNode = TempNode;
-
- rc = JoinSiblings(parent, parent->CurKeyNo -1, sibling, n);
-
- // Harvest the empty node, if necessary Clipper keeps the old key
- // count on the node, to we can't set it to 0
- if( rc == XB_HARVEST_NODE )
- harvest = true;
-
- if((rc = PutLeafNode( n->NodeNo,n )) != 0) return rc;
- if((rc = PutLeafNode( sibling->NodeNo,sibling )) != 0) return rc;
- if((rc = PutLeafNode( parent->NodeNo,parent )) != 0) return rc;
-
- if(harvest){
- HeadNode.UnusedOffset = n->NodeNo;
- // Save the empty xbNodeLink
- // ReleaseNodeMemory(n);
- // We may have to delete a node from the parent
- return RemoveKeyFromNode( parent->CurKeyNo, parent);
- }
- } else {
- // Take the right node
- TempNode = CurNode;
- GetLeafNode( GetLeftNodeNo(parent->CurKeyNo + 1, parent), 2 );
- sibling = CurNode;
- CurNode = TempNode;
-
- rc = JoinSiblings(parent, parent->CurKeyNo, n, sibling);
- // Harvest the empty node, if necessary Clipper keeps the old key
- // count on the node, to we can't set it to 0
- if( rc == XB_HARVEST_NODE )
- harvest = true;
-
- if((rc = PutLeafNode( n->NodeNo,n )) != 0) return rc;
- if((rc = PutLeafNode( sibling->NodeNo,sibling )) != 0) return rc;
- if((rc = PutLeafNode( parent->NodeNo,parent )) != 0) return rc;
-
- if( harvest ){
- HeadNode.UnusedOffset = sibling->NodeNo;
- // Save the empty xbNodeLink
- ReleaseNodeMemory( sibling );
-
- // Now the parents->CurKeyNo+1 left pointer is empty, and
- // we are about to delete the parent. So move the left node no
- // from the parents->CurKeyNo+1 to the parent->CurNodeNo
- PutLeftNodeNo( parent->CurKeyNo +1 , parent,
- GetLeftNodeNo( parent->CurKeyNo, parent ));
- // We may have to delete a node from the parent
- return RemoveKeyFromNode( parent->CurKeyNo, parent);
- }
- }
- } else {
- if( n->NodeNo == HeadNode.StartNode && n->Leaf.NoOfKeysThisNode == 0 ){
- // we are about to delete the last node from the head node.
- HeadNode.UnusedOffset = HeadNode.StartNode;
- HeadNode.StartNode = newHeadNode;
- }
-
- if((rc = PutLeafNode( n->NodeNo,n )) != 0) return rc;
- // If more then 1/2 keys per node -> done.
- return XB_NO_ERROR;
- }
- return XB_NO_ERROR;
-}
-
-//! Short description.
-/*!
- \param parent
- \param parentPos
- \param n1
- \param n2
-*/
-xbShort
-xbNtx::JoinSiblings(xbNodeLink *parent, xbShort parentPos, xbNodeLink *n1, xbNodeLink* n2)
-{
- // ASSUMES: keys in n1 are less then keys in n2
- //
- // Here, the contents of n1 need to be merged with n2. If n1 + parent_key
- // + n2 can all fit in n1, then leave n2 empty, and remove the key from the
- // parent.
- // Otherwise evenly distribute the keys from n1 and n2 over both, resetting
- // the parent.
-
- xbShort i, j;
- int totalKeys;
- int median;
-
- // if n1 has exactly (it will never have less) 1/2 keys per node
- // then put everything into n1.
- if((n1->Leaf.NoOfKeysThisNode + n2->Leaf.NoOfKeysThisNode + 1) <= HeadNode.KeysPerNode){
- int n1LastNodeNo = GetLeftNodeNo(n2->Leaf.NoOfKeysThisNode, n2);
- // Bring down the parent
- strcpy(KeyBuf, GetKeyData( parentPos, parent ));
- PutKeyData( n1->Leaf.NoOfKeysThisNode , n1);
- PutDbfNo ( n1->Leaf.NoOfKeysThisNode, n1, GetDbfNo( parentPos, parent ) );
- n1->Leaf.NoOfKeysThisNode++;
-
- // Copy over the rest of the keys
- for(i = n1->Leaf.NoOfKeysThisNode, j = 0; j < n2->Leaf.NoOfKeysThisNode; i++, j++){
- strcpy(KeyBuf, GetKeyData( j, n2 ));
- PutKeyData( i, n1);
- PutLeftNodeNo( i, n1, GetLeftNodeNo( j, n2) );
- PutDbfNo ( i , n1, GetDbfNo( j, n2 ) );
- }
- n1->Leaf.NoOfKeysThisNode += j;
- PutLeftNodeNo(n1->Leaf.NoOfKeysThisNode, n1, n1LastNodeNo);
-
- // We need a way to signal that this node will be harvested.
- // Clipper keeps the KeyCount on harvested nodes, it does NOT
- // set them to 0.
- return XB_HARVEST_NODE;
- } else {
- // Distribute the keys evenly. Of off by one, the extra
- // goes to n1.
-
- // If n1 contains the greater than keys, then at this point we
- // know that n1 has more than 1/2MKPN. therefore we copy
- // over untill we get to median. All the while removing
- // keys from n2. Then
-
- totalKeys = n1->Leaf.NoOfKeysThisNode + n2->Leaf.NoOfKeysThisNode + 1;
- median = (int) totalKeys/2;
-
- // If n1 has more keys then n2, then we need to copy the last keys
- // of n1 to the beginning of n2.
- // Leave HalfKeysPerNode+1 keys in n1, then the last key will
- // be copied up to the parent.
- if( n1->Leaf.NoOfKeysThisNode > HeadNode.HalfKeysPerNode ){
- // Bring down the parent
- InsertKeyOffset(0, n2);
- strcpy(KeyBuf, GetKeyData( parentPos, parent ));
- PutKeyData( 0 , n2);
- PutDbfNo ( 0, n2, GetDbfNo( parentPos, parent ) );
- n2->Leaf.NoOfKeysThisNode++;
- PutLeftNodeNo(0, n2, GetLeftNodeNo(n1->Leaf.NoOfKeysThisNode, n1));
- for( i = n1->Leaf.NoOfKeysThisNode -1; i > median; i-- ){
- // Put the key in n2
- InsertKeyOffset(0, n2);
- strcpy(KeyBuf, GetKeyData( i, n1 ));
- PutKeyData( 0, n2);
- PutLeftNodeNo( 0, n2, GetLeftNodeNo( i, n1) );
- PutDbfNo ( 0 , n2, GetDbfNo( i, n1 ) );
-
- // Remove the key from the current node.
- n1->Leaf.NoOfKeysThisNode--;
- n2->Leaf.NoOfKeysThisNode++;
- }
- // Copy up the last key from n1, that will become the new parent key.
- strcpy(KeyBuf, GetKeyData( n1->Leaf.NoOfKeysThisNode -1 , n1 ));
- PutKeyData( parentPos, parent);
- PutDbfNo ( parentPos , parent, GetDbfNo( n1->Leaf.NoOfKeysThisNode -1, n1) );
- n1->Leaf.NoOfKeysThisNode--;
- } else {
- xbLong n1LastLeftNodeNo;
- xbShort medianOffset = n2->Leaf.NoOfKeysThisNode - median -1;
- // Bring down the parent
- strcpy(KeyBuf, GetKeyData( parentPos, parent ));
- PutKeyData( n1->Leaf.NoOfKeysThisNode , n1);
- PutDbfNo ( n1->Leaf.NoOfKeysThisNode, n1, GetDbfNo( parentPos, parent ) );
- n1->Leaf.NoOfKeysThisNode++;
-
-// 8/20/03 gkunkel n1LastLeftNodeNo = GetLeftNodeNo(medianOffset, n2);
- PutLeftNodeNo( n1->Leaf.NoOfKeysThisNode, n1, GetLeftNodeNo(medianOffset, n2));
-
- // Moving the median to the parent may have to occur
- // before moving the other keys to n1. This we would have
- // to calcualte the correct offset from the median
- // Copy up the first key from n2 (the median),
- // that will become the new parent key.
- strcpy(KeyBuf, GetKeyData( medianOffset, n2 ));
- PutKeyData( parentPos, parent);
- PutDbfNo ( parentPos , parent, GetDbfNo(medianOffset, n2 ) );
- n1LastLeftNodeNo = GetLeftNodeNo(medianOffset, n2);
-
-// Still investigating the -1 thing with clipper, If anyone has clues,
-// please let me know - bob@synxis.com
-// if ( n1->Leaf.NoOfKeysThisNode >= (median - 1))
-// {
-// // Clipper, don't know why
-// PutLeftNodeNo(0, n2 , -1 );
-// std::cout << "Clipper hack" << std::endl;
-// }
-
- DeleteKeyOffset(medianOffset, n2);
- n2->Leaf.NoOfKeysThisNode--;
-
-// xbShort clipperMessedUpIndex = n1->Leaf.NoOfKeysThisNode;
- for( i = n1->Leaf.NoOfKeysThisNode, j = 0; j < medianOffset; i++, j++ ){
- strcpy(KeyBuf, GetKeyData( 0, n2 ));
- PutKeyData( i, n1);
- PutLeftNodeNo( i, n1, GetLeftNodeNo( 0, n2) );
- PutDbfNo ( i , n1, GetDbfNo( 0, n2 ) );
-
-// if( i == clipperMessedUpIndex){
-// // Clipper, don't know why
-// PutLeftNodeNo(0, n2 , -1 );
-// std::cout << "Clipper hack in loop i = " << i << std::endl;
-// }
-
- // Remove the key from the current node.
- DeleteKeyOffset(0, n2);
- n2->Leaf.NoOfKeysThisNode--;
- n1->Leaf.NoOfKeysThisNode++;
- }
- PutLeftNodeNo(n1->Leaf.NoOfKeysThisNode, n1, n1LastLeftNodeNo);
-
- }
- }
- return XB_NO_ERROR;
-}
-/************************************************************************/
-//! Short description.
-/*!
- \param option
-*/
-#ifdef XBASE_DEBUG
-xbShort xbNtx::CheckIndexIntegrity( const xbShort option )
-{
- /* if option = 1, print out some stats */
-
- xbShort rc;
- xbLong ctr = 1L;
-
- if ( option ) std::cout << "Checking NTX " << GetFileName() << std::endl;
- rc = dbf->GetRecord( ctr );
- while( ctr < dbf->NoOfRecords() ){
- ctr++;
- if( option ) std::cout << "Checking Record " << ctr << std::endl;
- if( !dbf->RecordDeleted() ){
- CreateKey( 0, 0 );
- rc = FindKey( KeyBuf, dbf->GetCurRecNo());
- if( rc != XB_FOUND ){
- if( option ){
- std::cout << "Record number " << dbf->GetCurRecNo()
- << " Not Found" << std::endl;
- std::cout << "Key = " << KeyBuf << std::endl;
- }
- return rc;
- }
- }
- if(( rc = dbf->GetRecord( ctr )) != XB_NO_ERROR )
- return rc;
- }
-
- if( option )
- std::cout << "Exiting with rc = " << rc << std::endl;
- return XB_NO_ERROR;
-}
-#endif
-/***********************************************************************/
-//! Short description.
-/*!
- \param statusFunc
-*/
-xbShort xbNtx::ReIndex(void (*statusFunc)(xbLong itemNum, xbLong numItems))
-{
- /* this method assumes the index has been locked in exclusive mode */
- xbLong l;
- xbShort rc, i, saveAutoLock;
- NtxHeadNode TempHead;
- FILE *t, *temp;
- xbString TempName;
-
- memcpy( &TempHead, &HeadNode, sizeof( struct NtxHeadNode ));
- TempHead.StartNode = 1024L;
- rc = dbf->xbase->DirectoryExistsInName( GetFileName() );
- if( rc ) {
- TempName.assign(GetFileName(), 0, rc);
- TempName += "TEMPFILE.NTX";
- } else
- TempName = "TEMPFILE.NTX";
-
- if(( t = fopen( TempName, "w+b" )) == NULL )
- return XB_OPEN_ERROR;
-
- if(( rc = PutHeadNode( &TempHead, t, 0 )) != 0 ){
- fclose( t );
- remove( TempName );
- return rc;
- }
-
- for( i = 0; i < XB_NTX_NODE_SIZE; i++ ){
- if(( fwrite( "\x00", 1, 1, t )) != 1 ){
- fclose( t );
- remove( TempName );
- return XB_WRITE_ERROR;
- }
- }
-
- temp = indexfp;
- indexfp = t;
-
- if(( rc = GetLeafNode(TempHead.StartNode, 1)) != 0 )
- return rc;
-
- for(i = 0; i < TempHead.KeysPerNode + 1; i++)
- CurNode->offsets[i] = (i * HeadNode.KeySize) +
- 2 + (2 * (HeadNode.KeysPerNode + 1));
-
- HeadNode.StartNode = TempHead.StartNode;
- if((rc = PutLeafNode(TempHead.StartNode, CurNode )) != 0)
- return rc;
-
- indexfp = temp;
-
- if( fclose( indexfp ) != 0 )
- return XB_CLOSE_ERROR;
-
- if( fclose( t ) != 0 )
- return XB_CLOSE_ERROR;
-
- if( remove( GetFileName() ) != 0 )
- return XB_CLOSE_ERROR;
-
- if( rename( TempName, GetFileName()) != 0 )
- return XB_WRITE_ERROR;
-
- if(( indexfp = fopen( GetFileName(), "r+b" )) == NULL )
- return XB_OPEN_ERROR;
-
- saveAutoLock = dbf->GetAutoLock();
- dbf->AutoLockOff();
-
- for( l = 1; l <= dbf->NoOfRecords(); l++ ){
- if(statusFunc)
- statusFunc(l, dbf->NoOfRecords());
-
- if(( rc = dbf->GetRecord(l)) != XB_NO_ERROR )
- return rc;
-
- if(!dbf->GetRealDelete() || !dbf->RecordDeleted()){
- /* Create the key */
- CreateKey( 0, 0 );
-
- /* add key to index */
- if(( rc = AddKey( l )) != XB_NO_ERROR )
- return rc;
- }
- }
- if(saveAutoLock)
- dbf->AutoLockOn();
-
- return XB_NO_ERROR;
-}
-
-//! Short description.
-/*!
-*/
-xbLong
-xbNtx::GetNextNodeNo()
-{
- struct stat FileStat;
- int rc;
- xbULong FileSize;
-
- if( HeadNode.UnusedOffset != 0){
- FileSize = HeadNode.UnusedOffset;
- HeadNode.UnusedOffset = 0;
- PutHeadNode(&HeadNode, indexfp, 1);
- return FileSize;
- }
-
- rc = fstat(fileno(indexfp), &FileStat);
- if( rc != 0 )
- return 0;
-
-
- FileSize = (xbULong)FileStat.st_size;
- // File offset is zero based, so the file size will be the
- // offset of the next page.
- return FileSize;
-}
-
-//! Short description.
-/*!
- \param buf
- \param len
-*/
-void xbNtx::GetExpression(char *buf, int len)
-{
- memcpy(buf, HeadNode.KeyExpression, len < 256 ? len : 256);
-}
-
-const char* xbNtx::GetExtWithDot(bool lower)
-{
- return lower? ".ntx": ".NTX";
-}
-
-xbUShort xbNtx::GetKeyLen()
-{
- return HeadNode.KeyLen;
-}
-
-const char* xbNtx::GetKeyExpression()
-{
- return HeadNode.KeyExpression;
-}
-
-void xbNtx::FreeNodesMemory()
-{
- ReleaseNodeMemory(NodeChain, true);
- NodeChain = 0;
-// ReleaseNodeMemory(CloneChain, true);
-// CloneChain = 0;
- ReleaseNodeMemory(FreeNodeChain, true);
- FreeNodeChain = 0;
- ReleaseNodeMemory(DeleteChain, true);
- DeleteChain = 0;
-}
-
-#endif /* XB_INDEX_NTX */
diff --git a/xbase64/xbntx.h b/xbase64/xbntx.h
deleted file mode 100755
index daa1aa7..0000000
--- a/xbase64/xbntx.h
+++ /dev/null
@@ -1,213 +0,0 @@
-/* xbntx.h
-
- Xbase64 project source code
-
- This file contains a header file for the xbNdx object, which is used
- for handling xbNdx type indices.
-
- Copyright (C) 1997,2003 Bob Cotton
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifndef __XB_NTX_H__
-#define __XB_NTX_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-#include <xbase64/xbase64.h>
-#include <string.h>
-
-/*! \file xbntx.h
-*/
-
-#define XB_NTX_NODE_SIZE 1024
-
-//! xbNtxHeadNode struct
-/*!
-*/
-
-struct NtxHeadNode { /* ntx header on disk */
- xbUShort Signature; /* Clipper 5.x or Clipper 87 */
- xbUShort Version; /* Compiler Version */
- /* Also turns out to be a last modified counter */
- xbLong StartNode; /* Offset in file for first index */
- xbULong UnusedOffset; /* First free page offset */
- xbUShort KeySize; /* Size of items (KeyLen + 8) */
- xbUShort KeyLen; /* Size of the Key */
- xbUShort DecimalCount; /* Number of decimal positions */
- xbUShort KeysPerNode; /* Max number of keys per page */
- xbUShort HalfKeysPerNode; /* Min number of keys per page */
- char KeyExpression[256]; /* Null terminated key expression */
- unsigned Unique; /* Unique Flag */
- char NotUsed[745];
-};
-
-//! xbNtxLeafNode struct
-/*!
-*/
-
-struct NtxLeafNode { /* ndx node on disk */
- xbUShort NoOfKeysThisNode;
- char KeyRecs[XB_NTX_NODE_SIZE];
-};
-
-
-//! xbNtxItem struct
-/*!
-*/
-
-struct NtxItem
-{
- xbULong Node;
- xbULong RecordNumber;
- char Key[256];
-};
-
-//! xbNtxNodeLink struct
-/*!
-*/
-
-struct xbNodeLink { /* ndx node memory */
- xbNodeLink * PrevNode;
- xbNodeLink * NextNode;
- xbUShort CurKeyNo; /* 0 - KeysPerNode-1 */
- xbLong NodeNo;
- struct NtxLeafNode Leaf;
- xbUShort * offsets;
-};
-
-//! xbNtx class
-/*!
-*/
-
-class XBDLLEXPORT xbNtx : public xbIndex
-{
-protected:
- NtxHeadNode HeadNode;
- NtxLeafNode LeafNode;
- xbLong NodeLinkCtr;
- xbLong ReusedNodeLinks;
- char Node[XB_NTX_NODE_SIZE];
- xbNodeLink * NodeChain; /* pointer to node chain of index nodes */
- xbNodeLink * FreeNodeChain; /* pointer to chain of free index nodes */
- xbNodeLink * CurNode; /* pointer to current node */
- xbNodeLink * DeleteChain; /* pointer to chain to delete */
-// xbNodeLink * CloneChain; /* pointer to node chain copy (add dup) */
- NtxItem PushItem;
-
-/* private functions */
- xbLong GetLeftNodeNo( xbShort, xbNodeLink * );
- xbShort CompareKey( const char *, const char *, xbShort );
- xbShort CompareKey( const char *, const char * );
- xbLong GetDbfNo( xbShort, xbNodeLink * );
- char * GetKeyData( xbShort, xbNodeLink * );
- xbUShort GetItemOffset ( xbShort, xbNodeLink *, xbShort );
- xbUShort InsertKeyOffset ( xbShort, xbNodeLink * );
- xbUShort GetKeysPerNode();
- virtual xbShort GetHeadNode();
- xbShort GetLeafNode( xbLong, xbShort );
- xbNodeLink * GetNodeMemory();
- xbLong GetNextNodeNo();
- void ReleaseNodeMemory(xbNodeLink *n, xbBool doFree = false);
- xbULong GetLeafFromInteriorNode( const char *, xbShort );
- xbShort CalcKeyLen();
- xbShort PutKeyData( xbShort, xbNodeLink * );
- xbShort PutLeftNodeNo( xbShort, xbNodeLink *, xbLong );
- xbShort PutLeafNode( xbLong, xbNodeLink * );
- xbShort PutHeadNode( NtxHeadNode *, FILE *, xbShort );
- xbShort TouchIndex();
- xbShort PutDbfNo( xbShort, xbNodeLink *, xbLong );
- xbShort PutKeyInNode( xbNodeLink *, xbShort, xbLong, xbLong, xbShort );
- xbShort SplitLeafNode( xbNodeLink *, xbNodeLink *, xbShort, xbLong );
- xbShort SplitINode( xbNodeLink *, xbNodeLink *, xbLong );
- xbShort AddToIxList();
- xbShort RemoveFromIxList();
- xbShort RemoveKeyFromNode( xbShort, xbNodeLink * );
- xbShort DeleteKeyFromNode( xbShort, xbNodeLink * );
- xbShort JoinSiblings(xbNodeLink *, xbShort, xbNodeLink *, xbNodeLink *);
- xbUShort DeleteKeyOffset( xbShort, xbNodeLink *);
- xbShort FindKey( const char *, xbShort, xbShort );
- xbShort UpdateParentKey( xbNodeLink * );
- xbShort GetFirstKey( xbShort );
- xbShort GetNextKey( xbShort );
- xbShort GetLastKey( xbLong, xbShort );
- xbShort GetPrevKey( xbShort );
- void UpdateDeleteList( xbNodeLink * );
- void ProcessDeleteList();
- xbShort FindKey( const char *, xbLong ); /* for a specific dbf no */
-
-public:
- xbNtx();
- xbNtx(xbDbf *);
- virtual ~xbNtx();
-
-/* note to gak - don't uncomment next line - it causes seg faults */
-// ~NTX() { if( NtxStatus ) CloseIndex(); }
-
- void DumpHdrNode ( xbShort Option );
- void DumpNodeRec ( xbLong );
- xbShort CreateIndex( const char *, const char *, xbShort, xbShort );
- xbLong GetTotalNodes();
- xbULong GetCurDbfRec() { return CurDbfRec; }
- void DumpNodeChain();
- xbShort CreateKey( xbShort, xbShort );
- xbShort GetCurrentKey(char *key);
- xbShort AddKey( xbLong );
- xbShort UniqueIndex() { return HeadNode.Unique; }
- xbShort DeleteKey( xbLong DbfRec );
- xbShort KeyWasChanged();
- xbShort FindKey( const char * );
- xbShort FindKey();
- xbShort FindKey( xbDouble );
- xbShort GetNextKey() { return GetNextKey( 1 ); }
- xbShort GetLastKey() { return GetLastKey( 0, 1 ); }
- xbShort GetFirstKey() { return GetFirstKey( 1 ); }
- xbShort GetPrevKey() { return GetPrevKey( 1 ); }
- xbShort ReIndex(void (*statusFunc)(xbLong itemNum, xbLong numItems) = 0) ;
- xbShort KeyExists( char * Key ) { return FindKey( Key, strlen( Key ), 0 ); }
- xbShort KeyExists( xbDouble );
- virtual void GetExpression(char *buf, int len);
-#ifdef XBASE_DEBUG
- xbShort CheckIndexIntegrity( xbShort Option );
-#endif
-
- virtual const char* GetExtWithDot(bool lower);
-
- protected:
- virtual xbUShort GetKeyLen();
- virtual const char* GetKeyExpression();
- virtual void FreeNodesMemory();
-};
-#endif /* __XB_NTX_H__ */
diff --git a/xbase64/xbretcod.h b/xbase64/xbretcod.h
deleted file mode 100755
index dd0748a..0000000
--- a/xbase64/xbretcod.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* xbretcod.h
-
- Xbase64 project source code
-
- This file contains a listing of all the Xbase return codes.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-/*! \file xbretcod.h
-*/
-
-#ifndef __XB_RETCODES_H__
-#define __XB_RETCODES_H__
-
-/***********************************************/
-/* Return Codes and Error Messages */
-
-#define XB_NO_ERROR 0
-#define XB_EOF -100
-#define XB_BOF -101
-#define XB_NO_MEMORY -102
-#define XB_FILE_EXISTS -103
-#define XB_OPEN_ERROR -104
-#define XB_WRITE_ERROR -105
-#define XB_UNKNOWN_FIELD_TYPE -106
-#define XB_ALREADY_OPEN -107
-#define XB_NOT_XBASE -108
-#define XB_INVALID_RECORD -109
-#define XB_INVALID_OPTION -110
-#define XB_NOT_OPEN -111
-#define XB_SEEK_ERROR -112
-#define XB_READ_ERROR -113
-#define XB_NOT_FOUND -114
-#define XB_FOUND -115
-#define XB_INVALID_KEY -116
-#define XB_INVALID_NODELINK -117
-#define XB_KEY_NOT_UNIQUE -118
-#define XB_INVALID_KEY_EXPRESSION -119
-#define XB_DBF_FILE_NOT_OPEN -120
-#define XB_INVALID_KEY_TYPE -121
-#define XB_INVALID_NODE_NO -122
-#define XB_NODE_FULL -123
-#define XB_INVALID_FIELDNO -124
-#define XB_INVALID_DATA -125
-#define XB_NOT_LEAFNODE -126
-#define XB_LOCK_FAILED -127
-#define XB_CLOSE_ERROR -128
-#define XB_INVALID_SCHEMA -129
-#define XB_INVALID_NAME -130
-#define XB_INVALID_BLOCK_SIZE -131
-#define XB_INVALID_BLOCK_NO -132
-#define XB_NOT_MEMO_FIELD -133
-#define XB_NO_MEMO_DATA -134
-#define XB_EXP_SYNTAX_ERROR -135
-#define XB_PARSE_ERROR -136
-#define XB_NO_DATA -137
-#define XB_UNKNOWN_TOKEN_TYPE -138
-#define XB_INVALID_FIELD -140
-#define XB_INSUFFICIENT_PARMS -141
-#define XB_TOO_MANY_PARMS -142
-#define XB_INVALID_FUNCTION -143
-#define XB_INVALID_FIELD_LEN -144
-#define XB_HARVEST_NODE -145
-#define XB_INVALID_DATE -146
-#define XB_INVALID_LOCK_OPTION -147
-#endif /* __XB_RETCODES_H__ */
-
diff --git a/xbase64/xbstring.cpp b/xbase64/xbstring.cpp
deleted file mode 100755
index 419014f..0000000
--- a/xbase64/xbstring.cpp
+++ /dev/null
@@ -1,1041 +0,0 @@
-/* xbstring.cpp
-
- Xbase64 project source code
-
- This file contains the xbString object methods
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifdef __GNU LesserG__
- #pragma implementation "xbstring.h"
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <xbase64/xbase64.h>
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-
-#ifdef HAVE_STRINGS_H
-#include <strings.h>
-#endif
-
-#ifdef STDC_HEADERS
-#include <stdarg.h>
-#endif
-
-#ifdef HAVE_CTYPE_H
-#include <ctype.h>
-#endif
-
-#include <xbase64/xbstring.h>
-//#include <xbase64/xbexcept.h>
-
-//#define free(x)
-
-/*! \file xbstring.cpp
-*/
-
-const char * xbString::NullString = "";
-
-//! Short description.
-/*!
-*/
-xbString::xbString() {
- ctor(NULL);
-}
-
-//! Short description.
-/*!
- \param size
-*/
-xbString::xbString(size_t size) {
- data = (char *)calloc(1, size);
- this->size = size;
-}
-
-//! Short description.
-/*!
- \param c
-*/
-xbString::xbString(char c) {
- ctor(NULL);
- *this = c;
-}
-
-//! Short description.
-/*!
- \param s
-*/
-xbString::xbString(const char *s) {
- ctor(s);
-}
-
-//! Short description.
-/*!
- \param s
-*/
-xbString::xbString(const xbString &s) {
- ctor((const char *)s);
-}
-
-//! Short description.
-/*!
- \param s
- \param maxlen
-*/
-xbString::xbString(const char *s, size_t maxlen) {
-#if 0
- size_t len = strlen(s);
-
- if(len < maxlen)
- maxlen = len;
-#endif
-
- size = maxlen + 1;
- data = (char *)calloc(1, size);
- strncpy(data, s, maxlen);
- data[maxlen] = 0;
-}
-
-//! Short description.
-/*!
-*/
-xbString::~xbString() {
- if (data != NULL)
- free(data);
-}
-
-//! Short description.
-/*!
- \param s
-*/
-void xbString::ctor(const char *s) {
- if (s == NULL) {
- data = NULL;
- size = 0;
- return;
- }
-
- size = strlen(s) + 1;
-
- data = (char *)calloc(1, size);
- strcpy(data, s);
-}
-
-//! Short description.
-/*!
- \param s
- \param maxlen
-*/
-void xbString::ctor(const char *s, size_t maxlen) {
-
- if (s == NULL) {
- data = NULL;
- size =0;
- return;
- }
- size = maxlen + 1;
- data = (char *)calloc(1, size);
- strncpy(data, s, maxlen);
- data[maxlen] = 0;
-}
-
-//! Short description.
-/*!
-*/
-xbString &xbString::operator=(char c) {
- if (data != NULL)
- free(data);
-
- data = (char *)calloc(1, 2);
- data[0] = c;
- data[1] = 0;
-
- size = 2;
-
- return (*this);
-}
-
-//! Short description.
-/*!
-*/
-xbString &xbString::operator=(const xbString &s) {
- if (data != NULL)
- free(data);
-
- const char *sd = s;
- if (sd == NULL) {
- data = NULL;
- size = 0;
- return (*this);
- }
-
- data = (char *)calloc(1, strlen(s) + 1);
- strcpy(data, s);
-
- size = strlen(data)+1;
-
- return (*this);
-}
-
-//! Short description.
-/*!
-*/
-xbString &xbString::operator=(const char *s) {
- if(data != NULL)
- free(data);
-
- if(s == NULL) {
- data = NULL;
- size = 0;
- return (*this);
- }
- data = (char *)calloc(1, strlen(s) + 1);
- strcpy(data, s);
- size = strlen(data) + 1;
- return (*this);
-}
-
-//! Short description.
-/*!
- \param size
-*/
-void xbString::resize(size_t size) {
- data = (char *)realloc(data, size);
- if( size > 0 )
- data[size-1] = 0;
- this->size = size;
-}
-
-//! Short description.
-/*!
-*/
-xbBool xbString::isNull() const {
- return( data == NULL );
-}
-
-//! Short description.
-/*!
-*/
-xbBool xbString::isEmpty() const {
- if( data == NULL )
- return true;
- if( data[0] == 0 )
- return true;
- return false;
-}
-
-//! Short description.
-/*!
-*/
-size_t xbString::len() const {
- return( data ? strlen(data) : 0 );
-}
-
-//! Short description.
-/*!
-*/
-size_t xbString::length() const {
- return len();
-}
-
-//! Short description.
-/*!
-*/
-xbString xbString::copy() const {
- return( *this );
-}
-
-//! Short description.
-/*!
- \param format
-*/
-xbString &xbString::sprintf(const char *format, ...) {
- va_list ap;
- va_start(ap, format);
-
- if (size < 256)
- resize(256); // make string big enough
-
-#ifdef HAVE_VSNPRINTF
- if (vsnprintf(data, size, format, ap) == -1)
- data[size-1] = 0;
-#else
-# if HAVE_VSPRINTF
- vsprintf(data, format, ap);
-# else
-# error "You have neither vsprintf nor vsnprintf!!!"
-# endif
-#endif
-
- resize(strlen(data)+1); // truncate
- va_end(ap);
- return (*this);
-}
-
-//! Short description.
-/*!
-*/
-xbString::operator const char *() const {
- return (data != NULL) ? data : NullString;
-}
-
-//! Short description.
-/*!
-*/
-xbString &xbString::operator-=(const char *s) {
- if( s == NULL ) return (*this);
- int len = strlen(s);
- int oldlen = this->len();
-
- data = (char *)realloc(data, oldlen+len+1);
- if( oldlen == 0 ) data[0] = 0;
-
- // looking for an occurence of space in the first string
- char *lftspc = strchr(data,' ');
- if( lftspc==NULL ) { // left string has no spaces
- strcat(data,s);
- } else { // left string has one or more spaces
- int numspc = strlen(lftspc);
- strcpy(lftspc,s);
- while( numspc-- > 0 ) strcat(lftspc," ");
- }
-
- size += len;
- return (*this);
-}
-
-//! Short description.
-/*!
-*/
-xbString &xbString::operator+=(const char *s) {
- if (s == NULL)
- return (*this);
- int len = strlen(s);
- int oldlen = this->len();
-
- data = (char *)realloc(data, oldlen+len+1);
- if (oldlen == 0)
- data[0] = 0;
- strcat(data, s);
-
- size += len;
- return (*this);
-}
-
-//! Short description.
-/*!
-*/
-xbString &xbString::operator+=(char c) {
- int len = 1;
- int oldlen = this->len();
-
- data = (char *)realloc(data, oldlen+len+1);
- data[oldlen] = c;
- data[oldlen+1] = 0;
-
- size++;
-
- return (*this);
-}
-
-//! Short description.
-/*!
-*/
-const char *xbString::getData() const {
- return data ? data : NullString;
-}
-
-//! Short description.
-/*!
-*/
-const char *xbString::c_str() const {
- return data ? data : NullString;
-}
-
-//! Short description.
-/*!
-*/
-void xbString::toLowerCase() {
- int len = this->len();
- for (int i=0;i<len;i++)
- data[i] = (char)tolower(data[i]);
-}
-
-
-//! Short description.
-/*!
-*/
-void xbString::toUpperCase() {
- int len = this->len();
- for (int i=0;i<len;i++)
- data[i] = (char)toupper(data[i]);
-}
-
-
-//! Short description.
-/*!
- \param c
-*/
-int xbString::pos(char c) {
- if (data == NULL)
- return (-1);
-
- const char *p = strchr(data, c);
-
- if (p == NULL)
- return (-1);
-
- return p-data;
-}
-
-//! Short description.
-/*!
- \param s
-*/
-int xbString::pos(const char* s) {
- if (data == NULL)
- return (-1);
-
- const char *p = strstr(data, s);
-
- if (p == NULL)
- return (-1);
-
- return p-data;
-}
-
-//! Short description.
-/*!
- \param num
-*/
-void xbString::setNum(long num) {
- sprintf("%ld", num);
-}
-
-//! Short description.
-/*!
- \param fmt
- \param num
-*/
-
-void xbString::setNum( char * fmt, double num) {
- xbString f;
- f = "%";
- f += fmt;
- f += "f";
- sprintf( f.getData(), num);
-}
-
-
-//! Short description.
-/*!
-*/
-XBDLLEXPORT xbBool operator==(const xbString &s1, const char *s2) {
- if (s2 == NULL) {
- if (s1.getData() == NULL)
- return true;
- return false;
- }
-
- if ((s2[0] == 0) && s1.getData() == NULL)
- return true;
-
- if (s1.getData() == NULL)
- return false;
-
- return (strcmp(s1, s2) == 0);
-}
-
-//! Short description.
-/*!
-*/
-XBDLLEXPORT xbBool operator!=(const xbString &s1, const char *s2) {
- if (s2 == NULL) {
- if (s1.getData() == NULL)
- return false;
- return true;
- }
-
- if ((s2[0] == 0) && s1.getData() == NULL)
- return false;
-
- if (s1.getData() == NULL)
- return true;
-
- return (strcmp(s1, s2) != 0);
-}
-
-//! Short description.
-/*!
-*/
-xbBool xbString::operator==( const xbString &s2 ) const {
- if( data == NULL || data[0] == 0 ) {
- if( s2.data == NULL || s2.data[0] == 0 ) return true; // NULL == NULL
- return false; // NULL == !NULL
- } else {
- if( s2.data == NULL || s2.data[0] == 0 ) return false; // !NULL == NULL
- return strcmp(data,s2.data) == 0; //!NULL == !NULL
- }
-}
-
-//! Short description.
-/*!
-*/
-xbBool xbString::operator!=( const xbString &s2 ) const {
- if( data == NULL || data[0] == 0 ) {
- if( s2.data == NULL || s2.data[0] == 0 ) return false; // NULL != NULL
- return true; // NULL != !NULL
- } else {
- if( s2.data == NULL || s2.data[0] == 0 ) return true; // !NULL != NULL
- return strcmp(data,s2.data) != 0; //!NULL != !NULL
- }
-}
-
-//! Short description.
-/*!
-*/
-xbBool xbString::operator< ( const xbString &s2 ) const {
- if( data == NULL || data[0] == 0 ) {
- if( s2.data == NULL || s2.data[0] == 0 ) return false; // NULL < NULL
- return true; // NULL < !NULL
- } else {
- if( s2.data == NULL || s2.data[0] == 0 ) return false; // !NULL < NULL
- return strcmp(data,s2.data) < 0; //!NULL < !NULL
- }
-}
-
-//! Short description.
-/*!
-*/
-xbBool xbString::operator> ( const xbString &s2 ) const {
- if( data == NULL || data[0] == 0 ) {
- if( s2.data == NULL || s2.data[0] == 0 ) return false; // NULL > NULL
- return false; // NULL > !NULL
- } else {
- if( s2.data == NULL || s2.data[0] == 0 ) return true; // !NULL > NULL
- return strcmp(data,s2.data) > 0; //!NULL > !NULL
- }
-}
-
-//! Short description.
-/*!
-*/
-xbBool xbString::operator<=( const xbString &s2 ) const {
- if( data == NULL || data[0] == 0 ) {
- if( s2.data == NULL || s2.data[0] == 0 ) return true; // NULL <= NULL
- return true; // NULL <= !NULL
- } else {
- if( s2.data == NULL || s2.data[0] == 0 ) return false; // !NULL <= NULL
- return strcmp(data,s2.data) <= 0; //!NULL <= !NULL
- }
-}
-
-//! Short description.
-/*!
-*/
-xbBool xbString::operator>=( const xbString &s2 ) const {
- if( data == NULL || data[0] == 0 ) {
- if( s2.data == NULL || s2.data[0] == 0 ) return true; // NULL >= NULL
- return false; // NULL >= !NULL
- } else {
- if( s2.data == NULL || s2.data[0] == 0 ) return true; // !NULL >= NULL
- return strcmp(data,s2.data) >= 0; //!NULL >= !NULL
- }
-}
-
-//! Short description.
-/*!
-*/
-XBDLLEXPORT std::ostream& operator<< ( std::ostream& os,
- const xbString& xbs ) {
- return os << xbs.data;
-}
-
-//! Short description.
-/*!
-*/
-XBDLLEXPORT xbString operator-(const xbString &s1, const xbString &s2) {
- xbString tmp(s1.getData());
- tmp -= s2;
- return tmp;
-}
-
-//! Short description.
-/*!
-*/
-XBDLLEXPORT xbString operator+(const xbString &s1, const xbString &s2) {
- xbString tmp(s1.getData());
- tmp += s2;
- return tmp;
-}
-
-//! Short description.
-/*!
-*/
-XBDLLEXPORT xbString operator+(const xbString &s1, const char *s2) {
- xbString tmp(s1.getData());
- tmp += s2;
- return tmp;
-}
-
-//! Short description.
-/*!
-*/
-XBDLLEXPORT xbString operator+(const char *s1, const xbString &s2) {
- xbString tmp(s1);
- tmp += s2;
- return tmp;
-}
-
-//! Short description.
-/*!
-*/
-XBDLLEXPORT xbString operator+(const xbString &s1, char c2) {
- xbString tmp(s1.getData());
- tmp += c2;
- return tmp;
-}
-
-//! Short description.
-/*!
-*/
-XBDLLEXPORT xbString operator+(char c1, const xbString &s2) {
- xbString tmp(c1);
- tmp += s2;
- return tmp;
-}
-
-//! Short description.
-/*!
- \param pos
- \param c
-*/
-void xbString::putAt(size_t pos, char c) {
- if (pos>len())
- return;
-
- data[pos] = c;
-}
-
-//! Short description.
-/*!
- \param str
- \param pos
- \param n
-*/
-xbString& xbString::assign(const xbString& str, size_t pos, int n)
-{
- if(data){
- free(data);
- data = 0;
- }
-
- if(str.len() <= pos){
- size = 0;
- return (*this);
- }
-
- if(str.len() < pos + n){
- n = str.len() - pos;
- }
-
- const char *d = str;
-
- if (n == -1){
-// data = (char *)malloc(str.len()-pos+1); ms win/nt bug fix
- data = (char *)calloc(str.len()-pos+1, sizeof( char ));
- strcpy(data, d+pos);
- size = str.len()-pos+1;
- }
- else
- {
-// data = (char *)malloc(n); ms win/nt bug fix
-// boundschecker flags the next line as a memory leak
-// but this is a valid memory allocation
- data = (char *)calloc(n + 1, sizeof(char));
- strncpy(data, d + pos, n);
- data[n] = '\0';
- size = n + 1;
- }
-
- return (*this);
-}
-
-//! Short description.
-/*!
- \param str
- \param n
-*/
-xbString& xbString::assign(char* str, int n)
-{
- if(data)
- {
- free(data);
- data = 0;
- }
-
- data = (char *)calloc(n + 1, sizeof(char));
- strncpy(data, str, n);
- data[n] = 0;
- size = n + 1;
-
- return (*this);
-}
-
-//! Short description.
-/*!
-*/
-void xbString::trim() {
- int l = len()-1;
-
- for (;;) {
- if (data[l] != ' ')
- break;
- data[l] = 0;
- if (l == 0)
- break;
- l--;
- }
-}
-
-//! Short description.
-/*!
- \param pos
- \param n
-*/
-xbString &xbString::remove(size_t pos, int n) {
- if (data == NULL)
- return (*this);
- if (data[0] == 0)
- return (*this);
-
- size_t l = len();
-
- if (pos>l)
- return (*this);
- if (n == 0)
- return (*this);
- if (n > int(l-pos))
- n = l-pos;
- if (n<0)
- n = l-pos;
- memcpy(data+pos, data+pos+n, l-pos-n+1);
-
- return (*this);
-}
-
-//! Short description.
-/*!
- \param pos
- \param n
-*/
-xbString xbString::mid(size_t pos, int n) const {
- if (data == NULL)
- return (*this);
- if (data[0] == 0)
- return (*this);
-
- size_t l = len();
-
- if (pos>l)
- return (*this);
- if (n == 0)
- return (*this);
- if (n > int(l-pos))
- n = l-pos;
- if (n<0)
- n = l-pos;
-
- xbString s;
- s.data = (char *)malloc(n+1);
- strncpy(s.data, data+pos, n);
- s.data[n] = 0;
-
- return s;
-}
-
-//! Short description.
-/*!
- \param from
- \param to
-*/
-void xbString::swapChars( char from, char to )
-{
- size_t i;
- for( i = 0; i < size; i++ )
- if( data[i] == from )
- data[i] = to;
-}
-
-//! Short description.
-/*!
- \param c
-*/
-void xbString::zapChar( char c )
-{
- /* routine zaps every occurrence of a given character from the string */
- int p;
- size_t s;
- p = pos( c );
- while( p != -1 ){
- for( s = (size_t) p; s < size; s++ )
- putAt( s, data[s+1]);
- resize( size-1 );
- p = pos( c );
- }
-}
-
-//! Short description.
-/*!
- \param c
-*/
-int xbString::countChar( char c ) const
-{
- int i,j;
-
- for( i = 0,j = 0; i < (int) size; i++ )
- if( data[i] == c )
- j++;
-
- return j;
-}
-
-
-//! Short description.
-/*!
- \param c
-*/
-
-void xbString::addBackSlash( char c )
-{
- /* prefixes all char "c" with a backslash */
- int i, t, cnt;
- xbString ws;
-
- cnt = countChar( c );
- if( !cnt )
- return;
-
- ws.resize( size+cnt );
- for( i = 0, t = 0; i < (int)size; i++ ){
- if( data[i] == c )
- ws.putAt( t++, '\\' );
- ws.putAt( t++, data[i] );
- }
- ws.putAt( t, 0 );
- *this = ws.getData();
-}
-
-//! Short description.
-/*!
- \param cnt
-*/
-void xbString::lTrunc( size_t cnt )
-{
- /* left truncate cnt butes */
-
- char * ndata;
- char * p;
- if( cnt >= size ){
- ctor(0);
- return;
- }
- ndata = (char *) malloc( size - cnt );
- p = data;
- p += cnt;
- strcpy( ndata, p );
- free( data );
- data = ndata;
- size = size - cnt;
-}
-
-
-//! Short description.
-/*!
- \param c
-*/
-void xbString::zapLeadingChar( char c )
-{
- /* left truncate all of character c */
-
- int len = 0;
- char *p;
- p = data;
- while( *p && *p == c ){
- len++;
- p++;
- }
- if( len )
- lTrunc( len );
-}
-
-
-//! Short description.
-/*!
-*/
-xbBool xbString::hasAlphaChars() const
-{
- for( int i = 0; i < (int) size; i++ )
- if( isalpha( data[i] ))
- return 1;
- return 0;
-}
-
-
-//! Short description.
-/*!
- \param out
-*/
-
-int xbString::cvtHexChar( char & out )
-{
- /* this routine converts a four byte string in the format of 0x00
- to a one byte char value
-
- the first four bytes of the string must be in the format 0x00
- anything past the first four bytes is disregarded
-
- returns -1 on error
- 0 on success
- */
-
- int j, k;
- char c;
-
- if( len() < 4 || data[0] != '0' || (data[1]!='X' && data[1]!='x' ))
- return -1;
-
- c = toupper( data[2] );
- j = ( c > '9' ? c - 'A' + 10 : c - '0' );
- c = toupper( data[3] );
- k = ( c > '9' ? c - 'A' + 10 : c - '0' );
- j = ( j << 4 ) + k;
-
- out = ( char ) j;
- return 0;
-}
-
-//! Short description.
-/*!
- \param out
-*/
-int xbString::cvtHexString( xbString & out )
-{
- /* this routine converts a string of four byte format of 0x00
- to a string of one byte chars
-
- returns -1 on error
- 0 on success
- */
-
- char c;
- xbString ws;
- ws = data;
- out = "";
- while( ws.len()){
- if( ws.cvtHexChar( c ))
- return -1;
- out += c;
- ws.lTrunc( 4 );
- }
- return 0;
-}
-//! Short description.
-/*!
- \param src
- \param delim
- \param skipcnt
- \param opt
-*/
-int xbString::setFromDelimitedInput( const char * src,
- char delim, int skipcnt, int opt )
-{
- /* opt values
-
- 1 - ignore delimiters between quotes
- 2 - treat crlf characters as delimters
- 3 - both options 1 and 2
- */
-
- int len;
- int curpos = 0;
- int quotesw = 0;
- const char * s;
- const char * anchor;
-
- /* skip past skipcnt delimiters */
- s = src;
- while( *s && curpos < skipcnt ){
- if( *s == delim && !quotesw )
- curpos++;
- else if (( opt == 1 || opt == 3 ) && *s == '"' )
- quotesw = (quotesw) ? 0 : 1;
- s++;
- }
- /* at the beginning of the field */
- anchor = s;
- while( *s && ( *s != delim || ( *s == delim && quotesw ))){
- if( *s == '"' )
- quotesw = (quotesw) ? 0 : 1;
- s++;
- }
- len = s - anchor;
-
- /* copy data */
- data = (char *) realloc( data, len+1 );
- memcpy( data, anchor, len );
- data[len] = 0;
- this->size = len+1;
-
- if( opt == 2 || opt == 3 ){
- zapChar( 0x0a );
- zapChar( 0x0c );
- zapChar( 0x0d );
- }
-
- return len;
-}
-
diff --git a/xbase64/xbstring.h b/xbase64/xbstring.h
deleted file mode 100755
index 9896cdc..0000000
--- a/xbase64/xbstring.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/* xbstring.h
-
- Xbase64 project source code
-
- This file contains the Class definition for a xbString object.
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifndef __XBSTRING_H__
-#define __XBSTRING_H__
-
-#ifdef __GNU LesserG__
-#pragma interface
-#endif
-
-#ifdef __WIN32__
-#include <xbase64/xbwincfg.h>
-#else
-#include <xbase64/xbconfig.h>
-#endif
-
-#include <stdlib.h>
-#include <iostream>
-
-/*! \file xbstring.h
-*/
-
-//! xbString class
-/*!
-*/
-class XBDLLEXPORT xbString {
-public:
- enum {npos = -1};
-
- xbString();
- xbString(size_t size);
- xbString(char c);
- xbString(const char *s);
- xbString(const char *s, size_t maxlen);
- xbString(const xbString &s);
- virtual ~xbString();
-
- operator const char *() const;
- char operator[](int n) { return data[n]; }
-
- xbString &operator=(const xbString &s);
- xbString &operator=(const char *s);
- xbString &operator=(char c);
- xbString &operator+=(const char *s);
- xbString &operator+=(char c);
- xbString &operator-=(const char *s);
-
- xbBool operator == ( const xbString& ) const;
- xbBool operator != ( const xbString& ) const;
- xbBool operator < ( const xbString& ) const;
- xbBool operator > ( const xbString& ) const;
- xbBool operator <= ( const xbString& ) const;
- xbBool operator >= ( const xbString& ) const;
-
- friend XBDLLEXPORT std::ostream& operator << ( std::ostream&,
- const xbString& );
- void addBackSlash( char c );
- xbString &assign(const xbString& str, size_t pos = 0, int n = npos);
- xbString &assign(char* str, int n);
- xbString copy() const;
- const char *c_str() const;
- int countChar( char c ) const;
- int cvtHexChar( char & out );
- int cvtHexString( xbString & out );
- char getCharacter( int n ) const { return data[n]; }
- const char *getData() const;
- xbBool hasAlphaChars() const;
- xbBool isEmpty() const;
- xbBool isNull() const;
- size_t len() const;
- size_t length() const;
- xbString mid(size_t pos = 0, int n = npos) const;
- void lTrunc( size_t cnt );
- int pos(char c);
- int pos(const char* s);
- void putAt(size_t pos, char c);
- xbString &remove(size_t pos = 0, int n = npos);
- void resize(size_t size);
- void setNum(long num);
- void setNum(char * fmt, double num);
- xbString &sprintf(const char *format, ...);
- void swapChars( char from, char to );
- void toLowerCase();
- void toUpperCase();
- void trim();
- void zapChar( char c );
- void zapLeadingChar( char c );
- int setFromDelimitedInput(const char *,char, int, int );
-
-protected:
- void ctor(const char *s);
- void ctor(const char *s, size_t maxlen);
- char *data;
- size_t size;
- static const char * NullString;
-};
-
-XBDLLEXPORT xbString operator-(const xbString &s1, const xbString &s2);
-XBDLLEXPORT xbString operator+(const xbString &s1, const xbString &s2);
-XBDLLEXPORT xbString operator+(const xbString &s1, const char *s2);
-XBDLLEXPORT xbString operator+(const char *s1, const xbString &s2);
-XBDLLEXPORT xbString operator+(const xbString &s1, char c2);
-XBDLLEXPORT xbString operator+(char c1, const xbString &s2);
-XBDLLEXPORT xbBool operator==(const xbString &s1, const char *s2);
-XBDLLEXPORT xbBool operator!=(const xbString &s1, const char *s2);
-
-#endif
-
diff --git a/xbase64/xbtypes.h b/xbase64/xbtypes.h
deleted file mode 100755
index de5f08c..0000000
--- a/xbase64/xbtypes.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/* xbtypes.h
-
- Xbase64 project source code
-
- Copyright (C) 1997,2003 Gary A Kunkel
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
- Contact:
-
- Email:
-
- xdb-devel@lists.sourceforge.net
- xdb-users@lists.sourceforge.net
-
-
- Regular Mail:
-
- XBase Support
- 149C South Main St
- Keller Texas, 76248
- USA
-
-*/
-
-#ifndef __XB_XTYPES_H__
-#define __XB_XTYPES_H__
-
-#include <stdio.h>
-
-/*! \file xbtypes.h
-*/
-
-//! xbULong type
-/*!
-*/
-typedef unsigned long int xbULong;
-
-//! xbUShort type
-/*!
-*/
-typedef unsigned short int xbUShort;
-
-//! xbShort type
-/*!
-*/
-typedef short int xbShort;
-typedef long xbLong;
-
-
-//! xbFloat type
-/*!
-*/
-typedef float xbFloat;
-
-
-//! xbDouble type
-/*!
-*/
-typedef double xbDouble;
-
-//! xbBool type
-/*!
-*/
-typedef short int xbBool;
-
-//! xbOffT type
-/*!
-*/
-#ifdef XB_LOCKING_ON
-#ifdef __WIN32__
-#else
-#endif
-#endif // XB_LOCKING_ON
-#endif // __XB_XTYPES_H__
-
-// 64 bit file processing
-#if defined(HAVE_FSEEKO) && defined(HAVE_FTELLO) && defined(XB_LARGEFILE_SUPPORT)
- #define _ftell ftello
- #define _fseek fseeko
- typedef off_t xbOffT;
-#else
- #define _ftell ftell
- #define _fseek fseek
- typedef long xbOffT;
-#endif
diff --git a/xbase64/xbwincfg.h b/xbase64/xbwincfg.h
deleted file mode 100755
index df2d187..0000000
--- a/xbase64/xbwincfg.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/* config file for windows environments */
-
-/* Name of package */
-#define PACKAGE "xbase64"
-
-/* Version number of package */
-#define VERSION "3.1.2"
-
-/* Define if you have the ANSI C header files. */
-#define STDC_HEADERS 1
-
-/* Define if you have io.h */
-#define HAVE_IO_H 1
-
-/* Define if you need to have .ndx indexes */
-#define XB_INDEX_NDX 1
-
-/* Define if you need to have .ntx indexes */
-#define XB_INDEX_NTX 1
-
-/* Define if you need to have .cdx indexes */
-#define XB_INDEX_CDX 1
-
-/* Define if you need to support memo fields */
-#define XB_MEMO_FIELDS 1
-
-/* Define if you need expressions */
-#define XB_EXPRESSIONS 1
-
-/* Define if you need locking support */
-#undef XB_LOCKING_ON
-
-/* Define if you need to turn on XBase specific debug */
-#define XBASE_DEBUG 1
-
-/* Define if using real deletes */
-#define XB_REAL_DELETE 1
-
-/* Define if need filters */
-#define XB_FILTERS 1
-
-/* Define if you have the fcntl function. */
-#define HAVE_FCNTL 1
-
-/* Define if you have the vsnprintf function. */
-//#define HAVE_VSNPRINTF 1
-
-/* Define if you have the vsprintf function. */
-#define HAVE_VSPRINTF 1
-
-/* Define if you have the <ctype.h> header file. */
-#define HAVE_CTYPE_H 1
-
-/* Define if you have the <fcntl.h> header file. */
-#define HAVE_FCNTL_H 1
-
-/* Define if you have the <string.h> header file. */
-#define HAVE_STRING_H 1
-
-/* Should we include generic index support? */
-#if defined(XB_INDEX_NDX) || defined(XB_INDEX_NTX)
-#define XB_INDEX_ANY 1
-#endif
-
-/* expressions required for indexes */
-#if defined(XB_INDEX_ANY) && !defined(XB_EXPRESSIONS)
-#define XB_EXPRESSIONS 1
-#endif
-
-/* default memo block size */
-#define XB_DBT_BLOCK_SIZE 512
-
-/* filename path separator */
-#define PATH_SEPARATOR '/'
-
-/* MS uses WIN32, Borland uses __WIN32__ */
-#ifdef WIN32
- #ifndef __WIN32__
- #define __WIN32__
- #endif
-#endif
-